[
  {
    "path": ".github/workflows/changelog.yml",
    "content": "name: Generate Changelog\n\non:\n  push:\n    tags:\n      - \"*\"\n\npermissions:\n  contents: write\n\njobs:\n  generate_changelog:\n    runs-on: ubuntu-latest\n    if: ${{ !contains(github.event.head_commit.message, '[skip ci]') }}\n\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          token: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Set up Git user\n        run: |\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n      - name: Get release context\n        id: release_context\n        shell: bash\n        run: |\n          set -euo pipefail\n\n          CURRENT_TAG=${GITHUB_REF#refs/tags/}\n          PREVIOUS_TAG=$(git tag --sort=-v:refname | grep -A 1 \"^${CURRENT_TAG}$\" | tail -n 1 || true)\n\n          if [ -n \"$PREVIOUS_TAG\" ] && [ \"$PREVIOUS_TAG\" != \"$CURRENT_TAG\" ]; then\n            COMMIT_RANGE=\"${PREVIOUS_TAG}..${CURRENT_TAG}\"\n            echo \"Collecting commits from ${COMMIT_RANGE}\"\n          else\n            COMMIT_RANGE=\"HEAD~20..HEAD\"\n            echo \"No previous tag found. Falling back to ${COMMIT_RANGE}\"\n          fi\n\n          COMMIT_LOG=$(git log \"$COMMIT_RANGE\" --pretty=format:\"- %s\" --no-merges | grep -E \"^- (feat|fix|refactor)(\\(.+\\))?:\" || true)\n\n          echo \"current_tag=$CURRENT_TAG\" >> \"$GITHUB_OUTPUT\"\n          echo \"previous_tag=$PREVIOUS_TAG\" >> \"$GITHUB_OUTPUT\"\n          echo \"commit_range=$COMMIT_RANGE\" >> \"$GITHUB_OUTPUT\"\n          echo \"commits<<EOF\" >> \"$GITHUB_OUTPUT\"\n          printf '%s\\n' \"$COMMIT_LOG\" >> \"$GITHUB_OUTPUT\"\n          echo \"EOF\" >> \"$GITHUB_OUTPUT\"\n\n          echo \"Raw commits fetched:\"\n          printf '%s\\n' \"$COMMIT_LOG\"\n\n      - name: Generate changelog with Gemini\n        id: ai_changelog\n        if: steps.release_context.outputs.commits != ''\n        env:\n          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n          COMMIT_MESSAGES: ${{ steps.release_context.outputs.commits }}\n        shell: bash\n        run: |\n          set -euo pipefail\n\n          MODEL=\"gemini-3-flash-preview\"\n          MAX_RETRIES=3\n          RETRY_DELAY=5\n          SUCCESS=false\n\n          SYSTEM_PROMPT=$(cat <<'EOF'\n          You generate release changelog entries from git commits.\n          Output only Markdown bullet points.\n          Requirements:\n          - Write Chinese first, then English in the same bullet.\n          - Focus on user-facing changes, features, fixes, and important refactors.\n          - Group related commits into concise bullets.\n          - Do not invent changes not present in the commits.\n          - Do not include headings, introductions, or code fences.\n          - Keep the output suitable for CI logs and CHANGELOG.md.\n          EOF\n          )\n\n          COMMIT_LINES=$(printf '%s\\n' \"$COMMIT_MESSAGES\" | grep -c '^- ' || true)\n          if [ \"$COMMIT_LINES\" -le 0 ]; then\n            echo \"No eligible commit lines found.\"\n            exit 0\n          fi\n\n          MAX_OUTPUT_TOKENS=$((500 + (COMMIT_LINES * 80)))\n          if [ \"$MAX_OUTPUT_TOKENS\" -gt 4096 ]; then\n            MAX_OUTPUT_TOKENS=4096\n          fi\n\n          for ATTEMPT in $(seq 1 \"$MAX_RETRIES\"); do\n            echo \"Attempt $ATTEMPT of $MAX_RETRIES\"\n\n            JSON_PAYLOAD=$(jq -n \\\n              --arg system_prompt \"$SYSTEM_PROMPT\" \\\n              --arg commit_messages \"$COMMIT_MESSAGES\" \\\n              --argjson max_output_tokens \"$MAX_OUTPUT_TOKENS\" \\\n              '{\n                system_instruction: {\n                  parts: [\n                    { text: $system_prompt }\n                  ]\n                },\n                contents: [\n                  {\n                    role: \"user\",\n                    parts: [\n                      {\n                        text: (\"Commit messages:\\n\\n\" + $commit_messages)\n                      }\n                    ]\n                  }\n                ],\n                generationConfig: {\n                  maxOutputTokens: $max_output_tokens,\n                  topP: 0.95,\n                  thinkingConfig: {\n                    thinkingBudget: 0\n                  }\n                },\n                safetySettings: [\n                  {\n                    category: \"HARM_CATEGORY_DANGEROUS_CONTENT\",\n                    threshold: \"BLOCK_NONE\"\n                  }\n                ]\n              }')\n\n            API_ENDPOINT=\"https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent\"\n\n            HTTP_CODE=$(curl -sS -o gemini_response.json -w \"%{http_code}\" \\\n              -X POST \"$API_ENDPOINT\" \\\n              -H \"x-goog-api-key: ${GEMINI_API_KEY}\" \\\n              -H \"Content-Type: application/json\" \\\n              --data \"$JSON_PAYLOAD\")\n\n            echo \"Gemini HTTP status: $HTTP_CODE\"\n            echo \"Gemini Raw Response:\"\n            cat gemini_response.json\n\n            if [ \"$HTTP_CODE\" -lt 200 ] || [ \"$HTTP_CODE\" -ge 300 ]; then\n              echo \"Gemini API returned non-2xx status.\"\n              sleep \"$RETRY_DELAY\"\n              continue\n            fi\n\n            ERROR_MSG=$(jq -r '.error.message // empty' gemini_response.json)\n            if [ -n \"$ERROR_MSG\" ]; then\n              echo \"API Error: $ERROR_MSG\"\n              sleep \"$RETRY_DELAY\"\n              continue\n            fi\n\n            GENERATED_TEXT=$(jq -r '[.candidates[0].content.parts[]? | select(has(\"text\")) | .text] | join(\"\\n\")' gemini_response.json | sed '/^[[:space:]]*$/d')\n            FINISH_REASON=$(jq -r '.candidates[0].finishReason // empty' gemini_response.json)\n            THOUGHTS_TOKENS=$(jq -r '.usageMetadata.thoughtsTokenCount // 0' gemini_response.json)\n\n            echo \"Finish reason: ${FINISH_REASON:-<empty>}\"\n            echo \"Thought tokens: $THOUGHTS_TOKENS\"\n\n            if [ -z \"$GENERATED_TEXT\" ]; then\n              echo \"Empty response from Gemini.\"\n              sleep \"$RETRY_DELAY\"\n              continue\n            fi\n\n            if [ \"$FINISH_REASON\" = \"MAX_TOKENS\" ]; then\n              echo \"Gemini output was truncated by MAX_TOKENS; retrying.\"\n              sleep \"$RETRY_DELAY\"\n              continue\n            fi\n\n            echo \"Generated Changelog Text:\"\n            printf '%s\\n' \"$GENERATED_TEXT\"\n\n            {\n              echo \"changelog_entry<<EOF\"\n              printf '%s\\n' \"$GENERATED_TEXT\"\n              echo \"EOF\"\n            } >> \"$GITHUB_OUTPUT\"\n\n            SUCCESS=true\n            break\n          done\n\n          if [ \"$SUCCESS\" != \"true\" ]; then\n            echo \"Failed to generate changelog after ${MAX_RETRIES} attempts.\"\n            exit 1\n          fi\n\n      - name: Update CHANGELOG.md\n        if: steps.ai_changelog.outputs.changelog_entry != ''\n        env:\n          GENERATED_CONTENT: ${{ steps.ai_changelog.outputs.changelog_entry }}\n        shell: bash\n        run: |\n          set -euo pipefail\n\n          CHANGELOG_FILE=\"CHANGELOG.md\"\n          UNRELEASED_HEADING=\"## [Unreleased]\"\n\n          if [ ! -f \"$CHANGELOG_FILE\" ]; then\n            cat > \"$CHANGELOG_FILE\" <<'EOF'\n          # Changelog\n\n          All notable changes to this project will be documented in this file.\n\n          ## [Unreleased]\n          EOF\n          fi\n\n          if grep -Fq \"$UNRELEASED_HEADING\" \"$CHANGELOG_FILE\"; then\n            awk -v unreleased_heading=\"$UNRELEASED_HEADING\" -v generated_content=\"$GENERATED_CONTENT\" '\n              BEGIN { inserted = 0 }\n              {\n                print\n                if (!inserted && $0 == unreleased_heading) {\n                  print \"\"\n                  print generated_content\n                  inserted = 1\n                }\n              }\n            ' \"$CHANGELOG_FILE\" > temp_changelog.md\n          else\n            awk -v unreleased_heading=\"$UNRELEASED_HEADING\" -v generated_content=\"$GENERATED_CONTENT\" '\n              NR <= 3 { print; next }\n              NR == 4 {\n                print \"\"\n                print unreleased_heading\n                print \"\"\n                print generated_content\n                print \"\"\n              }\n              { print }\n            ' \"$CHANGELOG_FILE\" > temp_changelog.md\n          fi\n\n          mv temp_changelog.md \"$CHANGELOG_FILE\"\n          echo \"CHANGELOG.md updated.\"\n\n      - name: Commit and push CHANGELOG.md\n        if: steps.ai_changelog.outputs.changelog_entry != ''\n        shell: bash\n        run: |\n          set -euo pipefail\n\n          CHANGELOG_FILE=\"CHANGELOG.md\"\n\n          if git diff --quiet -- \"$CHANGELOG_FILE\"; then\n            echo \"No changes to ${CHANGELOG_FILE} to commit.\"\n            exit 0\n          fi\n\n          git add \"$CHANGELOG_FILE\"\n          git commit -m \"chore: update changelog for ${GITHUB_REF#refs/tags/} [skip ci]\"\n          git push origin HEAD:refs/heads/main\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  pull_request:\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: read\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Use Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: '18.x'\n          registry-url: 'https://npm.pkg.github.com'\n          scope: '@nutstore'\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v2\n        with:\n          version: latest\n\n      - name: Install dependencies\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: pnpm install\n\n      - name: Build plugin\n        env:\n          NS_NSDAV_ENDPOINT: ${{ vars.NS_NSDAV_ENDPOINT }}\n          NS_DAV_ENDPOINT: ${{ vars.NS_DAV_ENDPOINT }}\n          NUTSTORE_PAT: ${{ secrets.GITHUB_TOKEN }}\n          NODE_ENV: production\n          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: pnpm run build\n\n      - name: Check build artifacts\n        run: |\n          if [ ! -f main.js ] || [ ! -f manifest.json ] || [ ! -f styles.css ]; then\n            echo \"Error: Required build artifacts not found\"\n            exit 1\n          fi\n          echo \"Build successful! All required files generated.\"\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release Obsidian plugin\n\non:\n  push:\n    tags:\n      - '*'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    environment: production\n    permissions:\n      contents: write\n      packages: read\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Use Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: '18.x'\n          registry-url: 'https://npm.pkg.github.com'\n          scope: '@nutstore'\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v2\n        with:\n          version: latest\n\n      - name: Build plugin\n        env:\n          NS_NSDAV_ENDPOINT: ${{ vars.NS_NSDAV_ENDPOINT }}\n          NS_DAV_ENDPOINT: ${{ vars.NS_DAV_ENDPOINT }}\n          NUTSTORE_PAT: ${{ secrets.GITHUB_TOKEN }}\n          NODE_ENV: production\n          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          pnpm install\n          pnpm run build\n\n      - name: Package plugin\n        run: |\n          tag=\"${GITHUB_REF#refs/tags/}\"\n          mkdir ${{ github.event.repository.name }}\n          cp main.js manifest.json styles.css ${{ github.event.repository.name }}\n          zip -r ${{ github.event.repository.name }}-${tag}.zip ${{ github.event.repository.name }}\n          tar -czf ${{ github.event.repository.name }}-${tag}.tar.gz ${{ github.event.repository.name }}\n\n      - name: Create release\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          tag=\"${GITHUB_REF#refs/tags/}\"\n\n          gh release create \"$tag\" \\\n            --title=\"$tag\" \\\n            --draft \\\n            main.js manifest.json styles.css \\\n            ${{ github.event.repository.name }}-${tag}.zip \\\n            ${{ github.event.repository.name }}-${tag}.tar.gz\n"
  },
  {
    "path": ".github/workflows/update-changelog-version.yml",
    "content": "name: Update Changelog Version\n\non:\n  release:\n    types: [published]\n\npermissions:\n  contents: write\n\njobs:\n  update-changelog:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout main branch\n        uses: actions/checkout@v4\n        with:\n          ref: main # Explicitly checkout main branch\n          fetch-depth: 0\n          token: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Set up Git user\n        run: |\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n      - name: Update version in CHANGELOG.md\n        run: |\n          echo \"GITHUB_REF: $GITHUB_REF\"\n          # Get release version (without 'v' prefix if present)\n          VERSION=${GITHUB_REF#refs/tags/}\n          echo \"After removing refs/tags/: $VERSION\"\n          VERSION=${VERSION#v}\n          echo \"After removing v prefix: $VERSION\"\n\n          echo \"Current content before replacement:\"\n          cat CHANGELOG.md\n\n          # Only replace \"Unreleased\" in the heading, not in other places\n          sed -i \"s/## \\[Unreleased\\]/## [$VERSION]/\" CHANGELOG.md\n\n          echo \"Content after replacement:\"\n          cat CHANGELOG.md\n\n          # Check if there are changes\n          if git diff --quiet CHANGELOG.md; then\n            echo \"No changes were made to CHANGELOG.md\"\n            exit 1\n          fi\n\n          # Commit and push changes\n          git add CHANGELOG.md\n          git commit -m \"docs: update changelog version to $VERSION [skip ci]\"\n          git push origin HEAD:main\n\n          # Update release description with CHANGELOG link\n          CHANGELOG_URL=\"https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md#$VERSION\"\n          RELEASE_ID=$(jq --raw-output .release.id \"$GITHUB_EVENT_PATH\")\n\n          # Add CHANGELOG link to release description\n          curl \\\n            -X PATCH \\\n            -H \"Authorization: token ${{ secrets.GITHUB_TOKEN }}\" \\\n            -H \"Accept: application/vnd.github.v3+json\" \\\n            \"https://api.github.com/repos/${{ github.repository }}/releases/$RELEASE_ID\" \\\n            -d \"{\n              \\\"body\\\": \\\"📝 View the changelog for this version: $CHANGELOG_URL\\\"\n            }\"\n"
  },
  {
    "path": ".gitignore",
    "content": "# Intellij\r\n*.iml\r\n.idea\r\n\r\n# npm\r\nnode_modules\r\n\r\n# Exclude sourcemaps\r\n*.map\r\n\r\n# obsidian\r\ndata.json\r\n\r\n# Exclude macOS Finder (System Explorer) View States\r\n.DS_Store\r\n\r\n# Local\r\n*.local\r\n*.log*\r\n\r\n# Environment variables\r\n.env\r\n\r\n# build output\r\ndist\r\nstyles.css\r\nmain.js\r\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n\t\"semi\": false,\n\t\"singleQuote\": true,\n\t\"trailingComma\": \"all\",\n\t\"useTabs\": true\n}\n"
  },
  {
    "path": ".swcrc",
    "content": "{\n\t\"$schema\": \"https://swc.rs/schema.json\",\n\t\"jsc\": {\n\t\t\"parser\": {\n\t\t\t\"syntax\": \"ecmascript\",\n\t\t\t\"jsx\": false,\n\t\t\t\"dynamicImport\": false,\n\t\t\t\"privateMethod\": false,\n\t\t\t\"functionBind\": false,\n\t\t\t\"exportDefaultFrom\": false,\n\t\t\t\"exportNamespaceFrom\": false,\n\t\t\t\"decorators\": false,\n\t\t\t\"decoratorsBeforeExport\": false,\n\t\t\t\"topLevelAwait\": false,\n\t\t\t\"importMeta\": false\n\t\t},\n\t\t\"target\": \"es5\",\n\t\t\"loose\": false,\n\t\t\"externalHelpers\": false,\n\t\t\"keepClassNames\": false\n\t},\n\t\"minify\": true\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n\t\"editor.formatOnSave\": true,\n\t\"tailwindCSS.codeActions\": false,\n\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n\n\t\"editor.codeActionsOnSave\": {\n\t\t\"source.organizeImports\": \"explicit\",\n\t\t\"source.removeUnusedImports\": \"explicit\"\n\t},\n\n\t\"[typescript]\": {\n\t\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n\t},\n\n\t\"[json]\": {\n\t\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n\t},\n\n\t\"[jsonc]\": {\n\t\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n\t},\n\n\t\"[css]\": {\n\t\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n\t},\n\n\t\"[yaml]\": {\n\t\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n\t},\n\n\t\"[markdown]\": {\n\t\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n\t},\n\t\"cSpell.words\": [\"fflate\", \"jedec\", \"Mkdirs\", \"Nutstore\", \"webdav\"],\n\t\"i18n-ally.localesPaths\": [\n\t\t\"src/i18n\",\n\t\t\"src/i18n/locales\",\n\t\t\"packages/webdav-explorer/src/i18n\",\n\t\t\"packages/webdav-explorer/src/i18n/locales\"\n\t]\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n本项目的所有重要更改都将记录在此文件中。All notable changes to this project will be documented in this file.\n\n## [1.2.1]\n\n- 修复未选择会话时的默认模型应用问题 | Fixed default model application for empty unselected sessions.\n- 修复对话模型显示名称记录问题，并确保任务运行使用模型 ID | Fixed chat model display name recording and ensured model IDs are used for task runs.\n- 修复用户配置目录过滤规则失效的问题 (#123) | Fixed an issue where user configuration directory filter rules were not being respected (#123).\n- 重构 AI 配置为基于记录的结构并支持预设功能 | Refactored AI configuration to a record-based structure with support for presets.\n- 新增聊天框功能区 (Ribbon) | Added a new ribbon interface for the chatbox.\n\n\n## [1.2.0] - 2026-04-28\n\n- 新增 AI 助手主流程与 Agent loop，支持多轮任务执行、会话管理、任务状态展示，以及消息删除、重新生成、召回与复制等交互。 / Added the core AI assistant flow and Agent loop, including multi-step task execution, session management, task status views, and message actions such as delete, regenerate, recall, and copy.\n- 新增 AI Provider 配置与管理能力，完善模型与提供商设置结构、必填/选填提示、校验与错误处理，并加入权限确认弹窗与可逆操作保护。 / Added AI provider configuration and management, with reworked model/provider settings, required or optional field indicators, stronger validation and error handling, plus a permission modal and safeguards for reversible operations.\n- 新增 Vault Bash 执行环境与相关工具增强，改进 Bash 输出处理、文本内容展示，以及 `collectTreeItems` 的深度和数量限制支持。 / Added a Vault Bash execution environment and improved related tools, including better Bash output handling, clearer text rendering, and support for depth and limit parameters in `collectTreeItems`.\n- 新增配置目录同步规则与设置，允许更细致地控制 config 目录同步行为，并补充跨平台适配与基于 Adapter API 的文件系统重构。 / Added config directory sync rules and settings for finer control over config synchronization, along with cross-platform fixes and filesystem refactoring based on the Adapter API.\n- 优化聊天与命令界面体验，加入可拖拽输入区、命令按钮图标、聊天消息卡片与历史任务面板，提升 AI 交互可用性。 / Improved the chat and command UI with a resizable input pane, command button icons, chat message cards, and session task panels for a better AI experience.\n- 改进同步冲突处理与文件操作能力，引入 DiffMatchPatchOrSkip 策略，并增强本地 Vault 文件操作与搜索路径过滤等底层支持。 / Improved conflict resolution and file operations with the new DiffMatchPatchOrSkip strategy, alongside stronger local vault handling and search path filtering support.\n\n## [1.1.3] - 2026-02-14\n\n- 优化了设置访问的稳定性和错误处理。\n- 优化账户同步流程：在同步前增加配置校验，引导用户前往设置页面。\n- Improved stability and error handling for settings access.\n- Enhanced account sync workflow: Added configuration validation before sync and guided users to settings page.\n\n\n## [1.1.2] - 2026-02-11\n\n- **新增对 traverseWebDAV 缓存清理的支持**\n- **Added support for clearing the traverseWebDAV cache**\n\n\n## [1.1.1] - 2026-02-10\n\n- 修复：增强了 HTML 实体解码支持，提升了对特殊字符的处理能力。\n- Fix: Enhanced HTML entity decoding support, improving special character handling.\n\n\n## [1.1.0] - 2026-02-05\n\n### 新增功能 / Features\n- 新增可恢复的 WebDAV 遍历功能，支持大规模目录树的高效扫描。\n- 新增失败任务弹窗，集中展示同步错误信息。\n- 新增同步准备事件，提供更细致的同步状态反馈。\n- 新增删除确认设置，允许在自动同步时控制是否显示删除确认。\n- 新增显示相对时间功能，改善时间显示的可读性。\n- 新增更多任务图标，丰富任务类型的视觉反馈。\n- 新增文件跳过原因显示（文件大小、被忽略项等），提升同步透明度。\n- Added resumable WebDAV traversal for efficient large directory tree scanning.\n- Added failed tasks modal to centralize sync error information display.\n- Added sync preparing event for more detailed sync status feedback.\n- Added delete confirmation setting to control confirmation display during auto-sync.\n- Added relative time display for improved time readability.\n- Added more task icons to enrich visual feedback for task types.\n- Added skip reason display (file size, ignored items, etc.) to improve sync transparency.\n\n### 修复 / Fixes\n- 修复同步进度弹窗按钮未定义的问题。\n- 修复 FilterEditorModal 描述显示问题。\n- 修复文件大小限制判断逻辑。\n- 修复 traverseWebDAVKV 异步等待问题。\n- 修复 delta 增量获取不完整的问题，确保持续检索直到无更多可用数据。\n- 修复节点键值的标准化问题。\n- 修复取消检测在确认前的问题。\n- 修复可恢复遍历的返回值。\n- 修复远程目录创建前的文件名有效性检查。\n- Fixed undefined button reference in SyncProgressModal.\n- Fixed FilterEditorModal description display issue.\n- Fixed file size limit logic.\n- Fixed traverseWebDAVKV async await issue.\n- Fixed incomplete delta retrieval, ensuring continuous retrieval until no more data is available.\n- Fixed node key normalization issue.\n- Fixed cancel detection before confirmation.\n- Fixed resumable traverse return value.\n- Fixed filename validity check before remote directory creation.\n\n### 重构与优化 / Refactoring & Improvements\n- 重构并增强 glob 匹配逻辑，改进路径标准化。\n- 重构 delta 应用逻辑，新增 applyDeltasToStats 工具函数。\n- 移除 delta 缓存键值存储，简化架构。\n- 改用 Vault API 进行文件操作，提升稳定性。\n- 将语言设置从 Obsidian API 获取改为插件设置中配置。\n- Refactored and enhanced glob matching logic with improved path normalization.\n- Refactored delta application logic and added applyDeltasToStats utility.\n- Removed delta cache key-value storage to simplify architecture.\n- Switched to Vault API for file operations to improve stability.\n- Changed language setting from Obsidian API to plugin settings configuration.\n\n\n## [1.0.0] - 2025-12-29\n\n- 功能: 分块执行同步任务并新增批量远端操作（批量建目录、递归删除）、覆盖推送与跳过冲突，显著提升大批量同步效率。/ Feature: Execute sync jobs in chunks with new batch remote operations (bulk mkdir, recursive delete), overwrite push, and conflict skipping to speed up large syncs.\n- 功能: 扩展 glob 规则和路径判定（Mergeable、Markdown、二进制文件），自动排除 configDir，并支持禁用间隔自动同步，增强策略可控性。/ Feature: Extended glob rules and path detection (mergeable, markdown, binary), auto-exclusion of configDir, and ability to disable interval auto sync for finer control.\n- 功能: 新增删除确认弹窗、将同步日志保存到 Vault，并在同步结束时显示 Close 状态，整体提升可用性与反馈。/ Feature: Added delete confirmation modal, saving sync logs to the vault, and showing Close instead of Hidden after sync to improve UX and feedback.\n- 修复: 保护忽略文件不被远端删除、修复缓存服务、记录跳过、进度上报与任务分块等问题，保证同步稳定性。/ Fix: Safeguarded ignored files from remote deletion and fixed cache service, record skipping, progress reporting, and chunked task handling to keep sync stable.\n- 优化: 使用 `fflate` 压缩缓存、以 SWC 支持 ES5、改进 ArrayBuffer 转换与时长 clamping，提供更快更兼容的运行体验。/ Improvement: Switched to `fflate` caching, compile with SWC for ES5 support, and improved ArrayBuffer conversion plus duration clamping for faster, more compatible runtime.\n\n## [0.8.5] - 2025-12-02\n\n- 功能: 允许跳过初始同步确认。/ Feature: Allow skipping initial sync confirmation.\n- 修复: 移除无用的卸载服务进程。/ Fix: Remove useless unload service process.\n- 优化: 优化记录更新的防抖性能。/ Refactor: Debounce record updates for performance.\n\n\n## [0.8.4] - 2025-08-06\n\n* **改进:**  实现了可配置的自动同步间隔。\n* **修复:**  删除了孤立的记录。\n* **内部优化:**  重构了同步决策架构，并添加了全面的 glob 匹配测试；对 `SyncRecord` 类进行了解耦和重构，提升了代码可维护性；改进了 `StatModel` 的类型安全性和修复了相关的类型问题；使用了 `path-browserify` 提升兼容性。\n* **Improvements:** Implemented configurable auto-sync interval.\n* **Fixes:** Removed orphaned record.\n* **Internal Improvements:** Refactored sync decision architecture and added comprehensive glob matching tests; Decoupled and refactored the `SyncRecord` class for improved maintainability; Improved `StatModel` type safety and fixed related type issues; Used `path-browserify` for better compatibility.\n\n\n## [0.8.3] - 2025-07-21\n\n* 优化二进制文件检测：通过扩展名检查优化了二进制文件的检测。\n* Optimized binary file detection: Improved binary file detection with extension checking.\n\n\n## [0.8.2] - 2025-06-26\n\n* **改进:** 提升了文件处理的稳定性，修复了 `PullTask` 执行方法中的错误。\n* **改进:**  改进了 `deepStringify` 函数的错误处理，使其能够更好地处理 `Error` 对象。\n* **Improvements:** Improved file handling stability, fixing errors in the `PullTask` execution method.\n* **Improvements:** Improved error handling in the `deepStringify` function to better manage `Error` objects.\n\n\n## [0.8.1] - 2025-06-25\n\n* **改进与修复:**\n    * 更新了文件检索方法，提高了效率和稳定性。\n    * 优化了文件夹创建逻辑，减少了潜在错误。\n    * 增强了语言获取方法的健壮性，避免了潜在的运行时错误。\n* **Improvements and Fixes:**\n    * Updated file retrieval method for improved efficiency and stability.\n    * Improved folder creation logic to reduce potential errors.\n    * Enhanced robustness of language retrieval method to prevent potential runtime errors.\n\n\n## [0.8.0] - 2025-06-23\n\n* **改进:**\n    * 优化同步流程，避免同步进度条被意外清空。\n    * 修复开始同步指令逻辑，使其更可靠。\n    * 统一英文翻译大小写格式，提升用户体验。\n    * 同步数据库时显示进度条，提升用户感知。\n* **底层优化:**\n    * 使用 Vault API 重构部分代码，提升效率和稳定性。\n    * 使用 `Setting` 组件替换 `h2` 元素，统一设置界面样式。\n    * 移除未使用的代码，精简代码库。\n    * 使用 `window.clearTimeout` 和 `window.setTimeout` 优化计时器管理。\n* **Improvements:**\n    * Optimized sync process to prevent unexpected clearing of the progress bar.\n    * Fixed the logic of the start sync command for better reliability.\n    * Unified capitalization in English translations for improved user experience.\n    * Added a progress bar during database synchronization for better user feedback.\n* **Under the hood:**\n    * Refactored parts of the code using the Vault API for improved efficiency and stability.\n    * Replaced `h2` elements with the `Setting` component for consistent settings interface styling.\n    * Removed unused code to streamline the codebase.\n    * Optimized timer management using `window.clearTimeout` and `window.setTimeout`.\n\n\n## [0.7.0] - 2025-05-14\n\n*   **特性**\n    *   增强智能合并策略，提升冲突解决效率。\n    *   新增启动后自动同步选项，允许配置同步延迟。\n*   **修复**\n    *   为 `updateMtimeInRecord` 方法增加错误处理，提高稳定性。\n    *   兼容 1.8.x 及更早版本。\n---\n*   **Features**\n    *   Enhanced intelligent merge strategy for more efficient conflict resolution.\n    *   Added an option for automatic synchronization after startup, with configurable delay.\n*   **Bug Fixes**\n    *   Improved stability of the `updateMtimeInRecord` method by adding error handling.\n    *   Ensured compatibility with versions 1.8.x and earlier.\n\n## [0.6.1] - 2025-05-13\n\n*   改进 Glob 匹配逻辑和性能 (重构文件系统结构)\n*   Improve glob matching logic and performance (Refactored filesystem structure)\n\n## [0.6.0] - 2025-05-09\n\n*   **新功能**\n    *   解码文件路径中的 HTML Entity 编码\n    *   添加文件名错误任务，处理不支持的特殊字符\n    *   自动同步时不显示通知\n    *   添加过滤规则设置，支持包含和排除规则\n\n*   **Features**\n    *   Decode HTML entities in file paths\n    *   Add task for filename errors to handle unsupported special characters\n    *   Suppress notifications during automatic synchronization\n    *   Add filter rule settings with support for include and exclude rules\n\n## [0.5.1] - 2025-04-30\n\n* 修复：修复了 NutstorePlugin 类型不存在 'logs' 属性的问题。\n* Fixed: Resolved an issue where the 'logs' property was missing from the NutstorePlugin type.\n\n* **功能改进:**\n    * 实现了实时同步服务，并添加了相应的设置选项。\n    * 添加了 BaseSyncDecision 抽象类以支持同步决策逻辑。\n* **错误修复:**\n    * 更新了过滤器描述，移除了关于 globstar 的描述。\n    * 修复了生成的正则表达式标志，移除了默认的全局标志。\n    * 将 configDir 添加到过滤器规则中。\n* **Features:**\n    * Implemented a real-time synchronization service and added corresponding settings.\n    * Added a BaseSyncDecision abstract class to support synchronization decision logic.\n* **Bug Fixes:**\n    * Updated the filter description, removing the description about globstar.\n    * Fixed the generated regular expression flags, removing the default global flag.\n    * Added configDir to the filter rules.\n\n\n## [0.4.2] - 2025-04-28\n\n* 修复：优化实时保存同步记录功能，避免同步大量文件中断后需要重新读写。\n* 修复：处理空目录或根目录情况。\n* 修复：改进了 WebDAV 连接检查功能，现在可以处理 503 错误并提供相应的通知。\n* Fixed: Optimized real-time saving of sync records to prevent rereading and rewriting after interruptions during large file synchronizations.\n* Fixed: Handled cases with empty or root directories.\n* Fixed: Improved WebDAV connection check to handle 503 errors and provide corresponding notifications.\n\n\n## [0.4.1] - 2025-04-27\n\n* 修复了首次同步时本地数据会覆盖远程数据的问题，现在会进行合并。\n* Fixed an issue where local data would overwrite remote data during the initial synchronization. Now, the data will be merged.\n\n\n## [0.4.0] - 2025-04-25\n\n* 可以配置跳过大文件，避免 OOM；同步进度窗口可以取消同步和隐藏窗口；可选择性清除缓存。\n* 串行保存 blob 数据，日志持久化。\n* Configure skip large files to avoid OOM; The sync progress window can cancel sync and hide the window; Selectable cache clearing modal.\n* Serialize blob saving; Logs are now persistent.\n\n\n## [0.3.2] - 2025-04-23\n\n* 恢复同步记录后显示同步完成提示。\n* 完善了同步记录功能，自动补充缺失文件夹的同步记录。\n* 新增内存文件系统。\n* 新增同步完成标记功能。\n* 新增同步进度弹窗。\n* 新增同步和终止命令。\n* 优化了同步机制，包括可中断的 503 重试机制和睡眠函数，修复了大量任务并发读取文件时闪退的问题。\n* Synchronization complete message is now displayed after synchronization records are restored.\n* Enhanced synchronization record functionality by automatically adding missing folder records.\n* Implemented an in-memory file system (memfs).\n* Added a synchronization completion marker.\n* Added a synchronization progress popup.\n* Added commands for starting and stopping synchronization.\n* Improved synchronization mechanism with interruptible 503 retry and sleep functions, fixing the crash issue when concurrently reading files with a large number of tasks.\n\n\n## [0.3.1] - 2025-04-21\n\n* 修复：\n    * 仅导出当前 vault 的缓存\n    * 修复 delta 响应中的类型解析错误\n* 功能：\n    * 使用标准远程路径处理选择的远程路径，确保路径一致性\n    * 添加空操作任务以优化任务执行流程\n    * 添加松散同步模式，跳过同名且大小相同的文件\n* Bug fixes:\n    * Only export the cache of the current vault.\n    * Fixed a type parsing error in delta responses.\n* Features:\n    * Use standardized remote paths to ensure path consistency.\n    * Added a no-op task to optimize task execution flow.\n    * Added a loose synchronization mode to skip files with the same name and size.\n\n\n## [0.3.0] - 2025-04-18\n\n* **功能改进:**\n    * 实现了 Indexed DB 缓存数据的导入导出功能，并支持保存到坚果云盘。\n    * 使用图标代替了选择文件夹的文本。\n    * 添加了日志界面。\n* **问题修复:**\n    * 修复了 stringify 导致的错误。\n* **其他改进:**\n    * 为生产模式添加了日志记录功能。\n    * 将设置模块重构为类。\n* **Features:**\n    * Implemented import and export of Indexed DB cache data, with support for saving to Nutstore Cloud.\n    * Replaced folder selection text with an icon.\n    * Added a log interface.\n* **Bug Fixes:**\n    * Fixed an error caused by stringify.\n* **Other Improvements:**\n    * Added logging functionality for production mode.\n    * Refactored the settings module as a class.\n\n\n## [0.2.3] - 2025-04-14\n\n* 修复相对路径处理逻辑\n* 为过滤器添加 flag\n\n* fix relative path bug\n* allow config flag for filter\n\n\n## [0.2.2] - 2025-04-10\n\n*   修复了部分旧环境下的兼容性问题 (通过 polyfill 数组方法)。\n*   修复了导致移动端无法同步的问题。\n\n*   Fixed compatibility issues in some older environments (by polyfilling array methods).\n*   Fixed an issue preventing synchronization on mobile devices.\n\n\n## [0.2.1] - 2025-04-10\n\n*   修正了相对路径的处理。\n\n*   Corrected handling of relative paths. \n\n## [0.2.0] - 2025-04-09\n\n*   简化了登录流程。\n*   增加了自定义过滤功能。\n*   支持自定义请求 URL。\n*   增加了当同步任务过多时建议使用客户端的提示信息。\n*   修复了 iOS 设备上无法通过浏览器进行 SSO 登录的问题。\n*   修复了数值可能以科学记数法 (eNotation) 显示的问题。\n*   更新了冲突解决策略的描述，增加了备份建议。\n*   调整了差异匹配阈值。\n*   对路径进行了编码以改善处理。\n\n*   Simplified the login process.\n*   Added custom filtering capabilities.\n*   Added support for custom request URLs.\n*   Added a prompt suggesting client use for numerous sync tasks.\n*   Fixed an issue preventing SSO login via browser on iOS devices.\n*   Fixed an issue where numbers might display in scientific notation (eNotation).\n*   Updated conflict resolution strategy descriptions to include a backup recommendation.\n*   Adjusted the match threshold for diffs.\n*   Encoded paths for improved handling.\n\n## [0.1.0] - 2025-04-03\n\n*   为冲突解决策略描述添加了备份建议。\n*   改进了手动登录帮助链接的结构。\n*   禁用了数字显示的科学计数法 (eNotation)。\n*   更新了单点登录 (SSO) 组件 (使用 `@nutstore/sso-js`)。\n\n*   Added backup recommendation to conflict resolution strategy descriptions.\n*   Improved the structure of the manual login help link.\n*   Disabled scientific notation (eNotation) for number display.\n*   Updated the Single Sign-On (SSO) component (using `@nutstore/sso-js`).\n\n## [0.0.7] - 2025-03-28\n\n*   新增：执行同步任务前增加确认步骤，通过包含说明文字的新弹窗进行确认。\n*   新增：添加 `confirmBeforeSync` 设置项，用于控制是否在同步前进行确认。\n*   改进：文件列表（FileList）现在可以同时显示文件和文件夹。\n*   改进：为远程目录创建过程中遇到的错误添加了通知提示。\n*   优化：优化了同步流程（包括远程目录存在性检查和记录清理）。\n\n*   Added a confirmation step before executing sync tasks, shown in a new modal with instructions.\n*   Added a `confirmBeforeSync` setting to control the sync confirmation behavior.\n*   Updated FileList to display both files and folders.\n*   Added notifications for errors during remote directory creation.\n*   Optimized the synchronization process (includes remote directory checks and record cleanup).\n\n## [0.0.6] - 2025-03-25\n\n*   提高了获取目录内容时的可靠性，增加了 API 速率限制和针对临时服务器错误 (503) 的自动重试机制。\n*   Improved reliability when fetching directory contents by adding API rate limiting and automatic retries for temporary server errors (503).\n\n## [0.0.5] - 2025-03-21\n\n*   修复：创建新文件夹后自动刷新列表。\n*   功能：更新了坚果云单点登录（SSO）支持。\n\n*   Fix: Refresh list automatically after creating a new folder.\n*   Feature: Updated Nutstore Single Sign-On (SSO) support.\n\n## [0.0.4] - 2025-03-13\n\n*   更新了单点登录 (SSO) 功能。\n*   Updated Single Sign-On (SSO) functionality.\n\n## [0.0.3] - 2025-03-13\n\n*   **同步核心与进度**\n    *   新增 同步状态管理、进度百分比显示、完成状态（含失败计数）和同步按钮视觉反馈。\n    *   新增 同步取消/停止功能。\n    *   新增 SSO（单点登录）用户界面。\n    *   新增 同步确认对话框及风险提示。\n    *   新增 在本地创建文件夹时，在远端也创建对应文件夹。\n    *   新增 同步任务失败时的本地化错误信息。\n    *   新增 对二进制文件进行哈希比较。\n    *   新增 针对 503 错误的重试机制。\n    *   优化 远程基础目录 (`remoteBaseDir`) 回退使用仓库名称。\n    *   优化 调整了 API 请求频率限制以提高稳定性。\n    *   修复 同步动画旋转方向错误。\n    *   修复 从正确的 `remoteBaseDir` 开始遍历文件。\n    *   修复 获取目录内容以正确处理服务器基础路径。\n*   **冲突处理**\n    *   新增 冲突处理策略可选。\n    *   新增 冲突标记（支持 Git 风格及自定义），并保留原始内容格式。\n    *   新增 跳过空文件冲突。\n    *   优化 冲突解决支持可选的本地和远程文件状态信息。\n*   **文件处理**\n    *   新增 文件属性中包含文件大小。\n    *   新增 获取目录内容支持分页。\n    *   修复 处理文件系统中的空文件状态。\n*   **其他**\n    *   新增 插件图标。\n    *   新增 中英文文档及同步流程图。\n    *   修复 文本自动换行问题。\n    *   更新 插件名称。\n\n*   **Sync Core & Progress**\n    *   Added sync state management, progress percentage display, completion status (with failed count), and visual feedback for the sync button.\n    *   Added sync cancellation/stop functionality.\n    *   Added SSO (Single Sign-On) user interface.\n    *   Added sync confirmation dialog and risk warning.\n    *   Added remote folder creation when a local folder is created.\n    *   Added localized error messages for sync task failures.\n    *   Added hash comparison for binary files.\n    *   Added retry mechanism for 503 errors.\n    *   Improved `remoteBaseDir` to use the vault name as a fallback.\n    *   Adjusted API rate limiting parameters for better stability.\n    *   Fixed sync animation rotation direction.\n    *   Fixed walking from the correct `remoteBaseDir`.\n    *   Fixed `getDirectoryContents` to handle server base paths correctly.\n*   **Conflict Handling**\n    *   Added selectable conflict resolution strategies.\n    *   Added conflict markers (supporting Git style and customization), preserving original content formatting.\n    *   Added skipping of blank file conflicts.\n    *   Improved conflict resolution to support optional local and remote file stats.\n*   **File Handling**\n    *   Added file size to file properties.\n    *   Added pagination support for getting directory contents.\n    *   Fixed handling of empty file stats in the file system.\n*   **Other**\n    *   Added plugin icons.\n    *   Added English and Chinese documentation, including a sync flowchart.\n    *   Fixed automatic word wrapping issues.\n    *   Updated plugin name.\n\n## [0.0.2] - 2025-03-07\n\n*   **WebDAV:**\n    *   新增 WebDAV 文件浏览器功能。\n    *   为 WebDAV 配置添加远程基础目录选择器。\n    *   支持通过环境变量配置 WebDAV。\n    *   提升 WebDAV 可靠性与性能（改进令牌处理、避免重复创建目录、修复 `nextLink` 解码问题）。\n*   **用户界面与体验:**\n    *   移除同步模态框（SyncModal）组件。\n    *   改进移动端适配。\n    *   更新坚果云（Nutstore）设置界面。\n    *   统一界面文本的大小写。\n*   **其他:**\n    *   为中文用户添加了帮助说明。\n    *   修复了访问 `configDir` 中配置值的问题。\n\n*   **WebDAV:**\n    *   Added a WebDAV file explorer feature.\n    *   Added a remote base directory selector for WebDAV configuration.\n    *   Enabled WebDAV configuration via environment variables.\n    *   Enhanced WebDAV reliability and performance (improved token handling, avoided duplicate mkdir, fixed `nextLink` decoding).\n*   **User Interface & Experience:**\n    *   Removed the SyncModal component.\n    *   Improved mobile adaptability.\n    *   Updated the Nutstore Setting Tab UI.\n    *   Standardized capitalization in UI text.\n*   **Other:**\n    *   Added Chinese help documentation (`help` for zh).\n    *   Fixed accessing configured value from `configDir`.\n\n## [0.0.1] - 2025-02-26\n\n*   新增 WebDAV 及本地文件同步功能，包括文件和文件夹的遍历、创建、删除（支持递归删除）以及基础的冲突解决机制。\n*   改进同步冲突处理：增加解决策略，支持跳过空文件冲突，并在解决后更新记录。\n*   增强同步用户体验：\n    *   增加同步状态管理、进度百分比显示、加载动画（修复了旋转方向）及完成后的失败任务计数。\n    *   增加同步过程中的通知提示和本地化错误信息。\n    *   添加取消/停止同步按钮。\n    *   优化了同步状态的 UI 显示并添加了图标。\n*   引入国际化 (i18n) 支持和语言切换功能。\n*   添加 SSO (单点登录) 相关界面（后已隐藏）。\n*   优化同步设置：远程目录将回退使用仓库名称。\n*   修复了同步中处理服务器基本路径、空文件统计信息等问题。\n\n*   Added basic file synchronization for WebDAV and local vaults, including traversal, creation, deletion (with recursive support), and basic conflict resolution.\n*   Improved sync conflict handling: added resolution strategies, support for skipping blank file conflicts, and record updates after resolution.\n*   Enhanced sync user experience:\n    *   Added sync state management, progress percentage display, loading animation (fixed rotation direction), and failed task count on completion.\n    *   Added notifications during sync and localized error messages.\n    *   Added a cancel/stop sync button.\n    *   Improved the sync status UI and added icons.\n*   Introduced internationalization (i18n) support and language switching functionality.\n*   Added SSO (Single Sign-On) related UI (later hidden).\n*   Improved sync setup: Remote base directory now falls back to using the vault name.\n*   Fixed issues related to handling server base paths, empty file stats, etc., during synchronization.\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>."
  },
  {
    "path": "README.md",
    "content": "# 🔄 Nutstore Sync\n\n## 简介 | Introduction\n\n此插件允许您通过 WebDAV 协议将 Obsidian 笔记与坚果云进行双向同步。\n_This plugin enables two-way synchronization between Obsidian notes and Nutstore via WebDAV protocol._\n\n---\n\n## ✨ 主要特性 | Key Features\n\n- 🔄 **双向同步 | Two-way Sync**\n  高效地在多设备间同步笔记。\n  _Efficiently synchronize your notes across devices._\n- ⚡ **增量同步 | Incremental Sync**\n  只传输更改过的文件，使大型笔记库也能快速同步。\n  _Fast updates that only transfer changed files, making large vaults sync quickly._\n- 🔐 **单点登录 | Single Sign-On**\n  通过简单授权连接坚果云，无需手动输入 WebDAV 凭据。\n  _Connect to Nutstore with simple authorization instead of manually entering WebDAV credentials._\n- 📁 **WebDAV 文件浏览器 | WebDAV Explorer**\n  远程文件管理的可视化界面。\n  _Visual file browser for remote file management._\n- 🔀 **智能冲突解决 | Smart Conflict Resolution**\n  字符级比较自动合并可能的更改；支持基于时间戳的解决方案（最新文件优先）。\n  _Character-level comparison to automatically merge changes when possible. Option to use timestamp-based resolution (newest file wins)._\n- 🚀 **宽松同步模式 | Loose Sync Mode**\n  优化对包含数千笔记的仓库的性能。\n  _Optimize performance for vaults with thousands of notes._\n- 📦 **大文件处理 | Large File Handling**\n  设置大小限制以跳过大文件，提升性能。\n  _Set size limits to skip large files for better performance._\n- 📊 **同步状态跟踪 | Sync Status Tracking**\n  清晰的同步进度和完成提示。\n  _Clear visual indicators of sync progress and completion._\n- 📝 **详细日志 | Detailed Logging**\n  全面的故障排查日志。\n  _Comprehensive logs for troubleshooting._\n- 🤖 **AI 智能助手 | AI Agent**\n  内置 AI 助手，可通过自然语言读取、编辑和管理 Vault 中的文件。\n  _Built-in AI assistant that can read, edit, and manage files in your vault through natural language._\n\n---\n\n## 🤖 AI 智能助手 | AI Agent\n\nAI 助手是一个内置的智能代理，让你通过自然语言管理 Obsidian Vault。支持任意兼容 OpenAI 接口的服务商，可自主完成复杂的多步骤任务。\n_The AI Agent is a built-in assistant that lets you manage your Obsidian vault through natural language. It supports any OpenAI-compatible provider and can handle complex, multi-step tasks autonomously._\n\nAgent 在做出任何更改前都会请求用户确认。你可以逐条批准、按操作类型批准当前会话，或在设置中开启 *YOLO 模式* 全部自动通过。\n_Before the agent makes any changes, it asks for your approval. You can approve individual operations, approve an operation type for the entire session, or enable _YOLO mode_ in settings to auto-approve everything._\n\n**配置方法 | Setup：**\n\n1. 打开插件设置 → **AI** 标签页\n   _Open plugin settings → **AI** tab_\n2. 添加 AI 服务商（支持任意兼容 OpenAI 接口的端点）并填写模型名称\n   _Add an AI provider (any OpenAI-compatible endpoint) and fill in the model name_\n3. 从左侧边栏打开 AI 对话框，开始对话\n   _Open the AI chat panel from the left sidebar and start chatting_\n\n---\n\n## ⚠️ 注意事项 | Important Notes\n\n- ⏳ **首次同步 | Initial Sync**\n  首次同步可能需要较长时间（文件比较多时）。\n  _Initial sync may take longer (especially with many files)._\n- 💾 **数据备份 | Backup**\n  请在同步之前备份。\n  _Please backup before syncing._\n"
  },
  {
    "path": "esbuild.config.mjs",
    "content": "import postcss from '@deanc/esbuild-plugin-postcss'\nimport UnoCSS from '@unocss/postcss'\nimport dotenv from 'dotenv'\nimport esbuild from 'esbuild'\nimport fs, { readFileSync } from 'fs'\nimport postcssMergeRules from 'postcss-merge-rules'\nimport process from 'process'\n\nconst pkgJson = JSON.parse(readFileSync('./package.json', 'utf-8'))\ndotenv.config()\n\nconst prod = process.argv[2] === 'production'\n\nconst renamePlugin = {\n\tname: 'rename-plugin',\n\tsetup(build) {\n\t\tbuild.onEnd(async () => {\n\t\t\tconst source = prod ? './dist/main.css' : './main.css'\n\t\t\tif (fs.existsSync(source)) {\n\t\t\t\tfs.renameSync(source, './styles.css')\n\t\t\t}\n\t\t})\n\t},\n}\n\nconst context = await esbuild.context({\n\tentryPoints: ['src/index.ts'],\n\tbundle: true,\n\texternal: [\n\t\t'obsidian',\n\t\t'electron',\n\t\t'@codemirror/autocomplete',\n\t\t'@codemirror/collab',\n\t\t'@codemirror/commands',\n\t\t'@codemirror/language',\n\t\t'@codemirror/lint',\n\t\t'@codemirror/search',\n\t\t'@codemirror/state',\n\t\t'@codemirror/view',\n\t\t'@lezer/common',\n\t\t'@lezer/highlight',\n\t\t'@lezer/lr',\n\t],\n\tdefine: {\n\t\t'process.env.NS_NSDAV_ENDPOINT': JSON.stringify(\n\t\t\tprocess.env.NS_NSDAV_ENDPOINT,\n\t\t),\n\t\t'process.env.NS_DAV_ENDPOINT': JSON.stringify(process.env.NS_DAV_ENDPOINT),\n\t\t'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || ''),\n\t\t'process.env.PLUGIN_VERSION': JSON.stringify(pkgJson.version),\n\t},\n\tformat: 'cjs',\n\ttarget: 'es2018',\n\tlogLevel: 'info',\n\tsourcemap: prod ? false : 'inline',\n\ttreeShaking: true,\n\toutfile: prod ? 'dist/main.js' : 'main.js',\n\tminify: prod,\n\tplatform: 'browser',\n\tplugins: [\n\t\tpostcss({\n\t\t\tplugins: [UnoCSS(), postcssMergeRules()],\n\t\t}),\n\t\trenamePlugin,\n\t],\n\talias: {\n\t\t'node:zlib': './src/shims/node-zlib.ts',\n\t},\n})\n\nif (prod) {\n\tawait context.rebuild()\n\tprocess.exit(0)\n} else {\n\tawait context.watch()\n}\n"
  },
  {
    "path": "manifest.json",
    "content": "{\n\t\"id\": \"nutstore-sync\",\n\t\"name\": \"Nutstore Sync\",\n\t\"version\": \"1.2.1\",\n\t\"minAppVersion\": \"0.15.0\",\n\t\"description\": \"Sync your vault with Nutstore/坚果云 using WebDAV protocol.\",\n\t\"author\": \"nutstore\",\n\t\"authorUrl\": \"https://github.com/nutstore\",\n\t\"isDesktopOnly\": false\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"name\": \"obsidian-nutstore-sync\",\n\t\"version\": \"1.2.1\",\n\t\"main\": \"main.js\",\n\t\"scripts\": {\n\t\t\"dev\": \"run-p dev:*\",\n\t\t\"dev:plugin\": \"node esbuild.config.mjs\",\n\t\t\"dev:chatbox\": \"pnpm --filter chatbox dev\",\n\t\t\"dev:webdav-explorer\": \"pnpm --filter webdav-explorer dev\",\n\t\t\"build\": \"run-s build:webdav-explorer build:chatbox build:plugin\",\n\t\t\"build:chatbox\": \"pnpm --filter chatbox build\",\n\t\t\"build:webdav-explorer\": \"pnpm --filter webdav-explorer build\",\n\t\t\"build:plugin\": \"tsc -noEmit -skipLibCheck && node esbuild.config.mjs production && swc ./dist/main.js -o main.js\",\n\t\t\"version\": \"node version-bump.mjs && git add manifest.json versions.json\",\n\t\t\"test\": \"vitest\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@ai-sdk/openai\": \"^3.0.48\",\n\t\t\"@deanc/esbuild-plugin-postcss\": \"^1.0.2\",\n\t\t\"@electron/remote\": \"^2.1.2\",\n\t\t\"@nutstore/sso-js\": \"^0.0.8\",\n\t\t\"@swc/cli\": \"^0.7.9\",\n\t\t\"@swc/core\": \"^1.15.6\",\n\t\t\"@types/diff-match-patch\": \"^1.0.36\",\n\t\t\"@types/glob-to-regexp\": \"^0.4.4\",\n\t\t\"@types/lodash-es\": \"^4.17.12\",\n\t\t\"@types/node\": \"^16.11.6\",\n\t\t\"@types/path-browserify\": \"^1.0.3\",\n\t\t\"@types/ramda\": \"^0.30.2\",\n\t\t\"@typescript-eslint/eslint-plugin\": \"5.29.0\",\n\t\t\"@typescript-eslint/parser\": \"5.29.0\",\n\t\t\"@unocss/postcss\": \"66.1.0-beta.3\",\n\t\t\"@vitest/coverage-v8\": \"^3.1.2\",\n\t\t\"ai\": \"^6.0.149\",\n\t\t\"assert\": \"^2.1.0\",\n\t\t\"async-mutex\": \"^0.5.0\",\n\t\t\"blob-polyfill\": \"^9.0.20240710\",\n\t\t\"bottleneck\": \"^2.19.5\",\n\t\t\"buffer\": \"^6.0.3\",\n\t\t\"builtin-modules\": \"3.3.0\",\n\t\t\"bytes-iec\": \"^3.1.1\",\n\t\t\"chatbox\": \"workspace: *\",\n\t\t\"consola\": \"^3.4.0\",\n\t\t\"core-js\": \"^3.41.0\",\n\t\t\"crypto-browserify\": \"^3.12.1\",\n\t\t\"diff-match-patch\": \"^1.0.5\",\n\t\t\"dotenv\": \"^16.4.7\",\n\t\t\"esbuild\": \"0.17.3\",\n\t\t\"esbuild-sass-plugin\": \"^3.3.1\",\n\t\t\"fast-xml-parser\": \"^4.5.1\",\n\t\t\"fflate\": \"^0.8.2\",\n\t\t\"glob-to-regexp\": \"^0.4.1\",\n\t\t\"hash-wasm\": \"^4.12.0\",\n\t\t\"html-entities\": \"^2.6.0\",\n\t\t\"http-status-codes\": \"^2.3.0\",\n\t\t\"i18next\": \"^24.2.2\",\n\t\t\"js-base64\": \"^3.7.7\",\n\t\t\"just-bash\": \"^2.14.0\",\n\t\t\"localforage\": \"^1.10.0\",\n\t\t\"lodash-es\": \"^4.17.21\",\n\t\t\"node-diff3\": \"^3.1.2\",\n\t\t\"npm-run-all2\": \"^7.0.2\",\n\t\t\"obsidian\": \"latest\",\n\t\t\"ohash\": \"^1.1.4\",\n\t\t\"path-browserify\": \"^1.0.1\",\n\t\t\"postcss-merge-rules\": \"^7.0.4\",\n\t\t\"prettier\": \"^3.5.0\",\n\t\t\"ramda\": \"^0.30.1\",\n\t\t\"rxjs\": \"^7.8.1\",\n\t\t\"stream-browserify\": \"^3.0.0\",\n\t\t\"superjson\": \"^2.2.2\",\n\t\t\"tslib\": \"2.4.0\",\n\t\t\"typescript\": \"^5.9.3\",\n\t\t\"unocss\": \"66.1.0-beta.3\",\n\t\t\"uuid\": \"^13.0.0\",\n\t\t\"vitest\": \"^3.1.2\",\n\t\t\"webdav\": \"^5.7.1\",\n\t\t\"webdav-explorer\": \"workspace: *\",\n\t\t\"zod\": \"^4.3.6\"\n\t},\n\t\"browser\": {\n\t\t\"path\": \"path-browserify\",\n\t\t\"stream\": \"stream-browserify\",\n\t\t\"buffer\": \"buffer\",\n\t\t\"crypto\": \"crypto-browserify\"\n\t}\n}"
  },
  {
    "path": "packages/chatbox/package.json",
    "content": "{\n\t\"name\": \"chatbox\",\n\t\"version\": \"0.0.0\",\n\t\"type\": \"module\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": \"./dist/index.d.ts\",\n\t\t\t\"import\": \"./dist/index.js\"\n\t\t}\n\t},\n\t\"module\": \"./dist/index.js\",\n\t\"types\": \"./dist/index.d.ts\",\n\t\"files\": [\n\t\t\"dist\"\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"rslib build\",\n\t\t\"dev\": \"rslib build --watch\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@rsbuild/plugin-babel\": \"^1.0.4\",\n\t\t\"@rsbuild/plugin-solid\": \"^1.0.5\",\n\t\t\"@rslib/core\": \"^0.5.3\",\n\t\t\"@solid-primitives/i18n\": \"^2.2.0\",\n\t\t\"@solid-primitives/media\": \"^2.3.0\",\n\t\t\"@unocss/postcss\": \"66.1.0-beta.3\",\n\t\t\"typescript\": \"^5.8.2\",\n\t\t\"unocss\": \"66.1.0-beta.3\"\n\t},\n\t\"dependencies\": {\n\t\t\"solid-js\": \"^1.9.5\"\n\t}\n}\n"
  },
  {
    "path": "packages/chatbox/postcss.config.mjs",
    "content": "import UnoCSS from '@unocss/postcss'\n\nexport default {\n\tplugins: [UnoCSS()],\n}\n"
  },
  {
    "path": "packages/chatbox/rslib.config.ts",
    "content": "import { pluginBabel } from '@rsbuild/plugin-babel'\nimport { pluginSolid } from '@rsbuild/plugin-solid'\nimport { defineConfig } from '@rslib/core'\n\nexport default defineConfig({\n\tsource: {\n\t\tentry: {\n\t\t\tindex: ['./src/**'],\n\t\t},\n\t},\n\ttools: {\n\t\trspack: {\n\t\t\tplugins: [],\n\t\t},\n\t},\n\tlib: [\n\t\t{\n\t\t\tbundle: false,\n\t\t\tdts: true,\n\t\t\tformat: 'esm',\n\t\t},\n\t],\n\toutput: {\n\t\ttarget: 'web',\n\t},\n\tplugins: [\n\t\tpluginBabel({\n\t\t\tinclude: /\\.(?:jsx|tsx)$/,\n\t\t}),\n\t\tpluginSolid(),\n\t],\n})\n"
  },
  {
    "path": "packages/chatbox/src/App.tsx",
    "content": "import {\n\tFor,\n\tMatch,\n\tShow,\n\tSwitch,\n\tcreateEffect,\n\tcreateSignal,\n\tonCleanup,\n} from 'solid-js'\nimport { ConfirmDialog } from './components/ConfirmDialog'\nimport { FragmentDivider } from './components/FragmentDivider'\nimport { MessageCard } from './components/MessageCard'\nimport { PaneResizer } from './components/PaneResizer'\nimport { PendingList } from './components/PendingList'\nimport { RunStateCard } from './components/RunStateCard'\nimport { SessionHistoryItem } from './components/SessionHistoryItem'\nimport { TasksPanel } from './components/TasksPanel'\nimport { t } from './i18n'\nimport type {\n\tChatTimelineFragmentItem,\n\tChatTimelineMessageItem,\n\tChatboxProps,\n} from './types'\n\nexport type AppProps = ChatboxProps\n\nconst DESKTOP_RESIZE_MEDIA_QUERY = '(pointer: fine) and (min-width: 1024px)'\nconst INPUT_HEIGHT_STORAGE_KEY = 'nutstore-sync.chatbox.desktop-input-height'\nconst DEFAULT_DESKTOP_INPUT_HEIGHT = 184\nconst DESKTOP_INPUT_MIN_HEIGHT = 120\nconst DESKTOP_INPUT_ABSOLUTE_MIN_HEIGHT = 72\nconst DESKTOP_MESSAGES_MIN_HEIGHT = 200\nconst RESIZER_HITBOX_HEIGHT = 10\nconst DESKTOP_INPUT_MAX_VIEWPORT_RATIO = 0.6\n\nfunction App(props: AppProps) {\n\tconst [input, setInput] = createSignal('')\n\tconst [isComposing, setIsComposing] = createSignal(false)\n\tconst [historyOpen, setHistoryOpen] = createSignal(false)\n\tconst [tasksOpen, setTasksOpen] = createSignal(false)\n\tconst [modelPickerOpen, setModelPickerOpen] = createSignal(false)\n\tconst [sessionPendingDeleteId, setSessionPendingDeleteId] =\n\t\tcreateSignal<string>()\n\tconst [pendingDeleteMessage, setPendingDeleteMessage] =\n\t\tcreateSignal<ChatTimelineMessageItem>()\n\tconst [pendingRegenerateMessage, setPendingRegenerateMessage] =\n\t\tcreateSignal<ChatTimelineMessageItem>()\n\tconst [pendingRecallMessage, setPendingRecallMessage] =\n\t\tcreateSignal<ChatTimelineMessageItem>()\n\tconst [desktopResizeEnabled, setDesktopResizeEnabled] = createSignal(false)\n\tconst [inputPaneHeight, setInputPaneHeight] = createSignal<number>()\n\tlet messagesEl: HTMLDivElement | undefined\n\tlet splitLayoutEl: HTMLDivElement | undefined\n\tlet inputPaneEl: HTMLDivElement | undefined\n\tlet historyEl: HTMLDivElement | undefined\n\tlet modelPickerEl: HTMLDivElement | undefined\n\tlet previousActiveSessionId = props.activeSessionId\n\tlet defaultDesktopInputHeight = DEFAULT_DESKTOP_INPUT_HEIGHT\n\tlet dragStartHeight = 0\n\n\tconst hasTasks = () =>\n\t\tprops.currentSessionTasks.length + props.otherSessionTasks.length > 0\n\tconst runningTaskCount = () =>\n\t\tprops.currentSessionTasks.filter((task) => task.status === 'running')\n\t\t\t.length +\n\t\tprops.otherSessionTasks.filter((task) => task.status === 'running').length\n\tconst isBusy = () => props.runState !== 'idle'\n\tconst selectedProvider = () =>\n\t\tprops.providers.find((provider) => provider.id === props.selectedProviderId)\n\tconst modelPickerLabel = () => {\n\t\tconst provider = selectedProvider()\n\t\tconst selectedModel = provider?.models.find(\n\t\t\t(model) => model.id === props.selectedModelId,\n\t\t)\n\t\treturn (\n\t\t\t[provider?.name, selectedModel?.name].filter(Boolean).join('/') ||\n\t\t\tt('noModel')\n\t\t)\n\t}\n\n\tfunction readStoredInputPaneHeight() {\n\t\ttry {\n\t\t\tconst raw = window.localStorage.getItem(INPUT_HEIGHT_STORAGE_KEY)\n\t\t\tif (!raw) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tconst value = Number(raw)\n\t\t\treturn Number.isFinite(value) ? value : undefined\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t}\n\n\tfunction persistInputPaneHeight(height: number) {\n\t\ttry {\n\t\t\twindow.localStorage.setItem(\n\t\t\t\tINPUT_HEIGHT_STORAGE_KEY,\n\t\t\t\tString(Math.round(height)),\n\t\t\t)\n\t\t} catch {\n\t\t\t// Ignore storage errors, resize should still work.\n\t\t}\n\t}\n\n\tfunction getMaxInputPaneHeight() {\n\t\tconst viewportMax = Math.floor(\n\t\t\twindow.innerHeight * DESKTOP_INPUT_MAX_VIEWPORT_RATIO,\n\t\t)\n\t\tconst splitHeight = splitLayoutEl?.getBoundingClientRect().height ?? 0\n\t\tif (splitHeight <= 0) {\n\t\t\treturn Math.max(DESKTOP_INPUT_MIN_HEIGHT, viewportMax)\n\t\t}\n\t\tconst messagesBound = Math.floor(\n\t\t\tsplitHeight - DESKTOP_MESSAGES_MIN_HEIGHT - RESIZER_HITBOX_HEIGHT,\n\t\t)\n\t\tconst maxHeight = Math.min(messagesBound, viewportMax)\n\t\treturn Math.max(DESKTOP_INPUT_ABSOLUTE_MIN_HEIGHT, maxHeight)\n\t}\n\n\tfunction clampInputPaneHeight(height: number) {\n\t\tconst maxHeight = getMaxInputPaneHeight()\n\t\tconst minHeight = Math.min(DESKTOP_INPUT_MIN_HEIGHT, maxHeight)\n\t\treturn Math.round(Math.min(Math.max(height, minHeight), maxHeight))\n\t}\n\n\tfunction applyInputPaneHeight(height: number, persist = false) {\n\t\tconst next = clampInputPaneHeight(height)\n\t\tsetInputPaneHeight(next)\n\t\tif (persist) {\n\t\t\tpersistInputPaneHeight(next)\n\t\t}\n\t\treturn next\n\t}\n\n\tfunction resetInputPaneHeight() {\n\t\tif (!desktopResizeEnabled()) {\n\t\t\treturn\n\t\t}\n\t\tapplyInputPaneHeight(defaultDesktopInputHeight, true)\n\t}\n\n\tfunction onInputPaneResizeStart() {\n\t\tif (!desktopResizeEnabled()) {\n\t\t\treturn\n\t\t}\n\t\tdragStartHeight =\n\t\t\tinputPaneHeight() ?? clampInputPaneHeight(defaultDesktopInputHeight)\n\t}\n\n\tfunction onInputPaneResize(deltaY: number) {\n\t\tif (!desktopResizeEnabled()) {\n\t\t\treturn\n\t\t}\n\t\tapplyInputPaneHeight(dragStartHeight + deltaY)\n\t}\n\n\tfunction onInputPaneResizeEnd() {\n\t\tconst height = inputPaneHeight()\n\t\tif (typeof height === 'number') {\n\t\t\tpersistInputPaneHeight(height)\n\t\t}\n\t}\n\n\tfunction scrollMessagesToBottom(behavior: ScrollBehavior = 'smooth') {\n\t\trequestAnimationFrame(() => {\n\t\t\tif (!messagesEl) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tmessagesEl.scrollTo({\n\t\t\t\ttop: messagesEl.scrollHeight,\n\t\t\t\tbehavior,\n\t\t\t})\n\t\t})\n\t}\n\n\tcreateEffect(() => {\n\t\tconst activeSessionId = props.activeSessionId\n\t\tprops.timeline.length\n\t\tprops.currentSessionTasks.length\n\t\tprops.otherSessionTasks.length\n\t\tprops.pendingMessages.length\n\t\tprops.runState\n\t\tconst behavior =\n\t\t\tpreviousActiveSessionId !== activeSessionId ? 'auto' : 'smooth'\n\t\tpreviousActiveSessionId = activeSessionId\n\t\tscrollMessagesToBottom(behavior)\n\t})\n\n\tcreateEffect(() => {\n\t\tif (!hasTasks() && tasksOpen()) {\n\t\t\tsetTasksOpen(false)\n\t\t}\n\t})\n\n\tcreateEffect(() => {\n\t\tif (!historyOpen() && !modelPickerOpen()) {\n\t\t\treturn\n\t\t}\n\n\t\tconst onPointerDown = (event: PointerEvent) => {\n\t\t\tconst target = event.target\n\t\t\tif (!(target instanceof Node)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (historyEl?.contains(target) || modelPickerEl?.contains(target)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tsetHistoryOpen(false)\n\t\t\tsetModelPickerOpen(false)\n\t\t}\n\n\t\tdocument.addEventListener('pointerdown', onPointerDown)\n\t\tonCleanup(() => document.removeEventListener('pointerdown', onPointerDown))\n\t})\n\n\tcreateEffect(() => {\n\t\tconst mediaQuery = window.matchMedia(DESKTOP_RESIZE_MEDIA_QUERY)\n\t\tconst update = () => setDesktopResizeEnabled(mediaQuery.matches)\n\t\tupdate()\n\t\tmediaQuery.addEventListener('change', update)\n\t\tonCleanup(() => mediaQuery.removeEventListener('change', update))\n\t})\n\n\tcreateEffect(() => {\n\t\tif (!desktopResizeEnabled() || !inputPaneEl) {\n\t\t\treturn\n\t\t}\n\t\tdefaultDesktopInputHeight =\n\t\t\tMath.round(inputPaneEl.getBoundingClientRect().height) ||\n\t\t\tDEFAULT_DESKTOP_INPUT_HEIGHT\n\t\tconst storedHeight = readStoredInputPaneHeight()\n\t\tapplyInputPaneHeight(storedHeight ?? defaultDesktopInputHeight)\n\t})\n\n\tcreateEffect(() => {\n\t\tif (desktopResizeEnabled()) {\n\t\t\treturn\n\t\t}\n\t\tsetInputPaneHeight(undefined)\n\t})\n\n\tcreateEffect(() => {\n\t\tif (!desktopResizeEnabled()) {\n\t\t\treturn\n\t\t}\n\t\tconst onResize = () => {\n\t\t\tconst height = inputPaneHeight()\n\t\t\tif (typeof height !== 'number') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst clampedHeight = clampInputPaneHeight(height)\n\t\t\tif (clampedHeight !== height) {\n\t\t\t\tapplyInputPaneHeight(clampedHeight, true)\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener('resize', onResize)\n\t\tonCleanup(() => window.removeEventListener('resize', onResize))\n\t})\n\n\tasync function submit() {\n\t\tconst text = input().trim()\n\t\tif (!text || !props.canSend) {\n\t\t\treturn\n\t\t}\n\t\tsetInput('')\n\t\tscrollMessagesToBottom('auto')\n\t\tawait props.onSendMessage(text)\n\t}\n\n\tasync function confirmDeleteSession() {\n\t\tconst sessionId = sessionPendingDeleteId()\n\t\tif (!sessionId) {\n\t\t\treturn\n\t\t}\n\t\tsetSessionPendingDeleteId(undefined)\n\t\tawait props.onDeleteSession(sessionId)\n\t}\n\n\tconst requestDeleteMessage = props.onDeleteMessage\n\t\t? (messageId: string) => {\n\t\t\t\tconst item = props.timeline.find(\n\t\t\t\t\t(i): i is ChatTimelineMessageItem =>\n\t\t\t\t\t\ti.kind === 'message' && i.message.id === messageId,\n\t\t\t\t)\n\t\t\t\tif (!item) return\n\t\t\t\tsetPendingDeleteMessage(item)\n\t\t\t}\n\t\t: undefined\n\n\tconst requestRegenerateMessage = props.onRegenerateMessage\n\t\t? (messageId: string) => {\n\t\t\t\tconst item = props.timeline.find(\n\t\t\t\t\t(i): i is ChatTimelineMessageItem =>\n\t\t\t\t\t\ti.kind === 'message' && i.message.id === messageId,\n\t\t\t\t)\n\t\t\t\tif (!item) return\n\t\t\t\tsetPendingRegenerateMessage(item)\n\t\t\t}\n\t\t: undefined\n\n\tconst requestRecallMessage = props.onRecallMessage\n\t\t? (messageId: string) => {\n\t\t\t\tconst item = props.timeline.find(\n\t\t\t\t\t(i): i is ChatTimelineMessageItem =>\n\t\t\t\t\t\ti.kind === 'message' && i.message.id === messageId,\n\t\t\t\t)\n\t\t\t\tif (!item) return\n\t\t\t\tsetPendingRecallMessage(item)\n\t\t\t}\n\t\t: undefined\n\n\tasync function doRecallMessage(\n\t\titem: ChatTimelineMessageItem,\n\t\toptions?: { restoreFiles?: boolean },\n\t) {\n\t\tconst text = (item.message.message.content ?? [])\n\t\t\t.filter((p) => p.type === 'text')\n\t\t\t.map((p) => (p as { type: 'text'; text: string }).text)\n\t\t\t.join('\\n')\n\t\tsetInput(text)\n\t\tawait props.onRecallMessage?.(item.message.id, options)\n\t}\n\n\tasync function confirmRecallMessage() {\n\t\tconst item = pendingRecallMessage()\n\t\tif (!item) return\n\t\tsetPendingRecallMessage(undefined)\n\t\tawait doRecallMessage(item)\n\t}\n\n\tfunction confirmRegenerateMessage() {\n\t\tconst item = pendingRegenerateMessage()\n\t\tif (!item) return\n\t\tsetPendingRegenerateMessage(undefined)\n\t\tprops.onRegenerateMessage?.(item.message.id)\n\t}\n\n\tfunction confirmDeleteMessage() {\n\t\tconst item = pendingDeleteMessage()\n\t\tif (!item) return\n\t\tsetPendingDeleteMessage(undefined)\n\t\tprops.onDeleteMessage?.(item.message.id)\n\t}\n\n\tconst deleteMessageConfirmText = () => {\n\t\tconst item = pendingDeleteMessage()\n\t\tif (!item) return ''\n\t\tswitch (item.message.message.role) {\n\t\t\tcase 'user':\n\t\t\t\treturn t('deleteUserMessageConfirm')\n\t\t\tcase 'tool':\n\t\t\t\treturn t('deleteToolMessageConfirm')\n\t\t\tdefault:\n\t\t\t\treturn t('deleteAssistantMessageConfirm')\n\t\t}\n\t}\n\n\tconst deleteMessageHasReversibleOps = () =>\n\t\tBoolean(pendingDeleteMessage()?.message.reversibleOps?.length)\n\n\tconst recallHasReversibleOps = () => {\n\t\tconst item = pendingRecallMessage()\n\t\tif (!item) return false\n\t\tlet seenTarget = false\n\t\tfor (const timelineItem of props.timeline) {\n\t\t\tif (timelineItem.kind !== 'message') {\n\t\t\t\tif (seenTarget) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!seenTarget) {\n\t\t\t\tseenTarget = timelineItem.message.id === item.message.id\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (timelineItem.message.reversibleOps?.length) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn item.message.reversibleOps?.length ? true : false\n\t}\n\n\tasync function confirmRecallAndRestoreMessage() {\n\t\tconst item = pendingRecallMessage()\n\t\tif (!item) return\n\t\tsetPendingRecallMessage(undefined)\n\t\tawait doRecallMessage(item, { restoreFiles: true })\n\t}\n\n\treturn (\n\t\t<div class=\"relative flex h-full overflow-hidden bg-[var(--background-primary)] text-[var(--text-normal)]\">\n\t\t\t<div class=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n\t\t\t\t{/* Header */}\n\t\t\t\t<div class=\"relative flex shrink-0 items-center gap-2 border-b border-[var(--background-modifier-border)] px-3 py-3\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetHistoryOpen((value) => !value)\n\t\t\t\t\t\t\tsetModelPickerOpen(false)\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t('history')}\n\t\t\t\t\t</button>\n\t\t\t\t\t<div class=\"min-w-0 flex-1 truncate text-sm font-semibold\">\n\t\t\t\t\t\t{props.title || t('newChat')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<Show when={hasTasks()}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"mod-cta\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => setTasksOpen((value) => !value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t('tasks')} ({runningTaskCount()})\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Show>\n\t\t\t\t\t<div class=\"relative\" ref={modelPickerEl}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"max-w-56 min-w-34 rounded-2 border border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] px-3 py-2 text-left text-sm hover:bg-[var(--background-modifier-hover)]\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tsetModelPickerOpen((value) => !value)\n\t\t\t\t\t\t\t\tsetHistoryOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"truncate\">{modelPickerLabel()}</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<Show when={modelPickerOpen()}>\n\t\t\t\t\t\t\t<div class=\"absolute right-0 top-12 z-10 w-72 rounded-3 border border-[var(--background-modifier-border)] bg-[var(--background-primary)] p-3 shadow-lg\">\n\t\t\t\t\t\t\t\t<div class=\"mb-2 text-xs text-[var(--text-muted)]\">\n\t\t\t\t\t\t\t\t\t{t('provider')}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t\t\t\tvalue={props.selectedProviderId || ''}\n\t\t\t\t\t\t\t\t\tonChange={(event) =>\n\t\t\t\t\t\t\t\t\t\tprops.onSelectProvider(event.currentTarget.value)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<option value=\"\">{t('noProvider')}</option>\n\t\t\t\t\t\t\t\t\t<For each={props.providers}>\n\t\t\t\t\t\t\t\t\t\t{(provider) => (\n\t\t\t\t\t\t\t\t\t\t\t<option value={provider.id}>{provider.name}</option>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</For>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t<div class=\"mb-2 mt-3 text-xs text-[var(--text-muted)]\">\n\t\t\t\t\t\t\t\t\t{t('model')}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t\t\t\tvalue={props.selectedModelId || ''}\n\t\t\t\t\t\t\t\t\tdisabled={!selectedProvider()?.models.length || isBusy()}\n\t\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\t\tprops.onSelectModel(event.currentTarget.value)\n\t\t\t\t\t\t\t\t\t\tsetModelPickerOpen(false)\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<option value=\"\">{t('noModel')}</option>\n\t\t\t\t\t\t\t\t\t<For each={selectedProvider()?.models || []}>\n\t\t\t\t\t\t\t\t\t\t{(model) => <option value={model.id}>{model.name}</option>}\n\t\t\t\t\t\t\t\t\t</For>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Show>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Show when={historyOpen()}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={historyEl}\n\t\t\t\t\t\t\tclass=\"absolute left-3 top-12 z-10 w-80 overflow-hidden rounded-4 border border-[var(--background-modifier-border)] bg-[var(--background-primary)] shadow-lg\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"border-b border-[var(--background-modifier-border)] px-4 py-3\">\n\t\t\t\t\t\t\t\t<div class=\"flex items-center justify-between gap-3\">\n\t\t\t\t\t\t\t\t\t<div class=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"text-sm font-semibold text-[var(--text-normal)]\">\n\t\t\t\t\t\t\t\t\t\t\t{t('history')}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"rounded-2 border border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] px-3 py-2 text-sm hover:bg-[var(--background-modifier-hover)]\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tprops.onNewSession()\n\t\t\t\t\t\t\t\t\t\t\tsetHistoryOpen(false)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{t('newChat')}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"max-h-80 overflow-auto p-3 scrollbar-default\">\n\t\t\t\t\t\t\t\t<div class=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t<For each={props.sessionHistory}>\n\t\t\t\t\t\t\t\t\t\t{(session) => (\n\t\t\t\t\t\t\t\t\t\t\t<SessionHistoryItem\n\t\t\t\t\t\t\t\t\t\t\t\tsession={session}\n\t\t\t\t\t\t\t\t\t\t\t\tisActive={session.id === props.activeSessionId}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(sessionId) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tprops.onSwitchSession(sessionId)\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetHistoryOpen(false)\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tonDelete={(sessionId) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSessionPendingDeleteId(sessionId)\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</For>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Show>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tref={splitLayoutEl}\n\t\t\t\t\tclass=\"flex min-h-0 flex-1 flex-col overflow-hidden\"\n\t\t\t\t>\n\t\t\t\t\t{/* Messages */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={messagesEl}\n\t\t\t\t\t\tclass=\"min-h-0 flex-1 overflow-y-auto px-3 scrollbar-default\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Show\n\t\t\t\t\t\t\twhen={\n\t\t\t\t\t\t\t\tprops.timeline.length > 0 ||\n\t\t\t\t\t\t\t\tprops.pendingMessages.length > 0 ||\n\t\t\t\t\t\t\t\tisBusy()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<div class=\"flex h-full items-center justify-center text-sm text-[var(--text-muted)]\">\n\t\t\t\t\t\t\t\t\t{t('empty')}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t\t<For each={props.timeline}>\n\t\t\t\t\t\t\t\t\t{(item) => (\n\t\t\t\t\t\t\t\t\t\t<Switch>\n\t\t\t\t\t\t\t\t\t\t\t<Match when={item.kind === 'fragment'}>\n\t\t\t\t\t\t\t\t\t\t\t\t<FragmentDivider\n\t\t\t\t\t\t\t\t\t\t\t\t\titem={item as ChatTimelineFragmentItem}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</Match>\n\t\t\t\t\t\t\t\t\t\t\t<Match when={item.kind === 'message'}>\n\t\t\t\t\t\t\t\t\t\t\t\t<MessageCard\n\t\t\t\t\t\t\t\t\t\t\t\t\titem={item as ChatTimelineMessageItem}\n\t\t\t\t\t\t\t\t\t\t\t\t\trenderMarkdown={props.renderMarkdown}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonDeleteMessage={requestDeleteMessage}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonRegenerateMessage={requestRegenerateMessage}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonRecallMessage={requestRecallMessage}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</Match>\n\t\t\t\t\t\t\t\t\t\t</Switch>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</For>\n\t\t\t\t\t\t\t\t<RunStateCard\n\t\t\t\t\t\t\t\t\trunState={props.runState}\n\t\t\t\t\t\t\t\t\tonStop={props.onStopActiveRun}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<PendingList pendingMessages={props.pendingMessages} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Show>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Show when={desktopResizeEnabled()}>\n\t\t\t\t\t\t<PaneResizer\n\t\t\t\t\t\t\tonResizeStart={onInputPaneResizeStart}\n\t\t\t\t\t\t\tonResize={onInputPaneResize}\n\t\t\t\t\t\t\tonResizeEnd={onInputPaneResizeEnd}\n\t\t\t\t\t\t\tonDblClick={resetInputPaneHeight}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Show>\n\n\t\t\t\t\t{/* Input */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={inputPaneEl}\n\t\t\t\t\t\tclass={`chatbox-input-pane shrink-0 px-3 py-3 ${\n\t\t\t\t\t\t\tdesktopResizeEnabled()\n\t\t\t\t\t\t\t\t? 'chatbox-input-pane--resizable'\n\t\t\t\t\t\t\t\t: 'border-t border-[var(--background-modifier-border)]'\n\t\t\t\t\t\t}`}\n\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\tdesktopResizeEnabled() && typeof inputPaneHeight() === 'number'\n\t\t\t\t\t\t\t\t? { height: `${inputPaneHeight()}px` }\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tclass=\"chatbox-input w-full resize-none rounded-3 border border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] text-sm outline-none\"\n\t\t\t\t\t\t\tplaceholder={t('inputPlaceholder')}\n\t\t\t\t\t\t\tvalue={input()}\n\t\t\t\t\t\t\tonInput={(event) => setInput(event.currentTarget.value)}\n\t\t\t\t\t\t\tonCompositionStart={() => setIsComposing(true)}\n\t\t\t\t\t\t\tonCompositionEnd={() => setIsComposing(false)}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tevent.key === 'Enter' &&\n\t\t\t\t\t\t\t\t\t!event.shiftKey &&\n\t\t\t\t\t\t\t\t\t!isComposing() &&\n\t\t\t\t\t\t\t\t\t!event.isComposing &&\n\t\t\t\t\t\t\t\t\tevent.keyCode !== 229\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t\t\tvoid submit()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div class=\"mt-3 flex items-center justify-between gap-3\">\n\t\t\t\t\t\t\t<div class=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"chatbox-tag-button\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={!props.canCreateFragment}\n\t\t\t\t\t\t\t\t\tonClick={() => props.onNewFragment()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('newFragment')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"chatbox-tag-button\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={!props.canCompress}\n\t\t\t\t\t\t\t\t\tonClick={() => void props.onCompressContext()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t('compressContext')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"mod-cta\"\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tdisabled={!input().trim()}\n\t\t\t\t\t\t\t\tonClick={() => void submit()}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isBusy() ? t('queueSend') : t('send')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Tasks sidebar */}\n\t\t\t<Show when={tasksOpen()}>\n\t\t\t\t<TasksPanel\n\t\t\t\t\tcurrentSessionTasks={props.currentSessionTasks}\n\t\t\t\t\totherSessionTasks={props.otherSessionTasks}\n\t\t\t\t\tonCancelTask={props.onCancelTask}\n\t\t\t\t\tonClose={() => setTasksOpen(false)}\n\t\t\t\t/>\n\t\t\t</Show>\n\n\t\t\t{/* Delete session dialog */}\n\t\t\t<Show when={sessionPendingDeleteId()}>\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\ttitle={t('deleteSessionTitle')}\n\t\t\t\t\tmessage={t('deleteSessionMessage')}\n\t\t\t\t\tconfirmLabel={t('confirmDelete')}\n\t\t\t\t\tonCancel={() => setSessionPendingDeleteId(undefined)}\n\t\t\t\t\tonConfirm={() => void confirmDeleteSession()}\n\t\t\t\t/>\n\t\t\t</Show>\n\n\t\t\t{/* Delete message dialog */}\n\t\t\t<Show when={pendingDeleteMessage()}>\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\ttitle={t('deleteMessageTitle')}\n\t\t\t\t\tmessage={`${deleteMessageConfirmText()}${\n\t\t\t\t\t\tdeleteMessageHasReversibleOps()\n\t\t\t\t\t\t\t? `\\n\\n${t('deleteToolMessageRestoreWarning')}`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}`}\n\t\t\t\t\tconfirmLabel={t('confirmDelete')}\n\t\t\t\t\tonCancel={() => setPendingDeleteMessage(undefined)}\n\t\t\t\t\tonConfirm={confirmDeleteMessage}\n\t\t\t\t/>\n\t\t\t</Show>\n\n\t\t\t{/* Regenerate message dialog */}\n\t\t\t<Show when={pendingRegenerateMessage()}>\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\ttitle={t('regenerateMessageTitle')}\n\t\t\t\t\tmessage={t('regenerateMessageConfirm')}\n\t\t\t\t\tconfirmLabel={t('regenerateMessage')}\n\t\t\t\t\tonCancel={() => setPendingRegenerateMessage(undefined)}\n\t\t\t\t\tonConfirm={confirmRegenerateMessage}\n\t\t\t\t/>\n\t\t\t</Show>\n\n\t\t\t{/* Recall message dialog */}\n\t\t\t<Show when={pendingRecallMessage()}>\n\t\t\t\t<ConfirmDialog\n\t\t\t\t\ttitle={t('recallMessageTitle')}\n\t\t\t\t\tmessage={t('recallMessageConfirm')}\n\t\t\t\t\tconfirmLabel={t('confirmRecall')}\n\t\t\t\t\tsecondaryConfirmLabel={\n\t\t\t\t\t\trecallHasReversibleOps()\n\t\t\t\t\t\t\t? t('recallMessageRestoreConfirm')\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tonCancel={() => setPendingRecallMessage(undefined)}\n\t\t\t\t\tonConfirm={() => void confirmRecallMessage()}\n\t\t\t\t\tonSecondaryConfirm={() => void confirmRecallAndRestoreMessage()}\n\t\t\t\t/>\n\t\t\t</Show>\n\t\t</div>\n\t)\n}\n\nexport default App\n"
  },
  {
    "path": "packages/chatbox/src/assets/styles/global.css",
    "content": "@unocss;\n\n.markdown-rendered {\n\tmin-width: 0;\n\toverflow-wrap: anywhere;\n\tword-break: break-word;\n}\n\n.markdown-rendered > *:first-child {\n\tmargin-top: 0;\n}\n\n.markdown-rendered > *:last-child {\n\tmargin-bottom: 0;\n}\n\n.markdown-rendered table {\n\tdisplay: block;\n\tmax-width: 100%;\n\toverflow-x: auto;\n\tborder-collapse: collapse;\n\twhite-space: nowrap;\n}\n\n.markdown-rendered thead,\n.markdown-rendered tbody,\n.markdown-rendered tr {\n\twidth: max-content;\n\tmin-width: 100%;\n}\n\n.markdown-rendered th,\n.markdown-rendered td {\n\twhite-space: nowrap;\n}\n\n.markdown-rendered pre,\n.markdown-rendered code,\n.markdown-rendered .internal-embed,\n.markdown-rendered img {\n\tmax-width: 100%;\n}\n\n.markdown-rendered pre {\n\toverflow-x: auto;\n\twhite-space: pre;\n}\n\n.chatbox-tag-button {\n\tborder-radius: 999px;\n}\n\n.chatbox-input {\n\theight: 7rem;\n\tpadding: 0.75rem;\n\tline-height: 1.5;\n}\n\n.chatbox-input-pane {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.chatbox-resizer {\n\tflex-shrink: 0;\n\tcursor: ns-resize;\n\tpadding-bottom: 4px;\n\tpadding-top: 4px;\n\ttouch-action: none;\n\tuser-select: none;\n}\n\n.chatbox-resizer-line {\n\theight: 1px;\n\tbackground: var(--background-modifier-border);\n\ttransition: background-color 120ms ease;\n}\n\n.chatbox-resizer:hover .chatbox-resizer-line,\n.chatbox-resizer.is-resizing .chatbox-resizer-line {\n\tbackground: var(--interactive-accent);\n}\n\n.chatbox-resize-active,\n.chatbox-resize-active * {\n\tcursor: ns-resize !important;\n\tuser-select: none !important;\n}\n\n@media (pointer: fine) and (min-width: 1024px) {\n\t.chatbox-input-pane--resizable {\n\t\tborder-top-width: 0;\n\t}\n\n\t.chatbox-input-pane--resizable .chatbox-input {\n\t\tflex: 1 1 auto;\n\t\theight: auto;\n\t\tmin-height: 4rem;\n\t\tmin-width: 0;\n\t}\n}\n\n@media (max-width: 768px) {\n\t.chatbox-input {\n\t\theight: 5.5rem;\n\t\tpadding: 0.625rem;\n\t\tline-height: 1.4;\n\t}\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/ConfirmDialog.tsx",
    "content": "import { Show } from 'solid-js'\nimport { t } from '../i18n'\n\nexport function ConfirmDialog(props: {\n\ttitle: string | undefined\n\tmessage: string | undefined\n\tconfirmLabel: string | undefined\n\tconfirmClass?: string\n\tsecondaryConfirmLabel?: string | undefined\n\tsecondaryConfirmClass?: string\n\tonCancel: () => void\n\tonConfirm: () => void\n\tonSecondaryConfirm?: () => void\n}) {\n\treturn (\n\t\t<div class=\"absolute inset-0 z-20 flex items-center justify-center bg-black/40 px-4\">\n\t\t\t<div class=\"w-full max-w-sm rounded-4 border border-[var(--background-modifier-border)] bg-[var(--background-primary)] p-4 shadow-xl\">\n\t\t\t\t<div class=\"text-base font-semibold text-[var(--text-normal)]\">\n\t\t\t\t\t{props.title}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"mt-3 text-sm leading-6 text-[var(--text-muted)]\">\n\t\t\t\t\t{props.message}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"mt-4 flex justify-end gap-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"rounded-2 border border-[var(--background-modifier-border)] px-3 py-2 text-sm hover:bg-[var(--background-modifier-hover)]\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={props.onCancel}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t('cancel')}\n\t\t\t\t\t</button>\n\t\t\t\t\t<Show when={props.secondaryConfirmLabel}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass={\n\t\t\t\t\t\t\t\tprops.secondaryConfirmClass ??\n\t\t\t\t\t\t\t\t'rounded-2 border border-[var(--interactive-accent-rgb)]/30 bg-[var(--interactive-accent-rgb)]/12 px-3 py-2 text-sm text-[var(--text-normal)] hover:bg-[var(--interactive-accent-rgb)]/18'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => props.onSecondaryConfirm?.()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{props.secondaryConfirmLabel}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Show>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass={\n\t\t\t\t\t\t\tprops.confirmClass ??\n\t\t\t\t\t\t\t'rounded-2 border border-[var(--color-red-rgb)]/30 bg-[var(--color-red-rgb)]/12 px-3 py-2 text-sm text-[var(--text-error)] hover:bg-[var(--color-red-rgb)]/18'\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={props.onConfirm}\n\t\t\t\t\t>\n\t\t\t\t\t\t{props.confirmLabel}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/ContentParts.tsx",
    "content": "import { For, Match, Show, Switch } from 'solid-js'\nimport type { ChatMessageContentPart, ChatboxProps } from '../types'\nimport { MarkdownContent } from './MarkdownContent'\n\nexport function ContentParts(props: {\n\tcontent?: ChatMessageContentPart[] | null\n\trenderMarkdown?: ChatboxProps['renderMarkdown']\n}) {\n\treturn (\n\t\t<Show when={props.content?.length}>\n\t\t\t<div class=\"mt-2 flex flex-col gap-3\">\n\t\t\t\t<For each={props.content || []}>\n\t\t\t\t\t{(part) => (\n\t\t\t\t\t\t<Switch>\n\t\t\t\t\t\t\t<Match when={part.type === 'text'}>\n\t\t\t\t\t\t\t\t<MarkdownContent\n\t\t\t\t\t\t\t\t\tmarkdown={\n\t\t\t\t\t\t\t\t\t\t(part as Extract<ChatMessageContentPart, { type: 'text' }>)\n\t\t\t\t\t\t\t\t\t\t\t.text\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\trenderMarkdown={props.renderMarkdown}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Match>\n\t\t\t\t\t\t\t<Match when={part.type === 'image_url'}>\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"max-h-80 max-w-full rounded-2 border border-[var(--background-modifier-border)] object-contain\"\n\t\t\t\t\t\t\t\t\tsrc={\n\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\tpart as Extract<\n\t\t\t\t\t\t\t\t\t\t\t\tChatMessageContentPart,\n\t\t\t\t\t\t\t\t\t\t\t\t{ type: 'image_url' }\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t).image_url.url\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Match>\n\t\t\t\t\t\t\t<Match when={part.type === 'unknown'}>\n\t\t\t\t\t\t\t\t<pre class=\"m-0 whitespace-pre-wrap break-words rounded-2 bg-[var(--background-secondary)] p-2 text-xs leading-5\">\n\t\t\t\t\t\t\t\t\t{JSON.stringify(\n\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\tpart as Extract<\n\t\t\t\t\t\t\t\t\t\t\t\tChatMessageContentPart,\n\t\t\t\t\t\t\t\t\t\t\t\t{ type: 'unknown' }\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t).value,\n\t\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t</Match>\n\t\t\t\t\t\t</Switch>\n\t\t\t\t\t)}\n\t\t\t\t</For>\n\t\t\t</div>\n\t\t</Show>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/CopyButton.tsx",
    "content": "import { Show, createSignal, onCleanup } from 'solid-js'\nimport { t } from '../i18n'\n\nexport function CopyButton(props: { getText: () => string }) {\n\tconst [copied, setCopied] = createSignal(false)\n\tlet timer: ReturnType<typeof setTimeout>\n\n\tfunction handleCopy() {\n\t\tvoid navigator.clipboard.writeText(props.getText()).then(() => {\n\t\t\tsetCopied(true)\n\t\t\tclearTimeout(timer)\n\t\t\ttimer = setTimeout(() => setCopied(false), 2000)\n\t\t})\n\t}\n\n\tonCleanup(() => clearTimeout(timer))\n\n\treturn (\n\t\t<button\n\t\t\tclass=\"cursor-pointer p-1 size-5 text-[var(--text-muted)] hover:text-[var(--text-normal)] !border-none !bg-transparent !shadow-none\"\n\t\t\ttype=\"button\"\n\t\t\ttitle={copied() ? t('copied') : t('copy')}\n\t\t\tonClick={handleCopy}\n\t\t>\n\t\t\t<Show\n\t\t\t\twhen={copied()}\n\t\t\t\tfallback={\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth=\"14\"\n\t\t\t\t\t\theight=\"14\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n\t\t\t\t\t\t<path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n\t\t\t\t\t</svg>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\twidth=\"14\"\n\t\t\t\t\theight=\"14\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\" />\n\t\t\t\t</svg>\n\t\t\t</Show>\n\t\t</button>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/FragmentDivider.tsx",
    "content": "import type { ChatTimelineFragmentItem } from '../types'\nimport { formatFragmentTime } from '../utils'\n\nexport function FragmentDivider(props: { item: ChatTimelineFragmentItem }) {\n\treturn (\n\t\t<div class=\"relative py-2\">\n\t\t\t<div class=\"absolute inset-x-0 top-1/2 h-px bg-[var(--background-modifier-border)]\" />\n\t\t\t<div class=\"relative mx-auto w-fit rounded-full border border-[var(--background-modifier-border)] bg-[var(--background-primary)] px-3 py-1 text-xs text-[var(--text-muted)]\">\n\t\t\t\t{formatFragmentTime(props.item.createdAt)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/MarkdownContent.tsx",
    "content": "import { createEffect, onCleanup } from 'solid-js'\nimport type { ChatboxProps } from '../types'\n\nexport function MarkdownContent(props: {\n\tmarkdown: string\n\trenderMarkdown?: ChatboxProps['renderMarkdown']\n}) {\n\tlet el: HTMLDivElement | undefined\n\tlet cleanup: (() => void) | undefined\n\tlet renderVersion = 0\n\n\tcreateEffect(() => {\n\t\tconst markdown = props.markdown\n\t\tconst renderMarkdown = props.renderMarkdown\n\t\tconst currentVersion = ++renderVersion\n\n\t\tcleanup?.()\n\t\tcleanup = undefined\n\n\t\tif (!el) {\n\t\t\treturn\n\t\t}\n\n\t\tel.replaceChildren()\n\n\t\tif (!markdown) {\n\t\t\treturn\n\t\t}\n\n\t\tif (!renderMarkdown) {\n\t\t\tel.textContent = markdown\n\t\t\treturn\n\t\t}\n\n\t\tvoid Promise.resolve(renderMarkdown(el, markdown)).then((nextCleanup) => {\n\t\t\tif (currentVersion !== renderVersion) {\n\t\t\t\tif (typeof nextCleanup === 'function') {\n\t\t\t\t\tnextCleanup()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcleanup = typeof nextCleanup === 'function' ? nextCleanup : undefined\n\t\t})\n\t})\n\n\tonCleanup(() => {\n\t\trenderVersion += 1\n\t\tcleanup?.()\n\t\tcleanup = undefined\n\t\tel?.replaceChildren()\n\t})\n\n\treturn (\n\t\t<div\n\t\t\tref={el}\n\t\t\tclass=\"markdown-rendered mt-2 text-sm leading-6 text-[var(--text-normal)]\"\n\t\t/>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/MessageCard.tsx",
    "content": "import { Show } from 'solid-js'\nimport type { ChatTimelineMessageItem, ChatboxProps } from '../types'\nimport { t } from '../i18n'\nimport { formatTime, formatUsage } from '../utils'\nimport { CopyButton } from './CopyButton'\nimport { ContentParts } from './ContentParts'\n\nexport function MessageCard(props: {\n\titem: ChatTimelineMessageItem\n\trenderMarkdown?: ChatboxProps['renderMarkdown']\n\tonDeleteMessage?: ChatboxProps['onDeleteMessage']\n\tonRegenerateMessage?: ChatboxProps['onRegenerateMessage']\n\tonRecallMessage?: ChatboxProps['onRecallMessage']\n}) {\n\tconst content = () => props.item.message.message.content\n\tconst usageText = () =>\n\t\tformatUsage(\n\t\t\tprops.item.message.meta?.usage?.inputTokens,\n\t\t\tprops.item.message.meta?.usage?.outputTokens,\n\t\t\tprops.item.message.meta?.usage?.totalTokens,\n\t\t)\n\n\tconst roleLabel = () => {\n\t\tif (props.item.message.message.role === 'tool') {\n\t\t\treturn `Tool: ${props.item.message.message.name || t('tool')}`\n\t\t}\n\t\tif (props.item.message.message.role === 'assistant') {\n\t\t\treturn props.item.message.meta?.modelName || 'Assistant'\n\t\t}\n\t\tif (props.item.message.message.role === 'user') {\n\t\t\treturn 'User'\n\t\t}\n\t\treturn 'System'\n\t}\n\n\tconst getText = () =>\n\t\t(content() ?? [])\n\t\t\t.filter((p) => p.type === 'text')\n\t\t\t.map((p) => (p as { type: 'text'; text: string }).text)\n\t\t\t.join('\\n')\n\n\treturn (\n\t\t<Show\n\t\t\twhen={props.item.message.message.role !== 'tool'}\n\t\t\tfallback={\n\t\t\t\t<details\n\t\t\t\t\tclass={`rounded-3 border border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] p-3 ${\n\t\t\t\t\t\tprops.item.message.isError ? 'border-[var(--text-error)]' : ''\n\t\t\t\t\t}`}\n\t\t\t\t>\n\t\t\t\t\t<summary class=\"flex cursor-pointer list-none items-center justify-between gap-3 text-xs text-[var(--text-muted)] marker:hidden\">\n\t\t\t\t\t\t<div class=\"font-medium text-[var(--text-normal)]\">\n\t\t\t\t\t\t\t{roleLabel()}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span>{formatTime(props.item.message.createdAt)}</span>\n\t\t\t\t\t\t\t<span onClick={(e) => e.stopPropagation()}>\n\t\t\t\t\t\t\t\t<CopyButton getText={getText} />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<Show when={props.onDeleteMessage}>\n\t\t\t\t\t\t\t\t<span onClick={(e) => e.stopPropagation()}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"cursor-pointer p-1 size-5 text-[var(--text-muted)] hover:text-[var(--text-error)] !border-none !bg-transparent !shadow-none\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\ttitle={t('deleteMessage')}\n\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\tprops.onDeleteMessage?.(props.item.message.id)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\twidth=\"14\"\n\t\t\t\t\t\t\t\t\t\t\theight=\"14\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<polyline points=\"3 6 5 6 21 6\" />\n\t\t\t\t\t\t\t\t\t\t\t<path d=\"M19 6l-1 14H6L5 6\" />\n\t\t\t\t\t\t\t\t\t\t\t<path d=\"M10 11v6M14 11v6\" />\n\t\t\t\t\t\t\t\t\t\t\t<path d=\"M9 6V4h6v2\" />\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Show>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</summary>\n\t\t\t\t\t<Show when={props.item.toolCall}>\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div class=\"mt-3 text-xs text-[var(--text-muted)]\">\n\t\t\t\t\t\t\t\t{t('params')}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<pre class=\"m-0 mt-1 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-2 bg-[var(--background-secondary)] p-2 text-xs leading-5\">\n\t\t\t\t\t\t\t\t{props.item.toolCall?.function.arguments || '{}'}\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t</>\n\t\t\t\t\t</Show>\n\t\t\t\t\t<div class=\"mt-3 text-xs text-[var(--text-muted)]\">{t('result')}</div>\n\t\t\t\t\t<pre class=\"m-0 mt-1 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-2 bg-[var(--background-secondary)] p-2 text-xs leading-5\">\n\t\t\t\t\t\t{content()\n\t\t\t\t\t\t\t?.filter((p) => p.type === 'text')\n\t\t\t\t\t\t\t.map((p) => (p as { type: 'text'; text: string }).text)\n\t\t\t\t\t\t\t.join('\\n') || ''}\n\t\t\t\t\t</pre>\n\t\t\t\t</details>\n\t\t\t}\n\t\t>\n\t\t\t<div\n\t\t\t\tclass={`rounded-3 p-3 border border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] ${\n\t\t\t\t\tprops.item.message.isError ? 'border-[var(--text-error)]' : ''\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t<div class=\"flex items-center justify-between gap-3 text-xs text-[var(--text-muted)]\">\n\t\t\t\t\t<div class=\"font-medium text-[var(--text-normal)]\">{roleLabel()}</div>\n\t\t\t\t\t<span>{formatTime(props.item.message.createdAt)}</span>\n\t\t\t\t</div>\n\t\t\t\t<ContentParts\n\t\t\t\t\tcontent={content()}\n\t\t\t\t\trenderMarkdown={props.renderMarkdown}\n\t\t\t\t/>\n\t\t\t\t<Show\n\t\t\t\t\twhen={\n\t\t\t\t\t\tprops.item.message.message.role === 'assistant' ||\n\t\t\t\t\t\tprops.item.message.message.role === 'user'\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<div class=\"mt-3 flex items-center justify-between gap-2\">\n\t\t\t\t\t\t<div class=\"flex items-center gap-0.5\">\n\t\t\t\t\t\t\t<CopyButton getText={getText} />\n\t\t\t\t\t\t\t<Show when={props.onDeleteMessage}>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"cursor-pointer p-1 size-6 text-[var(--text-muted)] hover:text-[var(--text-error)] !border-none !bg-transparent !shadow-none\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\ttitle={t('deleteMessage')}\n\t\t\t\t\t\t\t\t\tonClick={() => props.onDeleteMessage?.(props.item.message.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\twidth=\"14\"\n\t\t\t\t\t\t\t\t\t\theight=\"14\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<polyline points=\"3 6 5 6 21 6\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M19 6l-1 14H6L5 6\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M10 11v6M14 11v6\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M9 6V4h6v2\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Show>\n\t\t\t\t\t\t\t<Show\n\t\t\t\t\t\t\t\twhen={\n\t\t\t\t\t\t\t\t\tprops.item.message.message.role === 'user' &&\n\t\t\t\t\t\t\t\t\tprops.onRecallMessage\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"cursor-pointer p-1 size-6 text-[var(--text-muted)] hover:text-[var(--text-normal)] !border-none !bg-transparent !shadow-none\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\ttitle={t('recallMessage')}\n\t\t\t\t\t\t\t\t\tonClick={() => props.onRecallMessage?.(props.item.message.id)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\twidth=\"14\"\n\t\t\t\t\t\t\t\t\t\theight=\"14\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M9 14 4 9l5-5\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5v0a5.5 5.5 0 0 1-5.5 5.5H11\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Show>\n\t\t\t\t\t\t\t<Show\n\t\t\t\t\t\t\t\twhen={\n\t\t\t\t\t\t\t\t\tprops.item.message.message.role === 'assistant' &&\n\t\t\t\t\t\t\t\t\tprops.onRegenerateMessage\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"cursor-pointer p-1 size-6 text-[var(--text-muted)] hover:text-[var(--text-normal)] !border-none !bg-transparent !shadow-none\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\ttitle={t('regenerateMessage')}\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tprops.onRegenerateMessage?.(props.item.message.id)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\twidth=\"14\"\n\t\t\t\t\t\t\t\t\t\theight=\"14\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M21 3v5h-5\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n\t\t\t\t\t\t\t\t\t\t<path d=\"M8 16H3v5\" />\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Show>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Show\n\t\t\t\t\t\t\twhen={\n\t\t\t\t\t\t\t\tprops.item.message.message.role === 'assistant' && usageText()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"text-[10px] text-[var(--text-faint)]\">\n\t\t\t\t\t\t\t\t{usageText()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Show>\n\t\t\t\t\t</div>\n\t\t\t\t</Show>\n\t\t\t</div>\n\t\t</Show>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/PaneResizer.tsx",
    "content": "import { createSignal, onCleanup } from 'solid-js'\n\ninterface PaneResizerProps {\n\tonResizeStart?: () => void\n\tonResize: (deltaY: number) => void\n\tonResizeEnd?: () => void\n\tonDblClick?: () => void\n}\n\nexport function PaneResizer(props: PaneResizerProps) {\n\tconst [isResizing, setIsResizing] = createSignal(false)\n\tlet startY = 0\n\tlet removeListeners: (() => void) | undefined\n\n\tfunction stopResize() {\n\t\tremoveListeners?.()\n\t\tremoveListeners = undefined\n\t\tsetIsResizing(false)\n\t\tdocument.body.classList.remove('chatbox-resize-active')\n\t}\n\n\tfunction onPointerDown(event: PointerEvent) {\n\t\tif (event.button !== 0) {\n\t\t\treturn\n\t\t}\n\n\t\tevent.preventDefault()\n\t\tstopResize()\n\t\tprops.onResizeStart?.()\n\t\tstartY = event.clientY\n\t\tsetIsResizing(true)\n\t\tdocument.body.classList.add('chatbox-resize-active')\n\n\t\tconst onPointerMove = (moveEvent: PointerEvent) => {\n\t\t\tprops.onResize(startY - moveEvent.clientY)\n\t\t}\n\n\t\tconst onPointerUp = () => {\n\t\t\tprops.onResizeEnd?.()\n\t\t\tstopResize()\n\t\t}\n\n\t\tdocument.addEventListener('pointermove', onPointerMove)\n\t\tdocument.addEventListener('pointerup', onPointerUp)\n\t\tdocument.addEventListener('pointercancel', onPointerUp)\n\t\tremoveListeners = () => {\n\t\t\tdocument.removeEventListener('pointermove', onPointerMove)\n\t\t\tdocument.removeEventListener('pointerup', onPointerUp)\n\t\t\tdocument.removeEventListener('pointercancel', onPointerUp)\n\t\t}\n\t}\n\n\tonCleanup(() => stopResize())\n\n\treturn (\n\t\t<div\n\t\t\tclass=\"chatbox-resizer px-3\"\n\t\t\tclassList={{ 'is-resizing': isResizing() }}\n\t\t\trole=\"separator\"\n\t\t\taria-orientation=\"horizontal\"\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonDblClick={() => props.onDblClick?.()}\n\t\t>\n\t\t\t<div class=\"chatbox-resizer-line\" />\n\t\t</div>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/PendingList.tsx",
    "content": "import { For, Show } from 'solid-js'\nimport type { ChatboxProps } from '../types'\nimport { t } from '../i18n'\n\nexport function PendingList(props: {\n\tpendingMessages: ChatboxProps['pendingMessages']\n}) {\n\treturn (\n\t\t<Show when={props.pendingMessages.length > 0}>\n\t\t\t<div class=\"rounded-3 border border-dashed border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] p-3\">\n\t\t\t\t<div class=\"text-xs font-medium uppercase tracking-wide text-[var(--text-muted)]\">\n\t\t\t\t\t{t('pendingMessages')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"mt-2 flex flex-col gap-2\">\n\t\t\t\t\t<For each={props.pendingMessages}>\n\t\t\t\t\t\t{(message) => (\n\t\t\t\t\t\t\t<div class=\"rounded-2 bg-[var(--background-secondary)] p-3 text-sm text-[var(--text-normal)] whitespace-pre-wrap break-words\">\n\t\t\t\t\t\t\t\t{message.text}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</For>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Show>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/RunStateCard.tsx",
    "content": "import { Show } from 'solid-js'\nimport type { ChatboxProps } from '../types'\nimport { t } from '../i18n'\nimport { runStateLabel } from '../utils'\n\nexport function RunStateCard(props: {\n\trunState: ChatboxProps['runState']\n\tonStop?: ChatboxProps['onStopActiveRun']\n}) {\n\tconst label = () => runStateLabel(props.runState)\n\tconst canStop = () =>\n\t\tprops.runState === 'thinking' || props.runState === 'waiting_for_tools'\n\n\treturn (\n\t\t<Show when={label()}>\n\t\t\t<div class=\"rounded-3 border border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] p-3\">\n\t\t\t\t<div class=\"flex items-center justify-between gap-3 rounded-2 bg-[var(--background-secondary)] px-3 py-2 text-sm text-[var(--text-normal)]\">\n\t\t\t\t\t<div class=\"flex min-w-0 items-center gap-3\">\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclass=\"h-4 w-4 shrink-0 animate-spin text-[var(--interactive-accent)]\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\t\t\tr=\"9\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstroke-width=\"3\"\n\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\tstroke-dasharray=\"42 16\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<div class=\"min-w-0 font-medium\">{label()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Show when={canStop() && props.onStop}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"shrink-0 rounded-2 border border-[var(--background-modifier-border)] px-2 py-1 text-xs hover:bg-[var(--background-modifier-hover)]\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => props.onStop?.()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t('stopRun')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Show>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Show>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/SessionHistoryItem.tsx",
    "content": "import { Show } from 'solid-js'\nimport type { ChatboxProps } from '../types'\nimport { t } from '../i18n'\nimport { formatTime } from '../utils'\n\nexport function SessionHistoryItem(props: {\n\tsession: ChatboxProps['sessionHistory'][number]\n\tisActive: boolean\n\tonSelect: (sessionId: string) => void\n\tonDelete: (sessionId: string) => void\n}) {\n\tconst activate = () => props.onSelect(props.session.id)\n\n\treturn (\n\t\t<div\n\t\t\trole=\"button\"\n\t\t\ttabIndex={0}\n\t\t\tclass={`group relative w-full overflow-hidden rounded-3 border px-3 py-3 text-left transition-colors ${\n\t\t\t\tprops.isActive\n\t\t\t\t\t? 'border-[var(--interactive-accent)] bg-[var(--background-secondary)]'\n\t\t\t\t\t: 'border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)] hover:bg-[var(--background-modifier-hover)]'\n\t\t\t}`}\n\t\t\tonClick={activate}\n\t\t\tonKeyDown={(event) => {\n\t\t\t\tif (event.key === 'Enter' || event.key === ' ') {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tactivate()\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<Show when={props.isActive}>\n\t\t\t\t<div class=\"absolute inset-y-3 left-0 w-1 rounded-r-full bg-[var(--interactive-accent)]\" />\n\t\t\t</Show>\n\t\t\t<div class=\"flex items-start justify-between gap-3\">\n\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t<div class=\"truncate pr-1 text-sm font-medium text-[var(--text-normal)]\">\n\t\t\t\t\t\t{props.session.title}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"mt-2 text-xs text-[var(--text-muted)]\">\n\t\t\t\t\t\t{formatTime(props.session.createdAt)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"shrink-0 rounded-2 border border-[var(--background-modifier-border)] px-2 py-1 text-xs text-[var(--text-muted)] hover:bg-[var(--background-modifier-hover)] hover:text-[var(--text-error)]\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={t('deleteSession')}\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\t\tprops.onDelete(props.session.id)\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{t('deleteSession')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/TaskCard.tsx",
    "content": "import { Show } from 'solid-js'\nimport type { ChatTaskRecord, ChatboxProps } from '../types'\nimport { t } from '../i18n'\nimport { formatTime, formatDuration, statusLabel, statusClass } from '../utils'\n\nexport function TaskCard(props: {\n\ttask: ChatTaskRecord\n\tonCancelTask?: ChatboxProps['onCancelTask']\n\tcompact?: boolean\n}) {\n\tconst duration = () => formatDuration(props.task)\n\tconst detail = () => {\n\t\tswitch (props.task.status) {\n\t\t\tcase 'completed':\n\t\t\t\treturn props.task.summary\n\t\t\tcase 'failed':\n\t\t\t\treturn props.task.summary || props.task.error\n\t\t\tcase 'cancelled':\n\t\t\t\treturn props.task.summary\n\t\t\tdefault:\n\t\t\t\treturn ''\n\t\t}\n\t}\n\tconst sourceCount = () =>\n\t\tprops.task.status === 'completed'\n\t\t\t? props.task.sourceCount\n\t\t\t: props.task.status === 'failed'\n\t\t\t\t? props.task.sourceCount\n\t\t\t\t: undefined\n\n\treturn (\n\t\t<div\n\t\t\tclass={`rounded-3 border p-3 ${\n\t\t\t\tprops.task.status === 'failed'\n\t\t\t\t\t? 'border-[var(--text-error)] bg-[var(--background-primary-alt)]'\n\t\t\t\t\t: 'border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)]'\n\t\t\t}`}\n\t\t>\n\t\t\t<div class=\"flex items-start justify-between gap-3\">\n\t\t\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t\t\t<div class=\"font-medium text-[var(--text-normal)] truncate\">\n\t\t\t\t\t\t{props.task.title}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"mt-1 text-xs text-[var(--text-muted)] break-words\">\n\t\t\t\t\t\t{props.task.prompt}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<span\n\t\t\t\t\tclass={`shrink-0 rounded-full px-2 py-1 text-xs ${statusClass(props.task.status)}`}\n\t\t\t\t>\n\t\t\t\t\t{statusLabel(props.task.status)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div class=\"mt-3 flex flex-wrap gap-2 text-xs text-[var(--text-muted)]\">\n\t\t\t\t<span class=\"rounded-full bg-[var(--background-secondary)] px-2 py-1\">\n\t\t\t\t\t{t('depth')}: {props.task.depth}/{props.task.maxDepth}\n\t\t\t\t</span>\n\t\t\t\t<Show when={duration()}>\n\t\t\t\t\t<span class=\"rounded-full bg-[var(--background-secondary)] px-2 py-1\">\n\t\t\t\t\t\t{duration()}\n\t\t\t\t\t</span>\n\t\t\t\t</Show>\n\t\t\t\t<Show when={typeof sourceCount() === 'number'}>\n\t\t\t\t\t<span class=\"rounded-full bg-[var(--background-secondary)] px-2 py-1\">\n\t\t\t\t\t\t{t('sources')}: {sourceCount()}\n\t\t\t\t\t</span>\n\t\t\t\t</Show>\n\t\t\t</div>\n\t\t\t<Show when={detail()}>\n\t\t\t\t<div class=\"mt-3 rounded-2 bg-[var(--background-secondary)] p-3 text-sm leading-6 text-[var(--text-normal)] whitespace-pre-wrap break-words\">\n\t\t\t\t\t{detail()}\n\t\t\t\t</div>\n\t\t\t</Show>\n\t\t\t<Show when={!props.compact}>\n\t\t\t\t<div class=\"mt-3 flex items-center justify-between gap-3 text-xs text-[var(--text-muted)]\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t{formatTime(props.task.createdAt)}\n\t\t\t\t\t\t<Show when={'finishedAt' in props.task && props.task.finishedAt}>\n\t\t\t\t\t\t\t{` · ${formatTime((props.task as Extract<ChatTaskRecord, { finishedAt: number }>).finishedAt)}`}\n\t\t\t\t\t\t</Show>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Show when={props.task.status === 'running' && props.onCancelTask}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"rounded-2 border border-[var(--background-modifier-border)] px-2 py-1 text-xs hover:bg-[var(--background-modifier-hover)]\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => props.onCancelTask?.(props.task.id)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t('cancelTask')}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Show>\n\t\t\t\t</div>\n\t\t\t</Show>\n\t\t</div>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/components/TasksPanel.tsx",
    "content": "import { For, Show } from 'solid-js'\nimport type { ChatboxProps } from '../types'\nimport { t } from '../i18n'\nimport { TaskCard } from './TaskCard'\n\nexport function TasksPanel(props: {\n\tcurrentSessionTasks: ChatboxProps['currentSessionTasks']\n\totherSessionTasks: ChatboxProps['otherSessionTasks']\n\tonCancelTask?: ChatboxProps['onCancelTask']\n\tonClose: () => void\n}) {\n\treturn (\n\t\t<div class=\"flex h-full w-[22rem] shrink-0 flex-col border-l border-[var(--background-modifier-border)] bg-[var(--background-primary-alt)]\">\n\t\t\t<div class=\"flex items-center justify-between border-b border-[var(--background-modifier-border)] px-3 py-3\">\n\t\t\t\t<div class=\"text-sm font-semibold\">{t('tasks')}</div>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"rounded-2 border border-[var(--background-modifier-border)] px-2 py-1 text-xs hover:bg-[var(--background-modifier-hover)]\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={props.onClose}\n\t\t\t\t>\n\t\t\t\t\t{t('closeTasks')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div class=\"flex-1 overflow-y-auto px-3 py-3\">\n\t\t\t\t<div class=\"text-xs font-medium uppercase tracking-wide text-[var(--text-muted)]\">\n\t\t\t\t\t{t('currentSession')}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"mt-2 flex flex-col gap-3\">\n\t\t\t\t\t<Show\n\t\t\t\t\t\twhen={props.currentSessionTasks.length > 0}\n\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t<div class=\"rounded-3 border border-dashed border-[var(--background-modifier-border)] px-3 py-4 text-sm text-[var(--text-muted)]\">\n\t\t\t\t\t\t\t\t{t('noTasks')}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<For each={props.currentSessionTasks}>\n\t\t\t\t\t\t\t{(task) => (\n\t\t\t\t\t\t\t\t<TaskCard\n\t\t\t\t\t\t\t\t\ttask={task}\n\t\t\t\t\t\t\t\t\tonCancelTask={props.onCancelTask}\n\t\t\t\t\t\t\t\t\tcompact\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</For>\n\t\t\t\t\t</Show>\n\t\t\t\t</div>\n\t\t\t\t<Show when={props.otherSessionTasks.length > 0}>\n\t\t\t\t\t<div class=\"mt-6 text-xs font-medium uppercase tracking-wide text-[var(--text-muted)]\">\n\t\t\t\t\t\t{t('otherSessions')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"mt-2 flex flex-col gap-3\">\n\t\t\t\t\t\t<For each={props.otherSessionTasks}>\n\t\t\t\t\t\t\t{(task) => <TaskCard task={task} compact />}\n\t\t\t\t\t\t</For>\n\t\t\t\t\t</div>\n\t\t\t\t</Show>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"
  },
  {
    "path": "packages/chatbox/src/i18n/index.ts",
    "content": "import * as i18n from '@solid-primitives/i18n'\nimport { createResource, createSignal } from 'solid-js'\nimport en from './locales/en'\nimport zh from './locales/zh'\n\nexport type Locale = 'zh' | 'en'\n\nexport function toLocale(language: string) {\n\tswitch (language.split('-')[0].toLowerCase()) {\n\t\tcase 'zh':\n\t\t\treturn 'zh'\n\t\tdefault:\n\t\t\treturn 'en'\n\t}\n}\n\nexport const [locale, setLocale] = createSignal<Locale>(\n\ttoLocale(navigator.language),\n)\n\nconst [dict] = createResource(locale, (locale) => {\n\tswitch (locale) {\n\t\tcase 'zh':\n\t\t\treturn i18n.flatten(zh)\n\t\tdefault:\n\t\t\treturn i18n.flatten(en)\n\t}\n})\n\nexport const t = i18n.translator(dict)\n"
  },
  {
    "path": "packages/chatbox/src/i18n/locales/en.ts",
    "content": "const en = {\n\thistory: 'History',\n\tdeleteSession: 'Delete',\n\tdeleteSessionTitle: 'Delete Session',\n\tdeleteSessionMessage:\n\t\t'Delete this session permanently? This action cannot be undone.',\n\tcancel: 'Cancel',\n\tconfirmDelete: 'Delete',\n\tnewChat: 'New Chat',\n\tprovider: 'Provider',\n\tmodel: 'Model',\n\tnoProvider: 'No provider',\n\tnoModel: 'No model',\n\tsend: 'Send',\n\tqueueSend: 'Queue Send',\n\tthinking: 'Thinking',\n\tcompressing: 'Compressing',\n\tprocessingTools: 'Processing Tools',\n\tstopRun: 'Stop',\n\tempty: 'Start by sending a message',\n\tinputPlaceholder: 'Type a message. Enter to send, Shift+Enter for newline',\n\tnewFragment: 'New Fragment',\n\tcompressContext: 'Compress Context',\n\tpendingMessages: 'Pending Messages',\n\tparams: 'Params',\n\tresult: 'Result',\n\ttool: 'Tool',\n\ttasks: 'Tasks',\n\tcloseTasks: 'Close',\n\tcurrentSession: 'Current session',\n\totherSessions: 'Other sessions',\n\tnoTasks: 'No tasks yet',\n\tcancelTask: 'Cancel',\n\tdepth: 'Depth',\n\tsources: 'Sources',\n\ttaskQueued: 'Queued',\n\ttaskRunning: 'Running',\n\ttaskCompleted: 'Completed',\n\ttaskFailed: 'Failed',\n\ttaskCancelled: 'Cancelled',\n\tcopy: 'Copy',\n\tcopied: 'Copied!',\n\tdeleteMessage: 'Delete message',\n\tregenerateMessage: 'Regenerate',\n\tdeleteMessageTitle: 'Delete Message',\n\tregenerateMessageTitle: 'Regenerate',\n\tregenerateMessageConfirm:\n\t\t'This will regenerate this AI response in place. The original response will be replaced, and subsequent messages will be preserved. This action cannot be undone.',\n\tdeleteUserMessageConfirm:\n\t\t'This will delete this message and all following AI responses and tool results. This action cannot be undone.',\n\tdeleteAssistantMessageConfirm:\n\t\t'This will delete this AI response. This action cannot be undone.',\n\tdeleteToolMessageConfirm:\n\t\t'This will delete this tool result and remove the corresponding tool call from the AI message. This action cannot be undone.',\n\tdeleteToolMessageRestoreWarning:\n\t\t'After deletion, these file changes can no longer be restored by recalling the message.',\n\trecallMessage: 'Recall',\n\trecallMessageTitle: 'Recall Message',\n\trecallMessageConfirm:\n\t\t'This will put the message content back into the input box and recall this message plus all following messages in the current fragment. This action cannot be undone.',\n\trecallMessageRestoreConfirm: 'Recall and restore files',\n\tconfirmRecall: 'Recall',\n}\n\nexport default en\n"
  },
  {
    "path": "packages/chatbox/src/i18n/locales/zh.ts",
    "content": "const zh = {\n\thistory: '历史',\n\tdeleteSession: '删除',\n\tdeleteSessionTitle: '删除会话',\n\tdeleteSessionMessage: '确认删除这个会话吗？删除后不可恢复。',\n\tcancel: '取消',\n\tconfirmDelete: '确认删除',\n\tnewChat: '新对话',\n\tprovider: 'Provider',\n\tmodel: 'Model',\n\tnoProvider: '未选择 Provider',\n\tnoModel: '未选择 Model',\n\tsend: '发送',\n\tqueueSend: '加入挂起',\n\tthinking: '思考中',\n\tcompressing: '压缩中',\n\tprocessingTools: '工具处理中',\n\tstopRun: '终止',\n\tempty: '开始发送一条消息',\n\tinputPlaceholder: '输入消息，Enter 发送，Shift+Enter 换行',\n\tnewFragment: '新建段',\n\tcompressContext: '压缩上下文',\n\tpendingMessages: '挂起消息',\n\tparams: 'Params',\n\tresult: 'Result',\n\ttool: '工具',\n\ttasks: '任务',\n\tcloseTasks: '关闭',\n\tcurrentSession: '当前会话',\n\totherSessions: '其他会话',\n\tnoTasks: '还没有任务',\n\tcancelTask: '取消',\n\tdepth: '深度',\n\tsources: '来源',\n\ttaskQueued: '排队中',\n\ttaskRunning: '运行中',\n\ttaskCompleted: '已完成',\n\ttaskFailed: '失败',\n\ttaskCancelled: '已取消',\n\tcopy: '复制',\n\tcopied: '已复制',\n\tdeleteMessage: '删除消息',\n\tregenerateMessage: '重新生成',\n\tdeleteMessageTitle: '删除消息',\n\tregenerateMessageTitle: '重新生成',\n\tregenerateMessageConfirm:\n\t\t'此操作将重新生成该 AI 回复，原回复内容将被替换，其后的消息将被保留，无法恢复。',\n\tdeleteUserMessageConfirm:\n\t\t'此操作将删除该用户消息，以及其后所有 AI 回复和工具调用结果，无法恢复。',\n\tdeleteAssistantMessageConfirm: '此操作将删除该 AI 回复，无法恢复。',\n\tdeleteToolMessageConfirm:\n\t\t'此操作将删除该工具调用结果，并从对应的 AI 消息中移除该工具调用记录，无法恢复。',\n\tdeleteToolMessageRestoreWarning: '删除后将无法通过撤回消息恢复这些文件修改。',\n\trecallMessage: '撤回',\n\trecallMessageTitle: '撤回消息',\n\trecallMessageConfirm:\n\t\t'此操作将把消息内容放回输入框，并撤回该消息及当前段中之后的所有消息，无法恢复。',\n\trecallMessageRestoreConfirm: '撤回并还原修改',\n\tconfirmRecall: '确认撤回',\n}\n\nexport default zh\n"
  },
  {
    "path": "packages/chatbox/src/index.tsx",
    "content": "import './assets/styles/global.css'\n\nimport { createStore, reconcile } from 'solid-js/store'\nimport { render } from 'solid-js/web'\nimport App, { AppProps } from './App'\nexport * from './types'\n\nexport interface ChatboxController {\n\tupdate: (props: AppProps) => void\n\tdestroy: () => void\n}\n\nexport function mount(el: Element, props: AppProps): ChatboxController {\n\tlet update = (_props: AppProps) => {}\n\tconst destroy = render(() => {\n\t\tconst [state, setState] = createStore(props)\n\t\tupdate = (nextProps: AppProps) => {\n\t\t\tsetState(reconcile(nextProps))\n\t\t}\n\t\treturn <App {...state} />\n\t}, el)\n\n\treturn {\n\t\tupdate,\n\t\tdestroy,\n\t}\n}\n"
  },
  {
    "path": "packages/chatbox/src/types.ts",
    "content": "export interface ChatUsage {\n\tinputTokens?: number\n\toutputTokens?: number\n\ttotalTokens?: number\n}\n\nexport type ReversibleToolOp =\n\t| {\n\t\t\tvaultPath: string\n\t\t\toperation: 'create'\n\t\t\tbefore: { kind: 'file' | 'dir' }\n\t  }\n\t| {\n\t\t\tvaultPath: string\n\t\t\toperation: 'update'\n\t\t\tbefore: { kind: 'file'; contentBase64: string }\n\t  }\n\t| {\n\t\t\tvaultPath: string\n\t\t\toperation: 'delete'\n\t\t\tbefore: { kind: 'file'; contentBase64: string } | { kind: 'dir' }\n\t  }\n\nexport type ChatRunState =\n\t| 'idle'\n\t| 'thinking'\n\t| 'compressing'\n\t| 'waiting_for_tools'\n\nexport interface ChatTextPart {\n\ttype: 'text'\n\ttext: string\n}\n\nexport interface ChatImageUrlPart {\n\ttype: 'image_url'\n\timage_url: {\n\t\turl: string\n\t}\n}\n\nexport interface ChatUnknownPart {\n\ttype: 'unknown'\n\tvalue: unknown\n}\n\nexport type ChatMessageContentPart =\n\t| ChatTextPart\n\t| ChatImageUrlPart\n\t| ChatUnknownPart\n\nexport interface ChatToolCall {\n\tid: string\n\ttype: 'function'\n\tfunction: {\n\t\tname: string\n\t\targuments: string\n\t}\n}\n\nexport interface ChatMessageMeta {\n\tproviderId?: string\n\tproviderName?: string\n\tmodelId?: string\n\tmodelName?: string\n\tusage?: ChatUsage\n}\n\nexport interface ChatSystemMessage {\n\trole: 'system'\n\tcontent: ChatMessageContentPart[]\n}\n\nexport interface ChatUserMessage {\n\trole: 'user'\n\tcontent: ChatMessageContentPart[]\n}\n\nexport interface ChatAssistantMessageWithContent {\n\trole: 'assistant'\n\tcontent: ChatMessageContentPart[]\n\ttool_calls?: ChatToolCall[]\n}\n\nexport interface ChatAssistantMessageWithToolCalls {\n\trole: 'assistant'\n\tcontent?: null\n\ttool_calls: ChatToolCall[]\n}\n\nexport interface ChatToolMessage {\n\trole: 'tool'\n\tcontent: ChatMessageContentPart[]\n\tname: string\n\ttool_call_id: string\n}\n\nexport type ChatAssistantMessage =\n\t| ChatAssistantMessageWithContent\n\t| ChatAssistantMessageWithToolCalls\n\nexport type ChatMessage =\n\t| ChatSystemMessage\n\t| ChatUserMessage\n\t| ChatAssistantMessage\n\t| ChatToolMessage\n\nexport interface ChatMessageRecord {\n\tid: string\n\tcreatedAt: number\n\tmessage: ChatMessage\n\tmeta?: ChatMessageMeta\n\tisError?: boolean\n\treversibleOps?: ReversibleToolOp[]\n}\n\nexport interface ChatTaskBase {\n\tid: string\n\tsessionId: string\n\tparentTaskId?: string\n\tdepth: number\n\tmaxDepth: number\n\ttitle: string\n\tprompt: string\n\tcreatedAt: number\n}\n\nexport interface QueuedChatTask extends ChatTaskBase {\n\tstatus: 'queued'\n}\n\nexport interface RunningChatTask extends ChatTaskBase {\n\tstatus: 'running'\n\tstartedAt: number\n}\n\nexport interface CompletedChatTask extends ChatTaskBase {\n\tstatus: 'completed'\n\tstartedAt: number\n\tfinishedAt: number\n\tsummary: string\n\tsourceCount: number\n}\n\nexport interface FailedChatTask extends ChatTaskBase {\n\tstatus: 'failed'\n\tfinishedAt: number\n\terror: string\n\tsummary?: string\n\tfailureStage?: string\n\tstartedAt?: number\n\tsourceCount?: number\n}\n\nexport interface CancelledChatTask extends ChatTaskBase {\n\tstatus: 'cancelled'\n\tfinishedAt: number\n\tcancelReason: string\n\tsummary?: string\n\tstartedAt?: number\n}\n\nexport type ChatTaskRecord =\n\t| QueuedChatTask\n\t| RunningChatTask\n\t| CompletedChatTask\n\t| FailedChatTask\n\t| CancelledChatTask\n\nexport interface ChatPendingMessage {\n\tid: string\n\tcreatedAt: number\n\ttext: string\n}\n\nexport interface ChatModelOption {\n\tid: string\n\tname: string\n}\n\nexport interface ChatProviderOption {\n\tid: string\n\tname: string\n\tmodels: ChatModelOption[]\n}\n\nexport interface ChatSessionHistoryItem {\n\tid: string\n\ttitle: string\n\tcreatedAt: number\n\tupdatedAt: number\n}\n\nexport interface ChatTimelineFragmentItem {\n\tid: string\n\tkind: 'fragment'\n\tcreatedAt: number\n}\n\nexport interface ChatTimelineMessageItem {\n\tid: string\n\tkind: 'message'\n\tcreatedAt: number\n\tmessage: ChatMessageRecord\n\ttoolCall?: ChatToolCall\n}\n\nexport type ChatTimelineItem =\n\t| ChatTimelineFragmentItem\n\t| ChatTimelineMessageItem\n\nexport interface ChatboxViewModel {\n\ttitle: string\n\tsessionHistory: ChatSessionHistoryItem[]\n\tactiveSessionId?: string\n\ttimeline: ChatTimelineItem[]\n\tcurrentSessionTasks: ChatTaskRecord[]\n\totherSessionTasks: ChatTaskRecord[]\n\tproviders: ChatProviderOption[]\n\tselectedProviderId?: string\n\tselectedModelId?: string\n\trunState: ChatRunState\n\tpendingMessages: ChatPendingMessage[]\n\tcanSend: boolean\n\tcanCreateFragment: boolean\n\tcanCompress: boolean\n}\n\nexport interface ChatboxProps extends ChatboxViewModel {\n\tonNewSession: () => void\n\tonNewFragment: () => void\n\tonCompressContext: () => Promise<void>\n\tonSwitchSession: (sessionId: string) => void\n\tonDeleteSession: (sessionId: string) => Promise<void>\n\tonSelectProvider: (providerId: string) => void\n\tonSelectModel: (modelId: string) => void\n\tonSendMessage: (text: string) => Promise<void>\n\tonStopActiveRun?: () => void\n\tonCancelTask?: (taskId: string) => void\n\tonDeleteMessage?: (messageId: string) => void\n\tonRegenerateMessage?: (messageId: string) => void\n\tonRecallMessage?: (\n\t\tmessageId: string,\n\t\toptions?: { restoreFiles?: boolean },\n\t) => Promise<void> | void\n\trenderMarkdown?: (\n\t\tel: HTMLElement,\n\t\tmarkdown: string,\n\t) => void | (() => void) | Promise<void | (() => void)>\n}\n"
  },
  {
    "path": "packages/chatbox/src/utils.ts",
    "content": "import { ChatTaskRecord, ChatRunState } from './types'\nimport { t } from './i18n'\n\nexport function formatTime(timestamp: number) {\n\treturn new Intl.DateTimeFormat(undefined, {\n\t\tmonth: '2-digit',\n\t\tday: '2-digit',\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t}).format(timestamp)\n}\n\nexport function formatFragmentTime(timestamp: number) {\n\treturn new Intl.DateTimeFormat(undefined, {\n\t\tyear: 'numeric',\n\t\tmonth: '2-digit',\n\t\tday: '2-digit',\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t}).format(timestamp)\n}\n\nexport function formatDuration(task: ChatTaskRecord) {\n\tif (!('startedAt' in task) || typeof task.startedAt !== 'number') {\n\t\treturn ''\n\t}\n\tconst end =\n\t\t'finishedAt' in task && typeof task.finishedAt === 'number'\n\t\t\t? task.finishedAt\n\t\t\t: Date.now()\n\tconst totalSeconds = Math.max(0, Math.floor((end - task.startedAt) / 1000))\n\tconst minutes = Math.floor(totalSeconds / 60)\n\tconst seconds = totalSeconds % 60\n\tif (minutes > 0) {\n\t\treturn `${minutes}m ${seconds}s`\n\t}\n\treturn `${seconds}s`\n}\n\nexport function formatUsage(input?: number, output?: number, total?: number) {\n\tif (\n\t\ttypeof input !== 'number' &&\n\t\ttypeof output !== 'number' &&\n\t\ttypeof total !== 'number'\n\t) {\n\t\treturn ''\n\t}\n\tconst parts = []\n\tif (typeof total === 'number') {\n\t\tparts.push(`Tokens: ${total}`)\n\t}\n\tif (typeof input === 'number') {\n\t\tparts.push(`↑${input}`)\n\t}\n\tif (typeof output === 'number') {\n\t\tparts.push(`↓${output}`)\n\t}\n\treturn parts.join(' ')\n}\n\nexport function statusLabel(status: ChatTaskRecord['status']) {\n\tswitch (status) {\n\t\tcase 'queued':\n\t\t\treturn t('taskQueued')\n\t\tcase 'running':\n\t\t\treturn t('taskRunning')\n\t\tcase 'completed':\n\t\t\treturn t('taskCompleted')\n\t\tcase 'failed':\n\t\t\treturn t('taskFailed')\n\t\tcase 'cancelled':\n\t\t\treturn t('taskCancelled')\n\t}\n}\n\nexport function statusClass(status: ChatTaskRecord['status']) {\n\tswitch (status) {\n\t\tcase 'running':\n\t\t\treturn 'bg-[var(--color-green-rgb)]/12 text-[var(--text-accent)]'\n\t\tcase 'completed':\n\t\t\treturn 'bg-[var(--color-cyan-rgb)]/12 text-[var(--text-normal)]'\n\t\tcase 'failed':\n\t\t\treturn 'bg-[var(--color-red-rgb)]/12 text-[var(--text-error)]'\n\t\tcase 'cancelled':\n\t\t\treturn 'bg-[var(--background-secondary)] text-[var(--text-muted)]'\n\t\tdefault:\n\t\t\treturn 'bg-[var(--background-secondary)] text-[var(--text-normal)]'\n\t}\n}\n\nexport function runStateLabel(runState: ChatRunState) {\n\tswitch (runState) {\n\t\tcase 'thinking':\n\t\t\treturn t('thinking')\n\t\tcase 'compressing':\n\t\t\treturn t('compressing')\n\t\tcase 'waiting_for_tools':\n\t\t\treturn t('processingTools')\n\t\tdefault:\n\t\t\treturn ''\n\t}\n}\n"
  },
  {
    "path": "packages/chatbox/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"lib\": [\"DOM\", \"ES2020\"],\n\t\t\"jsx\": \"preserve\",\n\t\t\"target\": \"ES2020\",\n\t\t\"noEmit\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"jsxImportSource\": \"solid-js\",\n\t\t\"useDefineForClassFields\": true,\n\n\t\t/* modules */\n\t\t\"module\": \"ESNext\",\n\t\t\"isolatedModules\": true,\n\t\t\"resolveJsonModule\": true,\n\t\t\"moduleResolution\": \"bundler\",\n\t\t\"allowImportingTsExtensions\": true,\n\n\t\t/* type checking */\n\t\t\"strict\": true,\n\t\t\"noUnusedLocals\": true,\n\t\t\"noUnusedParameters\": true\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "packages/chatbox/unocss.config.ts",
    "content": "import { defineConfig, presetIcons, presetUno } from 'unocss'\n\nexport default defineConfig({\n\tcontent: {\n\t\tfilesystem: ['**/*.{html,js,ts,jsx,tsx,vue,svelte,astro}'],\n\t},\n\trules: [\n\t\t[\n\t\t\t/^scrollbar-hide$/,\n\t\t\t([_]) => {\n\t\t\t\treturn `.scrollbar-hide{scrollbar-width:none}\n  .scrollbar-hide::-webkit-scrollbar{display:none}`\n\t\t\t},\n\t\t],\n\t\t[\n\t\t\t/^scrollbar-default$/,\n\t\t\t([_]) => {\n\t\t\t\treturn `.scrollbar-default{scrollbar-width:auto}\n  .scrollbar-default::-webkit-scrollbar{display:block}`\n\t\t\t},\n\t\t],\n\t],\n\tpresets: [\n\t\tpresetIcons({\n\t\t\tcollections: {\n\t\t\t\tcustom: {\n\t\t\t\t\tfolder:\n\t\t\t\t\t\t'<svg id=\"图层_1\" data-name=\"图层 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\"><title>folder</title><path d=\"M396.5,185.7l22.7,27.2a36.1,36.1,0,0,0,27.7,12.7H906.8c29.4,0,53.2,22.8,53.2,50.9V800.1c0,28.1-23.8,50.9-53.2,50.9H117.2C87.8,851,64,828.2,64,800.1V223.9c0-28.1,23.8-50.9,53.2-50.9H368.8A36.1,36.1,0,0,1,396.5,185.7Z\" style=\"fill:#9fddff\"/><path d=\"M64,342.5V797.8c0,29.4,24,53.2,53.6,53.2H906.4c29.6,0,53.6-23.8,53.6-53.2V342.5Z\" style=\"fill:#74c6ff\"/></svg>',\n\t\t\t\t\tfile: '<svg id=\"图层_1\" data-name=\"图层 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\"><title>unknown</title><path d=\"M186.9,64c-18.4,0-33.4,14.7-33.4,32.6V927.4c0,17.9,15,32.6,33.4,32.6H837.1c18.4,0,33.4-14.7,33.4-32.6V259.5L669.9,64Zm0,0\" style=\"fill:#e3ecff\"/><path d=\"M669.9,64V226.9c0,17.9,15,32.6,33.4,32.6H870.5Zm0,0\" style=\"fill:#95a7cd\"/><rect x=\"479.2\" y=\"619.9\" width=\"50\" height=\"48.57\" style=\"fill:#95a7cd\"/><path d=\"M518.9,363.4h-6.1c-56.3,0-91.3,27.4-104,81.3l-1.3,5.6L450,464.3l1.3-7.1c6.9-36.9,25.7-54.1,59.3-54.1h4.6c28.1,2.6,42.8,15.6,46.2,40.6,2.6,20.4-10.1,40.2-37.7,58.9s-41.2,44-40.1,72.9v20.7h42.8V576.9c-.9-17.7,7.9-32.8,26.1-45,38.3-26.2,56.7-55.7,54.6-87.8C602.9,393.6,573.3,366.5,518.9,363.4Z\" style=\"fill:#95a7cd\"/></svg>',\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t\tpresetUno(),\n\t],\n})\n"
  },
  {
    "path": "packages/webdav-explorer/package.json",
    "content": "{\n\t\"name\": \"webdav-explorer\",\n\t\"version\": \"0.0.0\",\n\t\"type\": \"module\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": \"./dist/index.d.ts\",\n\t\t\t\"import\": \"./dist/index.js\"\n\t\t}\n\t},\n\t\"module\": \"./dist/index.js\",\n\t\"types\": \"./dist/index.d.ts\",\n\t\"files\": [\n\t\t\"dist\"\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"rslib build\",\n\t\t\"dev\": \"rslib build --watch\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@rsbuild/plugin-babel\": \"^1.0.4\",\n\t\t\"@rsbuild/plugin-solid\": \"^1.0.5\",\n\t\t\"@rslib/core\": \"^0.5.3\",\n\t\t\"@solid-primitives/i18n\": \"^2.2.0\",\n\t\t\"@solid-primitives/media\": \"^2.3.0\",\n\t\t\"@unocss/postcss\": \"66.1.0-beta.3\",\n\t\t\"typescript\": \"^5.8.2\",\n\t\t\"unocss\": \"66.1.0-beta.3\"\n\t},\n\t\"dependencies\": {\n\t\t\"solid-js\": \"^1.9.5\"\n\t}\n}\n"
  },
  {
    "path": "packages/webdav-explorer/postcss.config.mjs",
    "content": "import UnoCSS from '@unocss/postcss'\n\nexport default {\n\tplugins: [UnoCSS()],\n}\n"
  },
  {
    "path": "packages/webdav-explorer/rslib.config.ts",
    "content": "import { pluginBabel } from '@rsbuild/plugin-babel'\nimport { pluginSolid } from '@rsbuild/plugin-solid'\nimport { defineConfig } from '@rslib/core'\n\nexport default defineConfig({\n\tsource: {\n\t\tentry: {\n\t\t\tindex: ['./src/**'],\n\t\t},\n\t},\n\ttools: {\n\t\trspack: {\n\t\t\tplugins: [],\n\t\t},\n\t},\n\tlib: [\n\t\t{\n\t\t\tbundle: false,\n\t\t\tdts: true,\n\t\t\tformat: 'esm',\n\t\t},\n\t],\n\toutput: {\n\t\ttarget: 'web',\n\t},\n\tplugins: [\n\t\tpluginBabel({\n\t\t\tinclude: /\\.(?:jsx|tsx)$/,\n\t\t}),\n\t\tpluginSolid(),\n\t],\n})\n"
  },
  {
    "path": "packages/webdav-explorer/src/App.tsx",
    "content": "import { Notice } from 'obsidian'\nimport path from 'path-browserify'\nimport { createSignal, Show } from 'solid-js'\nimport { createFileList, FileStat } from './components/FileList'\nimport NewFolder from './components/NewFolder'\nimport { t } from './i18n'\n\ntype MaybePromise<T> = Promise<T> | T\n\nexport interface fs {\n\tls: (path: string) => MaybePromise<FileStat[]>\n\tmkdirs: (path: string) => MaybePromise<void>\n}\n\nexport interface AppProps {\n\tfs: fs\n\tonConfirm: (path: string) => void\n\tonClose: () => void\n}\n\nfunction App(props: AppProps) {\n\tconst [stack, setStack] = createSignal<string[]>(['/'])\n\tconst [showNewFolder, setShowNewFolder] = createSignal(false)\n\tconst cwd = () => stack().at(-1)\n\n\tfunction enter(path: string) {\n\t\tsetStack((stack) => [...stack, path])\n\t}\n\n\tfunction pop() {\n\t\tsetStack((stack) =>\n\t\t\tstack.length > 1 ? stack.slice(0, stack.length - 1) : stack,\n\t\t)\n\t}\n\n\tconst SingleCol = () => {\n\t\tconst list = createFileList()\n\t\treturn (\n\t\t\t<div class=\"flex-1 flex flex-col overflow-y-auto scrollbar-hide\">\n\t\t\t\t<Show when={showNewFolder()}>\n\t\t\t\t\t<NewFolder\n\t\t\t\t\t\tclass=\"mt-1\"\n\t\t\t\t\t\tonCancel={() => setShowNewFolder(false)}\n\t\t\t\t\t\tonConfirm={async (name) => {\n\t\t\t\t\t\t\tconst target = path.join(cwd() ?? '/', name)\n\t\t\t\t\t\t\tawait Promise.resolve(props.fs.mkdirs(target))\n\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\tsetShowNewFolder(false)\n\t\t\t\t\t\t\t\t\tlist.refresh()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\t\t\t\tnew Notice(e.message)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</Show>\n\t\t\t\t<list.FileList\n\t\t\t\t\tfs={props.fs}\n\t\t\t\t\tpath={cwd() ?? ''}\n\t\t\t\t\tonClick={(f) => enter(f.path)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div class=\"flex flex-col gap-4 h-50vh\">\n\t\t\t<SingleCol />\n\t\t\t<div class=\"flex gap-2 text-xs\">\n\t\t\t\t<span>{t('currentPath')}:</span>\n\t\t\t\t<span class=\"break-all\">{cwd() ?? '/'}</span>\n\t\t\t</div>\n\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t<button onClick={pop}>{t('goBack')}</button>\n\t\t\t\t<a class=\"no-underline\" onClick={() => setShowNewFolder(true)}>\n\t\t\t\t\t{t('newFolder')}\n\t\t\t\t</a>\n\t\t\t\t<div class=\"flex-1\"></div>\n\t\t\t\t<button onClick={props.onClose}>{t('cancel')}</button>\n\t\t\t\t<button onclick={() => props.onConfirm(cwd() ?? '/')}>\n\t\t\t\t\t{t('confirm')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nexport default App\n"
  },
  {
    "path": "packages/webdav-explorer/src/assets/styles/global.css",
    "content": "@unocss;\n"
  },
  {
    "path": "packages/webdav-explorer/src/components/File.tsx",
    "content": "export interface FolderProps {\n\tname: string\n}\n\nfunction File(props: FolderProps) {\n\treturn (\n\t\t<div class=\"flex gap-2 items-center max-w-full border-rounded px-1 hover:cursor-not-allowed opacity-20\">\n\t\t\t<div class=\"i-custom:file size-10\" />\n\t\t\t<span class=\"truncate flex-1\">{props.name}</span>\n\t\t</div>\n\t)\n}\n\nexport default File\n"
  },
  {
    "path": "packages/webdav-explorer/src/components/FileList.tsx",
    "content": "import { Notice } from 'obsidian'\nimport { createEffect, createSignal, For, Show } from 'solid-js'\nimport { type fs } from '../App'\nimport File from './File'\nimport Folder from './Folder'\n\nexport interface FileStat {\n\tpath: string\n\tbasename: string\n\tisDir: boolean\n}\n\nexport interface FileListProps {\n\tpath: string\n\tfs: fs\n\tonClick: (file: FileStat) => void\n}\n\nexport function createFileList() {\n\tconst [version, setVersion] = createSignal(0)\n\treturn {\n\t\trefresh() {\n\t\t\tsetVersion((v) => ++v)\n\t\t},\n\t\tFileList(props: FileListProps) {\n\t\t\tconst [items, setItems] = createSignal<FileStat[]>([])\n\n\t\t\tconst sortedItems = () =>\n\t\t\t\titems().sort((a, b) => {\n\t\t\t\t\tif (a.isDir === b.isDir) {\n\t\t\t\t\t\treturn a.basename.localeCompare(b.basename, ['zh'])\n\t\t\t\t\t}\n\t\t\t\t\tif (a.isDir && !b.isDir) {\n\t\t\t\t\t\treturn -1\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn 1\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\tasync function refresh() {\n\t\t\t\ttry {\n\t\t\t\t\tconst items = await props.fs.ls(props.path)\n\t\t\t\t\tsetItems(items)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\tnew Notice(e.message)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcreateEffect(async () => {\n\t\t\t\tif (version() === 0) {\n\t\t\t\t\tawait refresh()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tsetVersion(0)\n\t\t\t})\n\n\t\t\treturn (\n\t\t\t\t<For each={sortedItems()}>\n\t\t\t\t\t{(f) => (\n\t\t\t\t\t\t<Show when={f.isDir} fallback={<File name={f.basename} />}>\n\t\t\t\t\t\t\t<Folder\n\t\t\t\t\t\t\t\tname={f.basename}\n\t\t\t\t\t\t\t\tpath={f.path}\n\t\t\t\t\t\t\t\tonClick={() => props.onClick(f)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Show>\n\t\t\t\t\t)}\n\t\t\t\t</For>\n\t\t\t)\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "packages/webdav-explorer/src/components/Folder.tsx",
    "content": "export interface FolderProps {\n\tname: string\n\tpath: string\n\tonClick: (path: string) => void\n}\n\nfunction Folder(props: FolderProps) {\n\treturn (\n\t\t<div\n\t\t\tclass=\"flex gap-2 items-center max-w-full hover:bg-[var(--interactive-accent)] border-rounded px-1\"\n\t\t\tonClick={() => props.onClick(props.path)}\n\t\t>\n\t\t\t<div class=\"i-custom:folder size-10\" />\n\t\t\t<span class=\"truncate flex-1\">{props.name}</span>\n\t\t</div>\n\t)\n}\n\nexport default Folder\n"
  },
  {
    "path": "packages/webdav-explorer/src/components/NewFolder.tsx",
    "content": "import { createSignal } from 'solid-js'\nimport { t } from '../i18n'\n\ninterface NewFolderProps {\n\tclass?: string\n\tonConfirm: (name: string) => void\n\tonCancel: () => void\n}\n\nfunction NewFolder(props: NewFolderProps) {\n\tconst [name, setName] = createSignal('')\n\n\tconst className = () => `flex items-center gap-2 px-1 ${props.class}`\n\n\treturn (\n\t\t<div class={className()}>\n\t\t\t<div class=\"i-custom:folder size-10\"></div>\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tclass=\"flex-1\"\n\t\t\t\tautofocus\n\t\t\t\tvalue={name()}\n\t\t\t\tonInput={(e) => setName(e.target.value)}\n\t\t\t/>\n\t\t\t<button onClick={() => props.onConfirm(name())}>{t('confirm')}</button>\n\t\t\t<button onClick={() => props.onCancel()}>{t('cancel')}</button>\n\t\t</div>\n\t)\n}\n\nexport default NewFolder\n"
  },
  {
    "path": "packages/webdav-explorer/src/i18n/index.ts",
    "content": "import * as i18n from '@solid-primitives/i18n'\nimport { createResource, createSignal } from 'solid-js'\nimport en from './locales/en'\nimport zh from './locales/zh'\n\nexport type Locale = 'zh' | 'en'\n\nexport function toLocale(language: string) {\n\tswitch (language.split('-')[0].toLowerCase()) {\n\t\tcase 'zh':\n\t\t\treturn 'zh'\n\t\tdefault:\n\t\t\treturn 'en'\n\t}\n}\n\nexport const [locale, setLocale] = createSignal<Locale>(\n\ttoLocale(navigator.language),\n)\n\nconst [dict] = createResource(locale, (locale) => {\n\tswitch (locale) {\n\t\tcase 'zh':\n\t\t\treturn i18n.flatten(zh)\n\t\tdefault:\n\t\t\treturn i18n.flatten(en)\n\t}\n})\n\nexport const t = i18n.translator(dict)\n"
  },
  {
    "path": "packages/webdav-explorer/src/i18n/locales/en.ts",
    "content": "const en = {\n\tnewFolder: 'New Folder',\n\tgoBack: 'Go Back',\n\tconfirm: 'Confirm',\n\tcancel: 'Cancel',\n\tcurrentPath: 'Current Path',\n}\n\nexport default en\n"
  },
  {
    "path": "packages/webdav-explorer/src/i18n/locales/zh.ts",
    "content": "const zh = {\n\tnewFolder: '新建文件夹',\n\tgoBack: '返回上一层',\n\tconfirm: '确定',\n\tcancel: '取消',\n\tcurrentPath: '当前路径',\n}\n\nexport default zh\n"
  },
  {
    "path": "packages/webdav-explorer/src/index.tsx",
    "content": "import './assets/styles/global.css'\n\nimport { render } from 'solid-js/web'\nimport App, { AppProps } from './App'\n\nexport function mount(el: Element, props: AppProps) {\n\treturn render(() => <App {...props} />, el)\n}\n"
  },
  {
    "path": "packages/webdav-explorer/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"lib\": [\"DOM\", \"ES2020\"],\n\t\t\"jsx\": \"preserve\",\n\t\t\"target\": \"ES2020\",\n\t\t\"noEmit\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"jsxImportSource\": \"solid-js\",\n\t\t\"useDefineForClassFields\": true,\n\n\t\t/* modules */\n\t\t\"module\": \"ESNext\",\n\t\t\"isolatedModules\": true,\n\t\t\"resolveJsonModule\": true,\n\t\t\"moduleResolution\": \"bundler\",\n\t\t\"allowImportingTsExtensions\": true,\n\n\t\t/* type checking */\n\t\t\"strict\": true,\n\t\t\"noUnusedLocals\": true,\n\t\t\"noUnusedParameters\": true\n\t},\n\t\"include\": [\"src\"]\n}\n"
  },
  {
    "path": "packages/webdav-explorer/unocss.config.ts",
    "content": "import { defineConfig, presetIcons, presetUno } from 'unocss'\n\nexport default defineConfig({\n\tcontent: {\n\t\tfilesystem: ['**/*.{html,js,ts,jsx,tsx,vue,svelte,astro}'],\n\t},\n\trules: [\n\t\t[\n\t\t\t/^scrollbar-hide$/,\n\t\t\t([_]) => {\n\t\t\t\treturn `.scrollbar-hide{scrollbar-width:none}\n  .scrollbar-hide::-webkit-scrollbar{display:none}`\n\t\t\t},\n\t\t],\n\t\t[\n\t\t\t/^scrollbar-default$/,\n\t\t\t([_]) => {\n\t\t\t\treturn `.scrollbar-default{scrollbar-width:auto}\n  .scrollbar-default::-webkit-scrollbar{display:block}`\n\t\t\t},\n\t\t],\n\t],\n\tpresets: [\n\t\tpresetIcons({\n\t\t\tcollections: {\n\t\t\t\tcustom: {\n\t\t\t\t\tfolder:\n\t\t\t\t\t\t'<svg id=\"图层_1\" data-name=\"图层 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\"><title>folder</title><path d=\"M396.5,185.7l22.7,27.2a36.1,36.1,0,0,0,27.7,12.7H906.8c29.4,0,53.2,22.8,53.2,50.9V800.1c0,28.1-23.8,50.9-53.2,50.9H117.2C87.8,851,64,828.2,64,800.1V223.9c0-28.1,23.8-50.9,53.2-50.9H368.8A36.1,36.1,0,0,1,396.5,185.7Z\" style=\"fill:#9fddff\"/><path d=\"M64,342.5V797.8c0,29.4,24,53.2,53.6,53.2H906.4c29.6,0,53.6-23.8,53.6-53.2V342.5Z\" style=\"fill:#74c6ff\"/></svg>',\n\t\t\t\t\tfile: '<svg id=\"图层_1\" data-name=\"图层 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\"><title>unknown</title><path d=\"M186.9,64c-18.4,0-33.4,14.7-33.4,32.6V927.4c0,17.9,15,32.6,33.4,32.6H837.1c18.4,0,33.4-14.7,33.4-32.6V259.5L669.9,64Zm0,0\" style=\"fill:#e3ecff\"/><path d=\"M669.9,64V226.9c0,17.9,15,32.6,33.4,32.6H870.5Zm0,0\" style=\"fill:#95a7cd\"/><rect x=\"479.2\" y=\"619.9\" width=\"50\" height=\"48.57\" style=\"fill:#95a7cd\"/><path d=\"M518.9,363.4h-6.1c-56.3,0-91.3,27.4-104,81.3l-1.3,5.6L450,464.3l1.3-7.1c6.9-36.9,25.7-54.1,59.3-54.1h4.6c28.1,2.6,42.8,15.6,46.2,40.6,2.6,20.4-10.1,40.2-37.7,58.9s-41.2,44-40.1,72.9v20.7h42.8V576.9c-.9-17.7,7.9-32.8,26.1-45,38.3-26.2,56.7-55.7,54.6-87.8C602.9,393.6,573.3,366.5,518.9,363.4Z\" style=\"fill:#95a7cd\"/></svg>',\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t\tpresetUno(),\n\t],\n})\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - packages/*\n"
  },
  {
    "path": "src/ai/bash/fs.ts",
    "content": "import {\n\tInMemoryFs,\n\ttype BufferEncoding,\n\ttype CpOptions,\n\ttype FileContent,\n\ttype FsStat,\n\ttype IFileSystem,\n\ttype MkdirOptions,\n\ttype RmOptions,\n} from 'just-bash/browser'\nimport {\n\tnormalizePath,\n\tTFile,\n\tTFolder,\n\ttype App,\n\ttype TAbstractFile,\n\ttype Vault,\n} from 'obsidian'\nimport { posix as pathPosix } from 'path-browserify'\nimport type {\n\tAIDualPathFileOperation,\n\tAISinglePathFileOperation,\n} from '~/ai/file-operation'\nimport type { PermissionGuard } from '~/ai/permission-guard'\nimport { cloneReversibleToolOp, type ReversibleToolOp } from '~/chat/domain'\n\nconst FILE_MODE = 0o644\nconst DIR_MODE = 0o755\nconst VAULT_MOUNT_POINT = '/vault'\ntype ReadFileOptions = { encoding?: BufferEncoding | null }\ntype WriteFileOptions = { encoding?: BufferEncoding }\ntype SnapshotKind = 'file' | 'dir'\ntype VaultSnapshotNode = {\n\tpath: string\n\tkind: SnapshotKind\n\tcontentBase64?: string\n}\n\nfunction encodeBase64(content: Uint8Array) {\n\tif (typeof Buffer !== 'undefined') {\n\t\treturn Buffer.from(content).toString('base64')\n\t}\n\tlet binary = ''\n\tfor (const byte of content) {\n\t\tbinary += String.fromCharCode(byte)\n\t}\n\treturn btoa(binary)\n}\n\nfunction getEncoding(\n\toptions?: ReadFileOptions | WriteFileOptions | BufferEncoding | null,\n) {\n\tif (!options) {\n\t\treturn 'utf8'\n\t}\n\treturn typeof options === 'string' ? options : (options.encoding ?? 'utf8')\n}\n\nfunction decodeContent(\n\tcontent: Uint8Array,\n\toptions?: ReadFileOptions | BufferEncoding,\n) {\n\tconst encoding = getEncoding(options)\n\tif (encoding === 'base64') {\n\t\tif (typeof Buffer !== 'undefined') {\n\t\t\treturn Buffer.from(content).toString('base64')\n\t\t}\n\t\tlet binary = ''\n\t\tfor (const byte of content) {\n\t\t\tbinary += String.fromCharCode(byte)\n\t\t}\n\t\treturn btoa(binary)\n\t}\n\treturn new TextDecoder(encoding === 'utf-8' ? 'utf-8' : 'utf-8').decode(\n\t\tcontent,\n\t)\n}\n\nfunction encodeContent(\n\tcontent: FileContent,\n\toptions?: WriteFileOptions | BufferEncoding,\n) {\n\tif (content instanceof Uint8Array) {\n\t\treturn content\n\t}\n\n\tconst encoding = getEncoding(options)\n\tif (encoding === 'base64') {\n\t\tif (typeof Buffer !== 'undefined') {\n\t\t\treturn Uint8Array.from(Buffer.from(content, 'base64'))\n\t\t}\n\t\tconst decoded = atob(content)\n\t\treturn Uint8Array.from(decoded, (char) => char.charCodeAt(0))\n\t}\n\n\treturn new TextEncoder().encode(content)\n}\n\nfunction toArrayBuffer(content: Uint8Array) {\n\treturn content.buffer.slice(\n\t\tcontent.byteOffset,\n\t\tcontent.byteOffset + content.byteLength,\n\t) as ArrayBuffer\n}\n\nfunction getPathDepth(path: string) {\n\treturn path.split('/').filter(Boolean).length\n}\n\nfunction normalizeVirtualPath(inputPath: string) {\n\tconst normalized = pathPosix.normalize(pathPosix.resolve('/', inputPath))\n\treturn normalized === '' ? '/' : normalized\n}\n\nfunction joinVirtualPath(parent: string, name: string) {\n\treturn parent === '/' ? `/${name}` : `${parent}/${name}`\n}\n\nfunction ensureNotEscapingRoot(inputPath: string) {\n\tconst normalized = normalizeVirtualPath(inputPath)\n\tif (!normalized.startsWith('/')) {\n\t\tthrow new Error(`EINVAL: invalid path '${inputPath}'`)\n\t}\n\treturn normalized\n}\n\nfunction normalizeReversibleVaultPath(path: string) {\n\tconst normalized = ensureNotEscapingRoot(path)\n\tif (normalized === '/') {\n\t\treturn ''\n\t}\n\treturn normalizePath(normalized.slice(1))\n}\n\nfunction mapStat(stat: {\n\ttype: 'file' | 'folder'\n\tsize: number\n\tmtime: number\n}): FsStat {\n\treturn {\n\t\tisFile: stat.type === 'file',\n\t\tisDirectory: stat.type === 'folder',\n\t\tisSymbolicLink: false,\n\t\tmode: stat.type === 'folder' ? DIR_MODE : FILE_MODE,\n\t\tsize: stat.type === 'file' ? stat.size : 0,\n\t\tmtime: new Date(stat.mtime),\n\t}\n}\n\nfunction mapAbstractFileStat(file: TAbstractFile): FsStat {\n\tif (file instanceof TFolder) {\n\t\treturn mapStat({\n\t\t\ttype: 'folder',\n\t\t\tsize: 0,\n\t\t\tmtime: 0,\n\t\t})\n\t}\n\n\treturn mapStat({\n\t\ttype: 'file',\n\t\tsize: (file as TFile).stat.size,\n\t\tmtime: (file as TFile).stat.mtime,\n\t})\n}\n\nasync function copyRecursive(\n\tfs: IFileSystem,\n\tsrc: string,\n\tdest: string,\n\toptions?: CpOptions,\n) {\n\tconst sourceStat = await fs.stat(src)\n\tif (sourceStat.isDirectory) {\n\t\tif (!options?.recursive) {\n\t\t\tthrow new Error(`EISDIR: illegal operation on a directory, copy '${src}'`)\n\t\t}\n\t\tawait fs.mkdir(dest, { recursive: true })\n\t\tfor (const entry of await fs.readdir(src)) {\n\t\t\tawait copyRecursive(\n\t\t\t\tfs,\n\t\t\t\tjoinVirtualPath(src, entry),\n\t\t\t\tjoinVirtualPath(dest, entry),\n\t\t\t\toptions,\n\t\t\t)\n\t\t}\n\t\treturn\n\t}\n\n\tconst content = await fs.readFileBuffer(src)\n\tawait fs.writeFile(dest, content)\n}\n\nasync function removeRecursive(\n\tfs: IFileSystem,\n\ttargetPath: string,\n\toptions?: RmOptions,\n) {\n\tconst stat = await fs.stat(targetPath)\n\tif (stat.isDirectory) {\n\t\tconst children = await fs.readdir(targetPath)\n\t\tif (children.length > 0 && !options?.recursive) {\n\t\t\tthrow new Error(`ENOTEMPTY: directory not empty, remove '${targetPath}'`)\n\t\t}\n\t\tfor (const child of children) {\n\t\t\tawait removeRecursive(fs, joinVirtualPath(targetPath, child), options)\n\t\t}\n\t}\n\tawait fs.rm(targetPath, options)\n}\n\nexport async function listVaultPaths(app: App) {\n\tconst paths = new Set<string>(['/'])\n\tconst queue = [...app.vault.getRoot().children]\n\n\twhile (queue.length > 0) {\n\t\tconst current = queue.shift()\n\t\tif (!current) {\n\t\t\tcontinue\n\t\t}\n\n\t\tpaths.add(`/${normalizePath(current.path)}`)\n\t\tif (current instanceof TFolder) {\n\t\t\tqueue.push(...current.children)\n\t\t}\n\t}\n\n\treturn [...paths]\n}\n\nexport class ReversibleOpRecorder {\n\tprivate readonly operations: ReversibleToolOp[] = []\n\n\trecordCreate(vaultPath: string, kind: SnapshotKind) {\n\t\tconst normalizedPath = normalizeReversibleVaultPath(vaultPath)\n\t\tif (!normalizedPath) {\n\t\t\treturn\n\t\t}\n\t\tthis.operations.push({\n\t\t\tvaultPath: normalizedPath,\n\t\t\toperation: 'create',\n\t\t\tbefore: { kind },\n\t\t})\n\t}\n\n\trecordUpdate(vaultPath: string, contentBase64: string) {\n\t\tconst normalizedPath = normalizeReversibleVaultPath(vaultPath)\n\t\tif (!normalizedPath) {\n\t\t\treturn\n\t\t}\n\t\tthis.operations.push({\n\t\t\tvaultPath: normalizedPath,\n\t\t\toperation: 'update',\n\t\t\tbefore: {\n\t\t\t\tkind: 'file',\n\t\t\t\tcontentBase64,\n\t\t\t},\n\t\t})\n\t}\n\n\trecordDelete(snapshot: VaultSnapshotNode) {\n\t\tconst normalizedPath = normalizeReversibleVaultPath(snapshot.path)\n\t\tif (!normalizedPath) {\n\t\t\treturn\n\t\t}\n\t\tthis.operations.push({\n\t\t\tvaultPath: normalizedPath,\n\t\t\toperation: 'delete',\n\t\t\tbefore:\n\t\t\t\tsnapshot.kind === 'dir'\n\t\t\t\t\t? { kind: 'dir' }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\t\tcontentBase64: snapshot.contentBase64 || '',\n\t\t\t\t\t\t},\n\t\t})\n\t}\n\n\tgetOperations(): ReversibleToolOp[] {\n\t\treturn this.operations.map(cloneReversibleToolOp)\n\t}\n}\n\nexport class ObsidianVaultFs implements IFileSystem {\n\tprivate readonly snapshot = new Set<string>()\n\tprivate _batchDepth = 0\n\n\tconstructor(\n\t\tprivate readonly vault: Vault,\n\t\tinitialPaths: string[] = [],\n\t\tprivate readonly permissionGuard?: PermissionGuard,\n\t\tprivate readonly recorder?: ReversibleOpRecorder,\n\t) {\n\t\tfor (const path of initialPaths) {\n\t\t\tthis.snapshot.add(ensureNotEscapingRoot(path))\n\t\t}\n\t\tthis.snapshot.add('/')\n\t}\n\n\tprivate async withBatch<T>(fn: () => Promise<T>): Promise<T> {\n\t\tthis._batchDepth++\n\t\ttry {\n\t\t\treturn await fn()\n\t\t} finally {\n\t\t\tthis._batchDepth--\n\t\t}\n\t}\n\n\tprivate async checkPermission(\n\t\trequest:\n\t\t\t| { kind: AISinglePathFileOperation; path: string }\n\t\t\t| { kind: AIDualPathFileOperation; src: string; dest: string },\n\t): Promise<void> {\n\t\tif (this._batchDepth > 0 || !this.permissionGuard) return\n\t\tconst normalizedRequest =\n\t\t\t'src' in request\n\t\t\t\t? {\n\t\t\t\t\t\ttype: 'fs' as const,\n\t\t\t\t\t\tfs: {\n\t\t\t\t\t\t\tkind: request.kind,\n\t\t\t\t\t\t\tsrc: this.toPermissionPath(request.src),\n\t\t\t\t\t\t\tdest: this.toPermissionPath(request.dest),\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\ttype: 'fs' as const,\n\t\t\t\t\t\tfs: {\n\t\t\t\t\t\t\tkind: request.kind,\n\t\t\t\t\t\t\tpath: this.toPermissionPath(request.path),\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\tawait this.permissionGuard({\n\t\t\t...normalizedRequest,\n\t\t})\n\t}\n\n\tprivate toPermissionPath(path: string) {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\treturn normalized === '/'\n\t\t\t? VAULT_MOUNT_POINT\n\t\t\t: `${VAULT_MOUNT_POINT}${normalized}`\n\t}\n\n\tprivate toVaultPath(inputPath: string) {\n\t\tconst normalized = ensureNotEscapingRoot(inputPath)\n\t\treturn normalized === '/' ? '' : normalizePath(normalized.slice(1))\n\t}\n\n\tprivate async statInternal(inputPath: string) {\n\t\tconst target = this.vault.getAbstractFileByPath(this.toVaultPath(inputPath))\n\t\tif (!target) {\n\t\t\tthrow new Error(`ENOENT: no such file or directory, stat '${inputPath}'`)\n\t\t}\n\t\treturn target\n\t}\n\n\tprivate async readFileContentBase64(target: TFile) {\n\t\treturn encodeBase64(\n\t\t\tnew Uint8Array(\n\t\t\t\t(await this.vault.readBinary(target as never)) as ArrayBuffer,\n\t\t\t),\n\t\t)\n\t}\n\n\tprivate async snapshotNode(\n\t\ttarget:\n\t\t\t| TAbstractFile\n\t\t\t| { path: string; name: string; children?: unknown[] },\n\t\tvirtualPath: string,\n\t): Promise<VaultSnapshotNode[]> {\n\t\tif (target instanceof TFolder) {\n\t\t\tconst children = [...target.children].sort((left, right) =>\n\t\t\t\tleft.path.localeCompare(right.path),\n\t\t\t)\n\t\t\tconst snapshots: VaultSnapshotNode[] = []\n\t\t\tfor (const child of children) {\n\t\t\t\tsnapshots.push(\n\t\t\t\t\t...(await this.snapshotNode(\n\t\t\t\t\t\tchild,\n\t\t\t\t\t\tjoinVirtualPath(virtualPath, child.name),\n\t\t\t\t\t)),\n\t\t\t\t)\n\t\t\t}\n\t\t\tsnapshots.push({ path: virtualPath, kind: 'dir' })\n\t\t\treturn snapshots\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpath: virtualPath,\n\t\t\t\tkind: 'file',\n\t\t\t\tcontentBase64: await this.readFileContentBase64(target as TFile),\n\t\t\t},\n\t\t]\n\t}\n\n\tprivate async snapshotSubtree(path: string) {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\tconst target = this.vault.getAbstractFileByPath(\n\t\t\tthis.toVaultPath(normalized),\n\t\t)\n\t\tif (!target) {\n\t\t\treturn []\n\t\t}\n\t\treturn this.snapshotNode(target, normalized)\n\t}\n\n\tprivate toSnapshotMap(entries: VaultSnapshotNode[]) {\n\t\treturn new Map(entries.map((entry) => [entry.path, entry]))\n\t}\n\n\tprivate recordDeleteSnapshots(entries: VaultSnapshotNode[]) {\n\t\tif (!this.recorder) {\n\t\t\treturn\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tthis.recorder.recordDelete(entry)\n\t\t}\n\t}\n\n\tprivate recordTargetDiff(\n\t\tbeforeEntries: VaultSnapshotNode[],\n\t\tafterEntries: VaultSnapshotNode[],\n\t) {\n\t\tif (!this.recorder) {\n\t\t\treturn\n\t\t}\n\t\tconst beforeByPath = this.toSnapshotMap(beforeEntries)\n\t\tconst afterByPath = this.toSnapshotMap(afterEntries)\n\n\t\tfor (const entry of afterEntries.sort((left, right) => {\n\t\t\tconst depthDelta = getPathDepth(left.path) - getPathDepth(right.path)\n\t\t\treturn depthDelta !== 0 ? depthDelta : left.path.localeCompare(right.path)\n\t\t})) {\n\t\t\tconst previous = beforeByPath.get(entry.path)\n\t\t\tif (!previous) {\n\t\t\t\tthis.recorder.recordCreate(entry.path, entry.kind)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (previous.kind !== entry.kind) {\n\t\t\t\tthis.recorder.recordDelete(previous)\n\t\t\t\tthis.recorder.recordCreate(entry.path, entry.kind)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (\n\t\t\t\tentry.kind === 'file' &&\n\t\t\t\tprevious.contentBase64 !== entry.contentBase64\n\t\t\t) {\n\t\t\t\tthis.recorder.recordUpdate(entry.path, previous.contentBase64 || '')\n\t\t\t}\n\t\t}\n\n\t\tfor (const entry of beforeEntries\n\t\t\t.filter((entry) => !afterByPath.has(entry.path))\n\t\t\t.sort((left, right) => {\n\t\t\t\tconst depthDelta = getPathDepth(right.path) - getPathDepth(left.path)\n\t\t\t\treturn depthDelta !== 0\n\t\t\t\t\t? depthDelta\n\t\t\t\t\t: left.path.localeCompare(right.path)\n\t\t\t})) {\n\t\t\tthis.recorder.recordDelete(entry)\n\t\t}\n\t}\n\n\tprivate async deleteAbstractFile(target: TAbstractFile) {\n\t\tif (typeof this.vault.trash === 'function') {\n\t\t\tawait this.vault.trash(target, false)\n\t\t\treturn\n\t\t}\n\t\tif (typeof this.vault.delete === 'function') {\n\t\t\tawait this.vault.delete(target, false)\n\t\t\treturn\n\t\t}\n\t\tthrow new Error(\n\t\t\t`ENOTSUP: vault delete is not available for '${target.path}'`,\n\t\t)\n\t}\n\n\tprivate recordPath(inputPath: string) {\n\t\tconst normalized = ensureNotEscapingRoot(inputPath)\n\t\tconst parts = normalized.split('/').filter(Boolean)\n\t\tthis.snapshot.add('/')\n\t\tlet current = ''\n\t\tfor (const part of parts) {\n\t\t\tcurrent = `${current}/${part}`\n\t\t\tthis.snapshot.add(current)\n\t\t}\n\t}\n\n\tprivate forgetPath(inputPath: string) {\n\t\tconst normalized = ensureNotEscapingRoot(inputPath)\n\t\tfor (const path of [...this.snapshot]) {\n\t\t\tif (path === normalized || path.startsWith(`${normalized}/`)) {\n\t\t\t\tthis.snapshot.delete(path)\n\t\t\t}\n\t\t}\n\t\tthis.snapshot.add('/')\n\t}\n\n\tprivate assertExists(path: string) {\n\t\treturn this.exists(path).then((exists) => {\n\t\t\tif (!exists) {\n\t\t\t\tthrow new Error(`ENOENT: no such file or directory, access '${path}'`)\n\t\t\t}\n\t\t})\n\t}\n\n\tasync readFile(\n\t\tpath: string,\n\t\toptions?: ReadFileOptions | BufferEncoding,\n\t): Promise<string> {\n\t\treturn this.withBatch(() =>\n\t\t\tthis.readFileBuffer(path).then((buf) => decodeContent(buf, options)),\n\t\t)\n\t}\n\n\tasync readFileBuffer(path: string): Promise<Uint8Array> {\n\t\tconst stat = await this.stat(path)\n\t\tif (!stat.isFile) {\n\t\t\tthrow new Error(\n\t\t\t\t`EISDIR: illegal operation on a directory, read '${path}'`,\n\t\t\t)\n\t\t}\n\t\tconst target = this.vault.getAbstractFileByPath(this.toVaultPath(path))\n\t\tif (!(target instanceof TFile)) {\n\t\t\tthrow new Error(`ENOENT: no such file or directory, read '${path}'`)\n\t\t}\n\t\tconst buffer = await this.vault.readBinary(target as never)\n\t\treturn new Uint8Array(buffer as ArrayBuffer)\n\t}\n\n\tasync writeFile(\n\t\tpath: string,\n\t\tcontent: FileContent,\n\t\toptions?: WriteFileOptions | BufferEncoding,\n\t): Promise<void> {\n\t\tawait this.checkPermission({ kind: 'write', path })\n\t\tawait this.withBatch(async () => {\n\t\t\tawait this.mkdir(pathPosix.dirname(ensureNotEscapingRoot(path)), {\n\t\t\t\trecursive: true,\n\t\t\t})\n\t\t\tconst encoded = encodeContent(content, options)\n\t\t\tconst vaultPath = this.toVaultPath(path)\n\t\t\tconst target = this.vault.getAbstractFileByPath(vaultPath)\n\t\t\tif (target) {\n\t\t\t\tif (!(target instanceof TFile)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`EISDIR: illegal operation on a directory, write '${path}'`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthis.recorder?.recordUpdate(\n\t\t\t\t\tpath,\n\t\t\t\t\tawait this.readFileContentBase64(target),\n\t\t\t\t)\n\t\t\t\tawait this.vault.modifyBinary(target as never, toArrayBuffer(encoded))\n\t\t\t} else {\n\t\t\t\tawait this.vault.createBinary(vaultPath, toArrayBuffer(encoded))\n\t\t\t\tthis.recorder?.recordCreate(path, 'file')\n\t\t\t}\n\t\t\tthis.recordPath(path)\n\t\t})\n\t}\n\n\tasync appendFile(\n\t\tpath: string,\n\t\tcontent: FileContent,\n\t\toptions?: WriteFileOptions | BufferEncoding,\n\t): Promise<void> {\n\t\tawait this.checkPermission({ kind: 'write', path })\n\t\tawait this.withBatch(async () => {\n\t\t\tconst encoded = encodeContent(content, options)\n\t\t\tconst existing = (await this.exists(path))\n\t\t\t\t? await this.readFileBuffer(path)\n\t\t\t\t: (new Uint8Array(0) as Uint8Array)\n\t\t\tconst merged = new Uint8Array(existing.length + encoded.length)\n\t\t\tmerged.set(existing)\n\t\t\tmerged.set(encoded, existing.length)\n\t\t\tawait this.writeFile(path, merged)\n\t\t})\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\tif (normalized === '/') {\n\t\t\treturn true\n\t\t}\n\t\treturn Boolean(\n\t\t\tthis.vault.getAbstractFileByPath(this.toVaultPath(normalized)),\n\t\t)\n\t}\n\n\tasync stat(path: string): Promise<FsStat> {\n\t\tif (ensureNotEscapingRoot(path) === '/') {\n\t\t\treturn {\n\t\t\t\tisFile: false,\n\t\t\t\tisDirectory: true,\n\t\t\t\tisSymbolicLink: false,\n\t\t\t\tmode: DIR_MODE,\n\t\t\t\tsize: 0,\n\t\t\t\tmtime: new Date(0),\n\t\t\t}\n\t\t}\n\t\treturn mapAbstractFileStat(await this.statInternal(path))\n\t}\n\n\tasync mkdir(path: string, options?: MkdirOptions): Promise<void> {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\tif (normalized === '/') {\n\t\t\treturn\n\t\t}\n\t\tawait this.checkPermission({ kind: 'mkdir', path })\n\n\t\tconst segments = normalized.split('/').filter(Boolean)\n\t\tlet current = ''\n\t\tfor (let index = 0; index < segments.length; index += 1) {\n\t\t\tcurrent = `${current}/${segments[index]}`\n\t\t\tif (await this.exists(current)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!options?.recursive && index !== segments.length - 1) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`ENOENT: no such file or directory, mkdir '${normalized}'`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait this.vault.createFolder(this.toVaultPath(current))\n\t\t\tthis.recorder?.recordCreate(current, 'dir')\n\t\t\tthis.recordPath(current)\n\t\t}\n\t}\n\n\tasync readdir(path: string): Promise<string[]> {\n\t\tconst stat = await this.stat(path)\n\t\tif (!stat.isDirectory) {\n\t\t\tthrow new Error(`ENOTDIR: not a directory, scandir '${path}'`)\n\t\t}\n\t\tconst target =\n\t\t\tthis.toVaultPath(path) === ''\n\t\t\t\t? this.vault.getRoot()\n\t\t\t\t: this.vault.getAbstractFileByPath(this.toVaultPath(path))\n\t\tif (!(target instanceof TFolder)) {\n\t\t\tthrow new Error(`ENOTDIR: not a directory, scandir '${path}'`)\n\t\t}\n\t\treturn [...target.children]\n\t\t\t.map((item) => item.name)\n\t\t\t.filter((item): item is string => Boolean(item))\n\t\t\t.sort()\n\t}\n\n\tasync readdirWithFileTypes(path: string) {\n\t\tconst stat = await this.stat(path)\n\t\tif (!stat.isDirectory) {\n\t\t\tthrow new Error(`ENOTDIR: not a directory, scandir '${path}'`)\n\t\t}\n\t\tconst target =\n\t\t\tthis.toVaultPath(path) === ''\n\t\t\t\t? this.vault.getRoot()\n\t\t\t\t: this.vault.getAbstractFileByPath(this.toVaultPath(path))\n\t\tif (!(target instanceof TFolder)) {\n\t\t\tthrow new Error(`ENOTDIR: not a directory, scandir '${path}'`)\n\t\t}\n\t\treturn [...target.children]\n\t\t\t.map((item) => ({\n\t\t\t\tname: item.name,\n\t\t\t\tisFile: item instanceof TFile,\n\t\t\t\tisDirectory: item instanceof TFolder,\n\t\t\t\tisSymbolicLink: false,\n\t\t\t}))\n\t\t\t.sort((left, right) => left.name.localeCompare(right.name))\n\t}\n\n\tasync rm(path: string, options?: RmOptions): Promise<void> {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\tif (normalized === '/') {\n\t\t\tthrow new Error(`EPERM: operation not permitted, remove '${path}'`)\n\t\t}\n\t\tawait this.checkPermission({ kind: 'delete', path })\n\n\t\tif (!(await this.exists(normalized))) {\n\t\t\tif (options?.force) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow new Error(`ENOENT: no such file or directory, remove '${path}'`)\n\t\t}\n\n\t\tconst target = this.vault.getAbstractFileByPath(\n\t\t\tthis.toVaultPath(normalized),\n\t\t)\n\t\tif (!target) {\n\t\t\tthrow new Error(`ENOENT: no such file or directory, remove '${path}'`)\n\t\t}\n\t\tthis.recordDeleteSnapshots(await this.snapshotSubtree(normalized))\n\t\tawait this.deleteAbstractFile(target)\n\t\tthis.forgetPath(normalized)\n\t}\n\n\tasync cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n\t\tawait this.checkPermission({ kind: 'copy', src, dest })\n\t\tawait this.withBatch(() => copyRecursive(this, src, dest, options))\n\t}\n\n\tasync mv(src: string, dest: string): Promise<void> {\n\t\tawait this.checkPermission({ kind: 'move', src, dest })\n\t\tawait this.withBatch(async () => {\n\t\t\tconst sourceSnapshots = await this.snapshotSubtree(src)\n\t\t\tif (sourceSnapshots.length === 0) {\n\t\t\t\tthrow new Error(`ENOENT: no such file or directory, move '${src}'`)\n\t\t\t}\n\t\t\tconst destSnapshotsBefore = await this.snapshotSubtree(dest)\n\t\t\tawait this.mkdir(pathPosix.dirname(ensureNotEscapingRoot(dest)), {\n\t\t\t\trecursive: true,\n\t\t\t})\n\t\t\tconst target = this.vault.getAbstractFileByPath(this.toVaultPath(src))\n\t\t\tif (!target) {\n\t\t\t\tthrow new Error(`ENOENT: no such file or directory, move '${src}'`)\n\t\t\t}\n\t\t\tthis.recordDeleteSnapshots(sourceSnapshots)\n\t\t\tawait this.vault.rename(target, this.toVaultPath(dest))\n\t\t\tthis.forgetPath(src)\n\t\t\tthis.recordPath(dest)\n\t\t\tthis.recordTargetDiff(\n\t\t\t\tdestSnapshotsBefore,\n\t\t\t\tawait this.snapshotSubtree(dest),\n\t\t\t)\n\t\t})\n\t}\n\n\tresolvePath(base: string, path: string): string {\n\t\treturn ensureNotEscapingRoot(pathPosix.resolve(base || '/', path))\n\t}\n\n\tgetAllPaths(): string[] {\n\t\treturn [...this.snapshot].sort()\n\t}\n\n\tasync chmod(path: string, _mode: number): Promise<void> {\n\t\tawait this.assertExists(path)\n\t}\n\n\tasync symlink(_target: string, linkPath: string): Promise<void> {\n\t\tthrow new Error(\n\t\t\t`ENOTSUP: symbolic links are not supported in vault fs, link '${linkPath}'`,\n\t\t)\n\t}\n\n\tasync link(_existingPath: string, newPath: string): Promise<void> {\n\t\tthrow new Error(\n\t\t\t`ENOTSUP: hard links are not supported in vault fs, link '${newPath}'`,\n\t\t)\n\t}\n\n\tasync readlink(path: string): Promise<string> {\n\t\tthrow new Error(`EINVAL: not a symbolic link, readlink '${path}'`)\n\t}\n\n\tasync lstat(path: string): Promise<FsStat> {\n\t\treturn this.stat(path)\n\t}\n\n\tasync realpath(path: string): Promise<string> {\n\t\tawait this.assertExists(path)\n\t\treturn ensureNotEscapingRoot(path)\n\t}\n\n\tasync utimes(path: string, _atime: Date, _mtime: Date): Promise<void> {\n\t\tawait this.withBatch(async () => {\n\t\t\tconst stat = await this.stat(path)\n\t\t\tif (stat.isDirectory) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst content = await this.readFileBuffer(path)\n\t\t\tawait this.writeFile(path, content)\n\t\t})\n\t}\n}\n\nexport class MountedVaultFs implements IFileSystem {\n\tprivate readonly scratch = new InMemoryFs()\n\n\tconstructor(private readonly vaultFs: ObsidianVaultFs) {}\n\n\tprivate isRoot(path: string) {\n\t\treturn ensureNotEscapingRoot(path) === '/'\n\t}\n\n\tprivate isVaultMount(path: string) {\n\t\treturn ensureNotEscapingRoot(path) === VAULT_MOUNT_POINT\n\t}\n\n\tprivate isVaultPath(path: string) {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\treturn (\n\t\t\tnormalized === VAULT_MOUNT_POINT ||\n\t\t\tnormalized.startsWith(`${VAULT_MOUNT_POINT}/`)\n\t\t)\n\t}\n\n\tprivate toVaultRelative(path: string) {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\tif (normalized === VAULT_MOUNT_POINT) {\n\t\t\treturn '/'\n\t\t}\n\t\treturn normalized.slice(VAULT_MOUNT_POINT.length) || '/'\n\t}\n\n\tprivate route(path: string) {\n\t\tconst normalized = ensureNotEscapingRoot(path)\n\t\tif (this.isVaultPath(normalized)) {\n\t\t\treturn {\n\t\t\t\tfs: this.vaultFs as IFileSystem,\n\t\t\t\tpath: this.toVaultRelative(normalized),\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tfs: this.scratch as IFileSystem,\n\t\t\tpath: normalized,\n\t\t}\n\t}\n\n\tprivate async genericCp(src: string, dest: string, options?: CpOptions) {\n\t\tconst sourceStat = await this.stat(src)\n\t\tif (sourceStat.isDirectory) {\n\t\t\tif (!options?.recursive) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`EISDIR: illegal operation on a directory, copy '${src}'`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait this.mkdir(dest, { recursive: true })\n\t\t\tfor (const entry of await this.readdir(src)) {\n\t\t\t\tawait this.genericCp(\n\t\t\t\t\tjoinVirtualPath(src, entry),\n\t\t\t\t\tjoinVirtualPath(dest, entry),\n\t\t\t\t\toptions,\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tawait this.writeFile(dest, await this.readFileBuffer(src))\n\t}\n\n\tasync readFile(\n\t\tpath: string,\n\t\toptions?: ReadFileOptions | BufferEncoding,\n\t): Promise<string> {\n\t\tif (this.isVaultMount(path)) {\n\t\t\tthrow new Error(\n\t\t\t\t`EISDIR: illegal operation on a directory, read '${path}'`,\n\t\t\t)\n\t\t}\n\t\tconst routed = this.route(path)\n\t\treturn routed.fs.readFile(routed.path, options)\n\t}\n\n\tasync readFileBuffer(path: string): Promise<Uint8Array> {\n\t\tif (this.isVaultMount(path)) {\n\t\t\tthrow new Error(\n\t\t\t\t`EISDIR: illegal operation on a directory, read '${path}'`,\n\t\t\t)\n\t\t}\n\t\tconst routed = this.route(path)\n\t\treturn routed.fs.readFileBuffer(routed.path)\n\t}\n\n\tasync writeFile(\n\t\tpath: string,\n\t\tcontent: FileContent,\n\t\toptions?: WriteFileOptions | BufferEncoding,\n\t): Promise<void> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\tthrow new Error(\n\t\t\t\t`EISDIR: illegal operation on a directory, write '${path}'`,\n\t\t\t)\n\t\t}\n\t\tconst routed = this.route(path)\n\t\tawait routed.fs.writeFile(routed.path, content, options)\n\t}\n\n\tasync appendFile(\n\t\tpath: string,\n\t\tcontent: FileContent,\n\t\toptions?: WriteFileOptions | BufferEncoding,\n\t): Promise<void> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\tthrow new Error(\n\t\t\t\t`EISDIR: illegal operation on a directory, append '${path}'`,\n\t\t\t)\n\t\t}\n\t\tconst routed = this.route(path)\n\t\tawait routed.fs.appendFile(routed.path, content, options)\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\treturn true\n\t\t}\n\t\tconst routed = this.route(path)\n\t\treturn routed.fs.exists(routed.path)\n\t}\n\n\tasync stat(path: string): Promise<FsStat> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\treturn {\n\t\t\t\tisFile: false,\n\t\t\t\tisDirectory: true,\n\t\t\t\tisSymbolicLink: false,\n\t\t\t\tmode: DIR_MODE,\n\t\t\t\tsize: 0,\n\t\t\t\tmtime: new Date(0),\n\t\t\t}\n\t\t}\n\t\tconst routed = this.route(path)\n\t\treturn routed.fs.stat(routed.path)\n\t}\n\n\tasync mkdir(path: string, options?: MkdirOptions): Promise<void> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\treturn\n\t\t}\n\t\tconst routed = this.route(path)\n\t\tawait routed.fs.mkdir(routed.path, options)\n\t}\n\n\tasync readdir(path: string): Promise<string[]> {\n\t\tif (this.isRoot(path)) {\n\t\t\tconst base = await this.scratch.readdir('/')\n\t\t\treturn [...new Set(['vault', ...base])].sort()\n\t\t}\n\t\tif (this.isVaultMount(path)) {\n\t\t\treturn this.vaultFs.readdir('/')\n\t\t}\n\t\tconst routed = this.route(path)\n\t\treturn routed.fs.readdir(routed.path)\n\t}\n\n\tasync readdirWithFileTypes(path: string) {\n\t\tif (this.isRoot(path)) {\n\t\t\tconst base = this.scratch.readdirWithFileTypes\n\t\t\t\t? await this.scratch.readdirWithFileTypes('/')\n\t\t\t\t: (await this.scratch.readdir('/')).map((name) => ({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tisFile: true,\n\t\t\t\t\t\tisDirectory: false,\n\t\t\t\t\t\tisSymbolicLink: false,\n\t\t\t\t\t}))\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tname: 'vault',\n\t\t\t\t\tisFile: false,\n\t\t\t\t\tisDirectory: true,\n\t\t\t\t\tisSymbolicLink: false,\n\t\t\t\t},\n\t\t\t\t...base.filter((entry) => entry.name !== 'vault'),\n\t\t\t].sort((left, right) => left.name.localeCompare(right.name))\n\t\t}\n\t\tif (this.isVaultMount(path)) {\n\t\t\treturn this.vaultFs.readdirWithFileTypes?.('/') ?? []\n\t\t}\n\t\tconst routed = this.route(path)\n\t\treturn routed.fs.readdirWithFileTypes?.(routed.path) ?? []\n\t}\n\n\tasync rm(path: string, options?: RmOptions): Promise<void> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\tthrow new Error(`EPERM: operation not permitted, remove '${path}'`)\n\t\t}\n\t\tconst routed = this.route(path)\n\t\treturn routed.fs.rm(routed.path, options)\n\t}\n\n\tasync cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n\t\tawait this.genericCp(src, dest, options)\n\t}\n\n\tasync mv(src: string, dest: string): Promise<void> {\n\t\tif (this.isRoot(src) || this.isVaultMount(src)) {\n\t\t\tthrow new Error(`EPERM: operation not permitted, move '${src}'`)\n\t\t}\n\t\tconst source = this.route(src)\n\t\tconst target = this.route(dest)\n\t\tif (source.fs === target.fs) {\n\t\t\tawait source.fs.mv(source.path, target.path)\n\t\t\treturn\n\t\t}\n\t\tawait this.genericCp(src, dest, { recursive: true })\n\t\tawait removeRecursive(this, src, { recursive: true, force: false })\n\t}\n\n\tresolvePath(base: string, path: string): string {\n\t\treturn ensureNotEscapingRoot(pathPosix.resolve(base || '/', path))\n\t}\n\n\tgetAllPaths(): string[] {\n\t\tconst basePaths = this.scratch.getAllPaths().filter((path) => path !== '/')\n\t\tconst vaultPaths = this.vaultFs\n\t\t\t.getAllPaths()\n\t\t\t.filter((path) => path !== '/')\n\t\t\t.map((path) => `${VAULT_MOUNT_POINT}${path}`)\n\t\treturn ['/', VAULT_MOUNT_POINT, ...basePaths, ...vaultPaths].sort()\n\t}\n\n\tasync chmod(path: string, mode: number): Promise<void> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\treturn\n\t\t}\n\t\tconst routed = this.route(path)\n\t\tawait routed.fs.chmod(routed.path, mode)\n\t}\n\n\tasync symlink(target: string, linkPath: string): Promise<void> {\n\t\tif (this.isVaultPath(linkPath) || this.isVaultPath(target)) {\n\t\t\tthrow new Error(\n\t\t\t\t`ENOTSUP: symbolic links are not supported in vault fs, link '${linkPath}'`,\n\t\t\t)\n\t\t}\n\t\treturn this.scratch.symlink(target, linkPath)\n\t}\n\n\tasync link(existingPath: string, newPath: string): Promise<void> {\n\t\tif (this.isVaultPath(existingPath) || this.isVaultPath(newPath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`ENOTSUP: hard links are not supported in vault fs, link '${newPath}'`,\n\t\t\t)\n\t\t}\n\t\treturn this.scratch.link(existingPath, newPath)\n\t}\n\n\tasync readlink(path: string): Promise<string> {\n\t\tif (this.isVaultPath(path)) {\n\t\t\tthrow new Error(`EINVAL: not a symbolic link, readlink '${path}'`)\n\t\t}\n\t\treturn this.scratch.readlink(path)\n\t}\n\n\tasync lstat(path: string): Promise<FsStat> {\n\t\treturn this.stat(path)\n\t}\n\n\tasync realpath(path: string): Promise<string> {\n\t\tawait this.stat(path)\n\t\treturn ensureNotEscapingRoot(path)\n\t}\n\n\tasync utimes(path: string, atime: Date, mtime: Date): Promise<void> {\n\t\tif (this.isRoot(path) || this.isVaultMount(path)) {\n\t\t\treturn\n\t\t}\n\t\tconst routed = this.route(path)\n\t\tawait routed.fs.utimes(routed.path, atime, mtime)\n\t}\n}\n\nexport { VAULT_MOUNT_POINT }\n"
  },
  {
    "path": "src/ai/bash/runtime.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\nimport type { App, Vault } from 'obsidian'\nimport type { PermissionRequest } from '~/ai/permission-guard'\nimport { createVaultBash, execVaultBash, VAULT_MOUNT_POINT } from './runtime'\nimport {\n\tlistVaultPaths,\n\tMountedVaultFs,\n\tObsidianVaultFs,\n\tReversibleOpRecorder,\n} from './fs'\n\ninterface MockEntryFile {\n\ttype: 'file'\n\tcontent: Uint8Array\n\tmtime: number\n}\n\ninterface MockEntryFolder {\n\ttype: 'folder'\n\tmtime: number\n}\n\ntype MockEntry = MockEntryFile | MockEntryFolder\n\ninterface MockAbstractFile {\n\tpath: string\n\tname: string\n\tparent: MockFolder | null\n}\n\ninterface MockFile extends MockAbstractFile {\n\tstat: {\n\t\tsize: number\n\t\tmtime: number\n\t}\n}\n\ninterface MockFolder extends MockAbstractFile {\n\tchildren: Array<MockFile | MockFolder>\n}\n\nclass MemoryVaultStore {\n\tprivate readonly entries = new Map<string, MockEntry>([\n\t\t['', { type: 'folder', mtime: 0 }],\n\t])\n\n\tconstructor(\n\t\tinitialFiles: Record<string, string> = {},\n\t\tinitialFolders: string[] = [],\n\t) {\n\t\tfor (const folder of initialFolders) {\n\t\t\tthis.ensureFolder(folder)\n\t\t}\n\t\tfor (const [path, content] of Object.entries(initialFiles)) {\n\t\t\tthis.writeBinary(path, new TextEncoder().encode(content).buffer)\n\t\t}\n\t}\n\n\tnormalize(path: string) {\n\t\treturn path.replace(/^\\/+|\\/+$/g, '')\n\t}\n\n\tdirname(path: string) {\n\t\tif (!path || !path.includes('/')) {\n\t\t\treturn ''\n\t\t}\n\t\treturn path.slice(0, path.lastIndexOf('/'))\n\t}\n\n\tbasename(path: string) {\n\t\tif (!path) {\n\t\t\treturn ''\n\t\t}\n\t\tconst normalized = this.normalize(path)\n\t\treturn normalized.slice(normalized.lastIndexOf('/') + 1)\n\t}\n\n\tensureFolder(path: string) {\n\t\tconst normalized = this.normalize(path)\n\t\tif (!normalized) {\n\t\t\treturn\n\t\t}\n\t\tconst parent = this.dirname(normalized)\n\t\tif (parent !== normalized) {\n\t\t\tthis.ensureFolder(parent)\n\t\t}\n\t\tif (!this.entries.has(normalized)) {\n\t\t\tthis.entries.set(normalized, { type: 'folder', mtime: Date.now() })\n\t\t}\n\t}\n\n\texists(path: string) {\n\t\treturn this.entries.has(this.normalize(path))\n\t}\n\n\tstat(path: string) {\n\t\tconst entry = this.entries.get(this.normalize(path))\n\t\tif (!entry) {\n\t\t\treturn null\n\t\t}\n\t\treturn {\n\t\t\ttype: entry.type,\n\t\t\tctime: entry.mtime,\n\t\t\tmtime: entry.mtime,\n\t\t\tsize: entry.type === 'file' ? entry.content.byteLength : 0,\n\t\t}\n\t}\n\n\treadBinary(path: string) {\n\t\tconst entry = this.entries.get(this.normalize(path))\n\t\tif (!entry || entry.type !== 'file') {\n\t\t\tthrow new Error(`missing file: ${path}`)\n\t\t}\n\t\treturn entry.content.buffer.slice(\n\t\t\tentry.content.byteOffset,\n\t\t\tentry.content.byteOffset + entry.content.byteLength,\n\t\t) as ArrayBuffer\n\t}\n\n\twriteBinary(path: string, data: ArrayBuffer) {\n\t\tconst normalized = this.normalize(path)\n\t\tthis.ensureFolder(this.dirname(normalized))\n\t\tthis.entries.set(normalized, {\n\t\t\ttype: 'file',\n\t\t\tcontent: new Uint8Array(data),\n\t\t\tmtime: Date.now(),\n\t\t})\n\t}\n\n\tremove(path: string) {\n\t\tthis.entries.delete(this.normalize(path))\n\t}\n\n\tremoveRecursive(path: string) {\n\t\tconst normalized = this.normalize(path)\n\t\tfor (const key of [...this.entries.keys()]) {\n\t\t\tif (key === normalized || key.startsWith(`${normalized}/`)) {\n\t\t\t\tthis.entries.delete(key)\n\t\t\t}\n\t\t}\n\t}\n\n\trename(fromPath: string, toPath: string) {\n\t\tconst from = this.normalize(fromPath)\n\t\tconst to = this.normalize(toPath)\n\t\tthis.ensureFolder(this.dirname(to))\n\t\tconst moved = [...this.entries.entries()]\n\t\t\t.filter(([key]) => key === from || key.startsWith(`${from}/`))\n\t\t\t.sort((left, right) => left[0].length - right[0].length)\n\t\tfor (const [key, value] of moved) {\n\t\t\tthis.entries.delete(key)\n\t\t\tconst suffix = key.slice(from.length)\n\t\t\tthis.entries.set(\n\t\t\t\t`${to}${suffix}`,\n\t\t\t\tvalue.type === 'folder'\n\t\t\t\t\t? { ...value }\n\t\t\t\t\t: { ...value, content: value.content.slice() },\n\t\t\t)\n\t\t}\n\t}\n\n\tlistChildren(path: string) {\n\t\tconst normalized = this.normalize(path)\n\t\tconst prefix = normalized ? `${normalized}/` : ''\n\t\treturn [...this.entries.keys()]\n\t\t\t.filter((key) => key.startsWith(prefix) && key !== normalized)\n\t\t\t.filter((key) => !key.slice(prefix.length).includes('/'))\n\t\t\t.sort()\n\t}\n}\n\nfunction createMockVault(\n\tinitialFiles: Record<string, string> = {},\n\tinitialFolders: string[] = [],\n) {\n\tconst store = new MemoryVaultStore(initialFiles, initialFolders)\n\n\tconst buildFolder = (path: string, parent: MockFolder | null): MockFolder => {\n\t\tconst normalized = store.normalize(path)\n\t\tconst folder: MockFolder = {\n\t\t\tpath: normalized,\n\t\t\tname: normalized ? store.basename(normalized) : '',\n\t\t\tparent,\n\t\t\tchildren: [],\n\t\t}\n\t\tfolder.children = store.listChildren(normalized).map((childPath) => {\n\t\t\tconst childStat = store.stat(childPath)\n\t\t\tif (childStat?.type === 'folder') {\n\t\t\t\treturn buildFolder(childPath, folder)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tpath: childPath,\n\t\t\t\tname: store.basename(childPath),\n\t\t\t\tparent: folder,\n\t\t\t\tstat: {\n\t\t\t\t\tsize: childStat?.size ?? 0,\n\t\t\t\t\tmtime: childStat?.mtime ?? 0,\n\t\t\t\t},\n\t\t\t} satisfies MockFile\n\t\t})\n\t\treturn folder\n\t}\n\n\tconst root = () => buildFolder('', null)\n\n\tconst vault = {\n\t\tgetRoot() {\n\t\t\treturn root()\n\t\t},\n\t\tgetAbstractFileByPath(path: string) {\n\t\t\tconst normalized = store.normalize(path)\n\t\t\tif (!normalized) {\n\t\t\t\treturn root()\n\t\t\t}\n\t\t\tconst stat = store.stat(normalized)\n\t\t\tif (!stat) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst parentPath = store.dirname(normalized)\n\t\t\tconst parent =\n\t\t\t\tparentPath === normalized ? null : buildFolder(parentPath, null)\n\t\t\tif (stat.type === 'folder') {\n\t\t\t\treturn buildFolder(normalized, parent)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tpath: normalized,\n\t\t\t\tname: store.basename(normalized),\n\t\t\t\tparent,\n\t\t\t\tstat: {\n\t\t\t\t\tsize: stat.size,\n\t\t\t\t\tmtime: stat.mtime,\n\t\t\t\t},\n\t\t\t} satisfies MockFile\n\t\t},\n\t\tasync readBinary(file: MockFile) {\n\t\t\treturn store.readBinary(file.path)\n\t\t},\n\t\tasync createBinary(path: string, data: ArrayBuffer) {\n\t\t\tstore.writeBinary(path, data)\n\t\t\treturn vault.getAbstractFileByPath(path)\n\t\t},\n\t\tasync cachedRead(file: MockFile) {\n\t\t\treturn new TextDecoder().decode(store.readBinary(file.path))\n\t\t},\n\t\tasync modifyBinary(file: MockFile, data: ArrayBuffer) {\n\t\t\tstore.writeBinary(file.path, data)\n\t\t},\n\t\tasync modify(file: MockFile, content: string) {\n\t\t\tstore.writeBinary(file.path, new TextEncoder().encode(content).buffer)\n\t\t},\n\t\tasync createFolder(path: string) {\n\t\t\tstore.ensureFolder(path)\n\t\t\treturn vault.getAbstractFileByPath(path)\n\t\t},\n\t\tasync delete(file: MockFile | MockFolder) {\n\t\t\tconst stat = store.stat(file.path)\n\t\t\tif (stat?.type === 'folder') {\n\t\t\t\tstore.removeRecursive(file.path)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstore.remove(file.path)\n\t\t},\n\t\tasync trash(file: MockFile | MockFolder) {\n\t\t\treturn vault.delete(file as never)\n\t\t},\n\t\tasync rename(file: MockFile | MockFolder, newPath: string) {\n\t\t\tstore.rename(file.path, newPath)\n\t\t},\n\t} as unknown as Vault\n\n\treturn {\n\t\tvault,\n\t\tstore,\n\t}\n}\n\nfunction createApp(vault: Vault) {\n\treturn {\n\t\tvault,\n\t} as unknown as App\n}\n\ndescribe('vault bash runtime', () => {\n\tit('builds a vault path snapshot for globbing', async () => {\n\t\tconst { vault } = createMockVault(\n\t\t\t{\n\t\t\t\t'notes/today.md': 'hello',\n\t\t\t},\n\t\t\t['notes'],\n\t\t)\n\t\tconst app = createApp(vault)\n\n\t\tawait expect(listVaultPaths(app)).resolves.toEqual(\n\t\t\texpect.arrayContaining(['/', '/notes', '/notes/today.md']),\n\t\t)\n\t})\n\n\tit('mounts the Obsidian vault under /vault and supports writes', async () => {\n\t\tconst { vault, store } = createMockVault(\n\t\t\t{\n\t\t\t\t'docs/readme.md': 'hello world\\n',\n\t\t\t},\n\t\t\t['docs'],\n\t\t)\n\t\tconst app = createApp(vault)\n\n\t\tconst result = await execVaultBash(\n\t\t\tapp,\n\t\t\t'cat /vault/docs/readme.md && printf \"done\" > /vault/docs/output.txt',\n\t\t)\n\n\t\texpect(result.exitCode).toBe(0)\n\t\texpect(result.stdout).toContain('hello world')\n\t\texpect(new TextDecoder().decode(store.readBinary('docs/output.txt'))).toBe(\n\t\t\t'done',\n\t\t)\n\t})\n\n\tit('supports shell glob expansion from the initial vault snapshot', async () => {\n\t\tconst { vault } = createMockVault(\n\t\t\t{\n\t\t\t\t'notes/a.md': 'A',\n\t\t\t\t'notes/b.md': 'B',\n\t\t\t},\n\t\t\t['notes'],\n\t\t)\n\t\tconst bash = await createVaultBash(createApp(vault))\n\n\t\tconst result = await bash.exec('printf \"%s\\n\" /vault/notes/*.md')\n\t\texpect(result.exitCode).toBe(0)\n\t\texpect(result.stdout).toContain('/vault/notes/a.md')\n\t\texpect(result.stdout).toContain('/vault/notes/b.md')\n\t})\n\n\tit('exposes /vault as a mount while preserving scratch space outside it', async () => {\n\t\tconst { vault } = createMockVault(\n\t\t\t{\n\t\t\t\t'note.md': 'hello',\n\t\t\t},\n\t\t\t[],\n\t\t)\n\t\tconst mounted = new MountedVaultFs(\n\t\t\tnew ObsidianVaultFs(vault, ['/', '/note.md']),\n\t\t)\n\n\t\tawait mounted.writeFile('/scratch.txt', 'temp')\n\t\texpect(await mounted.readFile('/scratch.txt')).toBe('temp')\n\t\texpect(await mounted.readFile(`${VAULT_MOUNT_POINT}/note.md`)).toBe('hello')\n\t\texpect(await mounted.readdir('/')).toEqual(['scratch.txt', 'vault'])\n\t})\n\n\tit('records reversible ops for writes, deletes, copies, and moves', async () => {\n\t\tconst { vault } = createMockVault(\n\t\t\t{\n\t\t\t\t'docs/existing.md': 'before',\n\t\t\t\t'docs/nested/a.txt': 'A',\n\t\t\t},\n\t\t\t['docs', 'docs/nested'],\n\t\t)\n\t\tconst recorder = new ReversibleOpRecorder()\n\t\tconst fs = new ObsidianVaultFs(\n\t\t\tvault,\n\t\t\t['/', '/docs', '/docs/existing.md', '/docs/nested', '/docs/nested/a.txt'],\n\t\t\tundefined,\n\t\t\trecorder,\n\t\t)\n\n\t\tawait fs.writeFile('/docs/new.md', 'new')\n\t\tawait fs.writeFile('/docs/existing.md', 'after')\n\t\tawait fs.mkdir('/docs/deep/child', { recursive: true })\n\t\tawait fs.rm('/docs/nested', { recursive: true })\n\t\tawait fs.cp('/docs', '/docs-copy', { recursive: true })\n\t\tawait fs.mv('/docs/new.md', '/moved/new.md')\n\n\t\texpect(recorder.getOperations()).toEqual([\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/new.md',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'file' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/existing.md',\n\t\t\t\toperation: 'update',\n\t\t\t\tbefore: {\n\t\t\t\t\tkind: 'file',\n\t\t\t\t\tcontentBase64: Buffer.from('before').toString('base64'),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/deep',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/deep/child',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/nested/a.txt',\n\t\t\t\toperation: 'delete',\n\t\t\t\tbefore: {\n\t\t\t\t\tkind: 'file',\n\t\t\t\t\tcontentBase64: Buffer.from('A').toString('base64'),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/nested',\n\t\t\t\toperation: 'delete',\n\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs-copy',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs-copy/deep',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs-copy/deep/child',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs-copy/existing.md',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'file' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs-copy/new.md',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'file' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'moved',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/new.md',\n\t\t\t\toperation: 'delete',\n\t\t\t\tbefore: {\n\t\t\t\t\tkind: 'file',\n\t\t\t\t\tcontentBase64: Buffer.from('new').toString('base64'),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'moved/new.md',\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: 'file' },\n\t\t\t},\n\t\t])\n\t})\n\n\tit('checks cp destination and mv source plus destination in permission guard', async () => {\n\t\tconst { vault } = createMockVault(\n\t\t\t{\n\t\t\t\t'docs/source.md': 'source',\n\t\t\t},\n\t\t\t['docs'],\n\t\t)\n\t\tconst requests: PermissionRequest[] = []\n\t\tconst fs = new ObsidianVaultFs(\n\t\t\tvault,\n\t\t\t['/', '/docs', '/docs/source.md'],\n\t\t\tasync (request) => {\n\t\t\t\trequests.push(request)\n\t\t\t},\n\t\t)\n\n\t\tawait fs.cp('/docs/source.md', '/docs/copied.md')\n\t\tawait fs.mv('/docs/copied.md', '/docs/moved.md')\n\n\t\texpect(requests).toEqual([\n\t\t\t{\n\t\t\t\ttype: 'fs',\n\t\t\t\tfs: {\n\t\t\t\t\tkind: 'copy',\n\t\t\t\t\tsrc: '/vault/docs/source.md',\n\t\t\t\t\tdest: '/vault/docs/copied.md',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'fs',\n\t\t\t\tfs: {\n\t\t\t\t\tkind: 'move',\n\t\t\t\t\tsrc: '/vault/docs/copied.md',\n\t\t\t\t\tdest: '/vault/docs/moved.md',\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\t})\n\n\tit('records overwritten target content for cp and mv', async () => {\n\t\tconst { vault } = createMockVault(\n\t\t\t{\n\t\t\t\t'docs/src-copy.md': 'copy-source',\n\t\t\t\t'docs/src-move.md': 'move-source',\n\t\t\t\t'docs/dest-copy.md': 'copy-dest-before',\n\t\t\t\t'docs/dest-move.md': 'move-dest-before',\n\t\t\t},\n\t\t\t['docs'],\n\t\t)\n\t\tconst recorder = new ReversibleOpRecorder()\n\t\tconst fs = new ObsidianVaultFs(\n\t\t\tvault,\n\t\t\t[\n\t\t\t\t'/',\n\t\t\t\t'/docs',\n\t\t\t\t'/docs/src-copy.md',\n\t\t\t\t'/docs/src-move.md',\n\t\t\t\t'/docs/dest-copy.md',\n\t\t\t\t'/docs/dest-move.md',\n\t\t\t],\n\t\t\tundefined,\n\t\t\trecorder,\n\t\t)\n\n\t\tawait fs.cp('/docs/src-copy.md', '/docs/dest-copy.md')\n\t\tawait fs.mv('/docs/src-move.md', '/docs/dest-move.md')\n\n\t\texpect(recorder.getOperations()).toEqual([\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/dest-copy.md',\n\t\t\t\toperation: 'update',\n\t\t\t\tbefore: {\n\t\t\t\t\tkind: 'file',\n\t\t\t\t\tcontentBase64: Buffer.from('copy-dest-before').toString('base64'),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/src-move.md',\n\t\t\t\toperation: 'delete',\n\t\t\t\tbefore: {\n\t\t\t\t\tkind: 'file',\n\t\t\t\t\tcontentBase64: Buffer.from('move-source').toString('base64'),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tvaultPath: 'docs/dest-move.md',\n\t\t\t\toperation: 'update',\n\t\t\t\tbefore: {\n\t\t\t\t\tkind: 'file',\n\t\t\t\t\tcontentBase64: Buffer.from('move-dest-before').toString('base64'),\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\t})\n})\n"
  },
  {
    "path": "src/ai/bash/runtime.ts",
    "content": "import { Bash } from 'just-bash/browser'\nimport type { App } from 'obsidian'\nimport type { PermissionGuard } from '~/ai/permission-guard'\nimport {\n\tlistVaultPaths,\n\tMountedVaultFs,\n\tObsidianVaultFs,\n\tReversibleOpRecorder,\n\tVAULT_MOUNT_POINT,\n} from './fs'\n\nexport interface VaultBashExecOptions {\n\tcwd?: string\n\tstdin?: string\n\trawScript?: boolean\n\tpermissionGuard?: PermissionGuard\n}\n\nexport async function createVaultBash(\n\tapp: App,\n\tpermissionGuard?: PermissionGuard,\n\trecorder?: ReversibleOpRecorder,\n) {\n\tconst initialPaths = await listVaultPaths(app)\n\tconst vaultFs = new ObsidianVaultFs(\n\t\tapp.vault,\n\t\tinitialPaths,\n\t\tpermissionGuard,\n\t\trecorder,\n\t)\n\tconst fs = new MountedVaultFs(vaultFs)\n\n\treturn new Bash({\n\t\tfs,\n\t\tcwd: VAULT_MOUNT_POINT,\n\t})\n}\n\nexport async function execVaultBash(\n\tapp: App,\n\tscript: string,\n\toptions: VaultBashExecOptions = {},\n) {\n\tconst recorder = new ReversibleOpRecorder()\n\tconst bash = await createVaultBash(app, options.permissionGuard, recorder)\n\tconst result = await bash.exec(script, {\n\t\tcwd: options.cwd ?? VAULT_MOUNT_POINT,\n\t\tstdin: options.stdin,\n\t\trawScript: options.rawScript,\n\t})\n\treturn {\n\t\t...result,\n\t\treversibleOps: recorder.getOperations(),\n\t}\n}\n\nexport { VAULT_MOUNT_POINT }\n"
  },
  {
    "path": "src/ai/config.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\nimport { readFileSync } from 'fs'\nimport {\n\tcreateModelConfig,\n\tcreateProviderConfig,\n\tcreateProviderFromPreset,\n\tfindPresetModelById,\n\tsanitizeProviders,\n} from './config'\nimport { aiProviderDefinitionsSchema, type AIProviderDefinition } from './types'\n\ndescribe('ai config', () => {\n\tit('matches the models-api provider catalog shape', () => {\n\t\tconst catalog = JSON.parse(readFileSync('src/ai/models-api.json', 'utf8'))\n\n\t\texpect(aiProviderDefinitionsSchema.parse(catalog)).toBeTruthy()\n\t})\n\n\tit('creates an empty provider config', () => {\n\t\tconst draft = createProviderConfig()\n\n\t\texpect(draft.npm).toBe('@ai-sdk/openai-compatible')\n\t\texpect(draft.models).toEqual({})\n\t})\n\n\tit('creates empty model configs without sharing mutable defaults', () => {\n\t\tconst first = createModelConfig()\n\t\tconst second = createModelConfig()\n\n\t\tfirst.modalities.input.push('image')\n\t\tfirst.limit.context = 128000\n\n\t\texpect(second.modalities.input).toEqual(['text'])\n\t\texpect(second.limit.context).toBe(0)\n\t})\n\n\tit('sanitizes provider objects', () => {\n\t\tconst providers = sanitizeProviders({\n\t\t\t'provider-1': {\n\t\t\t\tid: 'provider-1',\n\t\t\t\tname: ' Provider ',\n\t\t\t\tapiKey: 'key',\n\t\t\t\tenv: ['OPENAI_API_KEY'],\n\t\t\t\tnpm: '@ai-sdk/openai-compatible',\n\t\t\t\tapi: 'https://example.com/v1',\n\t\t\t\tdoc: 'https://example.com/docs',\n\t\t\t\tmodels: {\n\t\t\t\t\t'model-1': {\n\t\t\t\t\t\tid: 'model-1',\n\t\t\t\t\t\tname: ' gpt-4.1 ',\n\t\t\t\t\t\tfamily: 'gpt',\n\t\t\t\t\t\tattachment: false,\n\t\t\t\t\t\treasoning: true,\n\t\t\t\t\t\ttool_call: true,\n\t\t\t\t\t\tstructured_output: true,\n\t\t\t\t\t\ttemperature: true,\n\t\t\t\t\t\trelease_date: '2025-01-01',\n\t\t\t\t\t\tlast_updated: '2025-01-02',\n\t\t\t\t\t\tmodalities: { input: ['text'], output: ['text'] },\n\t\t\t\t\t\topen_weights: false,\n\t\t\t\t\t\tcost: { input: 1, output: 2 },\n\t\t\t\t\t\tlimit: { context: 128000, output: 16000 },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\n\t\texpect(providers).toEqual({\n\t\t\t'provider-1': {\n\t\t\t\tid: 'provider-1',\n\t\t\t\tname: 'Provider',\n\t\t\t\tapiKey: 'key',\n\t\t\t\tenv: ['OPENAI_API_KEY'],\n\t\t\t\tnpm: '@ai-sdk/openai-compatible',\n\t\t\t\tapi: 'https://example.com/v1',\n\t\t\t\tdoc: 'https://example.com/docs',\n\t\t\t\tmodels: {\n\t\t\t\t\t'model-1': {\n\t\t\t\t\t\tid: 'model-1',\n\t\t\t\t\t\tname: 'gpt-4.1',\n\t\t\t\t\t\tfamily: 'gpt',\n\t\t\t\t\t\tattachment: false,\n\t\t\t\t\t\treasoning: true,\n\t\t\t\t\t\ttool_call: true,\n\t\t\t\t\t\tstructured_output: true,\n\t\t\t\t\t\ttemperature: true,\n\t\t\t\t\t\tknowledge: undefined,\n\t\t\t\t\t\trelease_date: '2025-01-01',\n\t\t\t\t\t\tlast_updated: '2025-01-02',\n\t\t\t\t\t\tmodalities: { input: ['text'], output: ['text'] },\n\t\t\t\t\t\topen_weights: false,\n\t\t\t\t\t\tcost: { input: 1, output: 2 },\n\t\t\t\t\t\tlimit: { context: 128000, output: 16000 },\n\t\t\t\t\t\tinterleaved: undefined,\n\t\t\t\t\t\tprovider: undefined,\n\t\t\t\t\t\tstatus: undefined,\n\t\t\t\t\t\texperimental: undefined,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t})\n\n\tit('uses record keys as fallback ids', () => {\n\t\tconst providers = sanitizeProviders({\n\t\t\t'provider-1': {\n\t\t\t\tname: 'Provider',\n\t\t\t\tmodels: {\n\t\t\t\t\t'model-1': {\n\t\t\t\t\t\tname: 'Model',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\n\t\texpect(providers['provider-1'].id).toBe('provider-1')\n\t\texpect(providers['provider-1'].models['model-1'].id).toBe('model-1')\n\t})\n\n\tit('creates provider configs from presets without sharing model objects', () => {\n\t\tconst preset: AIProviderDefinition = {\n\t\t\tid: 'provider-1',\n\t\t\tenv: ['API_KEY'],\n\t\t\tnpm: '@ai-sdk/openai-compatible',\n\t\t\tapi: 'https://example.com/v1',\n\t\t\tname: 'Provider',\n\t\t\tdoc: 'https://example.com/docs',\n\t\t\tmodels: {\n\t\t\t\t'model-1': {\n\t\t\t\t\tid: 'model-1',\n\t\t\t\t\tname: 'Model',\n\t\t\t\t\tattachment: false,\n\t\t\t\t\treasoning: false,\n\t\t\t\t\ttool_call: true,\n\t\t\t\t\ttemperature: true,\n\t\t\t\t\trelease_date: '2025-01-01',\n\t\t\t\t\tlast_updated: '2025-01-02',\n\t\t\t\t\tmodalities: { input: ['text'], output: ['text'] },\n\t\t\t\t\topen_weights: false,\n\t\t\t\t\tlimit: { context: 128000, output: 16000 },\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\t\tconst provider = createProviderFromPreset(preset, 'key')\n\t\tprovider.models['model-1'].modalities.input.push('image')\n\n\t\texpect(provider.apiKey).toBe('key')\n\t\texpect(preset.models['model-1'].modalities.input).toEqual(['text'])\n\t})\n\n\tit('finds preset models by trimmed id', () => {\n\t\tconst catalog = aiProviderDefinitionsSchema.parse(\n\t\t\tJSON.parse(readFileSync('src/ai/models-api.json', 'utf8')),\n\t\t)\n\t\tconst firstProvider = Object.values(catalog)[0]\n\t\tconst firstModel = Object.values(firstProvider.models)[0]\n\n\t\texpect(findPresetModelById(` ${firstModel.id} `)?.id).toBe(firstModel.id)\n\t})\n\n\tit('throws when providers value is not an object', () => {\n\t\texpect(() => sanitizeProviders('invalid')).toThrow(/Invalid AI provider/)\n\t\texpect(() => sanitizeProviders([{ name: 'Provider' }])).toThrow(\n\t\t\t/Invalid AI provider/,\n\t\t)\n\t})\n})\n"
  },
  {
    "path": "src/ai/config.ts",
    "content": "import { z } from 'zod'\nimport modelsApiJson from './models-api.json'\nimport {\n\tAIModelConfig,\n\tAIModelConfigs,\n\tAIProviderConfig,\n\tAIProviderConfigs,\n\tAIProviderDefinition,\n\tAIProviderDefinitions,\n\tAIProviderInput,\n\tAIModelInput,\n\tAIModelInputs,\n\taiProviderDefinitionsSchema,\n\taiProviderInputsSchema,\n} from './types'\n\nconst DEFAULT_NPM_PACKAGE = '@ai-sdk/openai-compatible'\n\nconst DEFAULT_MODALITIES: AIModelConfig['modalities'] = {\n\tinput: ['text'],\n\toutput: ['text'],\n}\n\nconst DEFAULT_LIMIT: AIModelConfig['limit'] = { context: 0, output: 0 }\n\nfunction formatSchemaIssues(error: z.ZodError): string {\n\treturn error.issues\n\t\t.map((issue) => {\n\t\t\tconst path = issue.path.length > 0 ? issue.path.join('.') : '(root)'\n\t\t\treturn `${path}: ${issue.message}`\n\t\t})\n\t\t.join('; ')\n}\n\nexport function createModelConfig(\n\tmodel: AIModelInput = {},\n\tfallbackId = '',\n): AIModelConfig {\n\tconst id = model.id?.trim() || fallbackId.trim()\n\tconst modalities = model.modalities || DEFAULT_MODALITIES\n\treturn {\n\t\tid,\n\t\tname: model.name?.trim() || '',\n\t\tfamily: model.family?.trim() || undefined,\n\t\tattachment: model.attachment ?? false,\n\t\treasoning: model.reasoning ?? false,\n\t\ttool_call: model.tool_call ?? true,\n\t\tstructured_output: model.structured_output,\n\t\ttemperature: model.temperature ?? true,\n\t\tknowledge: model.knowledge?.trim() || undefined,\n\t\trelease_date: model.release_date?.trim() || '',\n\t\tlast_updated: model.last_updated?.trim() || '',\n\t\tmodalities: {\n\t\t\tinput: [...modalities.input],\n\t\t\toutput: [...modalities.output],\n\t\t},\n\t\topen_weights: model.open_weights ?? false,\n\t\tcost: model.cost,\n\t\tlimit: { ...(model.limit || DEFAULT_LIMIT) },\n\t\tinterleaved: model.interleaved,\n\t\tprovider: model.provider ? { ...model.provider } : undefined,\n\t\tstatus: model.status,\n\t\texperimental: model.experimental,\n\t}\n}\n\nexport function createProviderConfig(\n\tprovider: AIProviderInput = {},\n\tfallbackId = '',\n): AIProviderConfig {\n\tconst id = provider.id?.trim() || fallbackId.trim()\n\treturn {\n\t\tid,\n\t\tenv: [...(provider.env || [])],\n\t\tnpm: provider.npm?.trim() || DEFAULT_NPM_PACKAGE,\n\t\tapi: provider.api?.trim() || undefined,\n\t\tname: provider.name?.trim() || '',\n\t\tdoc: provider.doc?.trim() || '',\n\t\tapiKey: provider.apiKey || '',\n\t\tmodels: sanitizeModels(provider.models),\n\t}\n}\n\nfunction sanitizeModels(models: AIModelInputs | undefined): AIModelConfigs {\n\treturn Object.fromEntries(\n\t\tObject.entries(models || {}).map(([modelId, model]) => {\n\t\t\tconst config = createModelConfig(model, modelId)\n\t\t\treturn [config.id, config]\n\t\t}),\n\t)\n}\n\nexport function sanitizeProviders(providers: unknown): AIProviderConfigs {\n\tconst parsed = aiProviderInputsSchema.safeParse(providers ?? {})\n\tif (!parsed.success) {\n\t\tthrow new Error(`Invalid AI providers: ${formatSchemaIssues(parsed.error)}`)\n\t}\n\n\treturn Object.fromEntries(\n\t\tObject.entries(parsed.data).map(([providerId, provider]) => {\n\t\t\tconst config = createProviderConfig(provider, providerId)\n\t\t\treturn [config.id, config]\n\t\t}),\n\t)\n}\n\nexport function sanitizeDefaultSelections(\n\tproviders: AIProviderConfigs,\n\tdefaultModel?: { providerId: string; modelId: string },\n): { providerId: string; modelId: string } | undefined {\n\tif (!defaultModel) return undefined\n\tconst provider = getProviderById(providers, defaultModel.providerId)\n\tconst model = getModelById(provider, defaultModel.modelId)\n\tif (!provider || !model) return undefined\n\treturn { providerId: provider.id, modelId: model.id }\n}\n\nexport function resolveInitialSelection(\n\tproviders: AIProviderConfigs,\n\tdefaultModel?: { providerId: string; modelId: string },\n) {\n\tconst validated = sanitizeDefaultSelections(providers, defaultModel)\n\treturn {\n\t\tproviderId: validated?.providerId,\n\t\tmodelId: validated?.modelId,\n\t}\n}\n\nexport function slugifyProviderId(name: string): string {\n\treturn name\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/\\s+/g, '-')\n\t\t.replace(/[^a-z0-9-_]/g, '')\n}\n\nexport function getProviderById(\n\tproviders: AIProviderConfigs,\n\tproviderId?: string,\n) {\n\treturn providerId ? providers[providerId] : undefined\n}\n\nexport function getModelById(\n\tprovider: AIProviderConfig | undefined,\n\tmodelId?: string,\n) {\n\treturn modelId ? provider?.models[modelId] : undefined\n}\n\nexport function listProviders(\n\tproviders: AIProviderConfigs,\n): AIProviderConfig[] {\n\treturn Object.values(providers)\n}\n\nexport function listModels(\n\tprovider: AIProviderConfig | undefined,\n): AIModelConfig[] {\n\treturn Object.values(provider?.models || {})\n}\n\nexport function getFirstModel(provider: AIProviderConfig | undefined) {\n\treturn listModels(provider)[0]\n}\n\nlet _presetProviders: AIProviderDefinitions | null = null\n\nexport function getPresetProviders(): AIProviderDefinitions {\n\tif (!_presetProviders) {\n\t\tconst parsed = aiProviderDefinitionsSchema.safeParse(modelsApiJson)\n\t\tif (!parsed.success) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid preset AI providers: ${formatSchemaIssues(parsed.error)}`,\n\t\t\t)\n\t\t}\n\t\t_presetProviders = parsed.data\n\t}\n\treturn _presetProviders\n}\n\nexport function listPresetProviders(): AIProviderDefinition[] {\n\treturn Object.values(getPresetProviders()).sort((a, b) =>\n\t\ta.name.localeCompare(b.name),\n\t)\n}\n\nexport function findPresetModelById(modelId: string): AIModelConfig | undefined {\n\tconst targetId = modelId.trim()\n\tif (!targetId) return undefined\n\n\tfor (const provider of Object.values(getPresetProviders())) {\n\t\tconst matched = provider.models[targetId]\n\t\tif (matched) return createModelConfig(matched, targetId)\n\t}\n\n\treturn undefined\n}\n\nexport function createProviderFromPreset(\n\tpreset: AIProviderDefinition,\n\tapiKey: string,\n): AIProviderConfig {\n\treturn {\n\t\t...preset,\n\t\tapiKey,\n\t\tmodels: Object.fromEntries(\n\t\t\tObject.entries(preset.models).map(([modelId, model]) => [\n\t\t\t\tmodelId,\n\t\t\t\tcreateModelConfig(model, modelId),\n\t\t\t]),\n\t\t),\n\t}\n}\n"
  },
  {
    "path": "src/ai/file-operation.ts",
    "content": "export const AI_FILE_OPERATIONS = [\n\t'copy',\n\t'delete',\n\t'edit',\n\t'mkdir',\n\t'move',\n\t'read',\n\t'write',\n] as const\n\nexport type AIFileOperation = (typeof AI_FILE_OPERATIONS)[number]\nexport type AISinglePathFileOperation = Exclude<\n\tAIFileOperation,\n\t'copy' | 'move'\n>\nexport type AIDualPathFileOperation = Extract<AIFileOperation, 'copy' | 'move'>\n"
  },
  {
    "path": "src/ai/models-api.json",
    "content": "{\n  \"siliconflow-cn\": {\n    \"id\": \"siliconflow-cn\",\n    \"env\": [\"SILICONFLOW_CN_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.siliconflow.cn/v1\",\n    \"name\": \"SiliconFlow (China)\",\n    \"doc\": \"https://cloud.siliconflow.com/models\",\n    \"models\": {\n      \"inclusionAI/Ring-flash-2.0\": {\n        \"id\": \"inclusionAI/Ring-flash-2.0\",\n        \"name\": \"inclusionAI/Ring-flash-2.0\",\n        \"family\": \"ring\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"inclusionAI/Ling-mini-2.0\": {\n        \"id\": \"inclusionAI/Ling-mini-2.0\",\n        \"name\": \"inclusionAI/Ling-mini-2.0\",\n        \"family\": \"ling\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-10\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"inclusionAI/Ling-flash-2.0\": {\n        \"id\": \"inclusionAI/Ling-flash-2.0\",\n        \"name\": \"inclusionAI/Ling-flash-2.0\",\n        \"family\": \"ling\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Kwaipilot/KAT-Dev\": {\n        \"id\": \"Kwaipilot/KAT-Dev\",\n        \"name\": \"Kwaipilot/KAT-Dev\",\n        \"family\": \"kat-coder\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-27\",\n        \"last_updated\": \"2026-01-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-08\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"moonshotai/Kimi-K2-Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-07\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.55, \"output\": 2.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Pro/moonshotai/Kimi-K2.5\": {\n        \"id\": \"Pro/moonshotai/Kimi-K2.5\",\n        \"name\": \"Pro/moonshotai/Kimi-K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.25 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Pro/moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"Pro/moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Pro/moonshotai/Kimi-K2-Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-07\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.55, \"output\": 2.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Pro/moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"Pro/moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Pro/moonshotai/Kimi-K2-Instruct-0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-08\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Pro/moonshotai/Kimi-K2.6\": {\n        \"id\": \"Pro/moonshotai/Kimi-K2.6\",\n        \"name\": \"Pro/moonshotai/Kimi-K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Pro/deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"Pro/deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"Pro/deepseek-ai/DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-03\",\n        \"last_updated\": \"2025-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.42 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"Pro/deepseek-ai/DeepSeek-V3\": {\n        \"id\": \"Pro/deepseek-ai/DeepSeek-V3\",\n        \"name\": \"Pro/deepseek-ai/DeepSeek-V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"Pro/deepseek-ai/DeepSeek-V3.1-Terminus\": {\n        \"id\": \"Pro/deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"name\": \"Pro/deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"Pro/deepseek-ai/DeepSeek-R1\": {\n        \"id\": \"Pro/deepseek-ai/DeepSeek-R1\",\n        \"name\": \"Pro/deepseek-ai/DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2.18 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"Pro/zai-org/GLM-5.1\": {\n        \"id\": \"Pro/zai-org/GLM-5.1\",\n        \"name\": \"Pro/zai-org/GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_write\": 0 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"Pro/zai-org/GLM-4.7\": {\n        \"id\": \"Pro/zai-org/GLM-4.7\",\n        \"name\": \"Pro/zai-org/GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"Pro/zai-org/GLM-5\": {\n        \"id\": \"Pro/zai-org/GLM-5\",\n        \"name\": \"Pro/zai-org/GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"Pro/MiniMaxAI/MiniMax-M2.1\": {\n        \"id\": \"Pro/MiniMaxAI/MiniMax-M2.1\",\n        \"name\": \"Pro/MiniMaxAI/MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 197000, \"output\": 131000 }\n      },\n      \"Pro/MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"Pro/MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"Pro/MiniMaxAI/MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.22 },\n        \"limit\": { \"context\": 192000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3.5-122B-A10B\": {\n        \"id\": \"Qwen/Qwen3.5-122B-A10B\",\n        \"name\": \"Qwen/Qwen3.5-122B-A10B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 2.32 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3.5-35B-A3B\": {\n        \"id\": \"Qwen/Qwen3.5-35B-A3B\",\n        \"name\": \"Qwen/Qwen3.5-35B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-25\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.23, \"output\": 1.86 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3.5-397B-A17B\": {\n        \"id\": \"Qwen/Qwen3.5-397B-A17B\",\n        \"name\": \"Qwen/Qwen3.5-397B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 1.74 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3.5-27B\": {\n        \"id\": \"Qwen/Qwen3.5-27B\",\n        \"name\": \"Qwen/Qwen3.5-27B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-25\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.26, \"output\": 2.09 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3.6-35B-A3B\": {\n        \"id\": \"Qwen/Qwen3.6-35B-A3B\",\n        \"name\": \"Qwen/Qwen3.6-35B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-17\",\n        \"last_updated\": \"2026-04-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.23, \"output\": 1.86 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3.5-9B\": {\n        \"id\": \"Qwen/Qwen3.5-9B\",\n        \"name\": \"Qwen/Qwen3.5-9B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 1.74 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3.5-4B\": {\n        \"id\": \"Qwen/Qwen3.5-4B\",\n        \"name\": \"Qwen/Qwen3.5-4B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3-8B\": {\n        \"id\": \"Qwen/Qwen3-8B\",\n        \"name\": \"Qwen/Qwen3-8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.06 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-VL-235B-A22B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-235B-A22B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-235B-A22B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.45, \"output\": 3.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen2.5-Coder-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-11\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen2.5-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-32B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-19\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-14B\": {\n        \"id\": \"Qwen/Qwen3-14B\",\n        \"name\": \"Qwen/Qwen3-14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-Coder-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-30B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Coder-30B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 1.4 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-VL-32B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-32B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-32B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-21\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Thinking-2507\",\n        \"name\": \"Qwen/Qwen3-30B-A3B-Thinking-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.3 },\n        \"limit\": { \"context\": 262000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen2.5-14B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-14B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-14B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-VL-8B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-8B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-8B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.68 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-32B\": {\n        \"id\": \"Qwen/Qwen3-32B\",\n        \"name\": \"Qwen/Qwen3-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.6 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen2.5-VL-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-32B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-VL-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.27 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-VL-8B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-8B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-8B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 2 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Thinking\",\n        \"name\": \"Qwen/Qwen3-Next-80B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-VL-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-30B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-30B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-05\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 1 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-VL-235B-A22B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-235B-A22B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-235B-A22B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Omni-30B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-Omni-30B-A3B-Thinking\",\n        \"name\": \"Qwen/Qwen3-Omni-30B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"Qwen/QwQ-32B\": {\n        \"id\": \"Qwen/QwQ-32B\",\n        \"name\": \"Qwen/QwQ-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-06\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.58 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"name\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.3 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen2.5-7B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-7B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-7B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.05 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-Omni-30B-A3B-Captioner\": {\n        \"id\": \"Qwen/Qwen3-Omni-30B-A3B-Captioner\",\n        \"name\": \"Qwen/Qwen3-Omni-30B-A3B-Captioner\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0.6 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen2.5-72B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-72B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-72B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.59, \"output\": 0.59 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen2.5-VL-72B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-72B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-VL-72B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.59, \"output\": 0.59 },\n        \"limit\": { \"context\": 131000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen2.5-72B-Instruct-128K\": {\n        \"id\": \"Qwen/Qwen2.5-72B-Instruct-128K\",\n        \"name\": \"Qwen/Qwen2.5-72B-Instruct-128K\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.59, \"output\": 0.59 },\n        \"limit\": { \"context\": 131000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-Omni-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Omni-30B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Omni-30B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"Qwen/Qwen3-VL-30B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-30B-A3B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-30B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-11\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 1 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-VL-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-32B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-21\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"THUDM/GLM-Z1-32B-0414\": {\n        \"id\": \"THUDM/GLM-Z1-32B-0414\",\n        \"name\": \"THUDM/GLM-Z1-32B-0414\",\n        \"family\": \"glm-z\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"THUDM/GLM-4-32B-0414\": {\n        \"id\": \"THUDM/GLM-4-32B-0414\",\n        \"name\": \"THUDM/GLM-4-32B-0414\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.27 },\n        \"limit\": { \"context\": 33000, \"output\": 33000 }\n      },\n      \"THUDM/GLM-Z1-9B-0414\": {\n        \"id\": \"THUDM/GLM-Z1-9B-0414\",\n        \"name\": \"THUDM/GLM-Z1-9B-0414\",\n        \"family\": \"glm-z\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.086, \"output\": 0.086 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"THUDM/GLM-4-9B-0414\": {\n        \"id\": \"THUDM/GLM-4-9B-0414\",\n        \"name\": \"THUDM/GLM-4-9B-0414\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.086, \"output\": 0.086 },\n        \"limit\": { \"context\": 33000, \"output\": 33000 }\n      },\n      \"PaddlePaddle/PaddleOCR-VL\": {\n        \"id\": \"PaddlePaddle/PaddleOCR-VL\",\n        \"name\": \"PaddlePaddle/PaddleOCR-VL\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-16\",\n        \"last_updated\": \"2025-10-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"PaddlePaddle/PaddleOCR-VL-1.5\": {\n        \"id\": \"PaddlePaddle/PaddleOCR-VL-1.5\",\n        \"name\": \"PaddlePaddle/PaddleOCR-VL-1.5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"deepseek-ai/DeepSeek-OCR\": {\n        \"id\": \"deepseek-ai/DeepSeek-OCR\",\n        \"name\": \"deepseek-ai/DeepSeek-OCR\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-20\",\n        \"last_updated\": \"2025-10-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"deepseek-ai/DeepSeek-R1\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1\",\n        \"name\": \"deepseek-ai/DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2.18 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/deepseek-vl2\": {\n        \"id\": \"deepseek-ai/deepseek-vl2\",\n        \"name\": \"deepseek-ai/deepseek-vl2\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-13\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 4000, \"output\": 4000 }\n      },\n      \"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B\",\n        \"name\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1-Terminus\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"name\": \"deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-V3\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3\",\n        \"name\": \"deepseek-ai/DeepSeek-V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B\",\n        \"name\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-03\",\n        \"last_updated\": \"2025-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.42 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"stepfun-ai/Step-3.5-Flash\": {\n        \"id\": \"stepfun-ai/Step-3.5-Flash\",\n        \"name\": \"stepfun-ai/Step-3.5-Flash\",\n        \"family\": \"step\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"baidu/ERNIE-4.5-300B-A47B\": {\n        \"id\": \"baidu/ERNIE-4.5-300B-A47B\",\n        \"name\": \"baidu/ERNIE-4.5-300B-A47B\",\n        \"family\": \"ernie\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-02\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 1.1 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"zai-org/GLM-4.6V\": {\n        \"id\": \"zai-org/GLM-4.6V\",\n        \"name\": \"zai-org/GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-07\",\n        \"last_updated\": \"2025-12-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"zai-org/GLM-4.5-Air\": {\n        \"id\": \"zai-org/GLM-4.5-Air\",\n        \"name\": \"zai-org/GLM-4.5-Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.86 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"zai-org/GLM-4.5V\": {\n        \"id\": \"zai-org/GLM-4.5V\",\n        \"name\": \"zai-org/GLM-4.5V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.86 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"zai-org/GLM-4.6\": {\n        \"id\": \"zai-org/GLM-4.6\",\n        \"name\": \"zai-org/GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.9 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"tencent/Hunyuan-MT-7B\": {\n        \"id\": \"tencent/Hunyuan-MT-7B\",\n        \"name\": \"tencent/Hunyuan-MT-7B\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 33000, \"output\": 33000 }\n      },\n      \"tencent/Hunyuan-A13B-Instruct\": {\n        \"id\": \"tencent/Hunyuan-A13B-Instruct\",\n        \"name\": \"tencent/Hunyuan-A13B-Instruct\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"ascend-tribe/pangu-pro-moe\": {\n        \"id\": \"ascend-tribe/pangu-pro-moe\",\n        \"name\": \"ascend-tribe/pangu-pro-moe\",\n        \"family\": \"pangu\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-02\",\n        \"last_updated\": \"2026-01-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"ByteDance-Seed/Seed-OSS-36B-Instruct\": {\n        \"id\": \"ByteDance-Seed/Seed-OSS-36B-Instruct\",\n        \"name\": \"ByteDance-Seed/Seed-OSS-36B-Instruct\",\n        \"family\": \"seed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 0.57 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      }\n    }\n  },\n  \"cohere\": {\n    \"id\": \"cohere\",\n    \"env\": [\"COHERE_API_KEY\"],\n    \"npm\": \"@ai-sdk/cohere\",\n    \"name\": \"Cohere\",\n    \"doc\": \"https://docs.cohere.com/docs/models\",\n    \"models\": {\n      \"command-a-reasoning-08-2025\": {\n        \"id\": \"command-a-reasoning-08-2025\",\n        \"name\": \"Command A Reasoning\",\n        \"family\": \"command-a\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"command-r7b-arabic-02-2025\": {\n        \"id\": \"command-r7b-arabic-02-2025\",\n        \"name\": \"Command R7B Arabic\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2025-02-27\",\n        \"last_updated\": \"2025-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.0375, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"command-r7b-12-2024\": {\n        \"id\": \"command-r7b-12-2024\",\n        \"name\": \"Command R7B\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2024-02-27\",\n        \"last_updated\": \"2024-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.0375, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"c4ai-aya-vision-8b\": {\n        \"id\": \"c4ai-aya-vision-8b\",\n        \"name\": \"Aya Vision 8B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-04\",\n        \"last_updated\": \"2025-05-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 16000, \"output\": 4000 }\n      },\n      \"command-a-03-2025\": {\n        \"id\": \"command-a-03-2025\",\n        \"name\": \"Command A\",\n        \"family\": \"command-a\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"output\": 8000 }\n      },\n      \"c4ai-aya-expanse-32b\": {\n        \"id\": \"c4ai-aya-expanse-32b\",\n        \"name\": \"Aya Expanse 32B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-24\",\n        \"last_updated\": \"2024-10-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"command-a-translate-08-2025\": {\n        \"id\": \"command-a-translate-08-2025\",\n        \"name\": \"Command A Translate\",\n        \"family\": \"command-a\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 8000, \"output\": 8000 }\n      },\n      \"c4ai-aya-vision-32b\": {\n        \"id\": \"c4ai-aya-vision-32b\",\n        \"name\": \"Aya Vision 32B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-04\",\n        \"last_updated\": \"2025-05-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 16000, \"output\": 4000 }\n      },\n      \"command-a-vision-07-2025\": {\n        \"id\": \"command-a-vision-07-2025\",\n        \"name\": \"Command A Vision\",\n        \"family\": \"command-a\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-07-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 8000 }\n      },\n      \"command-r-08-2024\": {\n        \"id\": \"command-r-08-2024\",\n        \"name\": \"Command R\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"command-r-plus-08-2024\": {\n        \"id\": \"command-r-plus-08-2024\",\n        \"name\": \"Command R+\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"c4ai-aya-expanse-8b\": {\n        \"id\": \"c4ai-aya-expanse-8b\",\n        \"name\": \"Aya Expanse 8B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-24\",\n        \"last_updated\": \"2024-10-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 8000, \"output\": 4000 }\n      }\n    }\n  },\n  \"friendli\": {\n    \"id\": \"friendli\",\n    \"env\": [\"FRIENDLI_TOKEN\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.friendli.ai/serverless/v1\",\n    \"name\": \"Friendli\",\n    \"doc\": \"https://friendli.ai/docs/guides/serverless_endpoints/introduction\",\n    \"models\": {\n      \"meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"meta-llama/Llama-3.1-8B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.1-8B-Instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8000 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"zai-org/GLM-5.1\": {\n        \"id\": \"zai-org/GLM-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 202752, \"output\": 202752 }\n      },\n      \"zai-org/GLM-5\": {\n        \"id\": \"zai-org/GLM-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 202752, \"output\": 202752 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      }\n    }\n  },\n  \"cortecs\": {\n    \"id\": \"cortecs\",\n    \"env\": [\"CORTECS_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.cortecs.ai/v1\",\n    \"name\": \"Cortecs\",\n    \"doc\": \"https://api.cortecs.ai/v1/models\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM 5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.08, \"output\": 3.44 },\n        \"limit\": { \"context\": 202752, \"output\": 202752 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM 4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.23 },\n        \"limit\": { \"context\": 198000, \"output\": 198000 }\n      },\n      \"minimax-M2.7\": {\n        \"id\": \"minimax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.47, \"output\": 1.4 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"minimax-m2\": {\n        \"id\": \"minimax-m2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.39, \"output\": 1.57 },\n        \"limit\": { \"context\": 400000, \"output\": 400000 }\n      },\n      \"claude-sonnet-4\": {\n        \"id\": \"claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.307, \"output\": 16.536 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"intellect-3\": {\n        \"id\": \"intellect-3\",\n        \"name\": \"INTELLECT 3\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-26\",\n        \"last_updated\": \"2025-11-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.219, \"output\": 1.202 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"deepseek-v3-0324\": {\n        \"id\": \"deepseek-v3-0324\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.551, \"output\": 1.654 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.656, \"output\": 2.731 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"kimi-k2-instruct\": {\n        \"id\": \"kimi-k2-instruct\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.551, \"output\": 2.646 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"claude-opus4-6\": {\n        \"id\": \"claude-opus4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5.98, \"output\": 29.89 },\n        \"limit\": { \"context\": 1000000, \"output\": 1000000 }\n      },\n      \"claude-opus4-5\": {\n        \"id\": \"claude-opus4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5.98, \"output\": 29.89 },\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-14\",\n        \"last_updated\": \"2026-04-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.31, \"output\": 4.1, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.654, \"output\": 11.024 },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT Oss 120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.76 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 1.34 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3 Next 80B A3B Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-11\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.164, \"output\": 1.311 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.32, \"output\": 1.18 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.441, \"output\": 1.984 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"glm-4.7-flash\": {\n        \"id\": \"glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.53 },\n        \"limit\": { \"context\": 203000, \"output\": 203000 }\n      },\n      \"nova-pro-v1\": {\n        \"id\": \"nova-pro-v1\",\n        \"name\": \"Nova Pro 1.0\",\n        \"family\": \"nova-pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.016, \"output\": 4.061 },\n        \"limit\": { \"context\": 300000, \"output\": 5000 }\n      },\n      \"glm-4.5\": {\n        \"id\": \"glm-4.5\",\n        \"name\": \"GLM 4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.67, \"output\": 2.46 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"kimi-k2.6\": {\n        \"id\": \"kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-17\",\n        \"last_updated\": \"2026-04-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.81, \"output\": 3.54, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"claude-opus4-7\": {\n        \"id\": \"claude-opus4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5.6,\n          \"output\": 27.99,\n          \"cache_read\": 0.56,\n          \"cache_write\": 6.99\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"devstral-2512\": {\n        \"id\": \"devstral-2512\",\n        \"name\": \"Devstral 2 2512\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"devstral-small-2512\": {\n        \"id\": \"devstral-small-2512\",\n        \"name\": \"Devstral Small 2 2512\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"qwen3-coder-next\": {\n        \"id\": \"qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next 80B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-04\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.158, \"output\": 0.84 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"minimax-m2.1\": {\n        \"id\": \"minimax-m2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.34, \"output\": 1.34 },\n        \"limit\": { \"context\": 196000, \"output\": 196000 }\n      },\n      \"llama-3.1-405b-instruct\": {\n        \"id\": \"llama-3.1-405b-instruct\",\n        \"name\": \"Llama 3.1 405B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT 4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.354, \"output\": 9.417 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.099, \"output\": 0.33 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"claude-4-5-sonnet\": {\n        \"id\": \"claude-4-5-sonnet\",\n        \"name\": \"Claude 4.5 Sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.259, \"output\": 16.296 },\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.09, \"output\": 5.43 },\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"claude-4-6-sonnet\": {\n        \"id\": \"claude-4-6-sonnet\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.59, \"output\": 17.92 },\n        \"limit\": { \"context\": 1000000, \"output\": 1000000 }\n      }\n    }\n  },\n  \"xiaomi-token-plan-sgp\": {\n    \"id\": \"xiaomi-token-plan-sgp\",\n    \"env\": [\"XIAOMI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://token-plan-sgp.xiaomimimo.com/v1\",\n    \"name\": \"Xiaomi Token Plan (Singapore)\",\n    \"doc\": \"https://platform.xiaomimimo.com/#/docs\",\n    \"models\": {\n      \"mimo-v2-tts\": {\n        \"id\": \"mimo-v2-tts\",\n        \"name\": \"MiMo-V2-TTS\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8000, \"output\": 16000 }\n      },\n      \"mimo-v2-pro\": {\n        \"id\": \"mimo-v2-pro\",\n        \"name\": \"MiMo-V2-Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2-omni\": {\n        \"id\": \"mimo-v2-omni\",\n        \"name\": \"MiMo-V2-Omni\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"mimo-v2.5-pro\": {\n        \"id\": \"mimo-v2.5-pro\",\n        \"name\": \"MiMo-V2.5-Pro\",\n        \"family\": \"mimo-v2.5-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2.5\": {\n        \"id\": \"mimo-v2.5\",\n        \"name\": \"MiMo-V2.5\",\n        \"family\": \"mimo-v2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      }\n    }\n  },\n  \"perplexity-agent\": {\n    \"id\": \"perplexity-agent\",\n    \"env\": [\"PERPLEXITY_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai\",\n    \"api\": \"https://api.perplexity.ai/v1\",\n    \"name\": \"Perplexity Agent\",\n    \"doc\": \"https://docs.perplexity.ai/docs/agent-api/models\",\n    \"models\": {\n      \"nvidia/nemotron-3-super-120b-a12b\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b\",\n        \"name\": \"Nemotron 3 Super 120B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 2.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 32000 }\n      },\n      \"anthropic/claude-sonnet-4-6\": {\n        \"id\": \"anthropic/claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4-5\": {\n        \"id\": \"anthropic/claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4-6\": {\n        \"id\": \"anthropic/claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4-5\": {\n        \"id\": \"anthropic/claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-haiku-4-5\": {\n        \"id\": \"anthropic/claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 5, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"xai/grok-4-1-fast-non-reasoning\": {\n        \"id\": \"xai/grok-4-1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"perplexity/sonar\": {\n        \"id\": \"perplexity/sonar\",\n        \"name\": \"Sonar\",\n        \"family\": \"sonar\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2.5, \"cache_read\": 0.0625 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3-flash-preview\": {\n        \"id\": \"google/gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"context_over_200k\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.125,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 15,\n            \"cache_read\": 0.25\n          }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3.1-pro-preview\": {\n        \"id\": \"google/gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      }\n    }\n  },\n  \"google-vertex\": {\n    \"id\": \"google-vertex\",\n    \"env\": [\n      \"GOOGLE_VERTEX_PROJECT\",\n      \"GOOGLE_VERTEX_LOCATION\",\n      \"GOOGLE_APPLICATION_CREDENTIALS\"\n    ],\n    \"npm\": \"@ai-sdk/google-vertex\",\n    \"name\": \"Vertex\",\n    \"doc\": \"https://cloud.google.com/vertex-ai/generative-ai/docs/models\",\n    \"models\": {\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.383\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.0-flash\": {\n        \"id\": \"gemini-2.0-flash\",\n        \"name\": \"Gemini 2.0 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"gemini-flash-latest\": {\n        \"id\": \"gemini-flash-latest\",\n        \"name\": \"Gemini Flash Latest\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.383\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Preview 09-25\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.383\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash-lite-preview-06-17\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-06-17\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview 06-17\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"qwen/qwen3-235b-a22b-instruct-2507-maas\": {\n        \"id\": \"qwen/qwen3-235b-a22b-instruct-2507-maas\",\n        \"name\": \"Qwen3 235B A22B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.88 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"meta/llama-3.3-70b-instruct-maas\": {\n        \"id\": \"meta/llama-3.3-70b-instruct-maas\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.72, \"output\": 0.72 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"meta/llama-4-maverick-17b-128e-instruct-maas\": {\n        \"id\": \"meta/llama-4-maverick-17b-128e-instruct-maas\",\n        \"name\": \"Llama 4 Maverick 17B 128E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.15 },\n        \"limit\": { \"context\": 524288, \"output\": 8192 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"moonshotai/kimi-k2-thinking-maas\": {\n        \"id\": \"moonshotai/kimi-k2-thinking-maas\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"deepseek-ai/deepseek-v3.1-maas\": {\n        \"id\": \"deepseek-ai/deepseek-v3.1-maas\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.7 },\n        \"limit\": { \"context\": 163840, \"output\": 32768 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"deepseek-ai/deepseek-v3.2-maas\": {\n        \"id\": \"deepseek-ai/deepseek-v3.2-maas\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2026-04-04\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68, \"cache_read\": 0.056 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"zai-org/glm-5-maas\": {\n        \"id\": \"zai-org/glm-5-maas\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"zai-org/glm-4.7-maas\": {\n        \"id\": \"zai-org/glm-4.7-maas\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-06\",\n        \"last_updated\": \"2026-01-06\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi\"\n        }\n      },\n      \"openai/gpt-oss-120b-maas\": {\n        \"id\": \"openai/gpt-oss-120b-maas\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.36 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-oss-20b-maas\": {\n        \"id\": \"openai/gpt-oss-20b-maas\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.25 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-embedding-001\": {\n        \"id\": \"gemini-embedding-001\",\n        \"name\": \"Gemini Embedding 001\",\n        \"family\": \"gemini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0 },\n        \"limit\": { \"context\": 2048, \"output\": 3072 }\n      },\n      \"gemini-3.1-flash-lite-preview\": {\n        \"id\": \"gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.5,\n          \"cache_read\": 0.025,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro-preview-06-05\": {\n        \"id\": \"gemini-2.5-pro-preview-06-05\",\n        \"name\": \"Gemini 2.5 Pro Preview 06-05\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview 09-25\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-flash-lite-latest\": {\n        \"id\": \"gemini-flash-lite-latest\",\n        \"name\": \"Gemini Flash-Lite Latest\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash-preview-05-20\": {\n        \"id\": \"gemini-2.5-flash-preview-05-20\",\n        \"name\": \"Gemini 2.5 Flash Preview 05-20\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.0375 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"context_over_200k\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.125,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 15,\n            \"cache_read\": 0.25\n          }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.0-flash-lite\": {\n        \"id\": \"gemini-2.0-flash-lite\",\n        \"name\": \"Gemini 2.0 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"gemini-2.5-pro-preview-05-06\": {\n        \"id\": \"gemini-2.5-pro-preview-05-06\",\n        \"name\": \"Gemini 2.5 Pro Preview 05-06\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2025-05-06\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3.1-pro-preview-customtools\": {\n        \"id\": \"gemini-3.1-pro-preview-customtools\",\n        \"name\": \"Gemini 3.1 Pro Preview Custom Tools\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3.1-pro-preview\": {\n        \"id\": \"gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash-preview-04-17\": {\n        \"id\": \"gemini-2.5-flash-preview-04-17\",\n        \"name\": \"Gemini 2.5 Flash Preview 04-17\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-04-17\",\n        \"last_updated\": \"2025-04-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.0375 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      }\n    }\n  },\n  \"mixlayer\": {\n    \"id\": \"mixlayer\",\n    \"env\": [\"MIXLAYER_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://models.mixlayer.ai/v1\",\n    \"name\": \"Mixlayer\",\n    \"doc\": \"https://docs.mixlayer.com\",\n    \"models\": {\n      \"qwen/qwen3.5-9b\": {\n        \"id\": \"qwen/qwen3.5-9b\",\n        \"name\": \"Qwen3.5 9B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen3.5-27b\": {\n        \"id\": \"qwen/qwen3.5-27b\",\n        \"name\": \"Qwen3.5 27B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen3.5-35b-a3b\": {\n        \"id\": \"qwen/qwen3.5-35b-a3b\",\n        \"name\": \"Qwen3.5 35B A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 1.3 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen3.5-122b-a10b\": {\n        \"id\": \"qwen/qwen3.5-122b-a10b\",\n        \"name\": \"Qwen3.5 122B A10B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 3.2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen3.5-397b-a17b\": {\n        \"id\": \"qwen/qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      }\n    }\n  },\n  \"xiaomi-token-plan-cn\": {\n    \"id\": \"xiaomi-token-plan-cn\",\n    \"env\": [\"XIAOMI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://token-plan-cn.xiaomimimo.com/v1\",\n    \"name\": \"Xiaomi Token Plan (China)\",\n    \"doc\": \"https://platform.xiaomimimo.com/#/docs\",\n    \"models\": {\n      \"mimo-v2.5-pro\": {\n        \"id\": \"mimo-v2.5-pro\",\n        \"name\": \"MiMo-V2.5-Pro\",\n        \"family\": \"mimo-v2.5-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2.5\": {\n        \"id\": \"mimo-v2.5\",\n        \"name\": \"MiMo-V2.5\",\n        \"family\": \"mimo-v2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2-omni\": {\n        \"id\": \"mimo-v2-omni\",\n        \"name\": \"MiMo-V2-Omni\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"mimo-v2-pro\": {\n        \"id\": \"mimo-v2-pro\",\n        \"name\": \"MiMo-V2-Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2-tts\": {\n        \"id\": \"mimo-v2-tts\",\n        \"name\": \"MiMo-V2-TTS\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8000, \"output\": 16000 }\n      }\n    }\n  },\n  \"submodel\": {\n    \"id\": \"submodel\",\n    \"env\": [\"SUBMODEL_INSTAGEN_ACCESS_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://llm.submodel.ai/v1\",\n    \"name\": \"submodel\",\n    \"doc\": \"https://submodel.gitbook.io\",\n    \"models\": {\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-23\",\n        \"last_updated\": \"2025-08-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-23\",\n        \"last_updated\": \"2025-08-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-23\",\n        \"last_updated\": \"2025-08-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek R1 0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-23\",\n        \"last_updated\": \"2025-08-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2.15 },\n        \"limit\": { \"context\": 75000, \"output\": 163840 }\n      },\n      \"deepseek-ai/DeepSeek-V3-0324\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3-0324\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-23\",\n        \"last_updated\": \"2025-08-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 75000, \"output\": 163840 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-23\",\n        \"last_updated\": \"2025-08-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 75000, \"output\": 163840 }\n      },\n      \"zai-org/GLM-4.5-FP8\": {\n        \"id\": \"zai-org/GLM-4.5-FP8\",\n        \"name\": \"GLM 4.5 FP8\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"zai-org/GLM-4.5-Air\": {\n        \"id\": \"zai-org/GLM-4.5-Air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-23\",\n        \"last_updated\": \"2025-08-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      }\n    }\n  },\n  \"jiekou\": {\n    \"id\": \"jiekou\",\n    \"env\": [\"JIEKOU_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.jiekou.ai/openai\",\n    \"name\": \"Jiekou.AI\",\n    \"doc\": \"https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev\",\n    \"models\": {\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"gemini-2.5-flash-lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.36 },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"claude-opus-4-20250514\": {\n        \"id\": \"claude-opus-4-20250514\",\n        \"name\": \"claude-opus-4-20250514\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 13.5, \"output\": 67.5 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"o3-mini\": {\n        \"id\": \"o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"o3\": {\n        \"id\": \"o3\",\n        \"name\": \"o3\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 40 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"gemini-2.5-flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 2.25 },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"claude-opus-4-1-20250805\": {\n        \"id\": \"claude-opus-4-1-20250805\",\n        \"name\": \"claude-opus-4-1-20250805\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 13.5, \"output\": 67.5 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"gemini-2.5-pro-preview-06-05\": {\n        \"id\": \"gemini-2.5-pro-preview-06-05\",\n        \"name\": \"gemini-2.5-pro-preview-06-05\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.125, \"output\": 9 },\n        \"limit\": { \"context\": 1048576, \"output\": 200000 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"gpt-5.1-codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.125, \"output\": 9 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"grok-4-fast-reasoning\": {\n        \"id\": \"grok-4-fast-reasoning\",\n        \"name\": \"grok-4-fast-reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.45 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"grok-4-fast-non-reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.45 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.36 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"gpt-5-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.225, \"output\": 1.8 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"gpt-5.1-codex-max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.125, \"output\": 9 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"gpt-5-pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 13.5, \"output\": 108 },\n        \"limit\": { \"context\": 400000, \"output\": 272000 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"claude-haiku-4-5-20251001\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.9, \"output\": 4.5 },\n        \"limit\": { \"context\": 20000, \"output\": 64000 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"gemini-3-pro-preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.8, \"output\": 10.8 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"grok-4-1-fast-non-reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.45 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"grok-4-1-fast-reasoning\": {\n        \"id\": \"grok-4-1-fast-reasoning\",\n        \"name\": \"grok-4-1-fast-reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.45 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"claude-opus-4-6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02\",\n        \"last_updated\": \"2026-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash-preview-05-20\": {\n        \"id\": \"gemini-2.5-flash-preview-05-20\",\n        \"name\": \"gemini-2.5-flash-preview-05-20\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.135, \"output\": 3.15 },\n        \"limit\": { \"context\": 1048576, \"output\": 200000 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"grok-code-fast-1\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 1.35 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"gemini-3-flash-preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"gemini-2.5-pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.125, \"output\": 9 },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"gpt-5-codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.125, \"output\": 9 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"gpt-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.575, \"output\": 12.6 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-20250514\": {\n        \"id\": \"claude-sonnet-4-20250514\",\n        \"name\": \"claude-sonnet-4-20250514\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.7, \"output\": 13.5 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"gpt-5.2-codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-opus-4-5-20251101\": {\n        \"id\": \"claude-opus-4-5-20251101\",\n        \"name\": \"claude-opus-4-5-20251101\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.5, \"output\": 22.5 },\n        \"limit\": { \"context\": 200000, \"output\": 65536 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"claude-sonnet-4-5-20250929\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.7, \"output\": 13.5 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5-chat-latest\": {\n        \"id\": \"gpt-5-chat-latest\",\n        \"name\": \"gpt-5-chat-latest\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.125, \"output\": 9 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash-lite-preview-06-17\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-06-17\",\n        \"name\": \"gemini-2.5-flash-lite-preview-06-17\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"video\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.36 },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"gpt-5.2-pro\": {\n        \"id\": \"gpt-5.2-pro\",\n        \"name\": \"gpt-5.2-pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 18.9, \"output\": 151.2 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"grok-4-0709\": {\n        \"id\": \"grok-4-0709\",\n        \"name\": \"grok-4-0709\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.7, \"output\": 13.5 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"gpt-5-nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.045, \"output\": 0.36 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"gpt-5.1-codex-mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.225, \"output\": 1.8 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"gpt-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02\",\n        \"last_updated\": \"2026-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.125, \"output\": 9 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen/qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen/qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen3 235B A22b Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen/qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3 Next 80B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 1.5 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"qwen/qwen3-235b-a22b-fp8\": {\n        \"id\": \"qwen/qwen3-235b-a22b-fp8\",\n        \"name\": \"Qwen3 235B A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 40960, \"output\": 20000 }\n      },\n      \"qwen/qwen3-30b-a3b-fp8\": {\n        \"id\": \"qwen/qwen3-30b-a3b-fp8\",\n        \"name\": \"Qwen3 30B A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.45 },\n        \"limit\": { \"context\": 40960, \"output\": 20000 }\n      },\n      \"qwen/qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3 Next 80B A3B Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 1.5 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"qwen/qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen/qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.8 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"qwen/qwen3-32b-fp8\": {\n        \"id\": \"qwen/qwen3-32b-fp8\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.45 },\n        \"limit\": { \"context\": 40960, \"output\": 20000 }\n      },\n      \"qwen/qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen/qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-coder-next\": {\n        \"id\": \"qwen/qwen3-coder-next\",\n        \"name\": \"qwen/qwen3-coder-next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02\",\n        \"last_updated\": \"2026-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"moonshotai/kimi-k2-instruct\": {\n        \"id\": \"moonshotai/kimi-k2-instruct\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.57, \"output\": 2.3 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"moonshotai/kimi-k2-0905\": {\n        \"id\": \"moonshotai/kimi-k2-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"xiaomimimo/mimo-v2-flash\": {\n        \"id\": \"xiaomimimo/mimo-v2-flash\",\n        \"name\": \"XiaomiMiMo/MiMo-V2-Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"deepseek/deepseek-v3-0324\": {\n        \"id\": \"deepseek/deepseek-v3-0324\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.14 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek/deepseek-r1-0528\": {\n        \"id\": \"deepseek/deepseek-r1-0528\",\n        \"name\": \"DeepSeek R1 0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.5 },\n        \"limit\": { \"context\": 163840, \"output\": 32768 }\n      },\n      \"deepseek/deepseek-v3.1\": {\n        \"id\": \"deepseek/deepseek-v3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 163840, \"output\": 32768 }\n      },\n      \"minimaxai/minimax-m1-80k\": {\n        \"id\": \"minimaxai/minimax-m1-80k\",\n        \"name\": \"MiniMax M1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 40000 }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"Minimax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"baidu/ernie-4.5-vl-424b-a47b\": {\n        \"id\": \"baidu/ernie-4.5-vl-424b-a47b\",\n        \"name\": \"ERNIE 4.5 VL 424B A47B\",\n        \"family\": \"ernie\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.42, \"output\": 1.25 },\n        \"limit\": { \"context\": 123000, \"output\": 16000 }\n      },\n      \"baidu/ernie-4.5-300b-a47b-paddle\": {\n        \"id\": \"baidu/ernie-4.5-300b-a47b-paddle\",\n        \"name\": \"ERNIE 4.5 300B A47B\",\n        \"family\": \"ernie\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.1 },\n        \"limit\": { \"context\": 123000, \"output\": 12000 }\n      },\n      \"zai-org/glm-4.7\": {\n        \"id\": \"zai-org/glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/glm-4.5v\": {\n        \"id\": \"zai-org/glm-4.5v\",\n        \"name\": \"GLM 4.5V\",\n        \"family\": \"glmv\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"zai-org/glm-4.7-flash\": {\n        \"id\": \"zai-org/glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.4 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"zai-org/glm-4.5\": {\n        \"id\": \"zai-org/glm-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      }\n    }\n  },\n  \"zai-coding-plan\": {\n    \"id\": \"zai-coding-plan\",\n    \"env\": [\"ZHIPU_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.z.ai/api/coding/paas/v4\",\n    \"name\": \"Z.AI Coding Plan\",\n    \"doc\": \"https://docs.z.ai/devpack/overview\",\n    \"models\": {\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"GLM-4.5-Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"glm-5-turbo\": {\n        \"id\": \"glm-5-turbo\",\n        \"name\": \"GLM-5-Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      }\n    }\n  },\n  \"fastrouter\": {\n    \"id\": \"fastrouter\",\n    \"env\": [\"FASTROUTER_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://go.fastrouter.ai/api/v1\",\n    \"name\": \"FastRouter\",\n    \"doc\": \"https://fastrouter.ai/models\",\n    \"models\": {\n      \"qwen/qwen3-coder\": {\n        \"id\": \"qwen/qwen3-coder\",\n        \"name\": \"Qwen3 Coder\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"moonshotai/kimi-k2\": {\n        \"id\": \"moonshotai/kimi-k2\",\n        \"name\": \"Kimi K2\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"x-ai/grok-4\": {\n        \"id\": \"x-ai/grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.75,\n          \"cache_write\": 15\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"deepseek-ai/deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek-ai/deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-01-23\",\n        \"last_updated\": \"2025-01-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.14 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"z-ai/glm-5\": {\n        \"id\": \"z-ai/glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 3.15 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"openai/gpt-5-nano\": {\n        \"id\": \"openai/gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5, \"cache_read\": 0.0375 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4.1\": {\n        \"id\": \"anthropic/claude-opus-4.1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      }\n    }\n  },\n  \"hpc-ai\": {\n    \"id\": \"hpc-ai\",\n    \"env\": [\"HPC_AI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.hpc-ai.com/inference/v1\",\n    \"name\": \"HPC-AI\",\n    \"doc\": \"https://www.hpc-ai.com/doc/docs/quickstart/\",\n    \"models\": {\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-01-01\",\n        \"last_updated\": \"2026-03-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.21, \"output\": 1, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax-m2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-03-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.56, \"cache_read\": 0.014 },\n        \"limit\": { \"context\": 1000000, \"output\": 131072 }\n      },\n      \"zai-org/glm-5.1\": {\n        \"id\": \"zai-org/glm-5.1\",\n        \"name\": \"GLM 5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.66, \"output\": 2, \"cache_read\": 0.12 },\n        \"limit\": { \"context\": 202000, \"output\": 202000 }\n      }\n    }\n  },\n  \"poe\": {\n    \"id\": \"poe\",\n    \"env\": [\"POE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.poe.com/v1\",\n    \"name\": \"Poe\",\n    \"doc\": \"https://creator.poe.com/docs/external-applications/openai-compatible-api\",\n    \"models\": {\n      \"cerebras/qwen3-32b-cs\": {\n        \"id\": \"cerebras/qwen3-32b-cs\",\n        \"name\": \"qwen3-32b-cs\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-15\",\n        \"last_updated\": \"2025-05-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 },\n        \"status\": \"deprecated\"\n      },\n      \"cerebras/qwen3-235b-2507-cs\": {\n        \"id\": \"cerebras/qwen3-235b-2507-cs\",\n        \"name\": \"qwen3-235b-2507-cs\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-06\",\n        \"last_updated\": \"2025-08-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 },\n        \"status\": \"deprecated\"\n      },\n      \"cerebras/llama-3.1-8b-cs\": {\n        \"id\": \"cerebras/llama-3.1-8b-cs\",\n        \"name\": \"Llama-3.1-8B-CS\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-13\",\n        \"last_updated\": \"2025-05-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"cerebras/llama-3.3-70b-cs\": {\n        \"id\": \"cerebras/llama-3.3-70b-cs\",\n        \"name\": \"llama-3.3-70b-cs\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-13\",\n        \"last_updated\": \"2025-05-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 },\n        \"status\": \"deprecated\"\n      },\n      \"cerebras/gpt-oss-120b-cs\": {\n        \"id\": \"cerebras/gpt-oss-120b-cs\",\n        \"name\": \"GPT-OSS-120B-CS\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-06\",\n        \"last_updated\": \"2025-08-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 0.75 },\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"lumalabs/ray2\": {\n        \"id\": \"lumalabs/ray2\",\n        \"name\": \"Ray2\",\n        \"family\": \"ray\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-02-20\",\n        \"last_updated\": \"2025-02-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 5000, \"output\": 0 }\n      },\n      \"anthropic/claude-sonnet-3.7\": {\n        \"id\": \"anthropic/claude-sonnet-3.7\",\n        \"name\": \"Claude-Sonnet-3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.6,\n          \"output\": 13,\n          \"cache_read\": 0.26,\n          \"cache_write\": 3.2\n        },\n        \"limit\": { \"context\": 196608, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Claude-Sonnet-4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-21\",\n        \"last_updated\": \"2025-05-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.6,\n          \"output\": 13,\n          \"cache_read\": 0.26,\n          \"cache_write\": 3.2\n        },\n        \"limit\": { \"context\": 983040, \"output\": 64000 }\n      },\n      \"anthropic/claude-haiku-3.5\": {\n        \"id\": \"anthropic/claude-haiku-3.5\",\n        \"name\": \"Claude-Haiku-3.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.68,\n          \"output\": 3.4,\n          \"cache_read\": 0.068,\n          \"cache_write\": 0.85\n        },\n        \"limit\": { \"context\": 189096, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4.1\": {\n        \"id\": \"anthropic/claude-opus-4.1\",\n        \"name\": \"Claude-Opus-4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 13,\n          \"output\": 64,\n          \"cache_read\": 1.3,\n          \"cache_write\": 16\n        },\n        \"limit\": { \"context\": 196608, \"output\": 32000 }\n      },\n      \"anthropic/claude-opus-4.6\": {\n        \"id\": \"anthropic/claude-opus-4.6\",\n        \"name\": \"Claude-Opus-4.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-04\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 4.3,\n          \"output\": 21,\n          \"cache_read\": 0.43,\n          \"cache_write\": 5.3\n        },\n        \"limit\": { \"context\": 983040, \"output\": 128000 }\n      },\n      \"anthropic/claude-haiku-4.5\": {\n        \"id\": \"anthropic/claude-haiku-4.5\",\n        \"name\": \"Claude-Haiku-4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.85,\n          \"output\": 4.3,\n          \"cache_read\": 0.085,\n          \"cache_write\": 1.1\n        },\n        \"limit\": { \"context\": 192000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4\": {\n        \"id\": \"anthropic/claude-opus-4\",\n        \"name\": \"Claude-Opus-4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-21\",\n        \"last_updated\": \"2025-05-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 13,\n          \"output\": 64,\n          \"cache_read\": 1.3,\n          \"cache_write\": 16\n        },\n        \"limit\": { \"context\": 192512, \"output\": 28672 }\n      },\n      \"anthropic/claude-opus-4.5\": {\n        \"id\": \"anthropic/claude-opus-4.5\",\n        \"name\": \"Claude-Opus-4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-21\",\n        \"last_updated\": \"2025-11-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 4.3,\n          \"output\": 21,\n          \"cache_read\": 0.43,\n          \"cache_write\": 5.3\n        },\n        \"limit\": { \"context\": 196608, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4.7\": {\n        \"id\": \"anthropic/claude-opus-4.7\",\n        \"name\": \"Claude-Opus-4.7\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-04-15\",\n        \"last_updated\": \"2026-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 4.3,\n          \"output\": 21,\n          \"cache_read\": 0.43,\n          \"cache_write\": 5.4\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4.6\": {\n        \"id\": \"anthropic/claude-sonnet-4.6\",\n        \"name\": \"Claude-Sonnet-4.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.6,\n          \"output\": 13,\n          \"cache_read\": 0.26,\n          \"cache_write\": 3.2\n        },\n        \"limit\": { \"context\": 983040, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-3.5-june\": {\n        \"id\": \"anthropic/claude-sonnet-3.5-june\",\n        \"name\": \"Claude-Sonnet-3.5-June\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-11-18\",\n        \"last_updated\": \"2024-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.6,\n          \"output\": 13,\n          \"cache_read\": 0.26,\n          \"cache_write\": 3.2\n        },\n        \"limit\": { \"context\": 189096, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"anthropic/claude-sonnet-3.5\": {\n        \"id\": \"anthropic/claude-sonnet-3.5\",\n        \"name\": \"Claude-Sonnet-3.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-06-05\",\n        \"last_updated\": \"2024-06-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.6,\n          \"output\": 13,\n          \"cache_read\": 0.26,\n          \"cache_write\": 3.2\n        },\n        \"limit\": { \"context\": 189096, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"anthropic/claude-haiku-3\": {\n        \"id\": \"anthropic/claude-haiku-3\",\n        \"name\": \"Claude-Haiku-3\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-03-09\",\n        \"last_updated\": \"2024-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.21,\n          \"output\": 1.1,\n          \"cache_read\": 0.021,\n          \"cache_write\": 0.26\n        },\n        \"limit\": { \"context\": 189096, \"output\": 8192 }\n      },\n      \"anthropic/claude-sonnet-4.5\": {\n        \"id\": \"anthropic/claude-sonnet-4.5\",\n        \"name\": \"Claude-Sonnet-4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-09-26\",\n        \"last_updated\": \"2025-09-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.6,\n          \"output\": 13,\n          \"cache_read\": 0.26,\n          \"cache_write\": 3.2\n        },\n        \"limit\": { \"context\": 983040, \"output\": 32768 }\n      },\n      \"xai/grok-4.1-fast-non-reasoning\": {\n        \"id\": \"xai/grok-4.1-fast-non-reasoning\",\n        \"name\": \"Grok-4.1-Fast-Non-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"xai/grok-4-fast-reasoning\": {\n        \"id\": \"xai/grok-4-fast-reasoning\",\n        \"name\": \"Grok-4-Fast-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-09-16\",\n        \"last_updated\": \"2025-09-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 128000 }\n      },\n      \"xai/grok-4-fast-non-reasoning\": {\n        \"id\": \"xai/grok-4-fast-non-reasoning\",\n        \"name\": \"Grok-4-Fast-Non-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-09-16\",\n        \"last_updated\": \"2025-09-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 128000 }\n      },\n      \"xai/grok-4.20-multi-agent\": {\n        \"id\": \"xai/grok-4.20-multi-agent\",\n        \"name\": \"Grok-4.20-Multi-Agent\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-13\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"xai/grok-4.1-fast-reasoning\": {\n        \"id\": \"xai/grok-4.1-fast-reasoning\",\n        \"name\": \"Grok-4.1-Fast-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"xai/grok-3-mini\": {\n        \"id\": \"xai/grok-3-mini\",\n        \"name\": \"Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-11\",\n        \"last_updated\": \"2025-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"xai/grok-code-fast-1\": {\n        \"id\": \"xai/grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-22\",\n        \"last_updated\": \"2025-08-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"xai/grok-3\": {\n        \"id\": \"xai/grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-11\",\n        \"last_updated\": \"2025-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"xai/grok-4\": {\n        \"id\": \"xai/grok-4\",\n        \"name\": \"Grok-4\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-07-10\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"poetools/claude-code\": {\n        \"id\": \"poetools/claude-code\",\n        \"name\": \"claude-code\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-27\",\n        \"last_updated\": \"2025-11-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"trytako/tako\": {\n        \"id\": \"trytako/tako\",\n        \"name\": \"Tako\",\n        \"family\": \"tako\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-15\",\n        \"last_updated\": \"2024-08-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2048, \"output\": 0 }\n      },\n      \"fireworks-ai/kimi-k2.5-fw\": {\n        \"id\": \"fireworks-ai/kimi-k2.5-fw\",\n        \"name\": \"Kimi-K2.5-FW\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"input\": 245760, \"output\": 16384 }\n      },\n      \"ideogramai/ideogram-v2\": {\n        \"id\": \"ideogramai/ideogram-v2\",\n        \"name\": \"Ideogram-v2\",\n        \"family\": \"ideogram\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-21\",\n        \"last_updated\": \"2024-08-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 150, \"output\": 0 }\n      },\n      \"ideogramai/ideogram-v2a-turbo\": {\n        \"id\": \"ideogramai/ideogram-v2a-turbo\",\n        \"name\": \"Ideogram-v2a-Turbo\",\n        \"family\": \"ideogram\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-02-27\",\n        \"last_updated\": \"2025-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 150, \"output\": 0 }\n      },\n      \"ideogramai/ideogram-v2a\": {\n        \"id\": \"ideogramai/ideogram-v2a\",\n        \"name\": \"Ideogram-v2a\",\n        \"family\": \"ideogram\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-02-27\",\n        \"last_updated\": \"2025-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 150, \"output\": 0 }\n      },\n      \"ideogramai/ideogram\": {\n        \"id\": \"ideogramai/ideogram\",\n        \"name\": \"Ideogram\",\n        \"family\": \"ideogram\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-04-03\",\n        \"last_updated\": \"2024-04-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 150, \"output\": 0 }\n      },\n      \"stabilityai/stablediffusionxl\": {\n        \"id\": \"stabilityai/stablediffusionxl\",\n        \"name\": \"StableDiffusionXL\",\n        \"family\": \"stable-diffusion\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2023-07-09\",\n        \"last_updated\": \"2023-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200, \"output\": 0 }\n      },\n      \"topazlabs-co/topazlabs\": {\n        \"id\": \"topazlabs-co/topazlabs\",\n        \"name\": \"TopazLabs\",\n        \"family\": \"topazlabs\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 204, \"output\": 0 }\n      },\n      \"novita/glm-5\": {\n        \"id\": \"novita/glm-5\",\n        \"name\": \"GLM-5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-02-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 205000, \"output\": 131072 }\n      },\n      \"novita/deepseek-v3.2\": {\n        \"id\": \"novita/deepseek-v3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.4, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"novita/glm-4.7\": {\n        \"id\": \"novita/glm-4.7\",\n        \"name\": \"glm-4.7\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 205000, \"output\": 131072 },\n        \"status\": \"deprecated\"\n      },\n      \"novita/glm-4.7-n\": {\n        \"id\": \"novita/glm-4.7-n\",\n        \"name\": \"glm-4.7-n\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 205000, \"output\": 131072 }\n      },\n      \"novita/kimi-k2-thinking\": {\n        \"id\": \"novita/kimi-k2-thinking\",\n        \"name\": \"kimi-k2-thinking\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-07\",\n        \"last_updated\": \"2025-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 0 }\n      },\n      \"novita/glm-4.6\": {\n        \"id\": \"novita/glm-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"novita/kimi-k2.5\": {\n        \"id\": \"novita/kimi-k2.5\",\n        \"name\": \"Kimi-K2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 262144 }\n      },\n      \"novita/glm-4.6v\": {\n        \"id\": \"novita/glm-4.6v\",\n        \"name\": \"glm-4.6v\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 131000, \"output\": 32768 }\n      },\n      \"novita/glm-4.7-flash\": {\n        \"id\": \"novita/glm-4.7-flash\",\n        \"name\": \"glm-4.7-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 65500 }\n      },\n      \"novita/minimax-m2.1\": {\n        \"id\": \"novita/minimax-m2.1\",\n        \"name\": \"minimax-m2.1\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-26\",\n        \"last_updated\": \"2025-12-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 205000, \"output\": 131072 }\n      },\n      \"openai/dall-e-3\": {\n        \"id\": \"openai/dall-e-3\",\n        \"name\": \"DALL-E-3\",\n        \"family\": \"dall-e\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2023-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 800, \"output\": 0 }\n      },\n      \"openai/o3-mini\": {\n        \"id\": \"openai/o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.99, \"output\": 4 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"GPT-4o-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.54, \"cache_read\": 0.068 },\n        \"limit\": { \"context\": 124096, \"output\": 4096 }\n      },\n      \"openai/o3\": {\n        \"id\": \"openai/o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.8, \"output\": 7.2, \"cache_read\": 0.45 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.4-pro\": {\n        \"id\": \"openai/gpt-5.4-pro\",\n        \"name\": \"GPT-5.4-Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 27, \"output\": 160 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"openai/o3-pro\": {\n        \"id\": \"openai/o3-pro\",\n        \"name\": \"o3-pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-10\",\n        \"last_updated\": \"2025-06-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 18, \"output\": 72 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-3.5-turbo-raw\": {\n        \"id\": \"openai/gpt-3.5-turbo-raw\",\n        \"name\": \"GPT-3.5-Turbo-Raw\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2023-09-27\",\n        \"last_updated\": \"2023-09-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.45, \"output\": 1.4 },\n        \"limit\": { \"context\": 4524, \"output\": 2048 }\n      },\n      \"openai/gpt-image-2\": {\n        \"id\": \"openai/gpt-image-2\",\n        \"name\": \"GPT-Image-2\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5.0505, \"output\": 32.3232, \"cache_read\": 1.2626 },\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"GPT-5.1-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-12\",\n        \"last_updated\": \"2025-11-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.99, \"output\": 4, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4-classic\": {\n        \"id\": \"openai/gpt-4-classic\",\n        \"name\": \"GPT-4-Classic\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-03-25\",\n        \"last_updated\": \"2024-03-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 27, \"output\": 54 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 },\n        \"status\": \"deprecated\"\n      },\n      \"openai/o1\": {\n        \"id\": \"openai/o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-12-18\",\n        \"last_updated\": \"2024-12-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14, \"output\": 54 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o\": {\n        \"id\": \"openai/gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/sora-2-pro\": {\n        \"id\": \"openai/sora-2-pro\",\n        \"name\": \"Sora-2-Pro\",\n        \"family\": \"sora\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"GPT-5-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-25\",\n        \"last_updated\": \"2025-06-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.22, \"output\": 1.8, \"cache_read\": 0.022 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-chat\": {\n        \"id\": \"openai/gpt-5-chat\",\n        \"name\": \"GPT-5-Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.1-codex-max\": {\n        \"id\": \"openai/gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1-Codex-Max\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-pro\": {\n        \"id\": \"openai/gpt-5-pro\",\n        \"name\": \"GPT-5-Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14, \"output\": 110 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-instant\": {\n        \"id\": \"openai/gpt-5.1-instant\",\n        \"name\": \"GPT-5.1-Instant\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-12\",\n        \"last_updated\": \"2025-11-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/sora-2\": {\n        \"id\": \"openai/sora-2\",\n        \"name\": \"Sora-2\",\n        \"family\": \"sora\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"openai/gpt-5.3-codex-spark\": {\n        \"id\": \"openai/gpt-5.3-codex-spark\",\n        \"name\": \"GPT-5.3-Codex-Spark\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-04\",\n        \"last_updated\": \"2026-03-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o4-mini-deep-research\": {\n        \"id\": \"openai/o4-mini-deep-research\",\n        \"name\": \"o4-mini-deep-research\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-27\",\n        \"last_updated\": \"2025-06-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.8, \"output\": 7.2, \"cache_read\": 0.45 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.4-mini\": {\n        \"id\": \"openai/gpt-5.4-mini\",\n        \"name\": \"GPT-5.4-Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-12\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.68, \"output\": 4, \"cache_read\": 0.068 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/o3-mini-high\": {\n        \"id\": \"openai/o3-mini-high\",\n        \"name\": \"o3-mini-high\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.99, \"output\": 4 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o3-deep-research\": {\n        \"id\": \"openai/o3-deep-research\",\n        \"name\": \"o3-deep-research\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-27\",\n        \"last_updated\": \"2025-06-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9, \"output\": 36, \"cache_read\": 2.2 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/chatgpt-4o-latest\": {\n        \"id\": \"openai/chatgpt-4o-latest\",\n        \"name\": \"ChatGPT-4o-Latest\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-14\",\n        \"last_updated\": \"2024-08-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.5, \"output\": 14 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"openai/gpt-4.1-mini\": {\n        \"id\": \"openai/gpt-4.1-mini\",\n        \"name\": \"GPT-4.1-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.36, \"output\": 1.4, \"cache_read\": 0.09 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-3.5-turbo\": {\n        \"id\": \"openai/gpt-3.5-turbo\",\n        \"name\": \"GPT-3.5-Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2023-09-13\",\n        \"last_updated\": \"2023-09-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.45, \"output\": 1.4 },\n        \"limit\": { \"context\": 16384, \"output\": 2048 }\n      },\n      \"openai/gpt-4o-search\": {\n        \"id\": \"openai/gpt-4o-search\",\n        \"name\": \"GPT-4o-Search\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-03-11\",\n        \"last_updated\": \"2025-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.2, \"output\": 9 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/gpt-5.2-instant\": {\n        \"id\": \"openai/gpt-5.2-instant\",\n        \"name\": \"GPT-5.2-Instant\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 13, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-image-1.5\": {\n        \"id\": \"openai/gpt-image-1.5\",\n        \"name\": \"gpt-image-1.5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"openai/gpt-image-1-mini\": {\n        \"id\": \"openai/gpt-image-1-mini\",\n        \"name\": \"GPT-Image-1-Mini\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"openai/gpt-5-codex\": {\n        \"id\": \"openai/gpt-5-codex\",\n        \"name\": \"GPT-5-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 13, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.3-codex\": {\n        \"id\": \"openai/gpt-5.3-codex\",\n        \"name\": \"GPT-5.3-Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-10\",\n        \"last_updated\": \"2026-02-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 13, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4-turbo\": {\n        \"id\": \"openai/gpt-4-turbo\",\n        \"name\": \"GPT-4-Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2023-09-13\",\n        \"last_updated\": \"2023-09-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9, \"output\": 27 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-image-1\": {\n        \"id\": \"openai/gpt-image-1\",\n        \"name\": \"GPT-Image-1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-03-31\",\n        \"last_updated\": \"2025-03-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"GPT-5.2-Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 13, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o-mini-search\": {\n        \"id\": \"openai/gpt-4o-mini-search\",\n        \"name\": \"GPT-4o-mini-Search\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-03-11\",\n        \"last_updated\": \"2025-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.54 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/gpt-4.1-nano\": {\n        \"id\": \"openai/gpt-4.1-nano\",\n        \"name\": \"GPT-4.1-nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.36, \"cache_read\": 0.022 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.2-pro\": {\n        \"id\": \"openai/gpt-5.2-pro\",\n        \"name\": \"GPT-5.2-Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 19, \"output\": 150 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-3.5-turbo-instruct\": {\n        \"id\": \"openai/gpt-3.5-turbo-instruct\",\n        \"name\": \"GPT-3.5-Turbo-Instruct\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2023-09-20\",\n        \"last_updated\": \"2023-09-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.4, \"output\": 1.8 },\n        \"limit\": { \"context\": 3500, \"output\": 1024 }\n      },\n      \"openai/gpt-5-nano\": {\n        \"id\": \"openai/gpt-5-nano\",\n        \"name\": \"GPT-5-nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.045, \"output\": 0.36, \"cache_read\": 0.0045 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.8, \"output\": 7.2, \"cache_read\": 0.45 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.1-codex-mini\": {\n        \"id\": \"openai/gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1-Codex-Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-12\",\n        \"last_updated\": \"2025-11-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.22, \"output\": 1.8, \"cache_read\": 0.022 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.3-instant\": {\n        \"id\": \"openai/gpt-5.3-instant\",\n        \"name\": \"GPT-5.3-Instant\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 13, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 128000, \"input\": 111616, \"output\": 16384 }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-12\",\n        \"last_updated\": \"2025-11-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/o1-pro\": {\n        \"id\": \"openai/o1-pro\",\n        \"name\": \"o1-pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-03-19\",\n        \"last_updated\": \"2025-03-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 140, \"output\": 540 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o-aug\": {\n        \"id\": \"openai/gpt-4o-aug\",\n        \"name\": \"GPT-4o-Aug\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-11-21\",\n        \"last_updated\": \"2024-11-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.2, \"output\": 9, \"cache_read\": 1.1 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/gpt-4-classic-0314\": {\n        \"id\": \"openai/gpt-4-classic-0314\",\n        \"name\": \"GPT-4-Classic-0314\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-26\",\n        \"last_updated\": \"2024-08-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 27, \"output\": 54 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 },\n        \"status\": \"deprecated\"\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.2, \"output\": 14, \"cache_read\": 0.22 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.4-nano\": {\n        \"id\": \"openai/gpt-5.4-nano\",\n        \"name\": \"GPT-5.4-Nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 1.1, \"cache_read\": 0.018 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"google/gemini-2.5-flash-lite\": {\n        \"id\": \"google/gemini-2.5-flash-lite\",\n        \"name\": \"Gemini-2.5-Flash-Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-19\",\n        \"last_updated\": \"2025-06-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 1024000, \"output\": 64000 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Gemini-2.5-Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-26\",\n        \"last_updated\": \"2025-04-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 1.8, \"cache_read\": 0.021 },\n        \"limit\": { \"context\": 1065535, \"output\": 65535 }\n      },\n      \"google/imagen-4-ultra\": {\n        \"id\": \"google/imagen-4-ultra\",\n        \"name\": \"Imagen-4-Ultra\",\n        \"family\": \"imagen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-24\",\n        \"last_updated\": \"2025-05-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/gemini-3-pro\": {\n        \"id\": \"google/gemini-3-pro\",\n        \"name\": \"Gemini-3-Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-22\",\n        \"last_updated\": \"2025-10-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 9.6, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 },\n        \"status\": \"deprecated\"\n      },\n      \"google/gemini-3.1-pro\": {\n        \"id\": \"google/gemini-3.1-pro\",\n        \"name\": \"Gemini-3.1-Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/veo-3.1\": {\n        \"id\": \"google/veo-3.1\",\n        \"name\": \"Veo-3.1\",\n        \"family\": \"veo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/gemini-2.0-flash\": {\n        \"id\": \"google/gemini-2.0-flash\",\n        \"name\": \"Gemini-2.0-Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.42 },\n        \"limit\": { \"context\": 990000, \"output\": 8192 }\n      },\n      \"google/gemma-4-31b\": {\n        \"id\": \"google/gemma-4-31b\",\n        \"name\": \"Gemma-4-31B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"google/gemini-deep-research\": {\n        \"id\": \"google/gemini-deep-research\",\n        \"name\": \"gemini-deep-research\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 9.6 },\n        \"limit\": { \"context\": 1048576, \"output\": 0 },\n        \"status\": \"deprecated\"\n      },\n      \"google/lyria\": {\n        \"id\": \"google/lyria\",\n        \"name\": \"Lyria\",\n        \"family\": \"lyria\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-04\",\n        \"last_updated\": \"2025-06-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Gemini-2.5-Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-02-05\",\n        \"last_updated\": \"2025-02-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.87, \"output\": 7, \"cache_read\": 0.087 },\n        \"limit\": { \"context\": 1065535, \"output\": 65535 }\n      },\n      \"google/gemini-3-flash\": {\n        \"id\": \"google/gemini-3-flash\",\n        \"name\": \"Gemini-3-Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-07\",\n        \"last_updated\": \"2025-10-07\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2.4, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-2.0-flash-lite\": {\n        \"id\": \"google/gemini-2.0-flash-lite\",\n        \"name\": \"Gemini-2.0-Flash-Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-02-05\",\n        \"last_updated\": \"2025-02-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.052, \"output\": 0.21 },\n        \"limit\": { \"context\": 990000, \"output\": 8192 }\n      },\n      \"google/veo-3\": {\n        \"id\": \"google/veo-3\",\n        \"name\": \"Veo-3\",\n        \"family\": \"veo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-21\",\n        \"last_updated\": \"2025-05-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/veo-3.1-fast\": {\n        \"id\": \"google/veo-3.1-fast\",\n        \"name\": \"Veo-3.1-Fast\",\n        \"family\": \"veo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/veo-3-fast\": {\n        \"id\": \"google/veo-3-fast\",\n        \"name\": \"Veo-3-Fast\",\n        \"family\": \"veo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-13\",\n        \"last_updated\": \"2025-10-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/veo-2\": {\n        \"id\": \"google/veo-2\",\n        \"name\": \"Veo-2\",\n        \"family\": \"veo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-12-02\",\n        \"last_updated\": \"2024-12-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/gemini-3.1-flash-lite\": {\n        \"id\": \"google/gemini-3.1-flash-lite\",\n        \"name\": \"Gemini-3.1-Flash-Lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-18\",\n        \"last_updated\": \"2026-02-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1.5 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/imagen-4-fast\": {\n        \"id\": \"google/imagen-4-fast\",\n        \"name\": \"Imagen-4-Fast\",\n        \"family\": \"imagen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-25\",\n        \"last_updated\": \"2025-06-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/imagen-3\": {\n        \"id\": \"google/imagen-3\",\n        \"name\": \"Imagen-3\",\n        \"family\": \"imagen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-10-15\",\n        \"last_updated\": \"2024-10-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/imagen-3-fast\": {\n        \"id\": \"google/imagen-3-fast\",\n        \"name\": \"Imagen-3-Fast\",\n        \"family\": \"imagen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-10-17\",\n        \"last_updated\": \"2024-10-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/imagen-4\": {\n        \"id\": \"google/imagen-4\",\n        \"name\": \"Imagen-4\",\n        \"family\": \"imagen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/nano-banana-pro\": {\n        \"id\": \"google/nano-banana-pro\",\n        \"name\": \"Nano-Banana-Pro\",\n        \"family\": \"nano-banana\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 65536, \"output\": 0 }\n      },\n      \"google/nano-banana\": {\n        \"id\": \"google/nano-banana\",\n        \"name\": \"Nano-Banana\",\n        \"family\": \"nano-banana\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 1.8, \"cache_read\": 0.021 },\n        \"limit\": { \"context\": 65536, \"output\": 0 }\n      },\n      \"runwayml/runway-gen-4-turbo\": {\n        \"id\": \"runwayml/runway-gen-4-turbo\",\n        \"name\": \"Runway-Gen-4-Turbo\",\n        \"family\": \"runway\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-09\",\n        \"last_updated\": \"2025-05-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256, \"output\": 0 }\n      },\n      \"runwayml/runway\": {\n        \"id\": \"runwayml/runway\",\n        \"name\": \"Runway\",\n        \"family\": \"runway\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-10-11\",\n        \"last_updated\": \"2024-10-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"video\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256, \"output\": 0 }\n      },\n      \"elevenlabs/elevenlabs-v2.5-turbo\": {\n        \"id\": \"elevenlabs/elevenlabs-v2.5-turbo\",\n        \"name\": \"ElevenLabs-v2.5-Turbo\",\n        \"family\": \"elevenlabs\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-10-28\",\n        \"last_updated\": \"2024-10-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"elevenlabs/elevenlabs-music\": {\n        \"id\": \"elevenlabs/elevenlabs-music\",\n        \"name\": \"ElevenLabs-Music\",\n        \"family\": \"elevenlabs\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-29\",\n        \"last_updated\": \"2025-08-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000, \"output\": 0 }\n      },\n      \"elevenlabs/elevenlabs-v3\": {\n        \"id\": \"elevenlabs/elevenlabs-v3\",\n        \"name\": \"ElevenLabs-v3\",\n        \"family\": \"elevenlabs\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 0 }\n      },\n      \"openai/gpt-5.5\": {\n        \"id\": \"openai/gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.5455, \"output\": 27.2727, \"cache_read\": 0.4545 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.5-pro\": {\n        \"id\": \"openai/gpt-5.5-pro\",\n        \"name\": \"GPT-5.5-Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 27.2727, \"output\": 163.6364 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      }\n    }\n  },\n  \"scaleway\": {\n    \"id\": \"scaleway\",\n    \"env\": [\"SCALEWAY_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.scaleway.ai/v1\",\n    \"name\": \"Scaleway\",\n    \"doc\": \"https://www.scaleway.com/en/docs/generative-apis/\",\n    \"models\": {\n      \"llama-3.1-8b-instruct\": {\n        \"id\": \"llama-3.1-8b-instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"devstral-2-123b-instruct-2512\": {\n        \"id\": \"devstral-2-123b-instruct-2512\",\n        \"name\": \"Devstral 2 123B Instruct (2512)\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-07\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.9, \"output\": 0.9 },\n        \"limit\": { \"context\": 32000, \"output\": 8196 }\n      },\n      \"bge-multilingual-gemma2\": {\n        \"id\": \"bge-multilingual-gemma2\",\n        \"name\": \"BGE Multilingual Gemma2\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-07-26\",\n        \"last_updated\": \"2025-06-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 8191, \"output\": 3072 }\n      },\n      \"qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3-Coder 30B-A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"mistral-nemo-instruct-2407\": {\n        \"id\": \"mistral-nemo-instruct-2407\",\n        \"name\": \"Mistral Nemo Instruct 2407\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-25\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT-OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"qwen3-embedding-8b\": {\n        \"id\": \"qwen3-embedding-8b\",\n        \"name\": \"Qwen3 Embedding 8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-25-11\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 4096 }\n      },\n      \"llama-3.3-70b-instruct\": {\n        \"id\": \"llama-3.3-70b-instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.9, \"output\": 0.9 },\n        \"limit\": { \"context\": 100000, \"output\": 16384 }\n      },\n      \"qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 2.25 },\n        \"limit\": { \"context\": 260000, \"output\": 16384 }\n      },\n      \"voxtral-small-24b-2507\": {\n        \"id\": \"voxtral-small-24b-2507\",\n        \"name\": \"Voxtral Small 24B 2507\",\n        \"family\": \"voxtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.35 },\n        \"limit\": { \"context\": 32000, \"output\": 16384 }\n      },\n      \"gemma-3-27b-it\": {\n        \"id\": \"gemma-3-27b-it\",\n        \"name\": \"Gemma-3-27B-IT\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.5 },\n        \"limit\": { \"context\": 40000, \"output\": 8192 }\n      },\n      \"pixtral-12b-2409\": {\n        \"id\": \"pixtral-12b-2409\",\n        \"name\": \"Pixtral 12B 2409\",\n        \"family\": \"pixtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistral-small-3.2-24b-instruct-2506\": {\n        \"id\": \"mistral-small-3.2-24b-instruct-2506\",\n        \"name\": \"Mistral Small 3.2 24B Instruct (2506)\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-20\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.35 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"qwen3.5-397b-a17b\": {\n        \"id\": \"qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"whisper-large-v3\": {\n        \"id\": \"whisper-large-v3\",\n        \"name\": \"Whisper Large v3\",\n        \"family\": \"whisper\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2023-09-01\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.003, \"output\": 0 },\n        \"limit\": { \"context\": 0, \"output\": 8192 }\n      }\n    }\n  },\n  \"tencent-tokenhub\": {\n    \"id\": \"tencent-tokenhub\",\n    \"env\": [\"TENCENT_TOKENHUB_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://tokenhub.tencentmaas.com/v1\",\n    \"name\": \"Tencent TokenHub\",\n    \"doc\": \"https://cloud.tencent.com/document/product/1823/130050\",\n    \"models\": {\n      \"hy3-preview\": {\n        \"id\": \"hy3-preview\",\n        \"name\": \"Hy3 preview\",\n        \"family\": \"Hy\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      }\n    }\n  },\n  \"zhipuai-coding-plan\": {\n    \"id\": \"zhipuai-coding-plan\",\n    \"env\": [\"ZHIPU_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://open.bigmodel.cn/api/coding/paas/v4\",\n    \"name\": \"Zhipu AI Coding Plan\",\n    \"doc\": \"https://docs.bigmodel.cn/cn/coding-plan/overview\",\n    \"models\": {\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-5-turbo\": {\n        \"id\": \"glm-5-turbo\",\n        \"name\": \"GLM-5-Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"GLM-4.5-Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"io-net\": {\n    \"id\": \"io-net\",\n    \"env\": [\"IOINTELLIGENCE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.intelligence.io.solutions/api/v1\",\n    \"name\": \"IO.NET\",\n    \"doc\": \"https://io.net/docs/guides/intelligence/io-intelligence\",\n    \"models\": {\n      \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\": {\n        \"id\": \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\",\n        \"name\": \"Llama 4 Maverick 17B 128E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-01-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.15,\n          \"output\": 0.6,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 430000, \"output\": 4096 }\n      },\n      \"meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.13,\n          \"output\": 0.38,\n          \"cache_read\": 0.065,\n          \"cache_write\": 0.26\n        },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta-llama/Llama-3.2-90B-Vision-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.2-90B-Vision-Instruct\",\n        \"name\": \"Llama 3.2 90B Vision Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.35,\n          \"output\": 0.4,\n          \"cache_read\": 0.175,\n          \"cache_write\": 0.7\n        },\n        \"limit\": { \"context\": 16000, \"output\": 4096 }\n      },\n      \"Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar\": {\n        \"id\": \"Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar\",\n        \"name\": \"Qwen 3 Coder 480B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-01-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.22,\n          \"output\": 0.95,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0.44\n        },\n        \"limit\": { \"context\": 106000, \"output\": 4096 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.55,\n          \"output\": 2.25,\n          \"cache_read\": 0.275,\n          \"cache_write\": 1.1\n        },\n        \"limit\": { \"context\": 32768, \"output\": 4096 }\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-09-05\",\n        \"last_updated\": \"2024-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.39,\n          \"output\": 1.9,\n          \"cache_read\": 0.195,\n          \"cache_write\": 0.78\n        },\n        \"limit\": { \"context\": 32768, \"output\": 4096 }\n      },\n      \"mistralai/Magistral-Small-2506\": {\n        \"id\": \"mistralai/Magistral-Small-2506\",\n        \"name\": \"Magistral Small 2506\",\n        \"family\": \"magistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-01\",\n        \"last_updated\": \"2025-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 1.5,\n          \"cache_read\": 0.25,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistralai/Devstral-Small-2505\": {\n        \"id\": \"mistralai/Devstral-Small-2505\",\n        \"name\": \"Devstral Small 2505\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-05-01\",\n        \"last_updated\": \"2025-05-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.05,\n          \"output\": 0.22,\n          \"cache_read\": 0.025,\n          \"cache_write\": 0.1\n        },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistralai/Mistral-Large-Instruct-2411\": {\n        \"id\": \"mistralai/Mistral-Large-Instruct-2411\",\n        \"name\": \"Mistral Large Instruct 2411\",\n        \"family\": \"mistral-large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 1, \"cache_write\": 4 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistralai/Mistral-Nemo-Instruct-2407\": {\n        \"id\": \"mistralai/Mistral-Nemo-Instruct-2407\",\n        \"name\": \"Mistral Nemo Instruct 2407\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.02,\n          \"output\": 0.04,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.04\n        },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen 3 235B Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.11,\n          \"output\": 0.6,\n          \"cache_read\": 0.055,\n          \"cache_write\": 0.22\n        },\n        \"limit\": { \"context\": 262144, \"output\": 4096 }\n      },\n      \"Qwen/Qwen2.5-VL-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-32B-Instruct\",\n        \"name\": \"Qwen 2.5 VL 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.05,\n          \"output\": 0.22,\n          \"cache_read\": 0.025,\n          \"cache_write\": 0.1\n        },\n        \"limit\": { \"context\": 32000, \"output\": 4096 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"name\": \"Qwen 3 Next 80B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-10\",\n        \"last_updated\": \"2025-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.8,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.2\n        },\n        \"limit\": { \"context\": 262144, \"output\": 4096 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 8.75,\n          \"cache_read\": 1,\n          \"cache_write\": 4\n        },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"zai-org/GLM-4.6\": {\n        \"id\": \"zai-org/GLM-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-11-15\",\n        \"last_updated\": \"2024-11-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.4,\n          \"output\": 1.75,\n          \"cache_read\": 0.2,\n          \"cache_write\": 0.8\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT-OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.04,\n          \"output\": 0.4,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.08\n        },\n        \"limit\": { \"context\": 131072, \"output\": 4096 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT-OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.03,\n          \"output\": 0.14,\n          \"cache_read\": 0.015,\n          \"cache_write\": 0.06\n        },\n        \"limit\": { \"context\": 64000, \"output\": 4096 }\n      }\n    }\n  },\n  \"cerebras\": {\n    \"id\": \"cerebras\",\n    \"env\": [\"CEREBRAS_API_KEY\"],\n    \"npm\": \"@ai-sdk/cerebras\",\n    \"name\": \"Cerebras\",\n    \"doc\": \"https://inference-docs.cerebras.ai/models/overview\",\n    \"models\": {\n      \"zai-glm-4.7\": {\n        \"id\": \"zai-glm-4.7\",\n        \"name\": \"Z.AI GLM-4.7\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-10\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 2.25,\n          \"output\": 2.75,\n          \"cache_read\": 0,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 131072, \"output\": 40000 }\n      },\n      \"llama3.1-8b\": {\n        \"id\": \"llama3.1-8b\",\n        \"name\": \"Llama 3.1 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 32000, \"output\": 8000 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.69 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen-3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen-3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen 3 235B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2025-07-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.2 },\n        \"limit\": { \"context\": 131000, \"output\": 32000 }\n      }\n    }\n  },\n  \"morph\": {\n    \"id\": \"morph\",\n    \"env\": [\"MORPH_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.morphllm.com/v1\",\n    \"name\": \"Morph\",\n    \"doc\": \"https://docs.morphllm.com/api-reference/introduction\",\n    \"models\": {\n      \"morph-v3-fast\": {\n        \"id\": \"morph-v3-fast\",\n        \"name\": \"Morph v3 Fast\",\n        \"family\": \"morph\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-15\",\n        \"last_updated\": \"2024-08-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 1.2 },\n        \"limit\": { \"context\": 16000, \"output\": 16000 }\n      },\n      \"auto\": {\n        \"id\": \"auto\",\n        \"name\": \"Auto\",\n        \"family\": \"auto\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.85, \"output\": 1.55 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"morph-v3-large\": {\n        \"id\": \"morph-v3-large\",\n        \"name\": \"Morph v3 Large\",\n        \"family\": \"morph\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-15\",\n        \"last_updated\": \"2024-08-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.9, \"output\": 1.9 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      }\n    }\n  },\n  \"alibaba-cn\": {\n    \"id\": \"alibaba-cn\",\n    \"env\": [\"DASHSCOPE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n    \"name\": \"Alibaba (China)\",\n    \"doc\": \"https://www.alibabacloud.com/help/en/model-studio/models\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.86, \"output\": 3.15 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"qwen-long\": {\n        \"id\": \"qwen-long\",\n        \"name\": \"Qwen Long\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01-25\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.072, \"output\": 0.287 },\n        \"limit\": { \"context\": 10000000, \"output\": 8192 }\n      },\n      \"qwen-turbo\": {\n        \"id\": \"qwen-turbo\",\n        \"name\": \"Qwen Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-07-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.044, \"output\": 0.087, \"reasoning\": 0.431 },\n        \"limit\": { \"context\": 1000000, \"output\": 16384 }\n      },\n      \"qwen-omni-turbo-realtime\": {\n        \"id\": \"qwen-omni-turbo-realtime\",\n        \"name\": \"Qwen-Omni Turbo Realtime\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-05-08\",\n        \"last_updated\": \"2025-05-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.23,\n          \"output\": 0.918,\n          \"input_audio\": 3.584,\n          \"output_audio\": 7.168\n        },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"qwen3.6-plus\": {\n        \"id\": \"qwen3.6-plus\",\n        \"name\": \"Qwen3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.276,\n          \"output\": 1.651,\n          \"cache_read\": 0.028,\n          \"cache_write\": 0.344\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen-max\": {\n        \"id\": \"qwen-max\",\n        \"name\": \"Qwen Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-03\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.345, \"output\": 1.377 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-vl-235b-a22b\": {\n        \"id\": \"qwen3-vl-235b-a22b\",\n        \"name\": \"Qwen3-VL 235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.286705, \"output\": 1.14682, \"reasoning\": 2.867051 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwq-32b\": {\n        \"id\": \"qwq-32b\",\n        \"name\": \"QwQ 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-12\",\n        \"last_updated\": \"2024-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.287, \"output\": 0.861 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen-doc-turbo\": {\n        \"id\": \"qwen-doc-turbo\",\n        \"name\": \"Qwen Doc Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01\",\n        \"last_updated\": \"2024-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.087, \"output\": 0.144 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"deepseek-r1-distill-qwen-1-5b\": {\n        \"id\": \"deepseek-r1-distill-qwen-1-5b\",\n        \"name\": \"DeepSeek R1 Distill Qwen 1.5B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"qwen2-5-32b-instruct\": {\n        \"id\": \"qwen2-5-32b-instruct\",\n        \"name\": \"Qwen2.5 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.287, \"output\": 0.861 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3.5-plus\": {\n        \"id\": \"qwen3.5-plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.573, \"output\": 3.44, \"reasoning\": 3.44 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen2-5-coder-7b-instruct\": {\n        \"id\": \"qwen2-5-coder-7b-instruct\",\n        \"name\": \"Qwen2.5-Coder 7B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-11\",\n        \"last_updated\": \"2024-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.144, \"output\": 0.287 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"deepseek-v3-2-exp\": {\n        \"id\": \"deepseek-v3-2-exp\",\n        \"name\": \"DeepSeek V3.2 Exp\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.287, \"output\": 0.431 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"deepseek-r1-distill-llama-8b\": {\n        \"id\": \"deepseek-r1-distill-llama-8b\",\n        \"name\": \"DeepSeek R1 Distill Llama 8B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"qwen2-5-7b-instruct\": {\n        \"id\": \"qwen2-5-7b-instruct\",\n        \"name\": \"Qwen2.5 7B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.072, \"output\": 0.144 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3.6-max-preview\": {\n        \"id\": \"qwen3.6-max-preview\",\n        \"name\": \"Qwen3.6 Max Preview\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.32, \"output\": 7.9, \"cache_read\": 0.132 },\n        \"limit\": { \"context\": 245800, \"output\": 65536 }\n      },\n      \"qwen-plus\": {\n        \"id\": \"qwen-plus\",\n        \"name\": \"Qwen Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.115, \"output\": 0.287, \"reasoning\": 1.147 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Moonshot Kimi K2 Thinking\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.574, \"output\": 2.294 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen3.5-flash\": {\n        \"id\": \"qwen3.5-flash\",\n        \"name\": \"Qwen3.5 Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-23\",\n        \"last_updated\": \"2026-02-23\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.172, \"output\": 1.72, \"reasoning\": 1.72 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3-Next 80B-A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.144, \"output\": 0.574 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen-plus-character\": {\n        \"id\": \"qwen-plus-character\",\n        \"name\": \"Qwen Plus Character\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01\",\n        \"last_updated\": \"2024-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.115, \"output\": 0.287 },\n        \"limit\": { \"context\": 32768, \"output\": 4096 }\n      },\n      \"deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.287, \"output\": 0.861 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"deepseek-r1-distill-qwen-14b\": {\n        \"id\": \"deepseek-r1-distill-qwen-14b\",\n        \"name\": \"DeepSeek R1 Distill Qwen 14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.144, \"output\": 0.431 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"qwen-omni-turbo\": {\n        \"id\": \"qwen-omni-turbo\",\n        \"name\": \"Qwen-Omni Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01-19\",\n        \"last_updated\": \"2025-03-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.058,\n          \"output\": 0.23,\n          \"input_audio\": 3.584,\n          \"output_audio\": 7.168\n        },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"qwen2-5-vl-7b-instruct\": {\n        \"id\": \"qwen2-5-vl-7b-instruct\",\n        \"name\": \"Qwen2.5-VL 7B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.287, \"output\": 0.717 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen-math-turbo\": {\n        \"id\": \"qwen-math-turbo\",\n        \"name\": \"Qwen Math Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09-19\",\n        \"last_updated\": \"2024-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.287, \"output\": 0.861 },\n        \"limit\": { \"context\": 4096, \"output\": 3072 }\n      },\n      \"qwen3-14b\": {\n        \"id\": \"qwen3-14b\",\n        \"name\": \"Qwen3 14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.144, \"output\": 0.574, \"reasoning\": 1.434 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen-vl-plus\": {\n        \"id\": \"qwen-vl-plus\",\n        \"name\": \"Qwen-VL Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2025-08-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.115, \"output\": 0.287 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-max\": {\n        \"id\": \"qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.861, \"output\": 3.441 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"deepseek-v3-1\": {\n        \"id\": \"deepseek-v3-1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.574, \"output\": 1.721 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"qwen-flash\": {\n        \"id\": \"qwen-flash\",\n        \"name\": \"Qwen Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.022, \"output\": 0.216 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"deepseek-r1-distill-qwen-32b\": {\n        \"id\": \"deepseek-r1-distill-qwen-32b\",\n        \"name\": \"DeepSeek R1 Distill Qwen 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.287, \"output\": 0.861 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"qwen2-5-72b-instruct\": {\n        \"id\": \"qwen2-5-72b-instruct\",\n        \"name\": \"Qwen2.5 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.574, \"output\": 1.721 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-omni-flash\": {\n        \"id\": \"qwen3-omni-flash\",\n        \"name\": \"Qwen3-Omni Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.058,\n          \"output\": 0.23,\n          \"input_audio\": 3.584,\n          \"output_audio\": 7.168\n        },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-14\",\n        \"last_updated\": \"2026-04-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.87, \"output\": 3.48, \"cache_read\": 0.17 },\n        \"limit\": { \"context\": 202752, \"output\": 128000 }\n      },\n      \"qwen3-vl-30b-a3b\": {\n        \"id\": \"qwen3-vl-30b-a3b\",\n        \"name\": \"Qwen3-VL 30B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.108, \"output\": 0.431, \"reasoning\": 1.076 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3-Coder 30B-A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.216, \"output\": 0.861 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3-asr-flash\": {\n        \"id\": \"qwen3-asr-flash\",\n        \"name\": \"Qwen3-ASR Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-08\",\n        \"last_updated\": \"2025-09-08\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.032, \"output\": 0.032 },\n        \"limit\": { \"context\": 53248, \"output\": 4096 }\n      },\n      \"qwen-deep-research\": {\n        \"id\": \"qwen-deep-research\",\n        \"name\": \"Qwen Deep Research\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01\",\n        \"last_updated\": \"2024-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 7.742, \"output\": 23.367 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"qwen-mt-turbo\": {\n        \"id\": \"qwen-mt-turbo\",\n        \"name\": \"Qwen-MT Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.101, \"output\": 0.28 },\n        \"limit\": { \"context\": 16384, \"output\": 8192 }\n      },\n      \"deepseek-r1-distill-qwen-7b\": {\n        \"id\": \"deepseek-r1-distill-qwen-7b\",\n        \"name\": \"DeepSeek R1 Distill Qwen 7B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.072, \"output\": 0.144 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"deepseek-r1-0528\": {\n        \"id\": \"deepseek-r1-0528\",\n        \"name\": \"DeepSeek R1 0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.574, \"output\": 2.294 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"qwen-vl-ocr\": {\n        \"id\": \"qwen-vl-ocr\",\n        \"name\": \"Qwen-VL OCR\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-10-28\",\n        \"last_updated\": \"2025-04-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.717, \"output\": 0.717 },\n        \"limit\": { \"context\": 34096, \"output\": 4096 }\n      },\n      \"qwen-math-plus\": {\n        \"id\": \"qwen-math-plus\",\n        \"name\": \"Qwen Math Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-08-16\",\n        \"last_updated\": \"2024-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.574, \"output\": 1.721 },\n        \"limit\": { \"context\": 4096, \"output\": 3072 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"moonshot-kimi-k2-instruct\": {\n        \"id\": \"moonshot-kimi-k2-instruct\",\n        \"name\": \"Moonshot Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.574, \"output\": 2.294 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qvq-max\": {\n        \"id\": \"qvq-max\",\n        \"name\": \"QVQ Max\",\n        \"family\": \"qvq\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.147, \"output\": 4.588 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Moonshot Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.574, \"output\": 2.411 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3-Next 80B-A3B (Thinking)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.144, \"output\": 1.434 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen3-coder-flash\": {\n        \"id\": \"qwen3-coder-flash\",\n        \"name\": \"Qwen3 Coder Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.144, \"output\": 0.574 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwq-plus\": {\n        \"id\": \"qwq-plus\",\n        \"name\": \"QwQ Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-03-05\",\n        \"last_updated\": \"2025-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.23, \"output\": 0.574 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen2-5-omni-7b\": {\n        \"id\": \"qwen2-5-omni-7b\",\n        \"name\": \"Qwen2.5-Omni 7B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-12\",\n        \"last_updated\": \"2024-12\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.087, \"output\": 0.345, \"input_audio\": 5.448 },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"qwen2-5-coder-32b-instruct\": {\n        \"id\": \"qwen2-5-coder-32b-instruct\",\n        \"name\": \"Qwen2.5-Coder 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-11\",\n        \"last_updated\": \"2024-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.287, \"output\": 0.861 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3-Coder 480B-A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.861, \"output\": 3.441 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen-vl-max\": {\n        \"id\": \"qwen-vl-max\",\n        \"name\": \"Qwen-VL Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-08\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.23, \"output\": 0.574 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-vl-plus\": {\n        \"id\": \"qwen3-vl-plus\",\n        \"name\": \"Qwen3-VL Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.143353,\n          \"output\": 1.433525,\n          \"reasoning\": 4.300576\n        },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen3-235b-a22b\": {\n        \"id\": \"qwen3-235b-a22b\",\n        \"name\": \"Qwen3 235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.287, \"output\": 1.147, \"reasoning\": 2.868 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"qwen2-5-vl-72b-instruct\": {\n        \"id\": \"qwen2-5-vl-72b-instruct\",\n        \"name\": \"Qwen2.5-VL 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.294, \"output\": 6.881 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen2-5-math-7b-instruct\": {\n        \"id\": \"qwen2-5-math-7b-instruct\",\n        \"name\": \"Qwen2.5-Math 7B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.144, \"output\": 0.287 },\n        \"limit\": { \"context\": 4096, \"output\": 3072 }\n      },\n      \"kimi-k2.6\": {\n        \"id\": \"kimi-k2.6\",\n        \"name\": \"Moonshot Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.929, \"output\": 3.858 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen3-8b\": {\n        \"id\": \"qwen3-8b\",\n        \"name\": \"Qwen3 8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.072, \"output\": 0.287, \"reasoning\": 0.717 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"tongyi-intent-detect-v3\": {\n        \"id\": \"tongyi-intent-detect-v3\",\n        \"name\": \"Tongyi Intent Detect V3\",\n        \"family\": \"yi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01\",\n        \"last_updated\": \"2024-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.058, \"output\": 0.144 },\n        \"limit\": { \"context\": 8192, \"output\": 1024 }\n      },\n      \"qwen3-omni-flash-realtime\": {\n        \"id\": \"qwen3-omni-flash-realtime\",\n        \"name\": \"Qwen3-Omni Flash Realtime\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.23,\n          \"output\": 0.918,\n          \"input_audio\": 3.584,\n          \"output_audio\": 7.168\n        },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"qwen3.5-397b-a17b\": {\n        \"id\": \"qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.43, \"output\": 2.58, \"reasoning\": 2.58 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen2-5-math-72b-instruct\": {\n        \"id\": \"qwen2-5-math-72b-instruct\",\n        \"name\": \"Qwen2.5-Math 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.574, \"output\": 1.721 },\n        \"limit\": { \"context\": 4096, \"output\": 3072 }\n      },\n      \"qwen-mt-plus\": {\n        \"id\": \"qwen-mt-plus\",\n        \"name\": \"Qwen-MT Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.259, \"output\": 0.775 },\n        \"limit\": { \"context\": 16384, \"output\": 8192 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.287, \"output\": 1.147, \"reasoning\": 2.868 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"deepseek-v3\": {\n        \"id\": \"deepseek-v3\",\n        \"name\": \"DeepSeek V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.287, \"output\": 1.147 },\n        \"limit\": { \"context\": 65536, \"output\": 8192 }\n      },\n      \"qwen2-5-14b-instruct\": {\n        \"id\": \"qwen2-5-14b-instruct\",\n        \"name\": \"Qwen2.5 14B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.144, \"output\": 0.431 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"deepseek-r1\": {\n        \"id\": \"deepseek-r1\",\n        \"name\": \"DeepSeek R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.574, \"output\": 2.294 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"MiniMax/MiniMax-M2.7\": {\n        \"id\": \"MiniMax/MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"kimi/kimi-k2.5\": {\n        \"id\": \"kimi/kimi-k2.5\",\n        \"name\": \"kimi/kimi-k2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"siliconflow/deepseek-v3.2\": {\n        \"id\": \"siliconflow/deepseek-v3.2\",\n        \"name\": \"siliconflow/deepseek-v3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-03\",\n        \"last_updated\": \"2025-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.42 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"siliconflow/deepseek-v3-0324\": {\n        \"id\": \"siliconflow/deepseek-v3-0324\",\n        \"name\": \"siliconflow/deepseek-v3-0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"siliconflow/deepseek-r1-0528\": {\n        \"id\": \"siliconflow/deepseek-r1-0528\",\n        \"name\": \"siliconflow/deepseek-r1-0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2.18 },\n        \"limit\": { \"context\": 163840, \"output\": 32768 }\n      },\n      \"siliconflow/deepseek-v3.1-terminus\": {\n        \"id\": \"siliconflow/deepseek-v3.1-terminus\",\n        \"name\": \"siliconflow/deepseek-v3.1-terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"qwen3-coder-plus\": {\n        \"id\": \"qwen3-coder-plus\",\n        \"name\": \"Qwen3 Coder Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"deepseek-v4-pro\": {\n        \"id\": \"deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"deepseek-v4-flash\": {\n        \"id\": \"deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      }\n    }\n  },\n  \"opencode-go\": {\n    \"id\": \"opencode-go\",\n    \"env\": [\"OPENCODE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://opencode.ai/zen/go/v1\",\n    \"name\": \"OpenCode Go\",\n    \"doc\": \"https://opencode.ai/docs/zen\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 32768 }\n      },\n      \"mimo-v2.5-pro\": {\n        \"id\": \"mimo-v2.5-pro\",\n        \"name\": \"MiMo V2.5 Pro\",\n        \"family\": \"mimo-v2.5-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 128000 }\n      },\n      \"deepseek-v4-pro\": {\n        \"id\": \"deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.0145 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"qwen3.6-plus\": {\n        \"id\": \"qwen3.6-plus\",\n        \"name\": \"Qwen3.6 Plus\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.625\n        },\n        \"limit\": { \"context\": 262144, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"qwen3.5-plus\": {\n        \"id\": \"qwen3.5-plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"family\": \"qwen3.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 1.2,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.25\n        },\n        \"limit\": { \"context\": 262144, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"mimo-v2.5\": {\n        \"id\": \"mimo-v2.5\",\n        \"name\": \"MiMo V2.5\",\n        \"family\": \"mimo-v2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.4,\n          \"output\": 2,\n          \"cache_read\": 0.08,\n          \"context_over_200k\": { \"input\": 0.8, \"output\": 4, \"cache_read\": 0.16 }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2-omni\": {\n        \"id\": \"mimo-v2-omni\",\n        \"name\": \"MiMo V2 Omni\",\n        \"family\": \"mimo-v2-omni\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 262144, \"output\": 128000 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 202752, \"output\": 32768 }\n      },\n      \"mimo-v2-pro\": {\n        \"id\": \"mimo-v2-pro\",\n        \"name\": \"MiMo V2 Pro\",\n        \"family\": \"mimo-v2-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 128000 }\n      },\n      \"deepseek-v4-flash\": {\n        \"id\": \"deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.0028 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi-k2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax-m2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 204800, \"output\": 65536 }\n      },\n      \"kimi-k2.6\": {\n        \"id\": \"kimi-k2.6\",\n        \"name\": \"Kimi K2.6 (3x limits)\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.32, \"output\": 1.34, \"cache_read\": 0.054 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"minimax-m2.7\": {\n        \"id\": \"minimax-m2.7\",\n        \"name\": \"MiniMax M2.7\",\n        \"family\": \"minimax-m2.7\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      }\n    }\n  },\n  \"sap-ai-core\": {\n    \"id\": \"sap-ai-core\",\n    \"env\": [\"AICORE_SERVICE_KEY\"],\n    \"npm\": \"@jerome-benoit/sap-ai-provider-v2\",\n    \"name\": \"SAP AI Core\",\n    \"doc\": \"https://help.sap.com/docs/sap-ai-core\",\n    \"models\": {\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"gemini-2.5-flash-lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"gemini-2.5-flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.03,\n          \"input_audio\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"anthropic--claude-3-haiku\": {\n        \"id\": \"anthropic--claude-3-haiku\",\n        \"name\": \"anthropic--claude-3-haiku\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-03-13\",\n        \"last_updated\": \"2024-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.25,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"anthropic--claude-4.6-opus\": {\n        \"id\": \"anthropic--claude-4.6-opus\",\n        \"name\": \"anthropic--claude-4.6-opus\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic--claude-3.5-sonnet\": {\n        \"id\": \"anthropic--claude-3.5-sonnet\",\n        \"name\": \"anthropic--claude-3.5-sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"sonar-deep-research\": {\n        \"id\": \"sonar-deep-research\",\n        \"name\": \"sonar-deep-research\",\n        \"family\": \"sonar-deep-research\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-02-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"reasoning\": 3 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"gpt-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"anthropic--claude-4-sonnet\": {\n        \"id\": \"anthropic--claude-4-sonnet\",\n        \"name\": \"anthropic--claude-4-sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic--claude-3-sonnet\": {\n        \"id\": \"anthropic--claude-3-sonnet\",\n        \"name\": \"anthropic--claude-3-sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-03-04\",\n        \"last_updated\": \"2024-03-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"anthropic--claude-4.5-opus\": {\n        \"id\": \"anthropic--claude-4.5-opus\",\n        \"name\": \"anthropic--claude-4.5-opus\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"gpt-5-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"anthropic--claude-4.5-haiku\": {\n        \"id\": \"anthropic--claude-4.5-haiku\",\n        \"name\": \"anthropic--claude-4.5-haiku\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic--claude-4.6-sonnet\": {\n        \"id\": \"anthropic--claude-4.6-sonnet\",\n        \"name\": \"anthropic--claude-4.6-sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"sonar\": {\n        \"id\": \"sonar\",\n        \"name\": \"sonar\",\n        \"family\": \"sonar\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"gpt-4.1-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"gemini-2.5-pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"sonar-pro\": {\n        \"id\": \"sonar-pro\",\n        \"name\": \"sonar-pro\",\n        \"family\": \"sonar-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic--claude-3.7-sonnet\": {\n        \"id\": \"anthropic--claude-3.7-sonnet\",\n        \"name\": \"anthropic--claude-3.7-sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-31\",\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic--claude-4.5-sonnet\": {\n        \"id\": \"anthropic--claude-4.5-sonnet\",\n        \"name\": \"anthropic--claude-4.5-sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic--claude-4-opus\": {\n        \"id\": \"anthropic--claude-4-opus\",\n        \"name\": \"anthropic--claude-4-opus\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic--claude-3-opus\": {\n        \"id\": \"anthropic--claude-3-opus\",\n        \"name\": \"anthropic--claude-3-opus\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-02-29\",\n        \"last_updated\": \"2024-02-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"gpt-5-nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"gpt-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      }\n    }\n  },\n  \"nvidia\": {\n    \"id\": \"nvidia\",\n    \"env\": [\"NVIDIA_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://integrate.api.nvidia.com/v1\",\n    \"name\": \"Nvidia\",\n    \"doc\": \"https://docs.api.nvidia.com/nim/\",\n    \"models\": {\n      \"qwen/qwq-32b\": {\n        \"id\": \"qwen/qwq-32b\",\n        \"name\": \"Qwq 32b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-05\",\n        \"last_updated\": \"2025-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen/qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3-Next-80B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen/qwen2.5-coder-32b-instruct\": {\n        \"id\": \"qwen/qwen2.5-coder-32b-instruct\",\n        \"name\": \"Qwen2.5 Coder 32b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-06\",\n        \"last_updated\": \"2024-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen/qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3-Next-80B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen/qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen/qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"qwen/qwen3-235b-a22b\": {\n        \"id\": \"qwen/qwen3-235b-a22b\",\n        \"name\": \"Qwen3-235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen/qwen3.5-397b-a17b\": {\n        \"id\": \"qwen/qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5-397B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"qwen/qwen2.5-coder-7b-instruct\": {\n        \"id\": \"qwen/qwen2.5-coder-7b-instruct\",\n        \"name\": \"Qwen2.5 Coder 7b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-17\",\n        \"last_updated\": \"2024-09-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama3-70b-instruct\": {\n        \"id\": \"meta/llama3-70b-instruct\",\n        \"name\": \"Llama3 70b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-17\",\n        \"last_updated\": \"2024-04-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/codellama-70b\": {\n        \"id\": \"meta/codellama-70b\",\n        \"name\": \"Codellama 70b\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-29\",\n        \"last_updated\": \"2024-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-3.2-11b-vision-instruct\": {\n        \"id\": \"meta/llama-3.2-11b-vision-instruct\",\n        \"name\": \"Llama 3.2 11b Vision Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2024-09-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"meta/llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout 17b 16e Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-02\",\n        \"release_date\": \"2025-04-02\",\n        \"last_updated\": \"2025-04-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-4-maverick-17b-128e-instruct\": {\n        \"id\": \"meta/llama-4-maverick-17b-128e-instruct\",\n        \"name\": \"Llama 4 Maverick 17b 128e Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-02\",\n        \"release_date\": \"2025-04-01\",\n        \"last_updated\": \"2025-04-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-3.3-70b-instruct\": {\n        \"id\": \"meta/llama-3.3-70b-instruct\",\n        \"name\": \"Llama 3.3 70b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-26\",\n        \"last_updated\": \"2024-11-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama3-8b-instruct\": {\n        \"id\": \"meta/llama3-8b-instruct\",\n        \"name\": \"Llama3 8b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-17\",\n        \"last_updated\": \"2024-04-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-3.2-1b-instruct\": {\n        \"id\": \"meta/llama-3.2-1b-instruct\",\n        \"name\": \"Llama 3.2 1b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2024-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-3.1-405b-instruct\": {\n        \"id\": \"meta/llama-3.1-405b-instruct\",\n        \"name\": \"Llama 3.1 405b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-16\",\n        \"last_updated\": \"2024-07-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-3.1-70b-instruct\": {\n        \"id\": \"meta/llama-3.1-70b-instruct\",\n        \"name\": \"Llama 3.1 70b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-16\",\n        \"last_updated\": \"2024-07-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"black-forest-labs/flux.1-dev\": {\n        \"id\": \"black-forest-labs/flux.1-dev\",\n        \"name\": \"FLUX.1-dev\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 4096, \"output\": 0 }\n      },\n      \"nvidia/llama-3.3-nemotron-super-49b-v1.5\": {\n        \"id\": \"nvidia/llama-3.3-nemotron-super-49b-v1.5\",\n        \"name\": \"Llama 3.3 Nemotron Super 49b V1.5\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-16\",\n        \"last_updated\": \"2025-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia/nemotron-4-340b-instruct\": {\n        \"id\": \"nvidia/nemotron-4-340b-instruct\",\n        \"name\": \"Nemotron 4 340b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-13\",\n        \"last_updated\": \"2024-06-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia/nemoretriever-ocr-v1\": {\n        \"id\": \"nvidia/nemoretriever-ocr-v1\",\n        \"name\": \"NeMo Retriever OCR v1\",\n        \"family\": \"nemoretriever\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 0, \"output\": 4096 }\n      },\n      \"nvidia/llama-3.3-nemotron-super-49b-v1\": {\n        \"id\": \"nvidia/llama-3.3-nemotron-super-49b-v1\",\n        \"name\": \"Llama 3.3 Nemotron Super 49b V1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-16\",\n        \"last_updated\": \"2025-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia/llama-3.1-nemotron-51b-instruct\": {\n        \"id\": \"nvidia/llama-3.1-nemotron-51b-instruct\",\n        \"name\": \"Llama 3.1 Nemotron 51b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-22\",\n        \"last_updated\": \"2024-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia/parakeet-tdt-0.6b-v2\": {\n        \"id\": \"nvidia/parakeet-tdt-0.6b-v2\",\n        \"name\": \"Parakeet TDT 0.6B v2\",\n        \"family\": \"parakeet\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 0, \"output\": 4096 }\n      },\n      \"nvidia/nemotron-3-super-120b-a12b\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b\",\n        \"name\": \"Nemotron 3 Super\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n        \"id\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n        \"name\": \"nvidia-nemotron-nano-9b-v2\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-08-18\",\n        \"last_updated\": \"2025-08-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nvidia/llama3-chatqa-1.5-70b\": {\n        \"id\": \"nvidia/llama3-chatqa-1.5-70b\",\n        \"name\": \"Llama3 Chatqa 1.5 70b\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-28\",\n        \"last_updated\": \"2024-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia/cosmos-nemotron-34b\": {\n        \"id\": \"nvidia/cosmos-nemotron-34b\",\n        \"name\": \"Cosmos Nemotron 34B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"nvidia/llama-3.1-nemotron-70b-instruct\": {\n        \"id\": \"nvidia/llama-3.1-nemotron-70b-instruct\",\n        \"name\": \"Llama 3.1 Nemotron 70b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-12\",\n        \"last_updated\": \"2024-10-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia/llama-embed-nemotron-8b\": {\n        \"id\": \"nvidia/llama-embed-nemotron-8b\",\n        \"name\": \"Llama Embed Nemotron 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-03-18\",\n        \"last_updated\": \"2025-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"nvidia/llama-3.1-nemotron-ultra-253b-v1\": {\n        \"id\": \"nvidia/llama-3.1-nemotron-ultra-253b-v1\",\n        \"name\": \"Llama-3.1-Nemotron-Ultra-253B-v1\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"nvidia/nemotron-3-nano-30b-a3b\": {\n        \"id\": \"nvidia/nemotron-3-nano-30b-a3b\",\n        \"name\": \"nemotron-3-nano-30b-a3b\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-12\",\n        \"last_updated\": \"2024-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11\",\n        \"last_updated\": \"2025-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2-instruct\": {\n        \"id\": \"moonshotai/kimi-k2-instruct\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"moonshotai/kimi-k2-instruct-0905\": {\n        \"id\": \"moonshotai/kimi-k2-instruct-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/devstral-2-123b-instruct-2512\": {\n        \"id\": \"mistralai/devstral-2-123b-instruct-2512\",\n        \"name\": \"Devstral-2-123B-Instruct-2512\",\n        \"family\": \"devstral\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/ministral-14b-instruct-2512\": {\n        \"id\": \"mistralai/ministral-14b-instruct-2512\",\n        \"name\": \"Ministral 3 14B Instruct 2512\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/mistral-large-3-675b-instruct-2512\": {\n        \"id\": \"mistralai/mistral-large-3-675b-instruct-2512\",\n        \"name\": \"Mistral Large 3 675B Instruct 2512\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/mamba-codestral-7b-v0.1\": {\n        \"id\": \"mistralai/mamba-codestral-7b-v0.1\",\n        \"name\": \"Mamba Codestral 7b V0.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-16\",\n        \"last_updated\": \"2024-07-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistralai/codestral-22b-instruct-v0.1\": {\n        \"id\": \"mistralai/codestral-22b-instruct-v0.1\",\n        \"name\": \"Codestral 22b Instruct V0.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-05-29\",\n        \"last_updated\": \"2024-05-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistralai/mistral-small-3.1-24b-instruct-2503\": {\n        \"id\": \"mistralai/mistral-small-3.1-24b-instruct-2503\",\n        \"name\": \"Mistral Small 3.1 24b Instruct 2503\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-11\",\n        \"last_updated\": \"2025-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistralai/mistral-large-2-instruct\": {\n        \"id\": \"mistralai/mistral-large-2-instruct\",\n        \"name\": \"Mistral Large 2 Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-24\",\n        \"last_updated\": \"2024-07-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"minimaxai/minimax-m2.5\": {\n        \"id\": \"minimaxai/minimax-m2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimaxai/minimax-m2.1\": {\n        \"id\": \"minimaxai/minimax-m2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimaxai/minimax-m2.7\": {\n        \"id\": \"minimaxai/minimax-m2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"microsoft/phi-4-mini-instruct\": {\n        \"id\": \"microsoft/phi-4-mini-instruct\",\n        \"name\": \"Phi-4-Mini\",\n        \"family\": \"phi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"microsoft/phi-3-small-8k-instruct\": {\n        \"id\": \"microsoft/phi-3-small-8k-instruct\",\n        \"name\": \"Phi 3 Small 8k Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-05-07\",\n        \"last_updated\": \"2024-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-medium-4k-instruct\": {\n        \"id\": \"microsoft/phi-3-medium-4k-instruct\",\n        \"name\": \"Phi 3 Medium 4k Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-05-07\",\n        \"last_updated\": \"2024-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 4000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3.5-vision-instruct\": {\n        \"id\": \"microsoft/phi-3.5-vision-instruct\",\n        \"name\": \"Phi 3.5 Vision Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-16\",\n        \"last_updated\": \"2024-08-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3.5-moe-instruct\": {\n        \"id\": \"microsoft/phi-3.5-moe-instruct\",\n        \"name\": \"Phi 3.5 Moe Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-17\",\n        \"last_updated\": \"2024-08-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-vision-128k-instruct\": {\n        \"id\": \"microsoft/phi-3-vision-128k-instruct\",\n        \"name\": \"Phi 3 Vision 128k Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-05-19\",\n        \"last_updated\": \"2024-05-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-small-128k-instruct\": {\n        \"id\": \"microsoft/phi-3-small-128k-instruct\",\n        \"name\": \"Phi 3 Small 128k Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-05-07\",\n        \"last_updated\": \"2024-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-medium-128k-instruct\": {\n        \"id\": \"microsoft/phi-3-medium-128k-instruct\",\n        \"name\": \"Phi 3 Medium 128k Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-05-07\",\n        \"last_updated\": \"2024-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"deepseek-ai/deepseek-v3.2\": {\n        \"id\": \"deepseek-ai/deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/deepseek-coder-6.7b-instruct\": {\n        \"id\": \"deepseek-ai/deepseek-coder-6.7b-instruct\",\n        \"name\": \"Deepseek Coder 6.7b Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-10-29\",\n        \"last_updated\": \"2023-10-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"deepseek-ai/deepseek-r1-0528\": {\n        \"id\": \"deepseek-ai/deepseek-r1-0528\",\n        \"name\": \"Deepseek R1 0528\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"deepseek-ai/deepseek-v3.1\": {\n        \"id\": \"deepseek-ai/deepseek-v3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-08-20\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"deepseek-ai/deepseek-v3.1-terminus\": {\n        \"id\": \"deepseek-ai/deepseek-v3.1-terminus\",\n        \"name\": \"DeepSeek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"deepseek-ai/deepseek-r1\": {\n        \"id\": \"deepseek-ai/deepseek-r1\",\n        \"name\": \"Deepseek R1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"stepfun-ai/step-3.5-flash\": {\n        \"id\": \"stepfun-ai/step-3.5-flash\",\n        \"name\": \"Step 3.5 Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-02-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"z-ai/glm5\": {\n        \"id\": \"z-ai/glm5\",\n        \"name\": \"GLM5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 131000 }\n      },\n      \"z-ai/glm4.7\": {\n        \"id\": \"z-ai/glm4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"z-ai/glm-5.1\": {\n        \"id\": \"z-ai/glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT-OSS-120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-04\",\n        \"last_updated\": \"2025-08-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/whisper-large-v3\": {\n        \"id\": \"openai/whisper-large-v3\",\n        \"name\": \"Whisper Large v3\",\n        \"family\": \"whisper\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2023-09-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 0, \"output\": 4096 }\n      },\n      \"google/gemma-4-31b-it\": {\n        \"id\": \"google/gemma-4-31b-it\",\n        \"name\": \"Gemma-4-31B-IT\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"google/codegemma-7b\": {\n        \"id\": \"google/codegemma-7b\",\n        \"name\": \"Codegemma 7b\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-03-21\",\n        \"last_updated\": \"2024-03-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"google/gemma-3-1b-it\": {\n        \"id\": \"google/gemma-3-1b-it\",\n        \"name\": \"Gemma 3 1b It\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"google/gemma-2-2b-it\": {\n        \"id\": \"google/gemma-2-2b-it\",\n        \"name\": \"Gemma 2 2b It\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-16\",\n        \"last_updated\": \"2024-07-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"google/gemma-3-12b-it\": {\n        \"id\": \"google/gemma-3-12b-it\",\n        \"name\": \"Gemma 3 12b It\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"google/gemma-3n-e2b-it\": {\n        \"id\": \"google/gemma-3n-e2b-it\",\n        \"name\": \"Gemma 3n E2b It\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-06-12\",\n        \"last_updated\": \"2025-06-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"google/gemma-2-27b-it\": {\n        \"id\": \"google/gemma-2-27b-it\",\n        \"name\": \"Gemma 2 27b It\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-24\",\n        \"last_updated\": \"2024-06-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"google/gemma-3-27b-it\": {\n        \"id\": \"google/gemma-3-27b-it\",\n        \"name\": \"Gemma-3-27B-IT\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"google/gemma-3n-e4b-it\": {\n        \"id\": \"google/gemma-3n-e4b-it\",\n        \"name\": \"Gemma 3n E4b It\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-06-03\",\n        \"last_updated\": \"2025-06-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"google/codegemma-1.1-7b\": {\n        \"id\": \"google/codegemma-1.1-7b\",\n        \"name\": \"Codegemma 1.1 7b\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-30\",\n        \"last_updated\": \"2024-04-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"deepseek-ai/deepseek-v4-pro\": {\n        \"id\": \"deepseek-ai/deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1048576, \"output\": 393216 }\n      },\n      \"deepseek-ai/deepseek-v4-flash\": {\n        \"id\": \"deepseek-ai/deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1048576, \"output\": 393216 }\n      }\n    }\n  },\n  \"stackit\": {\n    \"id\": \"stackit\",\n    \"env\": [\"STACKIT_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1\",\n    \"name\": \"STACKIT\",\n    \"doc\": \"https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models\",\n    \"models\": {\n      \"cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic\": {\n        \"id\": \"cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic\",\n        \"name\": \"Llama 3.3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.49, \"output\": 0.71 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-VL-235B-A22B-Instruct-FP8\": {\n        \"id\": \"Qwen/Qwen3-VL-235B-A22B-Instruct-FP8\",\n        \"name\": \"Qwen3-VL 235B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.64, \"output\": 1.91 },\n        \"limit\": { \"context\": 218000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-VL-Embedding-8B\": {\n        \"id\": \"Qwen/Qwen3-VL-Embedding-8B\",\n        \"name\": \"Qwen3-VL Embedding 8B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.09 },\n        \"limit\": { \"context\": 32000, \"output\": 4096 }\n      },\n      \"neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8\": {\n        \"id\": \"neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8\",\n        \"name\": \"Llama 3.1 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.16, \"output\": 0.27 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"neuralmagic/Mistral-Nemo-Instruct-2407-FP8\": {\n        \"id\": \"neuralmagic/Mistral-Nemo-Instruct-2407-FP8\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.49, \"output\": 0.71 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT-OSS 120B\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.49, \"output\": 0.71 },\n        \"limit\": { \"context\": 131000, \"output\": 8192 }\n      },\n      \"intfloat/e5-mistral-7b-instruct\": {\n        \"id\": \"intfloat/e5-mistral-7b-instruct\",\n        \"name\": \"E5 Mistral 7B\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-12-11\",\n        \"last_updated\": \"2023-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.02 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"google/gemma-3-27b-it\": {\n        \"id\": \"google/gemma-3-27b-it\",\n        \"name\": \"Gemma 3 27B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-17\",\n        \"last_updated\": \"2025-05-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.49, \"output\": 0.71 },\n        \"limit\": { \"context\": 37000, \"output\": 8192 }\n      }\n    }\n  },\n  \"nebius\": {\n    \"id\": \"nebius\",\n    \"env\": [\"NEBIUS_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.tokenfactory.nebius.com/v1\",\n    \"name\": \"Nebius Token Factory\",\n    \"doc\": \"https://docs.tokenfactory.nebius.com/\",\n    \"models\": {\n      \"NousResearch/Hermes-4-405B\": {\n        \"id\": \"NousResearch/Hermes-4-405B\",\n        \"name\": \"Hermes-4-405B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2026-01-30\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3,\n          \"reasoning\": 3,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"NousResearch/Hermes-4-70B\": {\n        \"id\": \"NousResearch/Hermes-4-70B\",\n        \"name\": \"Hermes-4-70B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2026-01-30\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.13,\n          \"output\": 0.4,\n          \"reasoning\": 0.4,\n          \"cache_read\": 0.013,\n          \"cache_write\": 0.16\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-12-05\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.13,\n          \"output\": 0.4,\n          \"cache_read\": 0.013,\n          \"cache_write\": 0.16\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"meta-llama/Llama-Guard-3-8B\": {\n        \"id\": \"meta-llama/Llama-Guard-3-8B\",\n        \"name\": \"Llama-Guard-3-8B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.02,\n          \"output\": 0.06,\n          \"cache_read\": 0.002,\n          \"cache_write\": 0.025\n        },\n        \"limit\": { \"context\": 8192, \"input\": 8000, \"output\": 1024 }\n      },\n      \"meta-llama/Llama-3.3-70B-Instruct-fast\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct-fast\",\n        \"name\": \"Llama-3.3-70B-Instruct (Fast)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-12-05\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 0.75,\n          \"cache_read\": 0.025,\n          \"cache_write\": 0.31\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"meta-llama/Meta-Llama-3.1-8B-Instruct\": {\n        \"id\": \"meta-llama/Meta-Llama-3.1-8B-Instruct\",\n        \"name\": \"Meta-Llama-3.1-8B-Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.02,\n          \"output\": 0.06,\n          \"cache_read\": 0.002,\n          \"cache_write\": 0.025\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 4096 }\n      },\n      \"meta-llama/Meta-Llama-3.1-8B-Instruct-fast\": {\n        \"id\": \"meta-llama/Meta-Llama-3.1-8B-Instruct-fast\",\n        \"name\": \"Meta-Llama-3.1-8B-Instruct (Fast)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.03,\n          \"output\": 0.09,\n          \"cache_read\": 0.003,\n          \"cache_write\": 0.03\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 4096 }\n      },\n      \"black-forest-labs/flux-dev\": {\n        \"id\": \"black-forest-labs/flux-dev\",\n        \"name\": \"FLUX.1-dev\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 77, \"input\": 77, \"output\": 0 }\n      },\n      \"black-forest-labs/flux-schnell\": {\n        \"id\": \"black-forest-labs/flux-schnell\",\n        \"name\": \"FLUX.1-schnell\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 77, \"input\": 77, \"output\": 0 }\n      },\n      \"nvidia/Nemotron-Nano-V2-12b\": {\n        \"id\": \"nvidia/Nemotron-Nano-V2-12b\",\n        \"name\": \"Nemotron-Nano-V2-12b\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.07,\n          \"output\": 0.2,\n          \"cache_read\": 0.007,\n          \"cache_write\": 0.08\n        },\n        \"limit\": { \"context\": 32000, \"input\": 30000, \"output\": 4096 }\n      },\n      \"nvidia/nemotron-3-super-120b-a12b\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b\",\n        \"name\": \"Nemotron-3-Super-120B-A12B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B\": {\n        \"id\": \"nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B\",\n        \"name\": \"Nemotron-3-Nano-30B-A3B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-08-10\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.06,\n          \"output\": 0.24,\n          \"cache_read\": 0.006,\n          \"cache_write\": 0.075\n        },\n        \"limit\": { \"context\": 32000, \"input\": 30000, \"output\": 4096 }\n      },\n      \"nvidia/Llama-3_1-Nemotron-Ultra-253B-v1\": {\n        \"id\": \"nvidia/Llama-3_1-Nemotron-Ultra-253B-v1\",\n        \"name\": \"Llama-3.1-Nemotron-Ultra-253B-v1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 1.8,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.75\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 4096 }\n      },\n      \"moonshotai/Kimi-K2.5-fast\": {\n        \"id\": \"moonshotai/Kimi-K2.5-fast\",\n        \"name\": \"Kimi-K2.5-fast\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 2.5,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.625\n        },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 8192 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi-K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 2.5,\n          \"reasoning\": 2.5,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.625\n        },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 8192 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Kimi-K2-Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2026-01-05\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.5,\n          \"reasoning\": 2.5,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.75\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 16384 }\n      },\n      \"moonshotai/Kimi-K2-Instruct\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct\",\n        \"name\": \"Kimi-K2-Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2026-01-05\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 2.4,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.625\n        },\n        \"limit\": { \"context\": 200000, \"input\": 190000, \"output\": 8192 }\n      },\n      \"BAAI/bge-en-icl\": {\n        \"id\": \"BAAI/bge-en-icl\",\n        \"name\": \"BGE-ICL\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-07-30\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 0 }\n      },\n      \"BAAI/bge-multilingual-gemma2\": {\n        \"id\": \"BAAI/bge-multilingual-gemma2\",\n        \"name\": \"bge-multilingual-gemma2\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-07-30\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 0 }\n      },\n      \"Qwen/Qwen3-32B-fast\": {\n        \"id\": \"Qwen/Qwen3-32B-fast\",\n        \"name\": \"Qwen3-32B (Fast)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 0.6,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.25\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-Embedding-8B\": {\n        \"id\": \"Qwen/Qwen3-Embedding-8B\",\n        \"name\": \"Qwen3-Embedding-8B\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2026-01-10\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 0 }\n      },\n      \"Qwen/Qwen2.5-Coder-7B-fast\": {\n        \"id\": \"Qwen/Qwen2.5-Coder-7B-fast\",\n        \"name\": \"Qwen2.5-Coder-7B (Fast)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-09-19\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.03,\n          \"output\": 0.09,\n          \"cache_read\": 0.003,\n          \"cache_write\": 0.03\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen2.5-VL-72B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-72B-Instruct\",\n        \"name\": \"Qwen2.5-VL-72B-Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 0.75,\n          \"cache_read\": 0.025,\n          \"cache_write\": 0.31\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-10-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-10-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.8 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"name\": \"Qwen3-30B-A3B-Instruct-2507\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.3,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.125\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Thinking\",\n        \"name\": \"Qwen3-Next-80B-A3B-Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.15,\n          \"output\": 1.2,\n          \"reasoning\": 1.2,\n          \"cache_read\": 0.015,\n          \"cache_write\": 0.18\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 16384 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-10-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-32B\": {\n        \"id\": \"Qwen/Qwen3-32B\",\n        \"name\": \"Qwen3-32B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.3,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.125\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Thinking-2507\",\n        \"name\": \"Qwen3-30B-A3B-Thinking-2507\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.3,\n          \"reasoning\": 0.3,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.125\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 16384 }\n      },\n      \"Qwen/Qwen3-Coder-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-30B-A3B-Instruct\",\n        \"name\": \"Qwen3-Coder-30B-A3B-Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.3,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.125\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"PrimeIntellect/INTELLECT-3\": {\n        \"id\": \"PrimeIntellect/INTELLECT-3\",\n        \"name\": \"INTELLECT-3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2026-01-25\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 1.1,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.25\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.45,\n          \"reasoning\": 0.45,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 163000, \"input\": 160000, \"output\": 16384 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek-R1-0528\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2026-01-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 2.4,\n          \"reasoning\": 2.4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 32768 }\n      },\n      \"deepseek-ai/DeepSeek-V3-0324\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3-0324\",\n        \"name\": \"DeepSeek-V3-0324\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 1.5,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.1875\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528-fast\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528-fast\",\n        \"name\": \"DeepSeek R1 0528 Fast\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"deepseek-ai/DeepSeek-V3-0324-fast\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3-0324-fast\",\n        \"name\": \"DeepSeek-V3-0324 (Fast)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.75,\n          \"output\": 2.25,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.28125\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"zai-org/GLM-4.5\": {\n        \"id\": \"zai-org/GLM-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.75\n        },\n        \"limit\": { \"context\": 128000, \"input\": 124000, \"output\": 4096 }\n      },\n      \"zai-org/GLM-4.7-FP8\": {\n        \"id\": \"zai-org/GLM-4.7-FP8\",\n        \"name\": \"GLM-4.7 (FP8)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.4,\n          \"output\": 2,\n          \"cache_read\": 0.04,\n          \"cache_write\": 0.5\n        },\n        \"limit\": { \"context\": 128000, \"input\": 124000, \"output\": 4096 }\n      },\n      \"zai-org/GLM-4.5-Air\": {\n        \"id\": \"zai-org/GLM-4.5-Air\",\n        \"name\": \"GLM-4.5-Air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-15\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 1.2,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.25\n        },\n        \"limit\": { \"context\": 128000, \"input\": 124000, \"output\": 4096 }\n      },\n      \"zai-org/GLM-5\": {\n        \"id\": \"zai-org/GLM-5\",\n        \"name\": \"GLM-5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-03-01\",\n        \"last_updated\": \"2026-03-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3.2,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 16384 }\n      },\n      \"MiniMaxAI/MiniMax-M2.1\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"reasoning\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 128000, \"input\": 120000, \"output\": 8192 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"gpt-oss-120b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2026-01-10\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.15,\n          \"output\": 0.6,\n          \"reasoning\": 0.6,\n          \"cache_read\": 0.015,\n          \"cache_write\": 0.18\n        },\n        \"limit\": { \"context\": 128000, \"input\": 124000, \"output\": 8192 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"gpt-oss-20b\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2026-01-10\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.05,\n          \"output\": 0.2,\n          \"cache_read\": 0.005,\n          \"cache_write\": 0.06\n        },\n        \"limit\": { \"context\": 128000, \"input\": 124000, \"output\": 4096 }\n      },\n      \"intfloat/e5-mistral-7b-instruct\": {\n        \"id\": \"intfloat/e5-mistral-7b-instruct\",\n        \"name\": \"e5-mistral-7b-instruct\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 0 }\n      },\n      \"google/gemma-2-9b-it-fast\": {\n        \"id\": \"google/gemma-2-9b-it-fast\",\n        \"name\": \"Gemma-2-9b-it (Fast)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-27\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.03,\n          \"output\": 0.09,\n          \"cache_read\": 0.003,\n          \"cache_write\": 0.0375\n        },\n        \"limit\": { \"context\": 8192, \"input\": 8000, \"output\": 4096 }\n      },\n      \"google/gemma-2-2b-it\": {\n        \"id\": \"google/gemma-2-2b-it\",\n        \"name\": \"Gemma-2-2b-it\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-07-31\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.02,\n          \"output\": 0.06,\n          \"cache_read\": 0.002,\n          \"cache_write\": 0.025\n        },\n        \"limit\": { \"context\": 8192, \"input\": 8000, \"output\": 4096 }\n      },\n      \"google/gemma-3-27b-it-fast\": {\n        \"id\": \"google/gemma-3-27b-it-fast\",\n        \"name\": \"Gemma-3-27b-it (Fast)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 0.6,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.25\n        },\n        \"limit\": { \"context\": 110000, \"input\": 100000, \"output\": 8192 }\n      },\n      \"google/gemma-3-27b-it\": {\n        \"id\": \"google/gemma-3-27b-it\",\n        \"name\": \"Gemma-3-27b-it\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.3,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.125\n        },\n        \"limit\": { \"context\": 110000, \"input\": 100000, \"output\": 8192 }\n      }\n    }\n  },\n  \"novita-ai\": {\n    \"id\": \"novita-ai\",\n    \"env\": [\"NOVITA_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.novita.ai/openai\",\n    \"name\": \"NovitaAI\",\n    \"doc\": \"https://novita.ai/docs/guides/introduction\",\n    \"models\": {\n      \"qwen/qwen3.5-27b\": {\n        \"id\": \"qwen/qwen3.5-27b\",\n        \"name\": \"Qwen3.5-27B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2.4 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen/qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen3 235B A22b Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-vl-235b-a22b-instruct\": {\n        \"id\": \"qwen/qwen3-vl-235b-a22b-instruct\",\n        \"name\": \"Qwen3 VL 235B A22B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3 Next 80B A3B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-10\",\n        \"last_updated\": \"2025-09-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 1.5 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-vl-8b-instruct\": {\n        \"id\": \"qwen/qwen3-vl-8b-instruct\",\n        \"name\": \"qwen/qwen3-vl-8b-instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-17\",\n        \"last_updated\": \"2025-10-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-vl-235b-a22b-thinking\": {\n        \"id\": \"qwen/qwen3-vl-235b-a22b-thinking\",\n        \"name\": \"Qwen3 VL 235B A22B Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.98, \"output\": 3.95 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-235b-a22b-fp8\": {\n        \"id\": \"qwen/qwen3-235b-a22b-fp8\",\n        \"name\": \"Qwen3 235B A22B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 40960, \"output\": 20000 }\n      },\n      \"qwen/qwen3-omni-30b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-omni-30b-a3b-thinking\",\n        \"name\": \"Qwen3 Omni 30B A3B Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": {\n          \"input\": [\"text\", \"audio\", \"video\", \"image\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 0.97,\n          \"input_audio\": 2.2,\n          \"output_audio\": 1.788\n        },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"qwen/qwen3-vl-30b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-vl-30b-a3b-instruct\",\n        \"name\": \"qwen/qwen3-vl-30b-a3b-instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-11\",\n        \"last_updated\": \"2025-10-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"video\", \"image\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.7 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen2.5-7b-instruct\": {\n        \"id\": \"qwen/qwen2.5-7b-instruct\",\n        \"name\": \"Qwen2.5 7B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.07 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"qwen/qwen3-max\": {\n        \"id\": \"qwen/qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.11, \"output\": 8.45 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3.5-35b-a3b\": {\n        \"id\": \"qwen/qwen3.5-35b-a3b\",\n        \"name\": \"Qwen3.5-35B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen2.5-vl-72b-instruct\": {\n        \"id\": \"qwen/qwen2.5-vl-72b-instruct\",\n        \"name\": \"Qwen2.5 VL 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 0.8 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"qwen/qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3 Coder 30b A3B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-09\",\n        \"last_updated\": \"2025-10-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.27 },\n        \"limit\": { \"context\": 160000, \"output\": 32768 }\n      },\n      \"qwen/qwen3.5-122b-a10b\": {\n        \"id\": \"qwen/qwen3.5-122b-a10b\",\n        \"name\": \"Qwen3.5-122B-A10B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 3.2 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-4b-fp8\": {\n        \"id\": \"qwen/qwen3-4b-fp8\",\n        \"name\": \"Qwen3 4B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.03 },\n        \"limit\": { \"context\": 128000, \"output\": 20000 }\n      },\n      \"qwen/qwen3-30b-a3b-fp8\": {\n        \"id\": \"qwen/qwen3-30b-a3b-fp8\",\n        \"name\": \"Qwen3 30B A3B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.45 },\n        \"limit\": { \"context\": 40960, \"output\": 20000 }\n      },\n      \"qwen/qwen3-vl-30b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-vl-30b-a3b-thinking\",\n        \"name\": \"qwen/qwen3-vl-30b-a3b-thinking\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-11\",\n        \"last_updated\": \"2025-10-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3 Next 80B A3B Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-10\",\n        \"last_updated\": \"2025-09-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 1.5 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen/qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2025-07-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.58 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"qwen/qwen3-32b-fp8\": {\n        \"id\": \"qwen/qwen3-32b-fp8\",\n        \"name\": \"Qwen3 32B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.45 },\n        \"limit\": { \"context\": 40960, \"output\": 20000 }\n      },\n      \"qwen/qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen/qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.3 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen-2.5-72b-instruct\": {\n        \"id\": \"qwen/qwen-2.5-72b-instruct\",\n        \"name\": \"Qwen 2.5 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-10-15\",\n        \"last_updated\": \"2024-10-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.38, \"output\": 0.4 },\n        \"limit\": { \"context\": 32000, \"output\": 8192 }\n      },\n      \"qwen/qwen3.5-397b-a17b\": {\n        \"id\": \"qwen/qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5-397B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 64000 }\n      },\n      \"qwen/qwen3-coder-next\": {\n        \"id\": \"qwen/qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-03\",\n        \"last_updated\": \"2026-02-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3.6-27b\": {\n        \"id\": \"qwen/qwen3.6-27b\",\n        \"name\": \"Qwen3.6-27B\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-8b-fp8\": {\n        \"id\": \"qwen/qwen3-8b-fp8\",\n        \"name\": \"Qwen3 8B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.035, \"output\": 0.138 },\n        \"limit\": { \"context\": 128000, \"output\": 20000 }\n      },\n      \"qwen/qwen3-omni-30b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-omni-30b-a3b-instruct\",\n        \"name\": \"Qwen3 Omni 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": {\n          \"input\": [\"text\", \"video\", \"audio\", \"image\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 0.97,\n          \"input_audio\": 2.2,\n          \"output_audio\": 1.788\n        },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"qwen/qwen-mt-plus\": {\n        \"id\": \"qwen/qwen-mt-plus\",\n        \"name\": \"Qwen MT Plus\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-03\",\n        \"last_updated\": \"2025-09-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75 },\n        \"limit\": { \"context\": 16384, \"output\": 8192 }\n      },\n      \"meta-llama/llama-3-70b-instruct\": {\n        \"id\": \"meta-llama/llama-3-70b-instruct\",\n        \"name\": \"Llama3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-25\",\n        \"last_updated\": \"2024-04-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.51, \"output\": 0.74 },\n        \"limit\": { \"context\": 8192, \"output\": 8000 }\n      },\n      \"meta-llama/llama-3.1-8b-instruct\": {\n        \"id\": \"meta-llama/llama-3.1-8b-instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-24\",\n        \"last_updated\": \"2024-07-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.05 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"meta-llama/llama-3.2-3b-instruct\": {\n        \"id\": \"meta-llama/llama-3.2-3b-instruct\",\n        \"name\": \"Llama 3.2 3B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2024-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.05 },\n        \"limit\": { \"context\": 32768, \"output\": 32000 }\n      },\n      \"meta-llama/llama-3-8b-instruct\": {\n        \"id\": \"meta-llama/llama-3-8b-instruct\",\n        \"name\": \"Llama 3 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-25\",\n        \"last_updated\": \"2024-04-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"meta-llama/llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"meta-llama/llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-06\",\n        \"last_updated\": \"2025-04-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.18, \"output\": 0.59 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"meta-llama/llama-4-maverick-17b-128e-instruct-fp8\": {\n        \"id\": \"meta-llama/llama-4-maverick-17b-128e-instruct-fp8\",\n        \"name\": \"Llama 4 Maverick Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-06\",\n        \"last_updated\": \"2025-04-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.85 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"meta-llama/llama-3.3-70b-instruct\": {\n        \"id\": \"meta-llama/llama-3.3-70b-instruct\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-07\",\n        \"last_updated\": \"2024-12-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.135, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 120000 }\n      },\n      \"gryphe/mythomax-l2-13b\": {\n        \"id\": \"gryphe/mythomax-l2-13b\",\n        \"name\": \"Mythomax L2 13B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-25\",\n        \"last_updated\": \"2024-04-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.09 },\n        \"limit\": { \"context\": 4096, \"output\": 3200 }\n      },\n      \"sao10k/L3-8B-Stheno-v3.2\": {\n        \"id\": \"sao10k/L3-8B-Stheno-v3.2\",\n        \"name\": \"L3 8B Stheno V3.2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-29\",\n        \"last_updated\": \"2024-11-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.05 },\n        \"limit\": { \"context\": 8192, \"output\": 32000 }\n      },\n      \"sao10k/l3-70b-euryale-v2.1\": {\n        \"id\": \"sao10k/l3-70b-euryale-v2.1\",\n        \"name\": \"L3 70B Euryale V2.1\\t\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-18\",\n        \"last_updated\": \"2024-06-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.48, \"output\": 1.48 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"sao10k/l31-70b-euryale-v2.2\": {\n        \"id\": \"sao10k/l31-70b-euryale-v2.2\",\n        \"name\": \"L31 70B Euryale V2.2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-19\",\n        \"last_updated\": \"2024-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.48, \"output\": 1.48 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"sao10k/l3-8b-lunaris\": {\n        \"id\": \"sao10k/l3-8b-lunaris\",\n        \"name\": \"Sao10k L3 8B Lunaris\\t\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-28\",\n        \"last_updated\": \"2024-11-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.05 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-07\",\n        \"last_updated\": \"2025-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2-instruct\": {\n        \"id\": \"moonshotai/kimi-k2-instruct\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.57, \"output\": 2.3 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"moonshotai/kimi-k2-0905\": {\n        \"id\": \"moonshotai/kimi-k2-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2.6\": {\n        \"id\": \"moonshotai/kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/mistral-nemo\": {\n        \"id\": \"mistralai/mistral-nemo\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-30\",\n        \"last_updated\": \"2024-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.17 },\n        \"limit\": { \"context\": 60288, \"output\": 16000 }\n      },\n      \"kwaipilot/kat-coder-pro\": {\n        \"id\": \"kwaipilot/kat-coder-pro\",\n        \"name\": \"Kat Coder Pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-05\",\n        \"last_updated\": \"2026-01-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"paddlepaddle/paddleocr-vl\": {\n        \"id\": \"paddlepaddle/paddleocr-vl\",\n        \"name\": \"PaddleOCR-VL\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-22\",\n        \"last_updated\": \"2025-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.02 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"nousresearch/hermes-2-pro-llama-3-8b\": {\n        \"id\": \"nousresearch/hermes-2-pro-llama-3-8b\",\n        \"name\": \"Hermes 2 Pro Llama 3 8B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-27\",\n        \"last_updated\": \"2024-06-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.14 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"xiaomimimo/mimo-v2-flash\": {\n        \"id\": \"xiaomimimo/mimo-v2-flash\",\n        \"name\": \"XiaomiMiMo/MiMo-V2-Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-19\",\n        \"last_updated\": \"2025-12-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 32000 }\n      },\n      \"baichuan/baichuan-m2-32b\": {\n        \"id\": \"baichuan/baichuan-m2-32b\",\n        \"name\": \"baichuan-m2-32b\",\n        \"family\": \"baichuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.07 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"deepseek/deepseek-v3.2\": {\n        \"id\": \"deepseek/deepseek-v3.2\",\n        \"name\": \"Deepseek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.269, \"output\": 0.4, \"cache_read\": 0.1345 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-ocr-2\": {\n        \"id\": \"deepseek/deepseek-ocr-2\",\n        \"name\": \"deepseek/deepseek-ocr-2\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.03 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-v3-0324\": {\n        \"id\": \"deepseek/deepseek-v3-0324\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1.12, \"cache_read\": 0.135 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek/deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek/deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill LLama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-27\",\n        \"last_updated\": \"2025-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 0.8 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-r1-distill-qwen-14b\": {\n        \"id\": \"deepseek/deepseek-r1-distill-qwen-14b\",\n        \"name\": \"DeepSeek R1 Distill Qwen 14B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"deepseek/deepseek-v3-turbo\": {\n        \"id\": \"deepseek/deepseek-v3-turbo\",\n        \"name\": \"DeepSeek V3 (Turbo)\\t\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-05\",\n        \"last_updated\": \"2025-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.3 },\n        \"limit\": { \"context\": 64000, \"output\": 16000 }\n      },\n      \"deepseek/deepseek-r1-turbo\": {\n        \"id\": \"deepseek/deepseek-r1-turbo\",\n        \"name\": \"DeepSeek R1 (Turbo)\\t\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-05\",\n        \"last_updated\": \"2025-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.5 },\n        \"limit\": { \"context\": 64000, \"output\": 16000 }\n      },\n      \"deepseek/deepseek-r1-0528-qwen3-8b\": {\n        \"id\": \"deepseek/deepseek-r1-0528-qwen3-8b\",\n        \"name\": \"DeepSeek R1 0528 Qwen3 8B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-29\",\n        \"last_updated\": \"2025-05-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.09 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-r1-distill-qwen-32b\": {\n        \"id\": \"deepseek/deepseek-r1-distill-qwen-32b\",\n        \"name\": \"DeepSeek R1 Distill Qwen 32B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 64000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-prover-v2-671b\": {\n        \"id\": \"deepseek/deepseek-prover-v2-671b\",\n        \"name\": \"Deepseek Prover V2 671B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-04-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.5 },\n        \"limit\": { \"context\": 160000, \"output\": 160000 }\n      },\n      \"deepseek/deepseek-r1-0528\": {\n        \"id\": \"deepseek/deepseek-r1-0528\",\n        \"name\": \"DeepSeek R1 0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.5, \"cache_read\": 0.35 },\n        \"limit\": { \"context\": 163840, \"output\": 32768 }\n      },\n      \"deepseek/deepseek-v3.2-exp\": {\n        \"id\": \"deepseek/deepseek-v3.2-exp\",\n        \"name\": \"Deepseek V3.2 Exp\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.41 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-ocr\": {\n        \"id\": \"deepseek/deepseek-ocr\",\n        \"name\": \"DeepSeek-OCR\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-24\",\n        \"last_updated\": \"2025-10-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.03 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-v3.1\": {\n        \"id\": \"deepseek/deepseek-v3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1, \"cache_read\": 0.135 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"deepseek/deepseek-v3.1-terminus\": {\n        \"id\": \"deepseek/deepseek-v3.1-terminus\",\n        \"name\": \"Deepseek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1, \"cache_read\": 0.135 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"inclusionai/ling-2.6-1t\": {\n        \"id\": \"inclusionai/ling-2.6-1t\",\n        \"name\": \"Ling-2.6-1T\",\n        \"family\": \"ling\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"minimaxai/minimax-m1-80k\": {\n        \"id\": \"minimaxai/minimax-m1-80k\",\n        \"name\": \"MiniMax M1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 40000 }\n      },\n      \"microsoft/wizardlm-2-8x22b\": {\n        \"id\": \"microsoft/wizardlm-2-8x22b\",\n        \"name\": \"Wizardlm 2 8x22B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-24\",\n        \"last_updated\": \"2024-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.62, \"output\": 0.62 },\n        \"limit\": { \"context\": 65535, \"output\": 8000 }\n      },\n      \"minimax/minimax-m2\": {\n        \"id\": \"minimax/minimax-m2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 204800, \"output\": 131100 }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"Minimax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.7\": {\n        \"id\": \"minimax/minimax-m2.7\",\n        \"name\": \"MiniMax M2.7\",\n        \"family\": \"minimax-m2.7\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.5-highspeed\": {\n        \"id\": \"minimax/minimax-m2.5-highspeed\",\n        \"name\": \"MiniMax M2.5 Highspeed\",\n        \"family\": \"minimax-m2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.4, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 204800, \"output\": 131100 }\n      },\n      \"baidu/ernie-4.5-vl-28b-a3b\": {\n        \"id\": \"baidu/ernie-4.5-vl-28b-a3b\",\n        \"name\": \"ERNIE 4.5 VL 28B A3B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 5.6 },\n        \"limit\": { \"context\": 30000, \"output\": 8000 }\n      },\n      \"baidu/ernie-4.5-vl-28b-a3b-thinking\": {\n        \"id\": \"baidu/ernie-4.5-vl-28b-a3b-thinking\",\n        \"name\": \"ERNIE-4.5-VL-28B-A3B-Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-26\",\n        \"last_updated\": \"2025-11-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.39, \"output\": 0.39 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"baidu/ernie-4.5-21B-a3b\": {\n        \"id\": \"baidu/ernie-4.5-21B-a3b\",\n        \"name\": \"ERNIE 4.5 21B A3B\",\n        \"family\": \"ernie\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 120000, \"output\": 8000 }\n      },\n      \"baidu/ernie-4.5-vl-424b-a47b\": {\n        \"id\": \"baidu/ernie-4.5-vl-424b-a47b\",\n        \"name\": \"ERNIE 4.5 VL 424B A47B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.42, \"output\": 1.25 },\n        \"limit\": { \"context\": 123000, \"output\": 16000 }\n      },\n      \"baidu/ernie-4.5-21B-a3b-thinking\": {\n        \"id\": \"baidu/ernie-4.5-21B-a3b-thinking\",\n        \"name\": \"ERNIE-4.5-21B-A3B-Thinking\",\n        \"family\": \"ernie\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"baidu/ernie-4.5-300b-a47b-paddle\": {\n        \"id\": \"baidu/ernie-4.5-300b-a47b-paddle\",\n        \"name\": \"ERNIE 4.5 300B A47B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.1 },\n        \"limit\": { \"context\": 123000, \"output\": 12000 }\n      },\n      \"zai-org/glm-5\": {\n        \"id\": \"zai-org/glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202800, \"output\": 131072 }\n      },\n      \"zai-org/glm-4.7\": {\n        \"id\": \"zai-org/glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/glm-4.6\": {\n        \"id\": \"zai-org/glm-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.2, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/glm-5.1\": {\n        \"id\": \"zai-org/glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/glm-4.6v\": {\n        \"id\": \"zai-org/glm-4.6v\",\n        \"name\": \"GLM 4.6V\",\n        \"family\": \"glmv\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"video\", \"image\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9, \"cache_read\": 0.055 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"zai-org/glm-4.5-air\": {\n        \"id\": \"zai-org/glm-4.5-air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-10-13\",\n        \"last_updated\": \"2025-10-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.85 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"zai-org/glm-4.5v\": {\n        \"id\": \"zai-org/glm-4.5v\",\n        \"name\": \"GLM 4.5V\",\n        \"family\": \"glmv\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-11\",\n        \"last_updated\": \"2025-08-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"video\", \"image\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"zai-org/glm-4.7-flash\": {\n        \"id\": \"zai-org/glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"zai-org/glm-4.5\": {\n        \"id\": \"zai-org/glm-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"zai-org/autoglm-phone-9b-multilingual\": {\n        \"id\": \"zai-org/autoglm-phone-9b-multilingual\",\n        \"name\": \"AutoGLM-Phone-9B-Multilingual\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-10\",\n        \"last_updated\": \"2025-12-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.035, \"output\": 0.138 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"OpenAI GPT OSS 120B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-06\",\n        \"last_updated\": \"2025-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.25 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"OpenAI: GPT OSS 20B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-06\",\n        \"last_updated\": \"2025-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"google/gemma-4-31b-it\": {\n        \"id\": \"google/gemma-4-31b-it\",\n        \"name\": \"Gemma 4 31B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"google/gemma-3-12b-it\": {\n        \"id\": \"google/gemma-3-12b-it\",\n        \"name\": \"Gemma 3 12B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"google/gemma-3-27b-it\": {\n        \"id\": \"google/gemma-3-27b-it\",\n        \"name\": \"Gemma 3 27B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.119, \"output\": 0.2 },\n        \"limit\": { \"context\": 98304, \"output\": 16384 }\n      },\n      \"google/gemma-4-26b-a4b-it\": {\n        \"id\": \"google/gemma-4-26b-a4b-it\",\n        \"name\": \"Gemma 4 26B A4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"deepseek/deepseek-v4-pro\": {\n        \"id\": \"deepseek/deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1048576, \"output\": 393216 }\n      },\n      \"deepseek/deepseek-v4-flash\": {\n        \"id\": \"deepseek/deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1048576, \"output\": 393216 }\n      }\n    }\n  },\n  \"llmgateway\": {\n    \"id\": \"llmgateway\",\n    \"env\": [\"LLMGATEWAY_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.llmgateway.io/v1\",\n    \"name\": \"LLM Gateway\",\n    \"doc\": \"https://llmgateway.io/docs\",\n    \"models\": {\n      \"llama-3-70b-instruct\": {\n        \"id\": \"llama-3-70b-instruct\",\n        \"name\": \"Llama 3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.51, \"output\": 0.74 },\n        \"limit\": { \"context\": 8192, \"output\": 8000 }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 0.42, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 163840, \"output\": 16384 }\n      },\n      \"gemma-2-27b-it-together\": {\n        \"id\": \"gemma-2-27b-it-together\",\n        \"name\": \"Gemma 2 27B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-27\",\n        \"last_updated\": \"2024-06-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.08 },\n        \"limit\": { \"context\": 8192, \"output\": 16384 }\n      },\n      \"claude-3-7-sonnet\": {\n        \"id\": \"claude-3-7-sonnet\",\n        \"name\": \"Claude 3.7 Sonnet\",\n        \"family\": \"claude\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"llama-3.1-8b-instruct\": {\n        \"id\": \"llama-3.1-8b-instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.22 },\n        \"limit\": { \"context\": 128000, \"output\": 2048 },\n        \"status\": \"beta\"\n      },\n      \"gemma-3-1b-it\": {\n        \"id\": \"gemma-3-1b-it\",\n        \"name\": \"Gemma 3 1B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.3 },\n        \"limit\": { \"context\": 1000000, \"output\": 16384 }\n      },\n      \"seed-1-6-250615\": {\n        \"id\": \"seed-1-6-250615\",\n        \"name\": \"Seed 1.6 (250615)\",\n        \"family\": \"seed\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-25\",\n        \"last_updated\": \"2025-06-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"qwen-coder-plus\": {\n        \"id\": \"qwen-coder-plus\",\n        \"name\": \"Qwen Coder Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2024-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen-max-latest\": {\n        \"id\": \"qwen-max-latest\",\n        \"name\": \"Qwen Max Latest\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-25\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 6.4 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"kimi-k2\": {\n        \"id\": \"kimi-k2\",\n        \"name\": \"Kimi K2\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"minimax-m2.1-lightning\": {\n        \"id\": \"minimax-m2.1-lightning\",\n        \"name\": \"MiniMax M2.1 Lightning\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.48 },\n        \"limit\": { \"context\": 196608, \"output\": 131072 }\n      },\n      \"glm-4.5-x\": {\n        \"id\": \"glm-4.5-x\",\n        \"name\": \"GLM-4.5 X\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.2, \"output\": 8.9, \"cache_read\": 0.45 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 },\n        \"status\": \"beta\"\n      },\n      \"qwen2-5-vl-32b-instruct\": {\n        \"id\": \"qwen2-5-vl-32b-instruct\",\n        \"name\": \"Qwen2.5 VL 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-15\",\n        \"last_updated\": \"2025-03-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"claude-3-5-haiku\": {\n        \"id\": \"claude-3-5-haiku\",\n        \"name\": \"Claude 3.5 Haiku\",\n        \"family\": \"claude\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 4, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"llama-3.2-3b-instruct\": {\n        \"id\": \"llama-3.2-3b-instruct\",\n        \"name\": \"Llama 3.2 3B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2024-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.05 },\n        \"limit\": { \"context\": 32768, \"output\": 32000 }\n      },\n      \"ministral-8b-2512\": {\n        \"id\": \"ministral-8b-2512\",\n        \"name\": \"Ministral 8B\",\n        \"family\": \"mistral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"glm-4.5-airx\": {\n        \"id\": \"glm-4.5-airx\",\n        \"name\": \"GLM-4.5 AirX\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.5, \"cache_read\": 0.22 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"ministral-3b-2512\": {\n        \"id\": \"ministral-3b-2512\",\n        \"name\": \"Ministral 3B\",\n        \"family\": \"mistral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"llama-3.2-11b-instruct\": {\n        \"id\": \"llama-3.2-11b-instruct\",\n        \"name\": \"Llama 3.2 11B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.33 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking (2507)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-08\",\n        \"last_updated\": \"2025-07-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 2.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4-fast-reasoning\": {\n        \"id\": \"grok-4-fast-reasoning\",\n        \"name\": \"Grok 4 Fast Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"llama-3-8b-instruct\": {\n        \"id\": \"llama-3-8b-instruct\",\n        \"name\": \"Llama 3 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"glm-4.6v-flashx\": {\n        \"id\": \"glm-4.6v-flashx\",\n        \"name\": \"GLM-4.6V FlashX\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.4, \"cache_read\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16000 }\n      },\n      \"qwen3-vl-235b-a22b-instruct\": {\n        \"id\": \"qwen3-vl-235b-a22b-instruct\",\n        \"name\": \"Qwen3 VL 235B A22B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 2.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"seed-1-6-flash-250715\": {\n        \"id\": \"seed-1-6-flash-250715\",\n        \"name\": \"Seed 1.6 Flash (250715)\",\n        \"family\": \"seed\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.3, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"auto\": {\n        \"id\": \"auto\",\n        \"name\": \"Auto Route\",\n        \"family\": \"auto\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-30b-a3b-instruct-2507\": {\n        \"id\": \"qwen3-30b-a3b-instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct (2507)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-08\",\n        \"last_updated\": \"2025-07-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-vl-8b-instruct\": {\n        \"id\": \"qwen3-vl-8b-instruct\",\n        \"name\": \"Qwen3 VL 8B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-vl-235b-a22b-thinking\": {\n        \"id\": \"qwen3-vl-235b-a22b-thinking\",\n        \"name\": \"Qwen3 VL 235B A22B Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 2.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"gemma-3-27b\": {\n        \"id\": \"gemma-3-27b\",\n        \"name\": \"Gemma 3 27B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.27 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-235b-a22b-fp8\": {\n        \"id\": \"qwen3-235b-a22b-fp8\",\n        \"name\": \"Qwen3 235B A22B FP8\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2.5 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"llama-4-scout-17b-instruct\": {\n        \"id\": \"llama-4-scout-17b-instruct\",\n        \"name\": \"Llama 4 Scout 17B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.66 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"qwen3-vl-30b-a3b-instruct\": {\n        \"id\": \"qwen3-vl-30b-a3b-instruct\",\n        \"name\": \"Qwen3 VL 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-02\",\n        \"last_updated\": \"2025-10-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"gpt-4o-mini-search-preview\": {\n        \"id\": \"gpt-4o-mini-search-preview\",\n        \"name\": \"GPT-4o Mini Search Preview\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-4o-search-preview\": {\n        \"id\": \"gpt-4o-search-preview\",\n        \"name\": \"GPT-4o Search Preview\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"minimax-text-01\": {\n        \"id\": \"minimax-text-01\",\n        \"name\": \"MiniMax Text 01\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-01-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 1000000, \"output\": 131072 }\n      },\n      \"grok-4-1-fast-reasoning\": {\n        \"id\": \"grok-4-1-fast-reasoning\",\n        \"name\": \"Grok 4.1 Fast Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"qwen3-vl-flash\": {\n        \"id\": \"qwen3-vl-flash\",\n        \"name\": \"Qwen3 VL Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-09\",\n        \"last_updated\": \"2025-10-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 1000000, \"output\": 32000 }\n      },\n      \"qwen25-coder-7b\": {\n        \"id\": \"qwen25-coder-7b\",\n        \"name\": \"Qwen2.5 Coder 7B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-19\",\n        \"last_updated\": \"2024-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.05 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"llama-4-scout\": {\n        \"id\": \"llama-4-scout\",\n        \"name\": \"Llama 4 Scout\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.18, \"output\": 0.59 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 },\n        \"status\": \"beta\"\n      },\n      \"qwen-plus-latest\": {\n        \"id\": \"qwen-plus-latest\",\n        \"name\": \"Qwen Plus Latest\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-25\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"glm-4.6v-flash\": {\n        \"id\": \"glm-4.6v-flash\",\n        \"name\": \"GLM-4.6V Flash\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16000 },\n        \"status\": \"beta\"\n      },\n      \"qwen3-4b-fp8\": {\n        \"id\": \"qwen3-4b-fp8\",\n        \"name\": \"Qwen3 4B FP8\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.05 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"deepseek-r1-0528\": {\n        \"id\": \"deepseek-r1-0528\",\n        \"name\": \"DeepSeek R1 (0528)\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 2.4 },\n        \"limit\": { \"context\": 64000, \"output\": 16384 },\n        \"status\": \"beta\"\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 32766 }\n      },\n      \"gemini-pro-latest\": {\n        \"id\": \"gemini-pro-latest\",\n        \"name\": \"Gemini Pro Latest\",\n        \"family\": \"gemini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-27\",\n        \"last_updated\": \"2026-02-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"qwen3-30b-a3b-fp8\": {\n        \"id\": \"qwen3-30b-a3b-fp8\",\n        \"name\": \"Qwen3 30B A3B FP8\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"glm-4-32b-0414-128k\": {\n        \"id\": \"glm-4-32b-0414-128k\",\n        \"name\": \"GLM-4 32B (0414-128k)\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-vl-30b-a3b-thinking\": {\n        \"id\": \"qwen3-vl-30b-a3b-thinking\",\n        \"name\": \"Qwen3 VL 30B A3B Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-02\",\n        \"last_updated\": \"2025-10-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct (2507)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-08\",\n        \"last_updated\": \"2025-07-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 2.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"custom\": {\n        \"id\": \"custom\",\n        \"name\": \"Custom Model\",\n        \"family\": \"auto\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-32b-fp8\": {\n        \"id\": \"qwen3-32b-fp8\",\n        \"name\": \"Qwen3 32B FP8\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"seed-1-6-250915\": {\n        \"id\": \"seed-1-6-250915\",\n        \"name\": \"Seed 1.6 (250915)\",\n        \"family\": \"seed\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"llama-4-maverick-17b-instruct\": {\n        \"id\": \"llama-4-maverick-17b-instruct\",\n        \"name\": \"Llama 4 Maverick 17B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.24, \"output\": 0.97 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"seed-1-8-251228\": {\n        \"id\": \"seed-1-8-251228\",\n        \"name\": \"Seed 1.8 (251228)\",\n        \"family\": \"seed\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-18\",\n        \"last_updated\": \"2025-12-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"codestral-2508\": {\n        \"id\": \"codestral-2508\",\n        \"name\": \"Codestral\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"ministral-14b-2512\": {\n        \"id\": \"ministral-14b-2512\",\n        \"name\": \"Ministral 14B\",\n        \"family\": \"mistral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"gpt-oss-20b\": {\n        \"id\": \"gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 32766 }\n      },\n      \"qwen3-coder-next\": {\n        \"id\": \"qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 4 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3-30b-a3b-thinking-2507\": {\n        \"id\": \"qwen3-30b-a3b-thinking-2507\",\n        \"name\": \"Qwen3 30B A3B Thinking (2507)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-08\",\n        \"last_updated\": \"2025-07-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4-0709\": {\n        \"id\": \"grok-4-0709\",\n        \"name\": \"Grok 4 (0709)\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"hermes-2-pro-llama-3-8b\": {\n        \"id\": \"hermes-2-pro-llama-3-8b\",\n        \"name\": \"Hermes 2 Pro Llama 3 8B\",\n        \"family\": \"hermes\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-05-27\",\n        \"last_updated\": \"2024-05-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.14 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"deepseek-v3.1\": {\n        \"id\": \"deepseek-v3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"llama-3.1-nemotron-ultra-253b\": {\n        \"id\": \"llama-3.1-nemotron-ultra-253b\",\n        \"name\": \"Llama 3.1 Nemotron Ultra 253B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-07\",\n        \"last_updated\": \"2025-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"claude-3-opus\": {\n        \"id\": \"claude-3-opus\",\n        \"name\": \"Claude 3 Opus\",\n        \"family\": \"claude\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-03-04\",\n        \"last_updated\": \"2024-03-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75, \"cache_read\": 1.5 },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"llama-3.1-70b-instruct\": {\n        \"id\": \"llama-3.1-70b-instruct\",\n        \"name\": \"Llama 3.1 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.72, \"output\": 0.72 },\n        \"limit\": { \"context\": 128000, \"output\": 2048 },\n        \"status\": \"beta\"\n      },\n      \"qwen3-max-2026-01-23\": {\n        \"id\": \"qwen3-max-2026-01-23\",\n        \"name\": \"Qwen3 Max (2026-01-23)\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-23\",\n        \"last_updated\": \"2026-01-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.6 },\n        \"limit\": { \"context\": 256000, \"output\": 32800 }\n      },\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3.2,\n          \"cache_read\": 0.2,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"claude-opus-4-20250514\": {\n        \"id\": \"claude-opus-4-20250514\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"qwen-turbo\": {\n        \"id\": \"qwen-turbo\",\n        \"name\": \"Qwen Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2, \"reasoning\": 0.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 16384 }\n      },\n      \"mistral-large-2512\": {\n        \"id\": \"mistral-large-2512\",\n        \"name\": \"Mistral Large 3\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"deepseek-v4-pro\": {\n        \"id\": \"deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"qwen-max\": {\n        \"id\": \"qwen-max\",\n        \"name\": \"Qwen Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-03\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 6.4 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"o3-mini\": {\n        \"id\": \"o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"minimax-m2\": {\n        \"id\": \"minimax-m2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 196608, \"output\": 128000 }\n      },\n      \"gpt-4o-mini\": {\n        \"id\": \"gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o3\": {\n        \"id\": \"o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-5.4-pro\": {\n        \"id\": \"gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.03,\n          \"input_audio\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3.1-flash-lite-preview\": {\n        \"id\": \"gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.5,\n          \"cache_read\": 0.025,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"grok-4-20-beta-0309-reasoning\": {\n        \"id\": \"grok-4-20-beta-0309-reasoning\",\n        \"name\": \"Grok 4.20 (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 6,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 12, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"claude-opus-4-1-20250805\": {\n        \"id\": \"claude-opus-4-1-20250805\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"qwen3-coder-plus\": {\n        \"id\": \"qwen3-coder-plus\",\n        \"name\": \"Qwen3 Coder Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"qwen35-397b-a17b\": {\n        \"id\": \"qwen35-397b-a17b\",\n        \"name\": \"Qwen3.5 397B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-02-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"glm-4.7-flashx\": {\n        \"id\": \"glm-4.7-flashx\",\n        \"name\": \"GLM-4.7-FlashX\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.07,\n          \"output\": 0.4,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"minimax-m2.7-highspeed\": {\n        \"id\": \"minimax-m2.7-highspeed\",\n        \"name\": \"MiniMax-M2.7-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"qwen-plus\": {\n        \"id\": \"qwen-plus\",\n        \"name\": \"Qwen Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.2, \"reasoning\": 4 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"kimi-k2-thinking-turbo\": {\n        \"id\": \"kimi-k2-thinking-turbo\",\n        \"name\": \"Kimi K2 Thinking Turbo\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.15, \"output\": 8, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3-Next 80B-A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"o1\": {\n        \"id\": \"o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5.2-chat-latest\": {\n        \"id\": \"gpt-5.2-chat-latest\",\n        \"name\": \"GPT-5.2 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"Grok 4 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"qwen-omni-turbo\": {\n        \"id\": \"qwen-omni-turbo\",\n        \"name\": \"Qwen-Omni Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01-19\",\n        \"last_updated\": \"2025-03-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.07,\n          \"output\": 0.27,\n          \"input_audio\": 4.44,\n          \"output_audio\": 8.89\n        },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"gemini-2.0-flash\": {\n        \"id\": \"gemini-2.0-flash\",\n        \"name\": \"Gemini 2.0 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"qwen-vl-plus\": {\n        \"id\": \"qwen-vl-plus\",\n        \"name\": \"Qwen-VL Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2025-08-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 0.63 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"claude-3-7-sonnet-20250219\": {\n        \"id\": \"claude-3-7-sonnet-20250219\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-31\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview 09-25\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"qwen3-max\": {\n        \"id\": \"qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"GPT-5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 272000 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"sonar\": {\n        \"id\": \"sonar\",\n        \"name\": \"Sonar\",\n        \"family\": \"sonar\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen-flash\": {\n        \"id\": \"qwen-flash\",\n        \"name\": \"Qwen Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gemma-3-12b-it\": {\n        \"id\": \"gemma-3-12b-it\",\n        \"name\": \"Gemma 3 12B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"pixtral-large-latest\": {\n        \"id\": \"pixtral-large-latest\",\n        \"name\": \"Pixtral Large (latest)\",\n        \"family\": \"pixtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mimo-v2-flash\": {\n        \"id\": \"mimo-v2-flash\",\n        \"name\": \"MiMo-V2-Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12-01\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"gemma-3-4b-it\": {\n        \"id\": \"gemma-3-4b-it\",\n        \"name\": \"Gemma 3 4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"sonar-reasoning-pro\": {\n        \"id\": \"sonar-reasoning-pro\",\n        \"name\": \"Sonar Reasoning Pro\",\n        \"family\": \"sonar-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-3.5-turbo\": {\n        \"id\": \"gpt-3.5-turbo\",\n        \"name\": \"GPT-3.5-turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-09-01\",\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 16385, \"output\": 4096 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"grok-3\": {\n        \"id\": \"grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 6,\n          \"output\": 24,\n          \"cache_read\": 1.3,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"context_over_200k\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3-Coder 30B-A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.25 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.125,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 15,\n            \"cache_read\": 0.25\n          }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"sonar-pro\": {\n        \"id\": \"sonar-pro\",\n        \"name\": \"Sonar Pro\",\n        \"family\": \"sonar-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"mistral-small-2506\": {\n        \"id\": \"mistral-small-2506\",\n        \"name\": \"Mistral Small 3.2\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-06-20\",\n        \"last_updated\": \"2025-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gemini-2.0-flash-lite\": {\n        \"id\": \"gemini-2.0-flash-lite\",\n        \"name\": \"Gemini 2.0 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"grok-4\": {\n        \"id\": \"grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"reasoning\": 15,\n          \"cache_read\": 0.75\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"deepseek-v4-flash\": {\n        \"id\": \"deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"glm-4.5-flash\": {\n        \"id\": \"glm-4.5-flash\",\n        \"name\": \"GLM-4.5-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi-k2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"glm-4.6v\": {\n        \"id\": \"glm-4.6v\",\n        \"name\": \"GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"GLM-4.5-Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 1.1,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3-Next 80B-A3B (Thinking)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"qwen3-coder-flash\": {\n        \"id\": \"qwen3-coder-flash\",\n        \"name\": \"Qwen3 Coder Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"grok-4-fast\": {\n        \"id\": \"grok-4-fast\",\n        \"name\": \"Grok 4 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"llama-3.3-70b-instruct\": {\n        \"id\": \"llama-3.3-70b-instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-4.5v\": {\n        \"id\": \"glm-4.5v\",\n        \"name\": \"GLM-4.5V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-11\",\n        \"last_updated\": \"2025-08-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 64000, \"output\": 16384 }\n      },\n      \"qwq-plus\": {\n        \"id\": \"qwq-plus\",\n        \"name\": \"QwQ Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-03-05\",\n        \"last_updated\": \"2025-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 2.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"gemma-3n-e2b-it\": {\n        \"id\": \"gemma-3n-e2b-it\",\n        \"name\": \"Gemma 3n 2B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2000 }\n      },\n      \"gpt-4-turbo\": {\n        \"id\": \"gpt-4-turbo\",\n        \"name\": \"GPT-4 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3-Coder 480B-A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.5, \"output\": 7.5 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen-vl-max\": {\n        \"id\": \"qwen-vl-max\",\n        \"name\": \"Qwen-VL Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-08\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 3.2 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"glm-4.7-flash\": {\n        \"id\": \"glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"grok-4-20-beta-0309-non-reasoning\": {\n        \"id\": \"grok-4-20-beta-0309-non-reasoning\",\n        \"name\": \"Grok 4.20 (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 6,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 12, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gpt-5.3-chat-latest\": {\n        \"id\": \"gpt-5.3-chat-latest\",\n        \"name\": \"GPT-5.3 Chat (latest)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-vl-plus\": {\n        \"id\": \"qwen3-vl-plus\",\n        \"name\": \"Qwen3-VL Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.6, \"reasoning\": 4.8 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"claude-sonnet-4-20250514\": {\n        \"id\": \"claude-sonnet-4-20250514\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"glm-4.5\": {\n        \"id\": \"glm-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"grok-4-1-fast\": {\n        \"id\": \"grok-4-1-fast\",\n        \"name\": \"Grok 4.1 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-opus-4-5-20251101\": {\n        \"id\": \"claude-opus-4-5-20251101\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"qwen2-5-vl-72b-instruct\": {\n        \"id\": \"qwen2-5-vl-72b-instruct\",\n        \"name\": \"Qwen2.5-VL 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.8, \"output\": 8.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"kimi-k2.6\": {\n        \"id\": \"kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"devstral-2512\": {\n        \"id\": \"devstral-2512\",\n        \"name\": \"Devstral 2\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"gpt-5-chat-latest\": {\n        \"id\": \"gpt-5-chat-latest\",\n        \"name\": \"GPT-5 Chat (latest)\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gemma-3n-e4b-it\": {\n        \"id\": \"gemma-3n-e4b-it\",\n        \"name\": \"Gemma 3n 4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2000 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"GPT-4.1 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-5.2-pro\": {\n        \"id\": \"gpt-5.2-pro\",\n        \"name\": \"GPT-5.2 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"minimax-m2.1\": {\n        \"id\": \"minimax-m2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"devstral-small-2507\": {\n        \"id\": \"devstral-small-2507\",\n        \"name\": \"Devstral Small\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-07-10\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"minimax-m2.7\": {\n        \"id\": \"minimax-m2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.8, \"reasoning\": 8.4 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"claude-opus-4-7\": {\n        \"id\": \"claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1 Codex mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gemini-3.1-pro-preview\": {\n        \"id\": \"gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5 (latest)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"minimax-m2.5-highspeed\": {\n        \"id\": \"minimax-m2.5-highspeed\",\n        \"name\": \"MiniMax-M2.5-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5 (latest)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"mistral-large-latest\": {\n        \"id\": \"mistral-large-latest\",\n        \"name\": \"Mistral Large (latest)\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"claude-3-5-sonnet-20241022\": {\n        \"id\": \"claude-3-5-sonnet-20241022\",\n        \"name\": \"Claude Sonnet 3.5 v2\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"gpt-4\": {\n        \"id\": \"gpt-4\",\n        \"name\": \"GPT-4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 60 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"gpt-5.4-nano\": {\n        \"id\": \"gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      }\n    }\n  },\n  \"moonshotai\": {\n    \"id\": \"moonshotai\",\n    \"env\": [\"MOONSHOT_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.moonshot.ai/v1\",\n    \"name\": \"Moonshot AI\",\n    \"doc\": \"https://platform.moonshot.ai/docs/api/chat\",\n    \"models\": {\n      \"kimi-k2-thinking-turbo\": {\n        \"id\": \"kimi-k2-thinking-turbo\",\n        \"name\": \"Kimi K2 Thinking Turbo\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.15, \"output\": 8, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-0711-preview\": {\n        \"id\": \"kimi-k2-0711-preview\",\n        \"name\": \"Kimi K2 0711\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-14\",\n        \"last_updated\": \"2025-07-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi-k2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-0905-preview\": {\n        \"id\": \"kimi-k2-0905-preview\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-turbo-preview\": {\n        \"id\": \"kimi-k2-turbo-preview\",\n        \"name\": \"Kimi K2 Turbo\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.4, \"output\": 10, \"cache_read\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2.6\": {\n        \"id\": \"kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      }\n    }\n  },\n  \"lucidquery\": {\n    \"id\": \"lucidquery\",\n    \"env\": [\"LUCIDQUERY_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://lucidquery.com/api/v1\",\n    \"name\": \"LucidQuery AI\",\n    \"doc\": \"https://lucidquery.com/api/docs\",\n    \"models\": {\n      \"lucidnova-rf1-100b\": {\n        \"id\": \"lucidnova-rf1-100b\",\n        \"name\": \"LucidNova RF1 100B\",\n        \"family\": \"nova\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-09-16\",\n        \"release_date\": \"2024-12-28\",\n        \"last_updated\": \"2025-09-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 5 },\n        \"limit\": { \"context\": 120000, \"output\": 8000 }\n      },\n      \"lucidquery-nexus-coder\": {\n        \"id\": \"lucidquery-nexus-coder\",\n        \"name\": \"LucidQuery Nexus Coder\",\n        \"family\": \"lucid\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-01\",\n        \"release_date\": \"2025-09-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 5 },\n        \"limit\": { \"context\": 250000, \"output\": 60000 }\n      }\n    }\n  },\n  \"alibaba-coding-plan-cn\": {\n    \"id\": \"alibaba-coding-plan-cn\",\n    \"env\": [\"ALIBABA_CODING_PLAN_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://coding.dashscope.aliyuncs.com/v1\",\n    \"name\": \"Alibaba Coding Plan (China)\",\n    \"doc\": \"https://help.aliyun.com/zh/model-studio/coding-plan\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"qwen3.6-plus\": {\n        \"id\": \"qwen3.6-plus\",\n        \"name\": \"Qwen3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3.5-plus\": {\n        \"id\": \"qwen3.5-plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3-coder-plus\": {\n        \"id\": \"qwen3-coder-plus\",\n        \"name\": \"Qwen3 Coder Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 196608, \"output\": 24576 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen3-coder-next\": {\n        \"id\": \"qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-03\",\n        \"last_updated\": \"2026-02-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3-max-2026-01-23\": {\n        \"id\": \"qwen3-max-2026-01-23\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-23\",\n        \"last_updated\": \"2026-01-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      }\n    }\n  },\n  \"cloudferro-sherlock\": {\n    \"id\": \"cloudferro-sherlock\",\n    \"env\": [\"CLOUDFERRO_SHERLOCK_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api-sherlock.cloudferro.com/openai/v1/\",\n    \"name\": \"CloudFerro Sherlock\",\n    \"doc\": \"https://docs.sherlock.cloudferro.com/\",\n    \"models\": {\n      \"meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-09\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.92, \"output\": 2.92 },\n        \"limit\": { \"context\": 70000, \"output\": 70000 }\n      },\n      \"speakleash/Bielik-11B-v3.0-Instruct\": {\n        \"id\": \"speakleash/Bielik-11B-v3.0-Instruct\",\n        \"name\": \"Bielik 11B v3.0 Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.67, \"output\": 0.67 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"speakleash/Bielik-11B-v2.6-Instruct\": {\n        \"id\": \"speakleash/Bielik-11B-v2.6-Instruct\",\n        \"name\": \"Bielik 11B v2.6 Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.67, \"output\": 0.67 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 196000, \"output\": 196000 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"OpenAI GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.92, \"output\": 2.92 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      }\n    }\n  },\n  \"synthetic\": {\n    \"id\": \"synthetic\",\n    \"env\": [\"SYNTHETIC_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.synthetic.new/openai/v1\",\n    \"name\": \"Synthetic\",\n    \"doc\": \"https://synthetic.new/pricing\",\n    \"models\": {\n      \"hf:Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"hf:Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.65, \"output\": 3 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"hf:Qwen/Qwen3.5-397B-A17B\": {\n        \"id\": \"hf:Qwen/Qwen3.5-397B-A17B\",\n        \"name\": \"Qwen3.5-97B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 },\n        \"status\": \"beta\"\n      },\n      \"hf:Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n        \"id\": \"hf:Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"name\": \"Qwen 3 Coder 480B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 2 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"hf:Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"hf:Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen 3 235B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-07-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"hf:Qwen/Qwen2.5-Coder-32B-Instruct\": {\n        \"id\": \"hf:Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"name\": \"Qwen2.5-Coder-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-11-11\",\n        \"last_updated\": \"2024-11-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 0.8 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"hf:deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"hf:deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.27,\n          \"output\": 0.4,\n          \"cache_read\": 0.27,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 162816, \"input\": 162816, \"output\": 8000 }\n      },\n      \"hf:deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"hf:deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek R1 (0528)\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 8 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"hf:deepseek-ai/DeepSeek-V3\": {\n        \"id\": \"hf:deepseek-ai/DeepSeek-V3\",\n        \"name\": \"DeepSeek V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-05-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.25, \"output\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"hf:deepseek-ai/DeepSeek-V3.1-Terminus\": {\n        \"id\": \"hf:deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"name\": \"DeepSeek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 1.2 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"hf:deepseek-ai/DeepSeek-V3-0324\": {\n        \"id\": \"hf:deepseek-ai/DeepSeek-V3-0324\",\n        \"name\": \"DeepSeek V3 (0324)\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 1.2 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"hf:deepseek-ai/DeepSeek-V3.1\": {\n        \"id\": \"hf:deepseek-ai/DeepSeek-V3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"hf:deepseek-ai/DeepSeek-R1\": {\n        \"id\": \"hf:deepseek-ai/DeepSeek-R1\",\n        \"name\": \"DeepSeek R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"hf:openai/gpt-oss-120b\": {\n        \"id\": \"hf:openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"hf:moonshotai/Kimi-K2.5\": {\n        \"id\": \"hf:moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"hf:moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"hf:moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-07\",\n        \"last_updated\": \"2025-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"hf:moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"hf:moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.2, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"hf:MiniMaxAI/MiniMax-M2.1\": {\n        \"id\": \"hf:MiniMaxAI/MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"hf:MiniMaxAI/MiniMax-M2\": {\n        \"id\": \"hf:MiniMaxAI/MiniMax-M2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 196608, \"output\": 131000 }\n      },\n      \"hf:MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"hf:MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-07\",\n        \"last_updated\": \"2026-02-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.6 },\n        \"limit\": { \"context\": 191488, \"output\": 65536 }\n      },\n      \"hf:zai-org/GLM-5.1\": {\n        \"id\": \"hf:zai-org/GLM-5.1\",\n        \"name\": \"GLM 5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3, \"cache_read\": 1 },\n        \"limit\": { \"context\": 196608, \"output\": 65536 }\n      },\n      \"hf:zai-org/GLM-4.6\": {\n        \"id\": \"hf:zai-org/GLM-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"hf:zai-org/GLM-4.7-Flash\": {\n        \"id\": \"hf:zai-org/GLM-4.7-Flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-18\",\n        \"last_updated\": \"2026-01-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.4, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 196608, \"output\": 65536 }\n      },\n      \"hf:zai-org/GLM-4.7\": {\n        \"id\": \"hf:zai-org/GLM-4.7\",\n        \"name\": \"GLM 4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"hf:zai-org/GLM-5\": {\n        \"id\": \"hf:zai-org/GLM-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3, \"cache_read\": 1 },\n        \"limit\": { \"context\": 196608, \"output\": 65536 }\n      },\n      \"hf:nvidia/Kimi-K2.5-NVFP4\": {\n        \"id\": \"hf:nvidia/Kimi-K2.5-NVFP4\",\n        \"name\": \"Kimi K2.5 (NVFP4)\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4\": {\n        \"id\": \"hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4\",\n        \"name\": \"Nemotron 3 Super 120B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"hf:meta-llama/Llama-4-Scout-17B-16E-Instruct\": {\n        \"id\": \"hf:meta-llama/Llama-4-Scout-17B-16E-Instruct\",\n        \"name\": \"Llama-4-Scout-17B-16E-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 328000, \"output\": 4096 }\n      },\n      \"hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\": {\n        \"id\": \"hf:meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\",\n        \"name\": \"Llama-4-Maverick-17B-128E-Instruct-FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.88 },\n        \"limit\": { \"context\": 524000, \"output\": 4096 }\n      },\n      \"hf:meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"hf:meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.9, \"output\": 0.9 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"hf:meta-llama/Llama-3.1-70B-Instruct\": {\n        \"id\": \"hf:meta-llama/Llama-3.1-70B-Instruct\",\n        \"name\": \"Llama-3.1-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.9, \"output\": 0.9 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"hf:meta-llama/Llama-3.1-405B-Instruct\": {\n        \"id\": \"hf:meta-llama/Llama-3.1-405B-Instruct\",\n        \"name\": \"Llama-3.1-405B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3, \"output\": 3 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"hf:meta-llama/Llama-3.1-8B-Instruct\": {\n        \"id\": \"hf:meta-llama/Llama-3.1-8B-Instruct\",\n        \"name\": \"Llama-3.1-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      }\n    }\n  },\n  \"wandb\": {\n    \"id\": \"wandb\",\n    \"env\": [\"WANDB_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.inference.wandb.ai/v1\",\n    \"name\": \"Weights & Biases\",\n    \"doc\": \"https://docs.wandb.ai/guides/integrations/inference/\",\n    \"models\": {\n      \"meta-llama/Llama-4-Scout-17B-16E-Instruct\": {\n        \"id\": \"meta-llama/Llama-4-Scout-17B-16E-Instruct\",\n        \"name\": \"Llama 4 Scout 17B 16E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.66 },\n        \"limit\": { \"context\": 64000, \"output\": 64000 }\n      },\n      \"meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.71, \"output\": 0.71 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"meta-llama/Llama-3.1-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.1-70B-Instruct\",\n        \"name\": \"Llama 3.1 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 0.8 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"meta-llama/Llama-3.1-8B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.1-8B-Instruct\",\n        \"name\": \"Meta-Llama-3.1-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.22 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"OpenPipe/Qwen3-14B-Instruct\": {\n        \"id\": \"OpenPipe/Qwen3-14B-Instruct\",\n        \"name\": \"OpenPipe Qwen3 14B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.22 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8\": {\n        \"id\": \"nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8\",\n        \"name\": \"NVIDIA Nemotron 3 Super 120B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2.85 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen3-235B-A22B-Thinking-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"name\": \"Qwen3-Coder-480B-A35B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"microsoft/Phi-4-mini-instruct\": {\n        \"id\": \"microsoft/Phi-4-mini-instruct\",\n        \"name\": \"Phi-4-mini-instruct\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.35 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 1.65 },\n        \"limit\": { \"context\": 161000, \"output\": 161000 }\n      },\n      \"zai-org/GLM-5-FP8\": {\n        \"id\": \"zai-org/GLM-5-FP8\",\n        \"name\": \"GLM 5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2 },\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"gpt-oss-120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"gpt-oss-20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      }\n    }\n  },\n  \"digitalocean\": {\n    \"id\": \"digitalocean\",\n    \"env\": [\"DIGITALOCEAN_ACCESS_TOKEN\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://inference.do-ai.run/v1\",\n    \"name\": \"DigitalOcean\",\n    \"doc\": \"https://docs.digitalocean.com/products/gradient-ai-platform/details/models/\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM 5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2 },\n        \"limit\": { \"context\": 202752, \"output\": 128000 }\n      },\n      \"openai-gpt-4.1\": {\n        \"id\": \"openai-gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"arcee-trinity-large-thinking\": {\n        \"id\": \"arcee-trinity-large-thinking\",\n        \"name\": \"Trinity Large Thinking\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.9, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 },\n        \"status\": \"beta\"\n      },\n      \"anthropic-claude-opus-4.6\": {\n        \"id\": \"anthropic-claude-opus-4.6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 0.5,\n            \"cache_write\": 6.25\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"openai-gpt-5-nano\": {\n        \"id\": \"openai-gpt-5-nano\",\n        \"name\": \"GPT-5 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai-o1\": {\n        \"id\": \"openai-o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai-gpt-image-1\": {\n        \"id\": \"openai-gpt-image-1\",\n        \"name\": \"GPT Image 1\",\n        \"family\": \"gpt-image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-24\",\n        \"last_updated\": \"2025-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 40, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"openai-gpt-4o-mini\": {\n        \"id\": \"openai-gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-30\",\n        \"last_updated\": \"2025-01-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.99, \"output\": 0.99 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"anthropic-claude-sonnet-4\": {\n        \"id\": \"anthropic-claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.3,\n            \"cache_write\": 3.75\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"llama3.3-70b-instruct\": {\n        \"id\": \"llama3.3-70b-instruct\",\n        \"name\": \"Llama 3.3 Instruct 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.65, \"output\": 0.65 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"anthropic-claude-4.1-opus\": {\n        \"id\": \"anthropic-claude-4.1-opus\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic-claude-opus-4.5\": {\n        \"id\": \"anthropic-claude-opus-4.5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"openai-gpt-5-mini\": {\n        \"id\": \"openai-gpt-5-mini\",\n        \"name\": \"GPT-5 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai-gpt-5-2-pro\": {\n        \"id\": \"openai-gpt-5-2-pro\",\n        \"name\": \"GPT-5.2 pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"all-mini-lm-l6-v2\": {\n        \"id\": \"all-mini-lm-l6-v2\",\n        \"name\": \"All-MiniLM-L6-v2\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2021-08-30\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.009, \"output\": 0 },\n        \"limit\": { \"context\": 256, \"output\": 384 }\n      },\n      \"openai-gpt-oss-20b\": {\n        \"id\": \"openai-gpt-oss-20b\",\n        \"name\": \"gpt-oss-20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.45 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai-gpt-5.4\": {\n        \"id\": \"openai-gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic-claude-4.6-sonnet\": {\n        \"id\": \"anthropic-claude-4.6-sonnet\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.3,\n            \"cache_write\": 3.75\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"anthropic-claude-4.5-sonnet\": {\n        \"id\": \"anthropic-claude-4.5-sonnet\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.3,\n            \"cache_write\": 3.75\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2.7 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax-m2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 128000 },\n        \"status\": \"beta\"\n      },\n      \"openai-gpt-5.1-codex-max\": {\n        \"id\": \"openai-gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1 Codex Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai-o3\": {\n        \"id\": \"openai-o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"anthropic-claude-opus-4.7\": {\n        \"id\": \"anthropic-claude-opus-4.7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"openai-gpt-image-1.5\": {\n        \"id\": \"openai-gpt-image-1.5\",\n        \"name\": \"GPT Image 1.5\",\n        \"family\": \"gpt-image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 10, \"cache_read\": 1 },\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"openai-gpt-5.4-mini\": {\n        \"id\": \"openai-gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai-gpt-oss-120b\": {\n        \"id\": \"openai-gpt-oss-120b\",\n        \"name\": \"gpt-oss-120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.7 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai-gpt-5.3-codex\": {\n        \"id\": \"openai-gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"nvidia-nemotron-3-super-120b\": {\n        \"id\": \"nvidia-nemotron-3-super-120b\",\n        \"name\": \"Nemotron-3-Super-120B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.65 },\n        \"limit\": { \"context\": 256000, \"output\": 32768 },\n        \"status\": \"beta\"\n      },\n      \"openai-gpt-5.4-nano\": {\n        \"id\": \"openai-gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai-o3-mini\": {\n        \"id\": \"openai-o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai-gpt-4o\": {\n        \"id\": \"openai-gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gte-large-en-v1.5\": {\n        \"id\": \"gte-large-en-v1.5\",\n        \"name\": \"GTE Large (v1.5)\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-03-27\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1024 }\n      },\n      \"openai-gpt-5\": {\n        \"id\": \"openai-gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"alibaba-qwen3-32b\": {\n        \"id\": \"alibaba-qwen3-32b\",\n        \"name\": \"Qwen3-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.55 },\n        \"limit\": { \"context\": 131000, \"output\": 40960 }\n      },\n      \"openai-gpt-5.4-pro\": {\n        \"id\": \"openai-gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"anthropic-claude-haiku-4.5\": {\n        \"id\": \"anthropic-claude-haiku-4.5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic-claude-opus-4\": {\n        \"id\": \"anthropic-claude-opus-4\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"qwen3-embedding-0.6b\": {\n        \"id\": \"qwen3-embedding-0.6b\",\n        \"name\": \"Qwen3 Embedding 0.6B\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-03\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0 },\n        \"limit\": { \"context\": 8000, \"output\": 1024 },\n        \"status\": \"beta\"\n      },\n      \"multi-qa-mpnet-base-dot-v1\": {\n        \"id\": \"multi-qa-mpnet-base-dot-v1\",\n        \"name\": \"Multi-QA-mpnet-base-dot-v1\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2021-08-30\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.009, \"output\": 0 },\n        \"limit\": { \"context\": 512, \"output\": 768 }\n      },\n      \"openai-gpt-5.2\": {\n        \"id\": \"openai-gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"fal-ai/fast-sdxl\": {\n        \"id\": \"fal-ai/fast-sdxl\",\n        \"name\": \"Fast SDXL\",\n        \"family\": \"stable-diffusion\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-07-26\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"fal-ai/flux/schnell\": {\n        \"id\": \"fal-ai/flux/schnell\",\n        \"name\": \"FLUX.1 [schnell]\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"fal-ai/elevenlabs/tts/multilingual-v2\": {\n        \"id\": \"fal-ai/elevenlabs/tts/multilingual-v2\",\n        \"name\": \"ElevenLabs Multilingual TTS v2\",\n        \"family\": \"elevenlabs\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-08-22\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"fal-ai/stable-audio-25/text-to-audio\": {\n        \"id\": \"fal-ai/stable-audio-25/text-to-audio\",\n        \"name\": \"Stable Audio 2.5 (Text-to-Audio)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-08\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      }\n    }\n  },\n  \"ollama-cloud\": {\n    \"id\": \"ollama-cloud\",\n    \"env\": [\"OLLAMA_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://ollama.com/v1\",\n    \"name\": \"Ollama Cloud\",\n    \"doc\": \"https://docs.ollama.com/cloud\",\n    \"models\": {\n      \"devstral-small-2:24b\": {\n        \"id\": \"devstral-small-2:24b\",\n        \"name\": \"devstral-small-2:24b\",\n        \"family\": \"devstral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"glm-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"ministral-3:3b\": {\n        \"id\": \"ministral-3:3b\",\n        \"name\": \"ministral-3:3b\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 128000 }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"deepseek-v3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-06-15\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"kimi-k2:1t\": {\n        \"id\": \"kimi-k2:1t\",\n        \"name\": \"kimi-k2:1t\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"glm-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"deepseek-v4-pro\": {\n        \"id\": \"deepseek-v4-pro\",\n        \"name\": \"deepseek-v4-pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"minimax-m2\": {\n        \"id\": \"minimax-m2\",\n        \"name\": \"minimax-m2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-10-23\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 204800, \"output\": 128000 }\n      },\n      \"nemotron-3-nano:30b\": {\n        \"id\": \"nemotron-3-nano:30b\",\n        \"name\": \"nemotron-3-nano:30b\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-15\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 1048576, \"output\": 131072 }\n      },\n      \"qwen3-vl:235b-instruct\": {\n        \"id\": \"qwen3-vl:235b-instruct\",\n        \"name\": \"qwen3-vl:235b-instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"deepseek-v3.1:671b\": {\n        \"id\": \"deepseek-v3.1:671b\",\n        \"name\": \"deepseek-v3.1:671b\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"kimi-k2-thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"gpt-oss:20b\": {\n        \"id\": \"gpt-oss:20b\",\n        \"name\": \"gpt-oss:20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"cogito-2.1:671b\": {\n        \"id\": \"cogito-2.1:671b\",\n        \"name\": \"cogito-2.1:671b\",\n        \"family\": \"cogito\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 163840, \"output\": 32000 }\n      },\n      \"rnj-1:8b\": {\n        \"id\": \"rnj-1:8b\",\n        \"name\": \"rnj-1:8b\",\n        \"family\": \"rnj\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-06\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 32768, \"output\": 4096 }\n      },\n      \"ministral-3:14b\": {\n        \"id\": \"ministral-3:14b\",\n        \"name\": \"ministral-3:14b\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 128000 }\n      },\n      \"gemma3:12b\": {\n        \"id\": \"gemma3:12b\",\n        \"name\": \"gemma3:12b\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistral-large-3:675b\": {\n        \"id\": \"mistral-large-3:675b\",\n        \"name\": \"mistral-large-3:675b\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"glm-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"qwen3-coder:480b\": {\n        \"id\": \"qwen3-coder:480b\",\n        \"name\": \"qwen3-coder:480b\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"nemotron-3-super\": {\n        \"id\": \"nemotron-3-super\",\n        \"name\": \"nemotron-3-super\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"gemma3:4b\": {\n        \"id\": \"gemma3:4b\",\n        \"name\": \"gemma3:4b\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen3-next:80b\": {\n        \"id\": \"qwen3-next:80b\",\n        \"name\": \"qwen3-next:80b\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"glm-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"gemini-3-flash-preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"kimi-k2.6:cloud\": {\n        \"id\": \"kimi-k2.6:cloud\",\n        \"name\": \"kimi-k2.6:cloud\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"deepseek-v4-flash\": {\n        \"id\": \"deepseek-v4-flash\",\n        \"name\": \"deepseek-v4-flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 1048576, \"output\": 1048576 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"kimi-k2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"minimax-m2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"ministral-3:8b\": {\n        \"id\": \"ministral-3:8b\",\n        \"name\": \"ministral-3:8b\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 128000 }\n      },\n      \"gpt-oss:120b\": {\n        \"id\": \"gpt-oss:120b\",\n        \"name\": \"gpt-oss:120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen3-vl:235b\": {\n        \"id\": \"qwen3-vl:235b\",\n        \"name\": \"qwen3-vl:235b\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"gemma3:27b\": {\n        \"id\": \"gemma3:27b\",\n        \"name\": \"gemma3:27b\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-07-27\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen3-coder-next\": {\n        \"id\": \"qwen3-coder-next\",\n        \"name\": \"qwen3-coder-next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-02-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"minimax-m2.1\": {\n        \"id\": \"minimax-m2.1\",\n        \"name\": \"minimax-m2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"qwen3.5:397b\": {\n        \"id\": \"qwen3.5:397b\",\n        \"name\": \"qwen3.5:397b\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 81920 }\n      },\n      \"minimax-m2.7\": {\n        \"id\": \"minimax-m2.7\",\n        \"name\": \"minimax-m2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gemma4:31b\": {\n        \"id\": \"gemma4:31b\",\n        \"name\": \"gemma4:31b\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"devstral-2:123b\": {\n        \"id\": \"devstral-2:123b\",\n        \"name\": \"devstral-2:123b\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      }\n    }\n  },\n  \"vercel\": {\n    \"id\": \"vercel\",\n    \"env\": [\"AI_GATEWAY_API_KEY\"],\n    \"npm\": \"@ai-sdk/gateway\",\n    \"name\": \"Vercel AI Gateway\",\n    \"doc\": \"https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway\",\n    \"models\": {\n      \"meta/llama-3.2-3b\": {\n        \"id\": \"meta/llama-3.2-3b\",\n        \"name\": \"Llama 3.2 3B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2024-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/llama-3.2-90b\": {\n        \"id\": \"meta/llama-3.2-90b\",\n        \"name\": \"Llama 3.2 90B Vision Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.72, \"output\": 0.72 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/llama-3.1-8b\": {\n        \"id\": \"meta/llama-3.1-8b\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.03, \"output\": 0.05 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta/llama-3.2-11b\": {\n        \"id\": \"meta/llama-3.2-11b\",\n        \"name\": \"Llama 3.2 11B Vision Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.16, \"output\": 0.16 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/llama-3.2-1b\": {\n        \"id\": \"meta/llama-3.2-1b\",\n        \"name\": \"Llama 3.2 1B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2024-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/llama-3.1-70b\": {\n        \"id\": \"meta/llama-3.1-70b\",\n        \"name\": \"Llama 3.1 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta/llama-3.3-70b\": {\n        \"id\": \"meta/llama-3.3-70b\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-4-maverick\": {\n        \"id\": \"meta/llama-4-maverick\",\n        \"name\": \"Llama-4-Maverick-17B-128E-Instruct-FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta/llama-4-scout\": {\n        \"id\": \"meta/llama-4-scout\",\n        \"name\": \"Llama-4-Scout-17B-16E-Instruct-FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"cohere/command-a\": {\n        \"id\": \"cohere/command-a\",\n        \"name\": \"Command A\",\n        \"family\": \"command\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"output\": 8000 }\n      },\n      \"cohere/embed-v4.0\": {\n        \"id\": \"cohere/embed-v4.0\",\n        \"name\": \"Embed v4.0\",\n        \"family\": \"cohere-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"bfl/flux-kontext-max\": {\n        \"id\": \"bfl/flux-kontext-max\",\n        \"name\": \"FLUX.1 Kontext Max\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-06\",\n        \"last_updated\": \"2025-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 512, \"output\": 0 }\n      },\n      \"bfl/flux-kontext-pro\": {\n        \"id\": \"bfl/flux-kontext-pro\",\n        \"name\": \"FLUX.1 Kontext Pro\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-06\",\n        \"last_updated\": \"2025-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 512, \"output\": 0 }\n      },\n      \"bfl/flux-pro-1.1-ultra\": {\n        \"id\": \"bfl/flux-pro-1.1-ultra\",\n        \"name\": \"FLUX1.1 [pro] Ultra\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-11\",\n        \"last_updated\": \"2024-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 512, \"output\": 0 }\n      },\n      \"bfl/flux-pro-1.1\": {\n        \"id\": \"bfl/flux-pro-1.1\",\n        \"name\": \"FLUX1.1 [pro]\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-10\",\n        \"last_updated\": \"2024-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 512, \"output\": 0 }\n      },\n      \"bfl/flux-pro-1.0-fill\": {\n        \"id\": \"bfl/flux-pro-1.0-fill\",\n        \"name\": \"FLUX.1 Fill [pro]\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-10\",\n        \"last_updated\": \"2024-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 512, \"output\": 0 }\n      },\n      \"bytedance/seed-1.8\": {\n        \"id\": \"bytedance/seed-1.8\",\n        \"name\": \"Seed 1.8\",\n        \"family\": \"seed\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-10\",\n        \"last_updated\": \"2025-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"bytedance/seed-1.6\": {\n        \"id\": \"bytedance/seed-1.6\",\n        \"name\": \"Seed 1.6\",\n        \"family\": \"seed\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"morph/morph-v3-large\": {\n        \"id\": \"morph/morph-v3-large\",\n        \"name\": \"Morph v3 Large\",\n        \"family\": \"morph\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-15\",\n        \"last_updated\": \"2024-08-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.9, \"output\": 1.9 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"morph/morph-v3-fast\": {\n        \"id\": \"morph/morph-v3-fast\",\n        \"name\": \"Morph v3 Fast\",\n        \"family\": \"morph\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-08-15\",\n        \"last_updated\": \"2024-08-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 1.2 },\n        \"limit\": { \"context\": 16000, \"output\": 16000 }\n      },\n      \"nvidia/nemotron-nano-12b-v2-vl\": {\n        \"id\": \"nvidia/nemotron-nano-12b-v2-vl\",\n        \"name\": \"Nvidia Nemotron Nano 12B V2 VL\",\n        \"family\": \"nemotron\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12\",\n        \"last_updated\": \"2024-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nvidia/nemotron-3-super-120b-a12b\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b\",\n        \"name\": \"NVIDIA Nemotron 3 Super 120B A12B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.65 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"nvidia/nemotron-nano-9b-v2\": {\n        \"id\": \"nvidia/nemotron-nano-9b-v2\",\n        \"name\": \"Nvidia Nemotron Nano 9B V2\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-18\",\n        \"last_updated\": \"2025-08-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.16 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nvidia/nemotron-3-nano-30b-a3b\": {\n        \"id\": \"nvidia/nemotron-3-nano-30b-a3b\",\n        \"name\": \"Nemotron 3 Nano 30B A3B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12\",\n        \"last_updated\": \"2024-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2-thinking-turbo\": {\n        \"id\": \"moonshotai/kimi-k2-thinking-turbo\",\n        \"name\": \"Kimi K2 Thinking Turbo\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.15, \"output\": 8, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262114, \"output\": 262114 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.47, \"output\": 2, \"cache_read\": 0.14 },\n        \"limit\": { \"context\": 216144, \"output\": 216144 }\n      },\n      \"moonshotai/kimi-k2-turbo\": {\n        \"id\": \"moonshotai/kimi-k2-turbo\",\n        \"name\": \"Kimi K2 Turbo\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.4, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"moonshotai/kimi-k2-0905\": {\n        \"id\": \"moonshotai/kimi-k2-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-26\",\n        \"last_updated\": \"2026-01-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2.6\": {\n        \"id\": \"moonshotai/kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"moonshotai/kimi-k2\": {\n        \"id\": \"moonshotai/kimi-k2\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-14\",\n        \"last_updated\": \"2025-07-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 },\n        \"status\": \"deprecated\"\n      },\n      \"vercel/v0-1.0-md\": {\n        \"id\": \"vercel/v0-1.0-md\",\n        \"name\": \"v0-1.0-md\",\n        \"family\": \"v0\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"vercel/v0-1.5-md\": {\n        \"id\": \"vercel/v0-1.5-md\",\n        \"name\": \"v0-1.5-md\",\n        \"family\": \"v0\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-09\",\n        \"last_updated\": \"2025-06-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"anthropic/claude-3.5-sonnet-20240620\": {\n        \"id\": \"anthropic/claude-3.5-sonnet-20240620\",\n        \"name\": \"Claude 3.5 Sonnet (2024-06-20)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-06-20\",\n        \"last_updated\": \"2024-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4.6\": {\n        \"id\": \"anthropic/claude-opus-4.6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02\",\n        \"last_updated\": \"2026-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-haiku-4.5\": {\n        \"id\": \"anthropic/claude-haiku-4.5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4.5\": {\n        \"id\": \"anthropic/claude-opus-4.5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4.7\": {\n        \"id\": \"anthropic/claude-opus-4.7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4.6\": {\n        \"id\": \"anthropic/claude-sonnet-4.6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-3-haiku\": {\n        \"id\": \"anthropic/claude-3-haiku\",\n        \"name\": \"Claude Haiku 3\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-03-13\",\n        \"last_updated\": \"2024-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.25,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"anthropic/claude-3-opus\": {\n        \"id\": \"anthropic/claude-3-opus\",\n        \"name\": \"Claude Opus 3\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-02-29\",\n        \"last_updated\": \"2024-02-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"anthropic/claude-sonnet-4.5\": {\n        \"id\": \"anthropic/claude-sonnet-4.5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-3.7-sonnet\": {\n        \"id\": \"anthropic/claude-3.7-sonnet\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-31\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-3.5-sonnet\": {\n        \"id\": \"anthropic/claude-3.5-sonnet\",\n        \"name\": \"Claude Sonnet 3.5 v2\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4\": {\n        \"id\": \"anthropic/claude-opus-4\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-opus-4.1\": {\n        \"id\": \"anthropic/claude-opus-4.1\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-3.5-haiku\": {\n        \"id\": \"anthropic/claude-3.5-haiku\",\n        \"name\": \"Claude Haiku 3.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"xai/grok-4.1-fast-non-reasoning\": {\n        \"id\": \"xai/grok-4.1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast Non-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"xai/grok-4.20-non-reasoning-beta\": {\n        \"id\": \"xai/grok-4.20-non-reasoning-beta\",\n        \"name\": \"Grok 4.20 Beta Non-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"xai/grok-4.20-multi-agent-beta\": {\n        \"id\": \"xai/grok-4.20-multi-agent-beta\",\n        \"name\": \"Grok 4.20 Multi Agent Beta\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"xai/grok-4-fast-reasoning\": {\n        \"id\": \"xai/grok-4-fast-reasoning\",\n        \"name\": \"Grok 4 Fast Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 256000 }\n      },\n      \"xai/grok-4.20-multi-agent\": {\n        \"id\": \"xai/grok-4.20-multi-agent\",\n        \"name\": \"Grok 4.20 Multi-Agent\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"xai/grok-4.1-fast-reasoning\": {\n        \"id\": \"xai/grok-4.1-fast-reasoning\",\n        \"name\": \"Grok 4.1 Fast Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"xai/grok-4.20-non-reasoning\": {\n        \"id\": \"xai/grok-4.20-non-reasoning\",\n        \"name\": \"Grok 4.20 Non-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"xai/grok-4.20-reasoning\": {\n        \"id\": \"xai/grok-4.20-reasoning\",\n        \"name\": \"Grok 4.20 Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"xai/grok-4.20-reasoning-beta\": {\n        \"id\": \"xai/grok-4.20-reasoning-beta\",\n        \"name\": \"Grok 4.20 Beta Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"xai/grok-imagine-image\": {\n        \"id\": \"xai/grok-imagine-image\",\n        \"name\": \"Grok Imagine Image\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\", \"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"xai/grok-imagine-image-pro\": {\n        \"id\": \"xai/grok-imagine-image-pro\",\n        \"name\": \"Grok Imagine Image Pro\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\", \"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"xai/grok-3-mini-fast\": {\n        \"id\": \"xai/grok-3-mini-fast\",\n        \"name\": \"Grok 3 Mini Fast\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 4,\n          \"reasoning\": 4,\n          \"cache_read\": 0.15\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"xai/grok-4\": {\n        \"id\": \"xai/grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"reasoning\": 15,\n          \"cache_read\": 0.75\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"xai/grok-3\": {\n        \"id\": \"xai/grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"xai/grok-code-fast-1\": {\n        \"id\": \"xai/grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"xai/grok-3-mini\": {\n        \"id\": \"xai/grok-3-mini\",\n        \"name\": \"Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.5,\n          \"reasoning\": 0.5,\n          \"cache_read\": 0.075\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"xai/grok-3-fast\": {\n        \"id\": \"xai/grok-3-fast\",\n        \"name\": \"Grok 3 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"xai/grok-4-fast-non-reasoning\": {\n        \"id\": \"xai/grok-4-fast-non-reasoning\",\n        \"name\": \"Grok 4 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"xai/grok-2-vision\": {\n        \"id\": \"xai/grok-2-vision\",\n        \"name\": \"Grok 2 Vision\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10, \"cache_read\": 2 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 }\n      },\n      \"kwaipilot/kat-coder-pro-v2\": {\n        \"id\": \"kwaipilot/kat-coder-pro-v2\",\n        \"name\": \"Kat Coder Pro V2\",\n        \"family\": \"kat-coder\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"kwaipilot/kat-coder-pro-v1\": {\n        \"id\": \"kwaipilot/kat-coder-pro-v1\",\n        \"name\": \"KAT-Coder-Pro V1\",\n        \"family\": \"kat-coder\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-10-24\",\n        \"last_updated\": \"2025-10-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-v3.2\": {\n        \"id\": \"deepseek/deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.4, \"cache_read\": 0.22 },\n        \"limit\": { \"context\": 163842, \"output\": 8000 }\n      },\n      \"deepseek/deepseek-v4-pro\": {\n        \"id\": \"deepseek/deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"deepseek/deepseek-v3.2-thinking\": {\n        \"id\": \"deepseek/deepseek-v3.2-thinking\",\n        \"name\": \"DeepSeek V3.2 Thinking\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 0.42, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"deepseek/deepseek-v3.2-exp\": {\n        \"id\": \"deepseek/deepseek-v3.2-exp\",\n        \"name\": \"DeepSeek V3.2 Exp\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.4 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek/deepseek-v4-flash\": {\n        \"id\": \"deepseek/deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"deepseek/deepseek-v3.1\": {\n        \"id\": \"deepseek/deepseek-v3.1\",\n        \"name\": \"DeepSeek-V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1 },\n        \"limit\": { \"context\": 163840, \"output\": 128000 }\n      },\n      \"deepseek/deepseek-v3\": {\n        \"id\": \"deepseek/deepseek-v3\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2024-12-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.77, \"output\": 0.77 },\n        \"limit\": { \"context\": 163840, \"output\": 16384 }\n      },\n      \"deepseek/deepseek-v3.1-terminus\": {\n        \"id\": \"deepseek/deepseek-v3.1-terminus\",\n        \"name\": \"DeepSeek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-r1\": {\n        \"id\": \"deepseek/deepseek-r1\",\n        \"name\": \"DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-05-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"recraft/recraft-v2\": {\n        \"id\": \"recraft/recraft-v2\",\n        \"name\": \"Recraft V2\",\n        \"family\": \"recraft\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-03\",\n        \"last_updated\": \"2024-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 512, \"output\": 0 }\n      },\n      \"recraft/recraft-v3\": {\n        \"id\": \"recraft/recraft-v3\",\n        \"name\": \"Recraft V3\",\n        \"family\": \"recraft\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-10\",\n        \"last_updated\": \"2024-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 512, \"output\": 0 }\n      },\n      \"perplexity/sonar\": {\n        \"id\": \"perplexity/sonar\",\n        \"name\": \"Sonar\",\n        \"family\": \"sonar\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 127000, \"output\": 8000 }\n      },\n      \"perplexity/sonar-reasoning-pro\": {\n        \"id\": \"perplexity/sonar-reasoning-pro\",\n        \"name\": \"Sonar Reasoning Pro\",\n        \"family\": \"sonar-reasoning\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 127000, \"output\": 8000 }\n      },\n      \"perplexity/sonar-pro\": {\n        \"id\": \"perplexity/sonar-pro\",\n        \"name\": \"Sonar Pro\",\n        \"family\": \"sonar-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 8000 }\n      },\n      \"perplexity/sonar-reasoning\": {\n        \"id\": \"perplexity/sonar-reasoning\",\n        \"name\": \"Sonar Reasoning\",\n        \"family\": \"sonar-reasoning\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 127000, \"output\": 8000 }\n      },\n      \"xiaomi/mimo-v2-flash\": {\n        \"id\": \"xiaomi/mimo-v2-flash\",\n        \"name\": \"MiMo V2 Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.29 },\n        \"limit\": { \"context\": 262144, \"output\": 32000 }\n      },\n      \"xiaomi/mimo-v2-pro\": {\n        \"id\": \"xiaomi/mimo-v2-pro\",\n        \"name\": \"MiMo V2 Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 3, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"meituan/longcat-flash-chat\": {\n        \"id\": \"meituan/longcat-flash-chat\",\n        \"name\": \"LongCat Flash Chat\",\n        \"family\": \"longcat\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-30\",\n        \"last_updated\": \"2025-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meituan/longcat-flash-thinking\": {\n        \"id\": \"meituan/longcat-flash-thinking\",\n        \"name\": \"LongCat Flash Thinking\",\n        \"family\": \"longcat\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 1.5 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meituan/longcat-flash-thinking-2601\": {\n        \"id\": \"meituan/longcat-flash-thinking-2601\",\n        \"name\": \"LongCat Flash Thinking 2601\",\n        \"family\": \"longcat\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-13\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"inception/mercury-edit-2\": {\n        \"id\": \"inception/mercury-edit-2\",\n        \"name\": \"Mercury Edit 2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"inception/mercury-coder-small\": {\n        \"id\": \"inception/mercury-coder-small\",\n        \"name\": \"Mercury Coder Small Beta\",\n        \"family\": \"mercury\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-26\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 32000, \"output\": 16384 }\n      },\n      \"inception/mercury-2\": {\n        \"id\": \"inception/mercury-2\",\n        \"name\": \"Mercury 2\",\n        \"family\": \"mercury\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 0.75,\n          \"cache_read\": 0.024999999999999998\n        },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"prime-intellect/intellect-3\": {\n        \"id\": \"prime-intellect/intellect-3\",\n        \"name\": \"INTELLECT 3\",\n        \"family\": \"intellect\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-11-26\",\n        \"last_updated\": \"2025-11-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2\": {\n        \"id\": \"minimax/minimax-m2\",\n        \"name\": \"MiniMax M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.27,\n          \"output\": 1.15,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.38\n        },\n        \"limit\": { \"context\": 262114, \"output\": 262114 }\n      },\n      \"minimax/minimax-m2.1-lightning\": {\n        \"id\": \"minimax/minimax-m2.1-lightning\",\n        \"name\": \"MiniMax M2.1 Lightning\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.4,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.38\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.7-highspeed\": {\n        \"id\": \"minimax/minimax-m2.7-highspeed\",\n        \"name\": \"MiniMax M2.7 High Speed\",\n        \"family\": \"minimax\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131100 }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131000 }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.38\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.7\": {\n        \"id\": \"minimax/minimax-m2.7\",\n        \"name\": \"Minimax M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131000 }\n      },\n      \"minimax/minimax-m2.5-highspeed\": {\n        \"id\": \"minimax/minimax-m2.5-highspeed\",\n        \"name\": \"MiniMax M2.5 High Speed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"arcee-ai/trinity-large-thinking\": {\n        \"id\": \"arcee-ai/trinity-large-thinking\",\n        \"name\": \"Trinity Large Thinking\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.8999999999999999 },\n        \"limit\": { \"context\": 262100, \"output\": 80000 }\n      },\n      \"arcee-ai/trinity-mini\": {\n        \"id\": \"arcee-ai/trinity-mini\",\n        \"name\": \"Trinity Mini\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12\",\n        \"last_updated\": \"2025-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"arcee-ai/trinity-large-preview\": {\n        \"id\": \"arcee-ai/trinity-large-preview\",\n        \"name\": \"Trinity Large Preview\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"zai/glm-5\": {\n        \"id\": \"zai/glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202800, \"output\": 131072 }\n      },\n      \"zai/glm-4.7\": {\n        \"id\": \"zai/glm-4.7\",\n        \"name\": \"GLM 4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.43, \"output\": 1.75, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 202752, \"output\": 120000 }\n      },\n      \"zai/glm-4.7-flashx\": {\n        \"id\": \"zai/glm-4.7-flashx\",\n        \"name\": \"GLM 4.7 FlashX\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"zai/glm-4.6\": {\n        \"id\": \"zai/glm-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 1.8 },\n        \"limit\": { \"context\": 200000, \"output\": 96000 }\n      },\n      \"zai/glm-5.1\": {\n        \"id\": \"zai/glm-5.1\",\n        \"name\": \"GLM 5.1\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 202752, \"output\": 202752 }\n      },\n      \"zai/glm-4.6v-flash\": {\n        \"id\": \"zai/glm-4.6v-flash\",\n        \"name\": \"GLM-4.6V-Flash\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 24000 }\n      },\n      \"zai/glm-4.6v\": {\n        \"id\": \"zai/glm-4.6v\",\n        \"name\": \"GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 128000, \"output\": 24000 }\n      },\n      \"zai/glm-4.5-air\": {\n        \"id\": \"zai/glm-4.5-air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 128000, \"output\": 96000 }\n      },\n      \"zai/glm-4.5v\": {\n        \"id\": \"zai/glm-4.5v\",\n        \"name\": \"GLM 4.5V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-11\",\n        \"last_updated\": \"2025-08-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"zai/glm-4.7-flash\": {\n        \"id\": \"zai/glm-4.7-flash\",\n        \"name\": \"GLM 4.7 Flash\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-13\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.39999999999999997 },\n        \"limit\": { \"context\": 200000, \"output\": 131000 }\n      },\n      \"zai/glm-5v-turbo\": {\n        \"id\": \"zai/glm-5v-turbo\",\n        \"name\": \"GLM 5V Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 4, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"zai/glm-5-turbo\": {\n        \"id\": \"zai/glm-5-turbo\",\n        \"name\": \"GLM 5 Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 4, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 202800, \"output\": 131100 }\n      },\n      \"zai/glm-4.5\": {\n        \"id\": \"zai/glm-4.5\",\n        \"name\": \"GLM 4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"alibaba/qwen3.6-plus\": {\n        \"id\": \"alibaba/qwen3.6-plus\",\n        \"name\": \"Qwen 3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.09999999999999999,\n          \"cache_write\": 0.625\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"alibaba/qwen3.5-plus\": {\n        \"id\": \"alibaba/qwen3.5-plus\",\n        \"name\": \"Qwen 3.5 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.4,\n          \"output\": 2.4,\n          \"cache_read\": 0.04,\n          \"cache_write\": 0.5\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"alibaba/qwen-3-30b\": {\n        \"id\": \"alibaba/qwen-3-30b\",\n        \"name\": \"Qwen3-30B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.08, \"output\": 0.29 },\n        \"limit\": { \"context\": 40960, \"output\": 16384 }\n      },\n      \"alibaba/qwen3-coder-plus\": {\n        \"id\": \"alibaba/qwen3-coder-plus\",\n        \"name\": \"Qwen3 Coder Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 1000000, \"output\": 1000000 }\n      },\n      \"alibaba/qwen3.5-flash\": {\n        \"id\": \"alibaba/qwen3.5-flash\",\n        \"name\": \"Qwen 3.5 Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.4,\n          \"cache_read\": 0.001,\n          \"cache_write\": 0.125\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"alibaba/qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"alibaba/qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3 Next 80B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-12\",\n        \"last_updated\": \"2025-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 1.1 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"alibaba/qwen3-max\": {\n        \"id\": \"alibaba/qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"alibaba/qwen-3-32b\": {\n        \"id\": \"alibaba/qwen-3-32b\",\n        \"name\": \"Qwen 3.32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 40960, \"output\": 16384 }\n      },\n      \"alibaba/qwen-3.6-max-preview\": {\n        \"id\": \"alibaba/qwen-3.6-max-preview\",\n        \"name\": \"Qwen 3.6 Max Preview\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 1.3,\n          \"output\": 7.8,\n          \"cache_read\": 0.26,\n          \"cache_write\": 1.625\n        },\n        \"limit\": { \"context\": 240000, \"output\": 64000 }\n      },\n      \"alibaba/qwen3-max-preview\": {\n        \"id\": \"alibaba/qwen3-max-preview\",\n        \"name\": \"Qwen3 Max Preview\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"alibaba/qwen3-vl-thinking\": {\n        \"id\": \"alibaba/qwen3-vl-thinking\",\n        \"name\": \"Qwen3 VL Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 8.4 },\n        \"limit\": { \"context\": 131072, \"output\": 129024 }\n      },\n      \"alibaba/qwen3-vl-instruct\": {\n        \"id\": \"alibaba/qwen3-vl-instruct\",\n        \"name\": \"Qwen3 VL Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.8 },\n        \"limit\": { \"context\": 131072, \"output\": 129024 }\n      },\n      \"alibaba/qwen-3-235b\": {\n        \"id\": \"alibaba/qwen-3-235b\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0.6 },\n        \"limit\": { \"context\": 40960, \"output\": 16384 }\n      },\n      \"alibaba/qwen3-embedding-4b\": {\n        \"id\": \"alibaba/qwen3-embedding-4b\",\n        \"name\": \"Qwen3 Embedding 4B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"alibaba/qwen3-embedding-8b\": {\n        \"id\": \"alibaba/qwen3-embedding-8b\",\n        \"name\": \"Qwen3 Embedding 8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"alibaba/qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"alibaba/qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3 Next 80B A3B Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-12\",\n        \"last_updated\": \"2025-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 1.5 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"alibaba/qwen3-coder\": {\n        \"id\": \"alibaba/qwen3-coder\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.38, \"output\": 1.53 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"alibaba/qwen3-max-thinking\": {\n        \"id\": \"alibaba/qwen3-max-thinking\",\n        \"name\": \"Qwen 3 Max Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.2, \"output\": 6, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"alibaba/qwen3-coder-next\": {\n        \"id\": \"alibaba/qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.2 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"alibaba/qwen3-235b-a22b-thinking\": {\n        \"id\": \"alibaba/qwen3-235b-a22b-thinking\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.9 },\n        \"limit\": { \"context\": 262114, \"output\": 262114 }\n      },\n      \"alibaba/qwen3-coder-30b-a3b\": {\n        \"id\": \"alibaba/qwen3-coder-30b-a3b\",\n        \"name\": \"Qwen 3 Coder 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.27 },\n        \"limit\": { \"context\": 160000, \"output\": 32768 }\n      },\n      \"alibaba/qwen3-embedding-0.6b\": {\n        \"id\": \"alibaba/qwen3-embedding-0.6b\",\n        \"name\": \"Qwen3 Embedding 0.6B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"alibaba/qwen-3-14b\": {\n        \"id\": \"alibaba/qwen-3-14b\",\n        \"name\": \"Qwen3-14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24 },\n        \"limit\": { \"context\": 40960, \"output\": 16384 }\n      },\n      \"voyage/voyage-law-2\": {\n        \"id\": \"voyage/voyage-law-2\",\n        \"name\": \"voyage-law-2\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-03\",\n        \"last_updated\": \"2024-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"voyage/voyage-finance-2\": {\n        \"id\": \"voyage/voyage-finance-2\",\n        \"name\": \"voyage-finance-2\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-03\",\n        \"last_updated\": \"2024-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"voyage/voyage-4-large\": {\n        \"id\": \"voyage/voyage-4-large\",\n        \"name\": \"voyage-4-large\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-06\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 32000, \"output\": 0 }\n      },\n      \"voyage/voyage-3-large\": {\n        \"id\": \"voyage/voyage-3-large\",\n        \"name\": \"voyage-3-large\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"voyage/voyage-4\": {\n        \"id\": \"voyage/voyage-4\",\n        \"name\": \"voyage-4\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-06\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 32000, \"output\": 0 }\n      },\n      \"voyage/voyage-3.5-lite\": {\n        \"id\": \"voyage/voyage-3.5-lite\",\n        \"name\": \"voyage-3.5-lite\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"voyage/voyage-3.5\": {\n        \"id\": \"voyage/voyage-3.5\",\n        \"name\": \"voyage-3.5\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"voyage/voyage-4-lite\": {\n        \"id\": \"voyage/voyage-4-lite\",\n        \"name\": \"voyage-4-lite\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-06\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 32000, \"output\": 0 }\n      },\n      \"voyage/voyage-code-3\": {\n        \"id\": \"voyage/voyage-code-3\",\n        \"name\": \"voyage-code-3\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"voyage/voyage-code-2\": {\n        \"id\": \"voyage/voyage-code-2\",\n        \"name\": \"voyage-code-2\",\n        \"family\": \"voyage\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-01\",\n        \"last_updated\": \"2024-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"openai/codex-mini\": {\n        \"id\": \"openai/codex-mini\",\n        \"name\": \"Codex Mini\",\n        \"family\": \"gpt-codex-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-05-16\",\n        \"last_updated\": \"2025-05-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 6, \"cache_read\": 0.38 },\n        \"limit\": { \"context\": 200000, \"input\": 100000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.4-pro\": {\n        \"id\": \"openai/gpt-5.4-pro\",\n        \"name\": \"GPT 5.4 Pro\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"openai/o3-pro\": {\n        \"id\": \"openai/o3-pro\",\n        \"name\": \"o3 Pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 20, \"output\": 80 },\n        \"limit\": { \"context\": 200000, \"input\": 100000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"GPT-5.1-Codex\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o-mini-search-preview\": {\n        \"id\": \"openai/gpt-4o-mini-search-preview\",\n        \"name\": \"GPT 4o Mini Search Preview\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"input\": 111616, \"output\": 16384 }\n      },\n      \"openai/gpt-5-chat\": {\n        \"id\": \"openai/gpt-5-chat\",\n        \"name\": \"GPT-5 Chat\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 128000, \"input\": 111616, \"output\": 16384 }\n      },\n      \"openai/gpt-5.1-codex-max\": {\n        \"id\": \"openai/gpt-5.1-codex-max\",\n        \"name\": \"GPT 5.1 Codex Max\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-pro\": {\n        \"id\": \"openai/gpt-5-pro\",\n        \"name\": \"GPT-5 pro\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"input\": 128000, \"output\": 272000 }\n      },\n      \"openai/gpt-5.1-instant\": {\n        \"id\": \"openai/gpt-5.1-instant\",\n        \"name\": \"GPT-5.1 Instant\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 128000, \"input\": 111616, \"output\": 16384 }\n      },\n      \"openai/gpt-oss-safeguard-20b\": {\n        \"id\": \"openai/gpt-oss-safeguard-20b\",\n        \"name\": \"gpt-oss-safeguard-20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.08, \"output\": 0.3, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 131072, \"input\": 65536, \"output\": 65536 }\n      },\n      \"openai/gpt-5.2-chat\": {\n        \"id\": \"openai/gpt-5.2-chat\",\n        \"name\": \"GPT-5.2 Chat\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.18 },\n        \"limit\": { \"context\": 128000, \"input\": 111616, \"output\": 16384 }\n      },\n      \"openai/gpt-5.4-mini\": {\n        \"id\": \"openai/gpt-5.4-mini\",\n        \"name\": \"GPT 5.4 Mini\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/o3-deep-research\": {\n        \"id\": \"openai/o3-deep-research\",\n        \"name\": \"o3-deep-research\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-06-26\",\n        \"last_updated\": \"2024-06-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 40, \"cache_read\": 2.5 },\n        \"limit\": { \"context\": 200000, \"input\": 100000, \"output\": 100000 }\n      },\n      \"openai/gpt-3.5-turbo\": {\n        \"id\": \"openai/gpt-3.5-turbo\",\n        \"name\": \"GPT-3.5 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-09\",\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 16385, \"input\": 12289, \"output\": 4096 }\n      },\n      \"openai/gpt-5.3-chat\": {\n        \"id\": \"openai/gpt-5.3-chat\",\n        \"name\": \"GPT-5.3 Chat\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"input\": 111616, \"output\": 16384 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai/text-embedding-3-large\": {\n        \"id\": \"openai/text-embedding-3-large\",\n        \"name\": \"text-embedding-3-large\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"input\": 6656, \"output\": 1536 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.18 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.3-codex\": {\n        \"id\": \"openai/gpt-5.3-codex\",\n        \"name\": \"GPT 5.3 Codex\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/text-embedding-ada-002\": {\n        \"id\": \"openai/text-embedding-ada-002\",\n        \"name\": \"text-embedding-ada-002\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2022-12-15\",\n        \"last_updated\": \"2022-12-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"input\": 6656, \"output\": 1536 }\n      },\n      \"openai/gpt-5.5\": {\n        \"id\": \"openai/gpt-5.5\",\n        \"name\": \"GPT 5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 30, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1000000, \"input\": 872000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"GPT-5.2-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12\",\n        \"last_updated\": \"2025-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/text-embedding-3-small\": {\n        \"id\": \"openai/text-embedding-3-small\",\n        \"name\": \"text-embedding-3-small\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"input\": 6656, \"output\": 1536 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"input\": 98304, \"output\": 32768 }\n      },\n      \"openai/gpt-5.2-pro\": {\n        \"id\": \"openai/gpt-5.2-pro\",\n        \"name\": \"GPT 5.2 \",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-3.5-turbo-instruct\": {\n        \"id\": \"openai/gpt-3.5-turbo-instruct\",\n        \"name\": \"GPT-3.5 Turbo Instruct\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-09\",\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 2 },\n        \"limit\": { \"context\": 8192, \"input\": 4096, \"output\": 4096 }\n      },\n      \"openai/gpt-5.5-pro\": {\n        \"id\": \"openai/gpt-5.5-pro\",\n        \"name\": \"GPT 5.5 Pro\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180 },\n        \"limit\": { \"context\": 1000000, \"input\": 872000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-codex-mini\": {\n        \"id\": \"openai/gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1 Codex mini\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-05-16\",\n        \"last_updated\": \"2025-05-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-thinking\": {\n        \"id\": \"openai/gpt-5.1-thinking\",\n        \"name\": \"GPT 5.1 Thinking\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"GPT 5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.4-nano\": {\n        \"id\": \"openai/gpt-5.4-nano\",\n        \"name\": \"GPT 5.4 Nano\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.19999999999999998,\n          \"output\": 1.25,\n          \"cache_read\": 0.02\n        },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5-nano\": {\n        \"id\": \"openai/gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1-nano\": {\n        \"id\": \"openai/gpt-4.1-nano\",\n        \"name\": \"GPT-4.1 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-4-turbo\": {\n        \"id\": \"openai/gpt-4-turbo\",\n        \"name\": \"GPT-4 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-5-codex\": {\n        \"id\": \"openai/gpt-5-codex\",\n        \"name\": \"GPT-5-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1-mini\": {\n        \"id\": \"openai/gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o\": {\n        \"id\": \"openai/gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o1\": {\n        \"id\": \"openai/o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"openai/o3\": {\n        \"id\": \"openai/o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o3-mini\": {\n        \"id\": \"openai/o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"amazon/nova-2-lite\": {\n        \"id\": \"amazon/nova-2-lite\",\n        \"name\": \"Nova 2 Lite\",\n        \"family\": \"nova\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 1000000 }\n      },\n      \"amazon/titan-embed-text-v2\": {\n        \"id\": \"amazon/titan-embed-text-v2\",\n        \"name\": \"Titan Text Embeddings V2\",\n        \"family\": \"titan-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-04\",\n        \"last_updated\": \"2024-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"amazon/nova-lite\": {\n        \"id\": \"amazon/nova-lite\",\n        \"name\": \"Nova Lite\",\n        \"family\": \"nova-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 300000, \"output\": 8192 }\n      },\n      \"amazon/nova-pro\": {\n        \"id\": \"amazon/nova-pro\",\n        \"name\": \"Nova Pro\",\n        \"family\": \"nova-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 300000, \"output\": 8192 }\n      },\n      \"amazon/nova-micro\": {\n        \"id\": \"amazon/nova-micro\",\n        \"name\": \"Nova Micro\",\n        \"family\": \"nova-micro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.035, \"output\": 0.14, \"cache_read\": 0.00875 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"google/gemini-2.5-flash-lite\": {\n        \"id\": \"google/gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-4-31b-it\": {\n        \"id\": \"google/gemma-4-31b-it\",\n        \"name\": \"Gemma 4 31B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.39999999999999997 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"google/gemini-2.5-flash-image\": {\n        \"id\": \"google/gemini-2.5-flash-image\",\n        \"name\": \"Nano Banana (Gemini 2.5 Flash Image)\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\", \"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"google/gemini-embedding-001\": {\n        \"id\": \"google/gemini-embedding-001\",\n        \"name\": \"Gemini Embedding 001\",\n        \"family\": \"gemini-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"google/gemini-3.1-flash-lite-preview\": {\n        \"id\": \"google/gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"family\": \"gemini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.5,\n          \"cache_read\": 0.025,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 65000 }\n      },\n      \"google/gemini-embedding-2\": {\n        \"id\": \"google/gemini-embedding-2\",\n        \"name\": \"Gemini Embedding 2\",\n        \"family\": \"gemini-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-10\",\n        \"last_updated\": \"2026-03-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"google/gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"google/gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview 09-25\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3-pro-preview\": {\n        \"id\": \"google/gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"google/gemini-3-pro-image\": {\n        \"id\": \"google/gemini-3-pro-image\",\n        \"name\": \"Nano Banana Pro (Gemini 3 Pro Image)\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\", \"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 120 },\n        \"limit\": { \"context\": 65536, \"output\": 32768 }\n      },\n      \"google/gemini-2.5-flash-preview-09-2025\": {\n        \"id\": \"google/gemini-2.5-flash-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Preview 09-25\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.383\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/text-multilingual-embedding-002\": {\n        \"id\": \"google/text-multilingual-embedding-002\",\n        \"name\": \"Text Multilingual Embedding 002\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-03\",\n        \"last_updated\": \"2024-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.03, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"google/gemini-3.1-flash-image-preview\": {\n        \"id\": \"google/gemini-3.1-flash-image-preview\",\n        \"name\": \"Gemini 3.1 Flash Image Preview (Nano Banana 2)\",\n        \"family\": \"gemini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"google/imagen-4.0-generate-001\": {\n        \"id\": \"google/imagen-4.0-generate-001\",\n        \"name\": \"Imagen 4\",\n        \"family\": \"imagen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/text-embedding-005\": {\n        \"id\": \"google/text-embedding-005\",\n        \"name\": \"Text Embedding 005\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2024-08\",\n        \"last_updated\": \"2024-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.03, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"google/gemini-3-flash\": {\n        \"id\": \"google/gemini-3-flash\",\n        \"name\": \"Gemini 3 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"google/imagen-4.0-fast-generate-001\": {\n        \"id\": \"google/imagen-4.0-fast-generate-001\",\n        \"name\": \"Imagen 4 Fast\",\n        \"family\": \"imagen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-06\",\n        \"last_updated\": \"2025-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/imagen-4.0-ultra-generate-001\": {\n        \"id\": \"google/imagen-4.0-ultra-generate-001\",\n        \"name\": \"Imagen 4 Ultra\",\n        \"family\": \"imagen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-24\",\n        \"last_updated\": \"2025-05-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 480, \"output\": 0 }\n      },\n      \"google/gemini-2.5-flash-image-preview\": {\n        \"id\": \"google/gemini-2.5-flash-image-preview\",\n        \"name\": \"Nano Banana Preview (Gemini 2.5 Flash Image Preview)\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\", \"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"google/gemini-3.1-pro-preview\": {\n        \"id\": \"google/gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"google/gemma-4-26b-a4b-it\": {\n        \"id\": \"google/gemma-4-26b-a4b-it\",\n        \"name\": \"Gemma 4 26B A4B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0.39999999999999997 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"google/gemini-2.0-flash-lite\": {\n        \"id\": \"google/gemini-2.0-flash-lite\",\n        \"name\": \"Gemini 2.0 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.125,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 15,\n            \"cache_read\": 0.25\n          }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-2.0-flash\": {\n        \"id\": \"google/gemini-2.0-flash\",\n        \"name\": \"Gemini 2.0 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.03,\n          \"input_audio\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"mistral/mistral-embed\": {\n        \"id\": \"mistral/mistral-embed\",\n        \"name\": \"Mistral Embed\",\n        \"family\": \"mistral-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-12-11\",\n        \"last_updated\": \"2023-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"mistral/mistral-large-3\": {\n        \"id\": \"mistral/mistral-large-3\",\n        \"name\": \"Mistral Large 3\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"mistral/ministral-14b\": {\n        \"id\": \"mistral/ministral-14b\",\n        \"name\": \"Ministral 14B\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"mistral/mistral-nemo\": {\n        \"id\": \"mistral/mistral-nemo\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.17 },\n        \"limit\": { \"context\": 60288, \"output\": 16000 }\n      },\n      \"mistral/mistral-medium\": {\n        \"id\": \"mistral/mistral-medium\",\n        \"name\": \"Mistral Medium 3.1\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"mistral/devstral-small\": {\n        \"id\": \"mistral/devstral-small\",\n        \"name\": \"Devstral Small 1.1\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"mistral/devstral-small-2\": {\n        \"id\": \"mistral/devstral-small-2\",\n        \"name\": \"Devstral Small 2\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"mistral/codestral-embed\": {\n        \"id\": \"mistral/codestral-embed\",\n        \"name\": \"Codestral Embed\",\n        \"family\": \"codestral-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"mistral/devstral-2\": {\n        \"id\": \"mistral/devstral-2\",\n        \"name\": \"Devstral 2\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"mistral/codestral\": {\n        \"id\": \"mistral/codestral\",\n        \"name\": \"Codestral (latest)\",\n        \"family\": \"codestral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-05-29\",\n        \"last_updated\": \"2025-01-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"output\": 4096 }\n      },\n      \"mistral/ministral-3b\": {\n        \"id\": \"mistral/ministral-3b\",\n        \"name\": \"Ministral 3B (latest)\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral/mixtral-8x22b-instruct\": {\n        \"id\": \"mistral/mixtral-8x22b-instruct\",\n        \"name\": \"Mixtral 8x22B\",\n        \"family\": \"mixtral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-17\",\n        \"last_updated\": \"2024-04-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 64000, \"output\": 64000 }\n      },\n      \"mistral/ministral-8b\": {\n        \"id\": \"mistral/ministral-8b\",\n        \"name\": \"Ministral 8B (latest)\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral/pixtral-large\": {\n        \"id\": \"mistral/pixtral-large\",\n        \"name\": \"Pixtral Large (latest)\",\n        \"family\": \"pixtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral/magistral-small\": {\n        \"id\": \"mistral/magistral-small\",\n        \"name\": \"Magistral Small\",\n        \"family\": \"magistral-small\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-03-17\",\n        \"last_updated\": \"2025-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral/magistral-medium\": {\n        \"id\": \"mistral/magistral-medium\",\n        \"name\": \"Magistral Medium (latest)\",\n        \"family\": \"magistral-medium\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-03-17\",\n        \"last_updated\": \"2025-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 5 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"mistral/pixtral-12b\": {\n        \"id\": \"mistral/pixtral-12b\",\n        \"name\": \"Pixtral 12B\",\n        \"family\": \"pixtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-09-01\",\n        \"last_updated\": \"2024-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral/mistral-small\": {\n        \"id\": \"mistral/mistral-small\",\n        \"name\": \"Mistral Small (latest)\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      }\n    }\n  },\n  \"xiaomi-token-plan-ams\": {\n    \"id\": \"xiaomi-token-plan-ams\",\n    \"env\": [\"XIAOMI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://token-plan-ams.xiaomimimo.com/v1\",\n    \"name\": \"Xiaomi Token Plan (Europe)\",\n    \"doc\": \"https://platform.xiaomimimo.com/#/docs\",\n    \"models\": {\n      \"mimo-v2-tts\": {\n        \"id\": \"mimo-v2-tts\",\n        \"name\": \"MiMo-V2-TTS\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8000, \"output\": 16000 }\n      },\n      \"mimo-v2-pro\": {\n        \"id\": \"mimo-v2-pro\",\n        \"name\": \"MiMo-V2-Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2-omni\": {\n        \"id\": \"mimo-v2-omni\",\n        \"name\": \"MiMo-V2-Omni\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"mimo-v2.5-pro\": {\n        \"id\": \"mimo-v2.5-pro\",\n        \"name\": \"MiMo-V2.5-Pro\",\n        \"family\": \"mimo-v2.5-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mimo-v2.5\": {\n        \"id\": \"mimo-v2.5\",\n        \"name\": \"MiMo-V2.5\",\n        \"family\": \"mimo-v2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      }\n    }\n  },\n  \"anthropic\": {\n    \"id\": \"anthropic\",\n    \"env\": [\"ANTHROPIC_API_KEY\"],\n    \"npm\": \"@ai-sdk/anthropic\",\n    \"name\": \"Anthropic\",\n    \"doc\": \"https://docs.anthropic.com/en/docs/about-claude/models\",\n    \"models\": {\n      \"claude-opus-4-20250514\": {\n        \"id\": \"claude-opus-4-20250514\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-3-sonnet-20240229\": {\n        \"id\": \"claude-3-sonnet-20240229\",\n        \"name\": \"Claude Sonnet 3\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-03-04\",\n        \"last_updated\": \"2024-03-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"claude-3-5-haiku-20241022\": {\n        \"id\": \"claude-3-5-haiku-20241022\",\n        \"name\": \"Claude Haiku 3.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"claude-opus-4-1-20250805\": {\n        \"id\": \"claude-opus-4-1-20250805\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-opus-4-0\": {\n        \"id\": \"claude-opus-4-0\",\n        \"name\": \"Claude Opus 4 (latest)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-opus-4-5\": {\n        \"id\": \"claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5 (latest)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-3-7-sonnet-20250219\": {\n        \"id\": \"claude-3-7-sonnet-20250219\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-31\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-3-haiku-20240307\": {\n        \"id\": \"claude-3-haiku-20240307\",\n        \"name\": \"Claude Haiku 3\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-03-13\",\n        \"last_updated\": \"2024-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.25,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-opus-4-1\": {\n        \"id\": \"claude-opus-4-1\",\n        \"name\": \"Claude Opus 4.1 (latest)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-sonnet-4-0\": {\n        \"id\": \"claude-sonnet-4-0\",\n        \"name\": \"Claude Sonnet 4 (latest)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 },\n        \"experimental\": {\n          \"modes\": {\n            \"fast\": {\n              \"cost\": {\n                \"input\": 30,\n                \"output\": 150,\n                \"cache_read\": 3,\n                \"cache_write\": 37.5\n              },\n              \"provider\": {\n                \"body\": { \"speed\": \"fast\" },\n                \"headers\": { \"anthropic-beta\": \"fast-mode-2026-02-01\" }\n              }\n            }\n          }\n        }\n      },\n      \"claude-3-5-haiku-latest\": {\n        \"id\": \"claude-3-5-haiku-latest\",\n        \"name\": \"Claude Haiku 3.5 (latest)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"claude-sonnet-4-20250514\": {\n        \"id\": \"claude-sonnet-4-20250514\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-opus-4-5-20251101\": {\n        \"id\": \"claude-opus-4-5-20251101\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-opus-4-7\": {\n        \"id\": \"claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5 (latest)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5 (latest)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-3-5-sonnet-20241022\": {\n        \"id\": \"claude-3-5-sonnet-20241022\",\n        \"name\": \"Claude Sonnet 3.5 v2\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"claude-3-opus-20240229\": {\n        \"id\": \"claude-3-opus-20240229\",\n        \"name\": \"Claude Opus 3\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-02-29\",\n        \"last_updated\": \"2024-02-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"claude-3-5-sonnet-20240620\": {\n        \"id\": \"claude-3-5-sonnet-20240620\",\n        \"name\": \"Claude Sonnet 3.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-06-20\",\n        \"last_updated\": \"2024-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      }\n    }\n  },\n  \"stepfun\": {\n    \"id\": \"stepfun\",\n    \"env\": [\"STEPFUN_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.stepfun.com/v1\",\n    \"name\": \"StepFun\",\n    \"doc\": \"https://platform.stepfun.com/docs/zh/overview/concept\",\n    \"models\": {\n      \"step-1-32k\": {\n        \"id\": \"step-1-32k\",\n        \"name\": \"Step 1 (32K)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.05, \"output\": 9.59, \"cache_read\": 0.41 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"step-3.5-flash\": {\n        \"id\": \"step-3.5-flash\",\n        \"name\": \"Step 3.5 Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.096, \"output\": 0.288, \"cache_read\": 0.019 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 256000 }\n      },\n      \"step-2-16k\": {\n        \"id\": \"step-2-16k\",\n        \"name\": \"Step 2 (16K)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5.21, \"output\": 16.44, \"cache_read\": 1.04 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"step-3.5-flash-2603\": {\n        \"id\": \"step-3.5-flash-2603\",\n        \"name\": \"Step 3.5 Flash 2603\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 256000 }\n      }\n    }\n  },\n  \"xai\": {\n    \"id\": \"xai\",\n    \"env\": [\"XAI_API_KEY\"],\n    \"npm\": \"@ai-sdk/xai\",\n    \"name\": \"xAI\",\n    \"doc\": \"https://docs.x.ai/docs/models\",\n    \"models\": {\n      \"grok-3-latest\": {\n        \"id\": \"grok-3-latest\",\n        \"name\": \"Grok 3 Latest\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-2-latest\": {\n        \"id\": \"grok-2-latest\",\n        \"name\": \"Grok 2 Latest\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-12-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10, \"cache_read\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-3-mini-fast-latest\": {\n        \"id\": \"grok-3-mini-fast-latest\",\n        \"name\": \"Grok 3 Mini Fast Latest\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 4,\n          \"reasoning\": 4,\n          \"cache_read\": 0.15\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-2-vision\": {\n        \"id\": \"grok-2-vision\",\n        \"name\": \"Grok 2 Vision\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10, \"cache_read\": 2 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 }\n      },\n      \"grok-4.20-multi-agent-0309\": {\n        \"id\": \"grok-4.20-multi-agent-0309\",\n        \"name\": \"Grok 4.20 Multi-Agent\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 6,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 12, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"Grok 4 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-3-fast\": {\n        \"id\": \"grok-3-fast\",\n        \"name\": \"Grok 3 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4.20-0309-non-reasoning\": {\n        \"id\": \"grok-4.20-0309-non-reasoning\",\n        \"name\": \"Grok 4.20 (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 6,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 12, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-vision-beta\": {\n        \"id\": \"grok-vision-beta\",\n        \"name\": \"Grok Vision Beta\",\n        \"family\": \"grok-vision\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 15, \"cache_read\": 5 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 }\n      },\n      \"grok-3-mini\": {\n        \"id\": \"grok-3-mini\",\n        \"name\": \"Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.5,\n          \"reasoning\": 0.5,\n          \"cache_read\": 0.075\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-4.20-0309-reasoning\": {\n        \"id\": \"grok-4.20-0309-reasoning\",\n        \"name\": \"Grok 4.20 (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-09\",\n        \"last_updated\": \"2026-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 6,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 12, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-beta\": {\n        \"id\": \"grok-beta\",\n        \"name\": \"Grok Beta\",\n        \"family\": \"grok-beta\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 15, \"cache_read\": 5 },\n        \"limit\": { \"context\": 131072, \"output\": 4096 }\n      },\n      \"grok-2-1212\": {\n        \"id\": \"grok-2-1212\",\n        \"name\": \"Grok 2 (1212)\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-12-12\",\n        \"last_updated\": \"2024-12-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10, \"cache_read\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"grok-3\": {\n        \"id\": \"grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4\": {\n        \"id\": \"grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"reasoning\": 15,\n          \"cache_read\": 0.75\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"grok-2-vision-1212\": {\n        \"id\": \"grok-2-vision-1212\",\n        \"name\": \"Grok 2 Vision (1212)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-12-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10, \"cache_read\": 2 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 }\n      },\n      \"grok-3-fast-latest\": {\n        \"id\": \"grok-3-fast-latest\",\n        \"name\": \"Grok 3 Fast Latest\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4-fast\": {\n        \"id\": \"grok-4-fast\",\n        \"name\": \"Grok 4 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-3-mini-latest\": {\n        \"id\": \"grok-3-mini-latest\",\n        \"name\": \"Grok 3 Mini Latest\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.5,\n          \"reasoning\": 0.5,\n          \"cache_read\": 0.075\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-2\": {\n        \"id\": \"grok-2\",\n        \"name\": \"Grok 2\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10, \"cache_read\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4-1-fast\": {\n        \"id\": \"grok-4-1-fast\",\n        \"name\": \"Grok 4.1 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-3-mini-fast\": {\n        \"id\": \"grok-3-mini-fast\",\n        \"name\": \"Grok 3 Mini Fast\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 4,\n          \"reasoning\": 4,\n          \"cache_read\": 0.15\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-2-vision-latest\": {\n        \"id\": \"grok-2-vision-latest\",\n        \"name\": \"Grok 2 Vision Latest\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-12-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10, \"cache_read\": 2 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 }\n      }\n    }\n  },\n  \"amazon-bedrock\": {\n    \"id\": \"amazon-bedrock\",\n    \"env\": [\n      \"AWS_ACCESS_KEY_ID\",\n      \"AWS_SECRET_ACCESS_KEY\",\n      \"AWS_REGION\",\n      \"AWS_BEARER_TOKEN_BEDROCK\"\n    ],\n    \"npm\": \"@ai-sdk/amazon-bedrock\",\n    \"name\": \"Amazon Bedrock\",\n    \"doc\": \"https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html\",\n    \"models\": {\n      \"mistral.ministral-3-3b-instruct\": {\n        \"id\": \"mistral.ministral-3-3b-instruct\",\n        \"name\": \"Ministral 3 3B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"minimax.minimax-m2\": {\n        \"id\": \"minimax.minimax-m2\",\n        \"name\": \"MiniMax M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204608, \"output\": 128000 }\n      },\n      \"openai.gpt-oss-20b-1:0\": {\n        \"id\": \"openai.gpt-oss-20b-1:0\",\n        \"name\": \"gpt-oss-20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"anthropic.claude-3-5-sonnet-20241022-v2:0\": {\n        \"id\": \"anthropic.claude-3-5-sonnet-20241022-v2:0\",\n        \"name\": \"Claude Sonnet 3.5 v2\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"qwen.qwen3-next-80b-a3b\": {\n        \"id\": \"qwen.qwen3-next-80b-a3b\",\n        \"name\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 1.4 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"mistral.ministral-3-8b-instruct\": {\n        \"id\": \"mistral.ministral-3-8b-instruct\",\n        \"name\": \"Ministral 3 8B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta.llama3-1-70b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-1-70b-instruct-v1:0\",\n        \"name\": \"Llama 3.1 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.72, \"output\": 0.72 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistral.pixtral-large-2502-v1:0\": {\n        \"id\": \"mistral.pixtral-large-2502-v1:0\",\n        \"name\": \"Pixtral Large (25.02)\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-08\",\n        \"last_updated\": \"2025-04-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"google.gemma-3-4b-it\": {\n        \"id\": \"google.gemma-3-4b-it\",\n        \"name\": \"Gemma 3 4B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"anthropic.claude-sonnet-4-5-20250929-v1:0\": {\n        \"id\": \"anthropic.claude-sonnet-4-5-20250929-v1:0\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"deepseek.v3-v1:0\": {\n        \"id\": \"deepseek.v3-v1:0\",\n        \"name\": \"DeepSeek-V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.58, \"output\": 1.68 },\n        \"limit\": { \"context\": 163840, \"output\": 81920 }\n      },\n      \"anthropic.claude-haiku-4-5-20251001-v1:0\": {\n        \"id\": \"anthropic.claude-haiku-4-5-20251001-v1:0\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"mistral.voxtral-small-24b-2507\": {\n        \"id\": \"mistral.voxtral-small-24b-2507\",\n        \"name\": \"Voxtral Small 24B 2507\",\n        \"family\": \"mistral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\", \"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.35 },\n        \"limit\": { \"context\": 32000, \"output\": 8192 }\n      },\n      \"meta.llama3-1-405b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-1-405b-instruct-v1:0\",\n        \"name\": \"Llama 3.1 405B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.4, \"output\": 2.4 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"eu.anthropic.claude-opus-4-7\": {\n        \"id\": \"eu.anthropic.claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7 (EU)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"mistral.devstral-2-123b\": {\n        \"id\": \"mistral.devstral-2-123b\",\n        \"name\": \"Devstral 2 123B\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"au.anthropic.claude-sonnet-4-6\": {\n        \"id\": \"au.anthropic.claude-sonnet-4-6\",\n        \"name\": \"AU Anthropic Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3.3,\n          \"output\": 16.5,\n          \"cache_read\": 0.33,\n          \"cache_write\": 4.125\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"amazon.nova-2-lite-v1:0\": {\n        \"id\": \"amazon.nova-2-lite-v1:0\",\n        \"name\": \"Nova 2 Lite\",\n        \"family\": \"nova\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.33, \"output\": 2.75 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai.gpt-oss-safeguard-120b\": {\n        \"id\": \"openai.gpt-oss-safeguard-120b\",\n        \"name\": \"GPT OSS Safeguard 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"us.anthropic.claude-opus-4-7\": {\n        \"id\": \"us.anthropic.claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7 (US)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"deepseek.v3.2\": {\n        \"id\": \"deepseek.v3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-02-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.62, \"output\": 1.85 },\n        \"limit\": { \"context\": 163840, \"output\": 81920 }\n      },\n      \"eu.anthropic.claude-opus-4-5-20251101-v1:0\": {\n        \"id\": \"eu.anthropic.claude-opus-4-5-20251101-v1:0\",\n        \"name\": \"Claude Opus 4.5 (EU)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"moonshotai.kimi-k2.5\": {\n        \"id\": \"moonshotai.kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-02-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"amazon.nova-micro-v1:0\": {\n        \"id\": \"amazon.nova-micro-v1:0\",\n        \"name\": \"Nova Micro\",\n        \"family\": \"nova-micro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.035, \"output\": 0.14, \"cache_read\": 0.00875 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"anthropic.claude-opus-4-5-20251101-v1:0\": {\n        \"id\": \"anthropic.claude-opus-4-5-20251101-v1:0\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"meta.llama3-3-70b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-3-70b-instruct-v1:0\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.72, \"output\": 0.72 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"us.anthropic.claude-haiku-4-5-20251001-v1:0\": {\n        \"id\": \"us.anthropic.claude-haiku-4-5-20251001-v1:0\",\n        \"name\": \"Claude Haiku 4.5 (US)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"eu.anthropic.claude-sonnet-4-5-20250929-v1:0\": {\n        \"id\": \"eu.anthropic.claude-sonnet-4-5-20250929-v1:0\",\n        \"name\": \"Claude Sonnet 4.5 (EU)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"meta.llama3-2-11b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-2-11b-instruct-v1:0\",\n        \"name\": \"Llama 3.2 11B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.16, \"output\": 0.16 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"writer.palmyra-x5-v1:0\": {\n        \"id\": \"writer.palmyra-x5-v1:0\",\n        \"name\": \"Palmyra X5\",\n        \"family\": \"palmyra\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 6 },\n        \"limit\": { \"context\": 1040000, \"output\": 8192 }\n      },\n      \"meta.llama4-scout-17b-instruct-v1:0\": {\n        \"id\": \"meta.llama4-scout-17b-instruct-v1:0\",\n        \"name\": \"Llama 4 Scout 17B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.66 },\n        \"limit\": { \"context\": 3500000, \"output\": 16384 }\n      },\n      \"zai.glm-5\": {\n        \"id\": \"zai.glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2 },\n        \"limit\": { \"context\": 202752, \"output\": 101376 }\n      },\n      \"eu.anthropic.claude-haiku-4-5-20251001-v1:0\": {\n        \"id\": \"eu.anthropic.claude-haiku-4-5-20251001-v1:0\",\n        \"name\": \"Claude Haiku 4.5 (EU)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"us.anthropic.claude-sonnet-4-5-20250929-v1:0\": {\n        \"id\": \"us.anthropic.claude-sonnet-4-5-20250929-v1:0\",\n        \"name\": \"Claude Sonnet 4.5 (US)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"deepseek.r1-v1:0\": {\n        \"id\": \"deepseek.r1-v1:0\",\n        \"name\": \"DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-05-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"global.anthropic.claude-sonnet-4-5-20250929-v1:0\": {\n        \"id\": \"global.anthropic.claude-sonnet-4-5-20250929-v1:0\",\n        \"name\": \"Claude Sonnet 4.5 (Global)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"amazon.nova-pro-v1:0\": {\n        \"id\": \"amazon.nova-pro-v1:0\",\n        \"name\": \"Nova Pro\",\n        \"family\": \"nova-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 300000, \"output\": 8192 }\n      },\n      \"qwen.qwen3-coder-next\": {\n        \"id\": \"qwen.qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-02-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 1.8 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"zai.glm-4.7\": {\n        \"id\": \"zai.glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"meta.llama3-2-90b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-2-90b-instruct-v1:0\",\n        \"name\": \"Llama 3.2 90B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.72, \"output\": 0.72 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia.nemotron-nano-3-30b\": {\n        \"id\": \"nvidia.nemotron-nano-3-30b\",\n        \"name\": \"NVIDIA Nemotron Nano 3 30B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen.qwen3-32b-v1:0\": {\n        \"id\": \"qwen.qwen3-32b-v1:0\",\n        \"name\": \"Qwen3 32B (dense)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"moonshot.kimi-k2-thinking\": {\n        \"id\": \"moonshot.kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"global.anthropic.claude-opus-4-7\": {\n        \"id\": \"global.anthropic.claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7 (Global)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic.claude-3-7-sonnet-20250219-v1:0\": {\n        \"id\": \"anthropic.claude-3-7-sonnet-20250219-v1:0\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"us.anthropic.claude-opus-4-5-20251101-v1:0\": {\n        \"id\": \"us.anthropic.claude-opus-4-5-20251101-v1:0\",\n        \"name\": \"Claude Opus 4.5 (US)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"google.gemma-3-27b-it\": {\n        \"id\": \"google.gemma-3-27b-it\",\n        \"name\": \"Google Gemma 3 27B Instruct\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-27\",\n        \"last_updated\": \"2025-07-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 8192 }\n      },\n      \"zai.glm-4.7-flash\": {\n        \"id\": \"zai.glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.4 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"meta.llama3-2-3b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-2-3b-instruct-v1:0\",\n        \"name\": \"Llama 3.2 3B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 131000, \"output\": 4096 }\n      },\n      \"qwen.qwen3-vl-235b-a22b\": {\n        \"id\": \"qwen.qwen3-vl-235b-a22b\",\n        \"name\": \"Qwen/Qwen3-VL-235B-A22B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"nvidia.nemotron-super-3-120b\": {\n        \"id\": \"nvidia.nemotron-super-3-120b\",\n        \"name\": \"NVIDIA Nemotron 3 Super 120B A12B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.65 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"mistral.mistral-large-3-675b-instruct\": {\n        \"id\": \"mistral.mistral-large-3-675b-instruct\",\n        \"name\": \"Mistral Large 3\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"writer.palmyra-x4-v1:0\": {\n        \"id\": \"writer.palmyra-x4-v1:0\",\n        \"name\": \"Palmyra X4\",\n        \"family\": \"palmyra\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 122880, \"output\": 8192 }\n      },\n      \"global.anthropic.claude-opus-4-5-20251101-v1:0\": {\n        \"id\": \"global.anthropic.claude-opus-4-5-20251101-v1:0\",\n        \"name\": \"Claude Opus 4.5 (Global)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"qwen.qwen3-235b-a22b-2507-v1:0\": {\n        \"id\": \"qwen.qwen3-235b-a22b-2507-v1:0\",\n        \"name\": \"Qwen3 235B A22B 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.88 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"mistral.magistral-small-2509\": {\n        \"id\": \"mistral.magistral-small-2509\",\n        \"name\": \"Magistral Small 1.2\",\n        \"family\": \"magistral\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 128000, \"output\": 40000 }\n      },\n      \"meta.llama4-maverick-17b-instruct-v1:0\": {\n        \"id\": \"meta.llama4-maverick-17b-instruct-v1:0\",\n        \"name\": \"Llama 4 Maverick 17B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.24, \"output\": 0.97 },\n        \"limit\": { \"context\": 1000000, \"output\": 16384 }\n      },\n      \"anthropic.claude-opus-4-7\": {\n        \"id\": \"anthropic.claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"au.anthropic.claude-opus-4-6-v1\": {\n        \"id\": \"au.anthropic.claude-opus-4-6-v1\",\n        \"name\": \"AU Anthropic Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 16.5,\n          \"output\": 82.5,\n          \"cache_read\": 1.65,\n          \"cache_write\": 20.625\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"meta.llama3-2-1b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-2-1b-instruct-v1:0\",\n        \"name\": \"Llama 3.2 1B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131000, \"output\": 4096 }\n      },\n      \"amazon.nova-premier-v1:0\": {\n        \"id\": \"amazon.nova-premier-v1:0\",\n        \"name\": \"Nova Premier\",\n        \"family\": \"nova\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 12.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 16384 }\n      },\n      \"mistral.ministral-3-14b-instruct\": {\n        \"id\": \"mistral.ministral-3-14b-instruct\",\n        \"name\": \"Ministral 14B 3.0\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"anthropic.claude-3-haiku-20240307-v1:0\": {\n        \"id\": \"anthropic.claude-3-haiku-20240307-v1:0\",\n        \"name\": \"Claude Haiku 3\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-02\",\n        \"release_date\": \"2024-03-13\",\n        \"last_updated\": \"2024-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1.25 },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"qwen.qwen3-coder-30b-a3b-v1:0\": {\n        \"id\": \"qwen.qwen3-coder-30b-a3b-v1:0\",\n        \"name\": \"Qwen3 Coder 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"google.gemma-3-12b-it\": {\n        \"id\": \"google.gemma-3-12b-it\",\n        \"name\": \"Google Gemma 3 12B\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.049999999999999996,\n          \"output\": 0.09999999999999999\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"minimax.minimax-m2.5\": {\n        \"id\": \"minimax.minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 196608, \"output\": 98304 }\n      },\n      \"qwen.qwen3-coder-480b-a35b-v1:0\": {\n        \"id\": \"qwen.qwen3-coder-480b-a35b-v1:0\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 1.8 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"minimax.minimax-m2.1\": {\n        \"id\": \"minimax.minimax-m2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"mistral.voxtral-mini-3b-2507\": {\n        \"id\": \"mistral.voxtral-mini-3b-2507\",\n        \"name\": \"Voxtral Mini 3B 2507\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"audio\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"amazon.nova-lite-v1:0\": {\n        \"id\": \"amazon.nova-lite-v1:0\",\n        \"name\": \"Nova Lite\",\n        \"family\": \"nova-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 300000, \"output\": 8192 }\n      },\n      \"openai.gpt-oss-120b-1:0\": {\n        \"id\": \"openai.gpt-oss-120b-1:0\",\n        \"name\": \"gpt-oss-120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia.nemotron-nano-9b-v2\": {\n        \"id\": \"nvidia.nemotron-nano-9b-v2\",\n        \"name\": \"NVIDIA Nemotron Nano 9B v2\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.23 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai.gpt-oss-safeguard-20b\": {\n        \"id\": \"openai.gpt-oss-safeguard-20b\",\n        \"name\": \"GPT OSS Safeguard 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"nvidia.nemotron-nano-12b-v2\": {\n        \"id\": \"nvidia.nemotron-nano-12b-v2\",\n        \"name\": \"NVIDIA Nemotron Nano 12B v2 VL BF16\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"global.anthropic.claude-haiku-4-5-20251001-v1:0\": {\n        \"id\": \"global.anthropic.claude-haiku-4-5-20251001-v1:0\",\n        \"name\": \"Claude Haiku 4.5 (Global)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"meta.llama3-1-8b-instruct-v1:0\": {\n        \"id\": \"meta.llama3-1-8b-instruct-v1:0\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.22 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"global.anthropic.claude-opus-4-6-v1\": {\n        \"id\": \"global.anthropic.claude-opus-4-6-v1\",\n        \"name\": \"Claude Opus 4.6 (Global)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"us.anthropic.claude-opus-4-20250514-v1:0\": {\n        \"id\": \"us.anthropic.claude-opus-4-20250514-v1:0\",\n        \"name\": \"Claude Opus 4 (US)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"us.anthropic.claude-opus-4-1-20250805-v1:0\": {\n        \"id\": \"us.anthropic.claude-opus-4-1-20250805-v1:0\",\n        \"name\": \"Claude Opus 4.1 (US)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"eu.anthropic.claude-sonnet-4-20250514-v1:0\": {\n        \"id\": \"eu.anthropic.claude-sonnet-4-20250514-v1:0\",\n        \"name\": \"Claude Sonnet 4 (EU)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic.claude-opus-4-1-20250805-v1:0\": {\n        \"id\": \"anthropic.claude-opus-4-1-20250805-v1:0\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"eu.anthropic.claude-opus-4-6-v1\": {\n        \"id\": \"eu.anthropic.claude-opus-4-6-v1\",\n        \"name\": \"Claude Opus 4.6 (EU)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic.claude-opus-4-20250514-v1:0\": {\n        \"id\": \"anthropic.claude-opus-4-20250514-v1:0\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"us.anthropic.claude-sonnet-4-6\": {\n        \"id\": \"us.anthropic.claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6 (US)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"global.anthropic.claude-sonnet-4-6\": {\n        \"id\": \"global.anthropic.claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6 (Global)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"anthropic.claude-sonnet-4-6\": {\n        \"id\": \"anthropic.claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"global.anthropic.claude-sonnet-4-20250514-v1:0\": {\n        \"id\": \"global.anthropic.claude-sonnet-4-20250514-v1:0\",\n        \"name\": \"Claude Sonnet 4 (Global)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic.claude-sonnet-4-20250514-v1:0\": {\n        \"id\": \"anthropic.claude-sonnet-4-20250514-v1:0\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic.claude-opus-4-6-v1\": {\n        \"id\": \"anthropic.claude-opus-4-6-v1\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic.claude-3-5-sonnet-20240620-v1:0\": {\n        \"id\": \"anthropic.claude-3-5-sonnet-20240620-v1:0\",\n        \"name\": \"Claude Sonnet 3.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-06-20\",\n        \"last_updated\": \"2024-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic.claude-3-5-haiku-20241022-v1:0\": {\n        \"id\": \"anthropic.claude-3-5-haiku-20241022-v1:0\",\n        \"name\": \"Claude Haiku 3.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"us.anthropic.claude-opus-4-6-v1\": {\n        \"id\": \"us.anthropic.claude-opus-4-6-v1\",\n        \"name\": \"Claude Opus 4.6 (US)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"us.anthropic.claude-sonnet-4-20250514-v1:0\": {\n        \"id\": \"us.anthropic.claude-sonnet-4-20250514-v1:0\",\n        \"name\": \"Claude Sonnet 4 (US)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"eu.anthropic.claude-sonnet-4-6\": {\n        \"id\": \"eu.anthropic.claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6 (EU)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      }\n    }\n  },\n  \"ovhcloud\": {\n    \"id\": \"ovhcloud\",\n    \"env\": [\"OVHCLOUD_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://oai.endpoints.kepler.ai.cloud.ovh.net/v1\",\n    \"name\": \"OVHcloud AI Endpoints\",\n    \"doc\": \"https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//\",\n    \"models\": {\n      \"llama-3.1-8b-instruct\": {\n        \"id\": \"llama-3.1-8b-instruct\",\n        \"name\": \"Llama-3.1-8B-Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-11\",\n        \"last_updated\": \"2025-06-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11, \"output\": 0.11 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen2.5-vl-72b-instruct\": {\n        \"id\": \"qwen2.5-vl-72b-instruct\",\n        \"name\": \"Qwen2.5-VL-72B-Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-31\",\n        \"last_updated\": \"2025-03-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.01, \"output\": 1.01 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3-Coder-30B-A3B-Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-28\",\n        \"last_updated\": \"2025-10-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.26 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistral-nemo-instruct-2407\": {\n        \"id\": \"mistral-nemo-instruct-2407\",\n        \"name\": \"Mistral-Nemo-Instruct-2407\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-20\",\n        \"last_updated\": \"2024-11-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.14 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"meta-llama-3_3-70b-instruct\": {\n        \"id\": \"meta-llama-3_3-70b-instruct\",\n        \"name\": \"Meta-Llama-3_3-70B-Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-01\",\n        \"last_updated\": \"2025-04-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.74, \"output\": 0.74 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"gpt-oss-120b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.47 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistral-small-3.2-24b-instruct-2506\": {\n        \"id\": \"mistral-small-3.2-24b-instruct-2506\",\n        \"name\": \"Mistral-Small-3.2-24B-Instruct-2506\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-16\",\n        \"last_updated\": \"2025-07-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.31 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"gpt-oss-20b\": {\n        \"id\": \"gpt-oss-20b\",\n        \"name\": \"gpt-oss-20b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.18 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3-32B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-16\",\n        \"last_updated\": \"2025-07-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.25 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"mistral-7b-instruct-v0.3\": {\n        \"id\": \"mistral-7b-instruct-v0.3\",\n        \"name\": \"Mistral-7B-Instruct-v0.3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-01\",\n        \"last_updated\": \"2025-04-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11, \"output\": 0.11 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      }\n    }\n  },\n  \"regolo-ai\": {\n    \"id\": \"regolo-ai\",\n    \"env\": [\"REGOLO_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.regolo.ai/v1\",\n    \"name\": \"Regolo AI\",\n    \"doc\": \"https://docs.regolo.ai/\",\n    \"models\": {\n      \"llama-3.1-8b-instruct\": {\n        \"id\": \"llama-3.1-8b-instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-07\",\n        \"last_updated\": \"2025-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.25 },\n        \"limit\": { \"context\": 120000, \"output\": 120000 }\n      },\n      \"qwen3.5-9b\": {\n        \"id\": \"qwen3.5-9b\",\n        \"name\": \"Qwen3.5-9B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-02-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"mistral-small3.2\": {\n        \"id\": \"mistral-small3.2\",\n        \"name\": \"Mistral Small 3.2\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2.2 },\n        \"limit\": { \"context\": 120000, \"output\": 120000 }\n      },\n      \"qwen3.5-122b\": {\n        \"id\": \"qwen3.5-122b\",\n        \"name\": \"Qwen3.5-122B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-02-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.9, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen-image\": {\n        \"id\": \"qwen-image\",\n        \"name\": \"Qwen-Image\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-01\",\n        \"last_updated\": \"2026-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2 },\n        \"limit\": { \"context\": 8192, \"output\": 4096 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT-OSS-120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 4.2 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-embedding-8b\": {\n        \"id\": \"qwen3-embedding-8b\",\n        \"name\": \"Qwen3-Embedding-8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-02-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"mistral-small-4-119b\": {\n        \"id\": \"mistral-small-4-119b\",\n        \"name\": \"Mistral Small 4 119B\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 3 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"llama-3.3-70b-instruct\": {\n        \"id\": \"llama-3.3-70b-instruct\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.7 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax 2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-10\",\n        \"last_updated\": \"2026-03-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 3.5 },\n        \"limit\": { \"context\": 190000, \"output\": 64000 }\n      },\n      \"gpt-oss-20b\": {\n        \"id\": \"gpt-oss-20b\",\n        \"name\": \"GPT-OSS-20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-01\",\n        \"last_updated\": \"2026-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.8 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-coder-next\": {\n        \"id\": \"qwen3-coder-next\",\n        \"name\": \"Qwen3-Coder-Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-01\",\n        \"last_updated\": \"2026-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen3-reranker-4b\": {\n        \"id\": \"qwen3-reranker-4b\",\n        \"name\": \"Qwen3-Reranker-4B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-02-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.12 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      }\n    }\n  },\n  \"github-models\": {\n    \"id\": \"github-models\",\n    \"env\": [\"GITHUB_TOKEN\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://models.github.ai/inference\",\n    \"name\": \"GitHub Models\",\n    \"doc\": \"https://docs.github.com/en/github-models\",\n    \"models\": {\n      \"meta/meta-llama-3-8b-instruct\": {\n        \"id\": \"meta/meta-llama-3-8b-instruct\",\n        \"name\": \"Meta-Llama-3-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"meta/meta-llama-3.1-8b-instruct\": {\n        \"id\": \"meta/meta-llama-3.1-8b-instruct\",\n        \"name\": \"Meta-Llama-3.1-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"meta/meta-llama-3-70b-instruct\": {\n        \"id\": \"meta/meta-llama-3-70b-instruct\",\n        \"name\": \"Meta-Llama-3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"meta/llama-3.2-11b-vision-instruct\": {\n        \"id\": \"meta/llama-3.2-11b-vision-instruct\",\n        \"name\": \"Llama-3.2-11B-Vision-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"meta/llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout 17B 16E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/llama-4-maverick-17b-128e-instruct-fp8\": {\n        \"id\": \"meta/llama-4-maverick-17b-128e-instruct-fp8\",\n        \"name\": \"Llama 4 Maverick 17B 128E Instruct FP8\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/meta-llama-3.1-70b-instruct\": {\n        \"id\": \"meta/meta-llama-3.1-70b-instruct\",\n        \"name\": \"Meta-Llama-3.1-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"meta/llama-3.3-70b-instruct\": {\n        \"id\": \"meta/llama-3.3-70b-instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"meta/llama-3.2-90b-vision-instruct\": {\n        \"id\": \"meta/llama-3.2-90b-vision-instruct\",\n        \"name\": \"Llama-3.2-90B-Vision-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta/meta-llama-3.1-405b-instruct\": {\n        \"id\": \"meta/meta-llama-3.1-405b-instruct\",\n        \"name\": \"Meta-Llama-3.1-405B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"cohere/cohere-command-a\": {\n        \"id\": \"cohere/cohere-command-a\",\n        \"name\": \"Cohere Command A\",\n        \"family\": \"command-a\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"cohere/cohere-command-r-plus-08-2024\": {\n        \"id\": \"cohere/cohere-command-r-plus-08-2024\",\n        \"name\": \"Cohere Command R+ 08-2024\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2024-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"cohere/cohere-command-r-plus\": {\n        \"id\": \"cohere/cohere-command-r-plus\",\n        \"name\": \"Cohere Command R+\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-04-04\",\n        \"last_updated\": \"2024-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"cohere/cohere-command-r-08-2024\": {\n        \"id\": \"cohere/cohere-command-r-08-2024\",\n        \"name\": \"Cohere Command R 08-2024\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2024-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"cohere/cohere-command-r\": {\n        \"id\": \"cohere/cohere-command-r\",\n        \"name\": \"Cohere Command R\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-03-11\",\n        \"last_updated\": \"2024-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"ai21-labs/ai21-jamba-1.5-large\": {\n        \"id\": \"ai21-labs/ai21-jamba-1.5-large\",\n        \"name\": \"AI21 Jamba 1.5 Large\",\n        \"family\": \"jamba\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-08-29\",\n        \"last_updated\": \"2024-08-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 4096 }\n      },\n      \"ai21-labs/ai21-jamba-1.5-mini\": {\n        \"id\": \"ai21-labs/ai21-jamba-1.5-mini\",\n        \"name\": \"AI21 Jamba 1.5 Mini\",\n        \"family\": \"jamba\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-08-29\",\n        \"last_updated\": \"2024-08-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 4096 }\n      },\n      \"core42/jais-30b-chat\": {\n        \"id\": \"core42/jais-30b-chat\",\n        \"name\": \"JAIS 30b Chat\",\n        \"family\": \"jais\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-03\",\n        \"release_date\": \"2023-08-30\",\n        \"last_updated\": \"2023-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"mistral-ai/mistral-nemo\": {\n        \"id\": \"mistral-ai/mistral-nemo\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"mistral-ai/codestral-2501\": {\n        \"id\": \"mistral-ai/codestral-2501\",\n        \"name\": \"Codestral 25.01\",\n        \"family\": \"codestral\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32000, \"output\": 8192 }\n      },\n      \"mistral-ai/ministral-3b\": {\n        \"id\": \"mistral-ai/ministral-3b\",\n        \"name\": \"Ministral 3B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"mistral-ai/mistral-large-2411\": {\n        \"id\": \"mistral-ai/mistral-large-2411\",\n        \"name\": \"Mistral Large 24.11\",\n        \"family\": \"mistral-large\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"mistral-ai/mistral-small-2503\": {\n        \"id\": \"mistral-ai/mistral-small-2503\",\n        \"name\": \"Mistral Small 3.1\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"mistral-ai/mistral-medium-2505\": {\n        \"id\": \"mistral-ai/mistral-medium-2505\",\n        \"name\": \"Mistral Medium 3 (25.05)\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-05-01\",\n        \"last_updated\": \"2025-05-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"xai/grok-3-mini\": {\n        \"id\": \"xai/grok-3-mini\",\n        \"name\": \"Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-09\",\n        \"last_updated\": \"2024-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"xai/grok-3\": {\n        \"id\": \"xai/grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-09\",\n        \"last_updated\": \"2024-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-v3-0324\": {\n        \"id\": \"deepseek/deepseek-v3-0324\",\n        \"name\": \"DeepSeek-V3-0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-r1-0528\": {\n        \"id\": \"deepseek/deepseek-r1-0528\",\n        \"name\": \"DeepSeek-R1-0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 65536, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-r1\": {\n        \"id\": \"deepseek/deepseek-r1\",\n        \"name\": \"DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 65536, \"output\": 8192 }\n      },\n      \"microsoft/phi-4-mini-instruct\": {\n        \"id\": \"microsoft/phi-4-mini-instruct\",\n        \"name\": \"Phi-4-mini-instruct\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-mini-4k-instruct\": {\n        \"id\": \"microsoft/phi-3-mini-4k-instruct\",\n        \"name\": \"Phi-3-mini instruct (4k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 4096, \"output\": 1024 }\n      },\n      \"microsoft/phi-4-reasoning\": {\n        \"id\": \"microsoft/phi-4-reasoning\",\n        \"name\": \"Phi-4-Reasoning\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-small-8k-instruct\": {\n        \"id\": \"microsoft/phi-3-small-8k-instruct\",\n        \"name\": \"Phi-3-small instruct (8k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"microsoft/phi-4-mini-reasoning\": {\n        \"id\": \"microsoft/phi-4-mini-reasoning\",\n        \"name\": \"Phi-4-mini-reasoning\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-4-multimodal-instruct\": {\n        \"id\": \"microsoft/phi-4-multimodal-instruct\",\n        \"name\": \"Phi-4-multimodal-instruct\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/mai-ds-r1\": {\n        \"id\": \"microsoft/mai-ds-r1\",\n        \"name\": \"MAI-DS-R1\",\n        \"family\": \"mai\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 65536, \"output\": 8192 }\n      },\n      \"microsoft/phi-4\": {\n        \"id\": \"microsoft/phi-4\",\n        \"name\": \"Phi-4\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 16000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-medium-4k-instruct\": {\n        \"id\": \"microsoft/phi-3-medium-4k-instruct\",\n        \"name\": \"Phi-3-medium instruct (4k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 4096, \"output\": 1024 }\n      },\n      \"microsoft/phi-3.5-vision-instruct\": {\n        \"id\": \"microsoft/phi-3.5-vision-instruct\",\n        \"name\": \"Phi-3.5-vision instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3.5-moe-instruct\": {\n        \"id\": \"microsoft/phi-3.5-moe-instruct\",\n        \"name\": \"Phi-3.5-MoE instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-mini-128k-instruct\": {\n        \"id\": \"microsoft/phi-3-mini-128k-instruct\",\n        \"name\": \"Phi-3-mini instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3.5-mini-instruct\": {\n        \"id\": \"microsoft/phi-3.5-mini-instruct\",\n        \"name\": \"Phi-3.5-mini instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-small-128k-instruct\": {\n        \"id\": \"microsoft/phi-3-small-128k-instruct\",\n        \"name\": \"Phi-3-small instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"microsoft/phi-3-medium-128k-instruct\": {\n        \"id\": \"microsoft/phi-3-medium-128k-instruct\",\n        \"name\": \"Phi-3-medium instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/o1-preview\": {\n        \"id\": \"openai/o1-preview\",\n        \"name\": \"OpenAI o1-preview\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"openai/o3-mini\": {\n        \"id\": \"openai/o3-mini\",\n        \"name\": \"OpenAI o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o3\": {\n        \"id\": \"openai/o3\",\n        \"name\": \"OpenAI o3\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"OpenAI o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o1\": {\n        \"id\": \"openai/o1\",\n        \"name\": \"OpenAI o1\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-12-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o\": {\n        \"id\": \"openai/gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o1-mini\": {\n        \"id\": \"openai/o1-mini\",\n        \"name\": \"OpenAI o1-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"openai/gpt-4.1-mini\": {\n        \"id\": \"openai/gpt-4.1-mini\",\n        \"name\": \"GPT-4.1-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4.1-nano\": {\n        \"id\": \"openai/gpt-4.1-nano\",\n        \"name\": \"GPT-4.1-nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      }\n    }\n  },\n  \"helicone\": {\n    \"id\": \"helicone\",\n    \"env\": [\"HELICONE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://ai-gateway.helicone.ai/v1\",\n    \"name\": \"Helicone\",\n    \"doc\": \"https://helicone.ai/models\",\n    \"models\": {\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"Google Gemini 2.5 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2025-07-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.09999999999999999,\n          \"output\": 0.39999999999999997,\n          \"cache_read\": 0.024999999999999998,\n          \"cache_write\": 0.09999999999999999\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"llama-3.3-70b-versatile\": {\n        \"id\": \"llama-3.3-70b-versatile\",\n        \"name\": \"Meta Llama 3.3 70B Versatile\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.59, \"output\": 0.7899999999999999 },\n        \"limit\": { \"context\": 131072, \"output\": 32678 }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.41 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"ernie-4.5-21b-a3b-thinking\": {\n        \"id\": \"ernie-4.5-21b-a3b-thinking\",\n        \"name\": \"Baidu Ernie 4.5 21B A3B Thinking\",\n        \"family\": \"ernie\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-03-16\",\n        \"last_updated\": \"2025-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 128000, \"output\": 8000 }\n      },\n      \"llama-3.1-8b-instruct\": {\n        \"id\": \"llama-3.1-8b-instruct\",\n        \"name\": \"Meta Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0.049999999999999996 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"o3-mini\": {\n        \"id\": \"o3-mini\",\n        \"name\": \"OpenAI o3 Mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2023-10-01\",\n        \"last_updated\": \"2023-10-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"claude-sonnet-4\": {\n        \"id\": \"claude-sonnet-4\",\n        \"name\": \"Anthropic: Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-14\",\n        \"last_updated\": \"2025-05-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.30000000000000004,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-4o-mini\": {\n        \"id\": \"gpt-4o-mini\",\n        \"name\": \"OpenAI GPT-4o-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o3\": {\n        \"id\": \"o3\",\n        \"name\": \"OpenAI o3\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Google Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"claude-3.5-haiku\": {\n        \"id\": \"claude-3.5-haiku\",\n        \"name\": \"Anthropic: Claude 3.5 Haiku\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.7999999999999999,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"o3-pro\": {\n        \"id\": \"o3-pro\",\n        \"name\": \"OpenAI o3 Pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 20, \"output\": 80 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"claude-3.5-sonnet-v2\": {\n        \"id\": \"claude-3.5-sonnet-v2\",\n        \"name\": \"Anthropic: Claude 3.5 Sonnet v2\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.30000000000000004,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"claude-opus-4-1-20250805\": {\n        \"id\": \"claude-opus-4-1-20250805\",\n        \"name\": \"Anthropic: Claude Opus 4.1 (20250805)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"deepseek-reasoner\": {\n        \"id\": \"deepseek-reasoner\",\n        \"name\": \"DeepSeek Reasoner\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68, \"cache_read\": 0.07 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"OpenAI: GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.12500000000000003\n        },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"sonar-deep-research\": {\n        \"id\": \"sonar-deep-research\",\n        \"name\": \"Perplexity Sonar Deep Research\",\n        \"family\": \"sonar-deep-research\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-27\",\n        \"last_updated\": \"2025-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 127000, \"output\": 4096 }\n      },\n      \"grok-4-fast-reasoning\": {\n        \"id\": \"grok-4-fast-reasoning\",\n        \"name\": \"xAI: Grok 4 Fast Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.19999999999999998,\n          \"output\": 0.5,\n          \"cache_read\": 0.049999999999999996\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"OpenAI GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.12500000000000003\n        },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen3-vl-235b-a22b-instruct\": {\n        \"id\": \"qwen3-vl-235b-a22b-instruct\",\n        \"name\": \"Qwen3 VL 235B A22B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"OpenAI o4 Mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.275 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"mistral-small\": {\n        \"id\": \"mistral-small\",\n        \"name\": \"Mistral Small\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-02\",\n        \"release_date\": \"2024-02-26\",\n        \"last_updated\": \"2024-02-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 75, \"output\": 200 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral-nemo\": {\n        \"id\": \"mistral-nemo\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 20, \"output\": 40 },\n        \"limit\": { \"context\": 128000, \"output\": 16400 }\n      },\n      \"claude-4.5-haiku\": {\n        \"id\": \"claude-4.5-haiku\",\n        \"name\": \"Anthropic: Claude 4.5 Haiku\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2025-10-01\",\n        \"last_updated\": \"2025-10-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.09999999999999999,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.48, \"output\": 2 },\n        \"limit\": { \"context\": 256000, \"output\": 262144 }\n      },\n      \"qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3 Next 80B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 1.4 },\n        \"limit\": { \"context\": 262000, \"output\": 16384 }\n      },\n      \"o1\": {\n        \"id\": \"o1\",\n        \"name\": \"OpenAI: o1\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.03, \"output\": 0.13 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"OpenAI GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o1-mini\": {\n        \"id\": \"o1-mini\",\n        \"name\": \"OpenAI: o1-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"kimi-k2-0711\": {\n        \"id\": \"kimi-k2-0711\",\n        \"name\": \"Kimi K2 (07/11)\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5700000000000001, \"output\": 2.3 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"claude-opus-4\": {\n        \"id\": \"claude-opus-4\",\n        \"name\": \"Anthropic: Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-14\",\n        \"last_updated\": \"2025-05-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"xAI Grok 4 Fast Non-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.19999999999999998,\n          \"output\": 0.5,\n          \"cache_read\": 0.049999999999999996\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"OpenAI GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 2,\n          \"cache_read\": 0.024999999999999998\n        },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"Zai GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.44999999999999996, \"output\": 1.5 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"claude-4.5-sonnet\": {\n        \"id\": \"claude-4.5-sonnet\",\n        \"name\": \"Anthropic: Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.30000000000000004,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"deepseek-tng-r1t2-chimera\": {\n        \"id\": \"deepseek-tng-r1t2-chimera\",\n        \"name\": \"DeepSeek TNG R1T2 Chimera\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-02\",\n        \"last_updated\": \"2025-07-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 130000, \"output\": 163840 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"OpenAI: GPT-5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"claude-3.7-sonnet\": {\n        \"id\": \"claude-3.7-sonnet\",\n        \"name\": \"Anthropic: Claude 3.7 Sonnet\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.30000000000000004,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-3-haiku-20240307\": {\n        \"id\": \"claude-3-haiku-20240307\",\n        \"name\": \"Anthropic: Claude 3 Haiku\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-03-07\",\n        \"last_updated\": \"2024-03-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.25,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"Anthropic: Claude 4.5 Haiku (20251001)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2025-10-01\",\n        \"last_updated\": \"2025-10-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.09999999999999999,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"claude-opus-4-1\": {\n        \"id\": \"claude-opus-4-1\",\n        \"name\": \"Anthropic: Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"llama-guard-4\": {\n        \"id\": \"llama-guard-4\",\n        \"name\": \"Meta Llama Guard 4 12B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 0.21 },\n        \"limit\": { \"context\": 131072, \"output\": 1024 }\n      },\n      \"sonar\": {\n        \"id\": \"sonar\",\n        \"name\": \"Perplexity Sonar\",\n        \"family\": \"sonar\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-27\",\n        \"last_updated\": \"2025-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 127000, \"output\": 4096 }\n      },\n      \"kimi-k2-0905\": {\n        \"id\": \"kimi-k2-0905\",\n        \"name\": \"Kimi K2 (09/05)\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 2,\n          \"cache_read\": 0.39999999999999997\n        },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Google Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.19999999999999998 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"grok-3-mini\": {\n        \"id\": \"grok-3-mini\",\n        \"name\": \"xAI Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"xAI Grok 4.1 Fast Non-Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-17\",\n        \"last_updated\": \"2025-11-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.19999999999999998,\n          \"output\": 0.5,\n          \"cache_read\": 0.049999999999999996\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"grok-4-1-fast-reasoning\": {\n        \"id\": \"grok-4-1-fast-reasoning\",\n        \"name\": \"xAI Grok 4.1 Fast Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-17\",\n        \"last_updated\": \"2025-11-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.19999999999999998,\n          \"output\": 0.5,\n          \"cache_read\": 0.049999999999999996\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"gemma-3-12b-it\": {\n        \"id\": \"gemma-3-12b-it\",\n        \"name\": \"Google Gemma 3 12B\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.049999999999999996,\n          \"output\": 0.09999999999999999\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"sonar-reasoning-pro\": {\n        \"id\": \"sonar-reasoning-pro\",\n        \"name\": \"Perplexity Sonar Reasoning Pro\",\n        \"family\": \"sonar-reasoning\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-27\",\n        \"last_updated\": \"2025-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 127000, \"output\": 4096 }\n      },\n      \"chatgpt-4o-latest\": {\n        \"id\": \"chatgpt-4o-latest\",\n        \"name\": \"OpenAI ChatGPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-14\",\n        \"last_updated\": \"2024-08-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 20, \"cache_read\": 2.5 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"OpenAI GPT-4.1 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.39999999999999997,\n          \"output\": 1.5999999999999999,\n          \"cache_read\": 0.09999999999999999\n        },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"llama-prompt-guard-2-86m\": {\n        \"id\": \"llama-prompt-guard-2-86m\",\n        \"name\": \"Meta Llama Prompt Guard 2 86M\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01 },\n        \"limit\": { \"context\": 512, \"output\": 2 }\n      },\n      \"claude-4.5-opus\": {\n        \"id\": \"claude-4.5-opus\",\n        \"name\": \"Anthropic: Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"llama-4-scout\": {\n        \"id\": \"llama-4-scout\",\n        \"name\": \"Meta Llama 4 Scout 17B 16E\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.08, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"xAI Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2024-08-25\",\n        \"last_updated\": \"2024-08-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.19999999999999998,\n          \"output\": 1.5,\n          \"cache_read\": 0.02\n        },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"grok-3\": {\n        \"id\": \"grok-3\",\n        \"name\": \"xAI Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3 Coder 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-07-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09999999999999999, \"output\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Google Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.3125,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"sonar-pro\": {\n        \"id\": \"sonar-pro\",\n        \"name\": \"Perplexity Sonar Pro\",\n        \"family\": \"sonar-pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-27\",\n        \"last_updated\": \"2025-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"sonar-reasoning\": {\n        \"id\": \"sonar-reasoning\",\n        \"name\": \"Perplexity Sonar Reasoning\",\n        \"family\": \"sonar-reasoning\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-27\",\n        \"last_updated\": \"2025-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 127000, \"output\": 4096 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"OpenAI GPT-OSS 120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.16 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"grok-4\": {\n        \"id\": \"grok-4\",\n        \"name\": \"xAI Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-09\",\n        \"last_updated\": \"2024-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"OpenAI: GPT-5 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.12500000000000003\n        },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"llama-3.3-70b-instruct\": {\n        \"id\": \"llama-3.3-70b-instruct\",\n        \"name\": \"Meta Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0.39 },\n        \"limit\": { \"context\": 128000, \"output\": 16400 }\n      },\n      \"qwen3-coder\": {\n        \"id\": \"qwen3-coder\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.22, \"output\": 0.95 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"llama-4-maverick\": {\n        \"id\": \"llama-4-maverick\",\n        \"name\": \"Meta Llama 4 Maverick 17B 128E\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"llama-prompt-guard-2-22m\": {\n        \"id\": \"llama-prompt-guard-2-22m\",\n        \"name\": \"Meta Llama Prompt Guard 2 22M\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01 },\n        \"limit\": { \"context\": 512, \"output\": 2 }\n      },\n      \"gemma2-9b-it\": {\n        \"id\": \"gemma2-9b-it\",\n        \"name\": \"Google Gemma 2\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-25\",\n        \"last_updated\": \"2024-06-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.01, \"output\": 0.03 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"mistral-large-2411\": {\n        \"id\": \"mistral-large-2411\",\n        \"name\": \"Mistral-Large\",\n        \"family\": \"mistral-large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-24\",\n        \"last_updated\": \"2024-07-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-4.1-mini-2025-04-14\": {\n        \"id\": \"gpt-4.1-mini-2025-04-14\",\n        \"name\": \"OpenAI GPT-4.1 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.39999999999999997,\n          \"output\": 1.5999999999999999,\n          \"cache_read\": 0.09999999999999999\n        },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"Anthropic: Claude Sonnet 4.5 (20250929)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.30000000000000004,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5-chat-latest\": {\n        \"id\": \"gpt-5-chat-latest\",\n        \"name\": \"OpenAI GPT-5 Chat Latest\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-09-30\",\n        \"last_updated\": \"2024-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.12500000000000003\n        },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-30b-a3b\": {\n        \"id\": \"qwen3-30b-a3b\",\n        \"name\": \"Qwen3 30B A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-06-01\",\n        \"last_updated\": \"2025-06-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.08, \"output\": 0.29 },\n        \"limit\": { \"context\": 41000, \"output\": 41000 }\n      },\n      \"gpt-oss-20b\": {\n        \"id\": \"gpt-oss-20b\",\n        \"name\": \"OpenAI GPT-OSS 20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.049999999999999996,\n          \"output\": 0.19999999999999998\n        },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"llama-3.1-8b-instruct-turbo\": {\n        \"id\": \"llama-3.1-8b-instruct-turbo\",\n        \"name\": \"Meta Llama 3.1 8B Instruct Turbo\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0.03 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"OpenAI GPT-4.1 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.09999999999999999,\n          \"output\": 0.39999999999999997,\n          \"cache_read\": 0.024999999999999998\n        },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"hermes-2-pro-llama-3-8b\": {\n        \"id\": \"hermes-2-pro-llama-3-8b\",\n        \"name\": \"Hermes 2 Pro Llama 3 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-05-27\",\n        \"last_updated\": \"2024-05-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.14 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"OpenAI GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.049999999999999996,\n          \"output\": 0.39999999999999997,\n          \"cache_read\": 0.005\n        },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"OpenAI GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 0.59 },\n        \"limit\": { \"context\": 131072, \"output\": 40960 }\n      },\n      \"qwen2.5-coder-7b-fast\": {\n        \"id\": \"qwen2.5-coder-7b-fast\",\n        \"name\": \"Qwen2.5 Coder 7B fast\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-09-15\",\n        \"last_updated\": \"2024-09-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.03, \"output\": 0.09 },\n        \"limit\": { \"context\": 32000, \"output\": 8192 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"OpenAI: GPT-5.1 Codex Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 2,\n          \"cache_read\": 0.024999999999999998\n        },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen3-235b-a22b-thinking\": {\n        \"id\": \"qwen3-235b-a22b-thinking\",\n        \"name\": \"Qwen3 235B A22B Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.9000000000000004 },\n        \"limit\": { \"context\": 262144, \"output\": 81920 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"OpenAI GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.12500000000000003\n        },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"deepseek-v3\": {\n        \"id\": \"deepseek-v3\",\n        \"name\": \"DeepSeek V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2024-12-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68, \"cache_read\": 0.07 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"llama-3.1-8b-instant\": {\n        \"id\": \"llama-3.1-8b-instant\",\n        \"name\": \"Meta Llama 3.1 8B Instant\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.049999999999999996, \"output\": 0.08 },\n        \"limit\": { \"context\": 131072, \"output\": 32678 }\n      },\n      \"gpt-5.1-chat-latest\": {\n        \"id\": \"gpt-5.1-chat-latest\",\n        \"name\": \"OpenAI GPT-5.1 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.12500000000000003\n        },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"deepseek-v3.1-terminus\": {\n        \"id\": \"deepseek-v3.1-terminus\",\n        \"name\": \"DeepSeek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.27,\n          \"output\": 1,\n          \"cache_read\": 0.21600000000000003\n        },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      }\n    }\n  },\n  \"google-vertex-anthropic\": {\n    \"id\": \"google-vertex-anthropic\",\n    \"env\": [\n      \"GOOGLE_VERTEX_PROJECT\",\n      \"GOOGLE_VERTEX_LOCATION\",\n      \"GOOGLE_APPLICATION_CREDENTIALS\"\n    ],\n    \"npm\": \"@ai-sdk/google-vertex/anthropic\",\n    \"name\": \"Vertex (Anthropic)\",\n    \"doc\": \"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude\",\n    \"models\": {\n      \"claude-sonnet-4-6@default\": {\n        \"id\": \"claude-sonnet-4-6@default\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-sonnet-4@20250514\": {\n        \"id\": \"claude-sonnet-4@20250514\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-3-5-sonnet@20241022\": {\n        \"id\": \"claude-3-5-sonnet@20241022\",\n        \"name\": \"Claude Sonnet 3.5 v2\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"claude-opus-4-6@default\": {\n        \"id\": \"claude-opus-4-6@default\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"claude-opus-4-5@20251101\": {\n        \"id\": \"claude-opus-4-5@20251101\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-opus-4-7@default\": {\n        \"id\": \"claude-opus-4-7@default\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"claude-opus-4@20250514\": {\n        \"id\": \"claude-opus-4@20250514\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-3-5-haiku@20241022\": {\n        \"id\": \"claude-3-5-haiku@20241022\",\n        \"name\": \"Claude Haiku 3.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"claude-sonnet-4-5@20250929\": {\n        \"id\": \"claude-sonnet-4-5@20250929\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-3-7-sonnet@20250219\": {\n        \"id\": \"claude-3-7-sonnet@20250219\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-31\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-opus-4-1@20250805\": {\n        \"id\": \"claude-opus-4-1@20250805\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-haiku-4-5@20251001\": {\n        \"id\": \"claude-haiku-4-5@20251001\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      }\n    }\n  },\n  \"dinference\": {\n    \"id\": \"dinference\",\n    \"env\": [\"DINFERENCE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.dinference.com/v1\",\n    \"name\": \"DInference\",\n    \"doc\": \"https://dinference.com\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02\",\n        \"last_updated\": \"2026-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 2.4 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12\",\n        \"last_updated\": \"2025-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 1.65 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08\",\n        \"last_updated\": \"2025-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.0675, \"output\": 0.27 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      }\n    }\n  },\n  \"minimax-cn-coding-plan\": {\n    \"id\": \"minimax-cn-coding-plan\",\n    \"env\": [\"MINIMAX_API_KEY\"],\n    \"npm\": \"@ai-sdk/anthropic\",\n    \"api\": \"https://api.minimaxi.com/anthropic/v1\",\n    \"name\": \"MiniMax Coding Plan (minimaxi.com)\",\n    \"doc\": \"https://platform.minimaxi.com/docs/coding-plan/intro\",\n    \"models\": {\n      \"MiniMax-M2.1\": {\n        \"id\": \"MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7\": {\n        \"id\": \"MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7-highspeed\": {\n        \"id\": \"MiniMax-M2.7-highspeed\",\n        \"name\": \"MiniMax-M2.7-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2\": {\n        \"id\": \"MiniMax-M2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 196608, \"output\": 128000 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.5-highspeed\": {\n        \"id\": \"MiniMax-M2.5-highspeed\",\n        \"name\": \"MiniMax-M2.5-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"alibaba-coding-plan\": {\n    \"id\": \"alibaba-coding-plan\",\n    \"env\": [\"ALIBABA_CODING_PLAN_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://coding-intl.dashscope.aliyuncs.com/v1\",\n    \"name\": \"Alibaba Coding Plan\",\n    \"doc\": \"https://www.alibabacloud.com/help/en/model-studio/coding-plan\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"qwen3.6-plus\": {\n        \"id\": \"qwen3.6-plus\",\n        \"name\": \"Qwen3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3.5-plus\": {\n        \"id\": \"qwen3.5-plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3-coder-plus\": {\n        \"id\": \"qwen3-coder-plus\",\n        \"name\": \"Qwen3 Coder Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 196608, \"input\": 196601, \"output\": 24576 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen3-coder-next\": {\n        \"id\": \"qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-03\",\n        \"last_updated\": \"2026-02-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3-max-2026-01-23\": {\n        \"id\": \"qwen3-max-2026-01-23\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-23\",\n        \"last_updated\": \"2026-01-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      }\n    }\n  },\n  \"privatemode-ai\": {\n    \"id\": \"privatemode-ai\",\n    \"env\": [\"PRIVATEMODE_API_KEY\", \"PRIVATEMODE_ENDPOINT\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"http://localhost:8080/v1\",\n    \"name\": \"Privatemode AI\",\n    \"doc\": \"https://docs.privatemode.ai/api/overview\",\n    \"models\": {\n      \"gemma-3-27b\": {\n        \"id\": \"gemma-3-27b\",\n        \"name\": \"Gemma 3 27B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"qwen3-embedding-4b\": {\n        \"id\": \"qwen3-embedding-4b\",\n        \"name\": \"Qwen3-Embedding 4B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-06-06\",\n        \"last_updated\": \"2025-06-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32000, \"output\": 2560 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"gpt-oss-120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-04\",\n        \"last_updated\": \"2025-08-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"whisper-large-v3\": {\n        \"id\": \"whisper-large-v3\",\n        \"name\": \"Whisper large-v3\",\n        \"family\": \"whisper\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2023-09-01\",\n        \"last_updated\": \"2023-09-01\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 0, \"output\": 4096 }\n      },\n      \"qwen3-coder-30b-a3b\": {\n        \"id\": \"qwen3-coder-30b-a3b\",\n        \"name\": \"Qwen3-Coder 30B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      }\n    }\n  },\n  \"upstage\": {\n    \"id\": \"upstage\",\n    \"env\": [\"UPSTAGE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.upstage.ai/v1/solar\",\n    \"name\": \"Upstage\",\n    \"doc\": \"https://developers.upstage.ai/docs/apis/chat\",\n    \"models\": {\n      \"solar-mini\": {\n        \"id\": \"solar-mini\",\n        \"name\": \"solar-mini\",\n        \"family\": \"solar-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-06-12\",\n        \"last_updated\": \"2025-04-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 32768, \"output\": 4096 }\n      },\n      \"solar-pro3\": {\n        \"id\": \"solar-pro3\",\n        \"name\": \"solar-pro3\",\n        \"family\": \"solar-pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.25 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"solar-pro2\": {\n        \"id\": \"solar-pro2\",\n        \"name\": \"solar-pro2\",\n        \"family\": \"solar-pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.25 },\n        \"limit\": { \"context\": 65536, \"output\": 8192 }\n      }\n    }\n  },\n  \"qihang-ai\": {\n    \"id\": \"qihang-ai\",\n    \"env\": [\"QIHANG_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.qhaigc.net/v1\",\n    \"name\": \"QiHang\",\n    \"doc\": \"https://www.qhaigc.net/docs\",\n    \"models\": {\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.09,\n          \"output\": 0.71,\n          \"context_over_200k\": { \"input\": 0.09, \"output\": 0.71 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5-Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.29 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-10-01\",\n        \"last_updated\": \"2025-10-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.71 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.57, \"output\": 3.43 },\n        \"limit\": { \"context\": 1000000, \"output\": 65000 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.07,\n          \"output\": 0.43,\n          \"context_over_200k\": { \"input\": 0.07, \"output\": 0.43 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 1.14 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-opus-4-5-20251101\": {\n        \"id\": \"claude-opus-4-5-20251101\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.71, \"output\": 3.57 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.43, \"output\": 2.14 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      }\n    }\n  },\n  \"venice\": {\n    \"id\": \"venice\",\n    \"env\": [\"VENICE_API_KEY\"],\n    \"npm\": \"venice-ai-sdk-provider\",\n    \"name\": \"Venice AI\",\n    \"doc\": \"https://docs.venice.ai\",\n    \"models\": {\n      \"venice-uncensored-1-2\": {\n        \"id\": \"venice-uncensored-1-2\",\n        \"name\": \"Venice Uncensored 1.2\",\n        \"family\": \"venice\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.9 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2025-12-04\",\n        \"last_updated\": \"2026-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.33, \"output\": 0.48, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 160000, \"output\": 32768 }\n      },\n      \"grok-4-20-multi-agent\": {\n        \"id\": \"grok-4-20-multi-agent\",\n        \"name\": \"Grok 4.20 Multi-Agent\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-12\",\n        \"last_updated\": \"2026-04-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.27,\n          \"output\": 6.8,\n          \"cache_read\": 0.23,\n          \"context_over_200k\": {\n            \"input\": 4.53,\n            \"output\": 13.6,\n            \"cache_read\": 0.45\n          }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 128000 }\n      },\n      \"arcee-trinity-large-thinking\": {\n        \"id\": \"arcee-trinity-large-thinking\",\n        \"name\": \"Trinity Large Thinking\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3125, \"output\": 1.125, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"deepseek-v4-pro\": {\n        \"id\": \"deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.175, \"output\": 4.35 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3.6,\n          \"output\": 18,\n          \"cache_read\": 0.36,\n          \"cache_write\": 4.5\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"qwen3-vl-235b-a22b\": {\n        \"id\": \"qwen3-vl-235b-a22b\",\n        \"name\": \"Qwen3 VL 235B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-16\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"openai-gpt-52-codex\": {\n        \"id\": \"openai-gpt-52-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.19, \"output\": 17.5, \"cache_read\": 0.219 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"llama-3.2-3b\": {\n        \"id\": \"llama-3.2-3b\",\n        \"name\": \"Llama 3.2 3B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-10-03\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"minimax-m27\": {\n        \"id\": \"minimax-m27\",\n        \"name\": \"MiniMax M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.375, \"output\": 1.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 198000, \"output\": 32768 }\n      },\n      \"z-ai-glm-5v-turbo\": {\n        \"id\": \"z-ai-glm-5v-turbo\",\n        \"name\": \"GLM 5V Turbo\",\n        \"family\": \"glmv\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 5, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 200000, \"output\": 32768 }\n      },\n      \"kimi-k2-5\": {\n        \"id\": \"kimi-k2-5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.56, \"output\": 3.5, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"hermes-3-llama-3.1-405b\": {\n        \"id\": \"hermes-3-llama-3.1-405b\",\n        \"name\": \"Hermes 3 Llama 3.1 405b\",\n        \"family\": \"hermes\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.1, \"output\": 3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen 3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 3.5 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-12-10\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 3.2, \"cache_read\": 0.375 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"claude-opus-4-5\": {\n        \"id\": \"claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-06\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 6,\n          \"output\": 30,\n          \"cache_read\": 0.6,\n          \"cache_write\": 7.5\n        },\n        \"limit\": { \"context\": 198000, \"output\": 32768 }\n      },\n      \"grok-4-20\": {\n        \"id\": \"grok-4-20\",\n        \"name\": \"Grok 4.20\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-12\",\n        \"last_updated\": \"2026-04-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.27,\n          \"output\": 6.8,\n          \"cache_read\": 0.23,\n          \"context_over_200k\": {\n            \"input\": 4.53,\n            \"output\": 13.6,\n            \"cache_read\": 0.45\n          }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 128000 }\n      },\n      \"openai-gpt-54-mini\": {\n        \"id\": \"openai-gpt-54-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.9375, \"output\": 5.625, \"cache_read\": 0.09375 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"venice-uncensored\": {\n        \"id\": \"venice-uncensored\",\n        \"name\": \"Venice Uncensored 1.1\",\n        \"family\": \"venice\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2025-03-18\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.9 },\n        \"limit\": { \"context\": 32000, \"output\": 8192 }\n      },\n      \"qwen3-5-397b-a17b\": {\n        \"id\": \"qwen3-5-397b-a17b\",\n        \"name\": \"Qwen 3.5 397B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"google-gemma-3-27b-it\": {\n        \"id\": \"google-gemma-3-27b-it\",\n        \"name\": \"Google Gemma 3 27B Instruct\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11-04\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.2 },\n        \"limit\": { \"context\": 198000, \"output\": 16384 }\n      },\n      \"google-gemma-4-26b-a4b-it\": {\n        \"id\": \"google-gemma-4-26b-a4b-it\",\n        \"name\": \"Google Gemma 4 26B A4B Instruct\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1625, \"output\": 0.5 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"gemma-4-uncensored\": {\n        \"id\": \"gemma-4-uncensored\",\n        \"name\": \"Gemma 4 Uncensored\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-13\",\n        \"last_updated\": \"2026-04-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1625, \"output\": 0.5 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"openai-gpt-52\": {\n        \"id\": \"openai-gpt-52\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-13\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.19, \"output\": 17.5, \"cache_read\": 0.219 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"olafangensan-glm-4.7-flash-heretic\": {\n        \"id\": \"olafangensan-glm-4.7-flash-heretic\",\n        \"name\": \"GLM 4.7 Flash Heretic\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-04\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.8 },\n        \"limit\": { \"context\": 200000, \"output\": 24000 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 6,\n          \"output\": 30,\n          \"cache_read\": 0.6,\n          \"cache_write\": 7.5\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"nvidia-nemotron-3-nano-30b-a3b\": {\n        \"id\": \"nvidia-nemotron-3-nano-30b-a3b\",\n        \"name\": \"NVIDIA Nemotron 3 Nano 30B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"claude-opus-4-6-fast\": {\n        \"id\": \"claude-opus-4-6-fast\",\n        \"name\": \"Claude Opus 4.6 Fast\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 36,\n          \"output\": 180,\n          \"cache_read\": 3.6,\n          \"cache_write\": 45\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-19\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 3.75, \"cache_read\": 0.07 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"openai-gpt-55\": {\n        \"id\": \"openai-gpt-55\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 6.25,\n          \"output\": 37.5,\n          \"cache_read\": 0.625,\n          \"context_over_200k\": {\n            \"input\": 12.5,\n            \"output\": 56.25,\n            \"cache_read\": 1.25\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 131072 }\n      },\n      \"nvidia-nemotron-cascade-2-30b-a3b\": {\n        \"id\": \"nvidia-nemotron-cascade-2-30b-a3b\",\n        \"name\": \"Nemotron Cascade 2 30B A3B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-24\",\n        \"last_updated\": \"2026-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.8 },\n        \"limit\": { \"context\": 256000, \"output\": 32768 }\n      },\n      \"kimi-k2-6\": {\n        \"id\": \"kimi-k2-6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7448, \"output\": 4.655, \"cache_read\": 0.1463 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"openai-gpt-53-codex\": {\n        \"id\": \"openai-gpt-53-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.19, \"output\": 17.5, \"cache_read\": 0.219 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen-3-6-plus\": {\n        \"id\": \"qwen-3-6-plus\",\n        \"name\": \"Qwen 3.6 Plus Uncensored\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-06\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.625,\n          \"output\": 3.75,\n          \"cache_read\": 0.0625,\n          \"cache_write\": 0.78,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 7.5,\n            \"cache_read\": 0.0625,\n            \"cache_write\": 0.78\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3-5-35b-a3b\": {\n        \"id\": \"qwen3-5-35b-a3b\",\n        \"name\": \"Qwen 3.5 35B A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-25\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3125, \"output\": 1.25, \"cache_read\": 0.15625 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"zai-org-glm-5-1\": {\n        \"id\": \"zai-org-glm-5-1\",\n        \"name\": \"GLM 5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.75, \"output\": 5.5, \"cache_read\": 0.325 },\n        \"limit\": { \"context\": 200000, \"output\": 24000 }\n      },\n      \"deepseek-v4-flash\": {\n        \"id\": \"deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.175, \"output\": 0.35 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"zai-org-glm-4.7\": {\n        \"id\": \"zai-org-glm-4.7\",\n        \"name\": \"GLM 4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-24\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.65, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 198000, \"output\": 16384 }\n      },\n      \"openai-gpt-54\": {\n        \"id\": \"openai-gpt-54\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.13, \"output\": 18.8, \"cache_read\": 0.313 },\n        \"limit\": { \"context\": 1000000, \"output\": 131072 }\n      },\n      \"qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen 3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.75 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"z-ai-glm-5-turbo\": {\n        \"id\": \"z-ai-glm-5-turbo\",\n        \"name\": \"GLM 5 Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.2, \"output\": 4, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 200000, \"output\": 32768 }\n      },\n      \"venice-uncensored-role-play\": {\n        \"id\": \"venice-uncensored-role-play\",\n        \"name\": \"Venice Role Play Uncensored\",\n        \"family\": \"venice\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-20\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen3-coder-480b-a35b-instruct-turbo\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct-turbo\",\n        \"name\": \"Qwen 3 Coder 480B Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.5, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen 3 Coder 480b\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 3 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"grok-41-fast\": {\n        \"id\": \"grok-41-fast\",\n        \"name\": \"Grok 4.1 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2026-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.23, \"output\": 0.57, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 1000000, \"output\": 30000 }\n      },\n      \"qwen3-next-80b\": {\n        \"id\": \"qwen3-next-80b\",\n        \"name\": \"Qwen 3 Next 80b\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.9 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"aion-labs-aion-2-0\": {\n        \"id\": \"aion-labs-aion-2-0\",\n        \"name\": \"Aion 2.0\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-24\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 2, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"zai-org-glm-5\": {\n        \"id\": \"zai-org-glm-5\",\n        \"name\": \"GLM 5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 198000, \"output\": 32000 }\n      },\n      \"openai-gpt-oss-120b\": {\n        \"id\": \"openai-gpt-oss-120b\",\n        \"name\": \"OpenAI GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"mistral-small-3-2-24b-instruct\": {\n        \"id\": \"mistral-small-3-2-24b-instruct\",\n        \"name\": \"Mistral Small 3.2 24B Instruct\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-15\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09375, \"output\": 0.25 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"mistral-small-2603\": {\n        \"id\": \"mistral-small-2603\",\n        \"name\": \"Mistral Small 4\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1875, \"output\": 0.75 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"qwen3-6-27b\": {\n        \"id\": \"qwen3-6-27b\",\n        \"name\": \"Qwen3.6 27B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.325, \"output\": 3.25 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"zai-org-glm-4.7-flash\": {\n        \"id\": \"zai-org-glm-4.7-flash\",\n        \"name\": \"GLM 4.7 Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.125, \"output\": 0.5 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen3-5-9b\": {\n        \"id\": \"qwen3-5-9b\",\n        \"name\": \"Qwen 3.5 9B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-04-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.15 },\n        \"limit\": { \"context\": 256000, \"output\": 32768 }\n      },\n      \"llama-3.3-70b\": {\n        \"id\": \"llama-3.3-70b\",\n        \"name\": \"Llama 3.3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-04-06\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.8 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai-gpt-4o-2024-11-20\": {\n        \"id\": \"openai-gpt-4o-2024-11-20\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-28\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.125, \"output\": 12.5 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gemini-3-1-pro-preview\": {\n        \"id\": \"gemini-3-1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.5,\n          \"output\": 15,\n          \"cache_read\": 0.5,\n          \"cache_write\": 0.5,\n          \"context_over_200k\": { \"input\": 5, \"output\": 22.5, \"cache_read\": 0.5 }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"openai-gpt-4o-mini-2024-07-18\": {\n        \"id\": \"openai-gpt-4o-mini-2024-07-18\",\n        \"name\": \"GPT-4o Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-28\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1875, \"output\": 0.75, \"cache_read\": 0.09375 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"claude-opus-4-7\": {\n        \"id\": \"claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 6,\n          \"output\": 30,\n          \"cache_read\": 0.6,\n          \"cache_write\": 7.5\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"minimax-m25\": {\n        \"id\": \"minimax-m25\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.34, \"output\": 1.19, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 198000, \"output\": 32768 }\n      },\n      \"zai-org-glm-4.6\": {\n        \"id\": \"zai-org-glm-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-01\",\n        \"last_updated\": \"2026-04-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.85, \"output\": 2.75, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 198000, \"output\": 16384 }\n      },\n      \"openai-gpt-54-pro\": {\n        \"id\": \"openai-gpt-54-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 37.5,\n          \"output\": 225,\n          \"context_over_200k\": { \"input\": 75, \"output\": 337.5 }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3.75,\n          \"output\": 18.75,\n          \"cache_read\": 0.375,\n          \"cache_write\": 4.69\n        },\n        \"limit\": { \"context\": 198000, \"output\": 64000 }\n      },\n      \"google-gemma-4-31b-it\": {\n        \"id\": \"google-gemma-4-31b-it\",\n        \"name\": \"Google Gemma 4 31B Instruct\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-03\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.175, \"output\": 0.5 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"mercury-2\": {\n        \"id\": \"mercury-2\",\n        \"name\": \"Mercury 2\",\n        \"family\": \"mercury\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-20\",\n        \"last_updated\": \"2026-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3125, \"output\": 0.9375, \"cache_read\": 0.03125 },\n        \"limit\": { \"context\": 128000, \"output\": 50000 }\n      },\n      \"openai-gpt-55-pro\": {\n        \"id\": \"openai-gpt-55-pro\",\n        \"name\": \"GPT-5.5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 37.5, \"output\": 225 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      }\n    }\n  },\n  \"siliconflow\": {\n    \"id\": \"siliconflow\",\n    \"env\": [\"SILICONFLOW_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.siliconflow.com/v1\",\n    \"name\": \"SiliconFlow\",\n    \"doc\": \"https://cloud.siliconflow.com/models\",\n    \"models\": {\n      \"meta-llama/Meta-Llama-3.1-8B-Instruct\": {\n        \"id\": \"meta-llama/Meta-Llama-3.1-8B-Instruct\",\n        \"name\": \"meta-llama/Meta-Llama-3.1-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-23\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.06 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"inclusionAI/Ling-flash-2.0\": {\n        \"id\": \"inclusionAI/Ling-flash-2.0\",\n        \"name\": \"inclusionAI/Ling-flash-2.0\",\n        \"family\": \"ling\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"inclusionAI/Ling-mini-2.0\": {\n        \"id\": \"inclusionAI/Ling-mini-2.0\",\n        \"name\": \"inclusionAI/Ling-mini-2.0\",\n        \"family\": \"ling\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-10\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"inclusionAI/Ring-flash-2.0\": {\n        \"id\": \"inclusionAI/Ring-flash-2.0\",\n        \"name\": \"inclusionAI/Ring-flash-2.0\",\n        \"family\": \"ring\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"moonshotai/Kimi-K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.25 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"moonshotai/Kimi-K2-Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-07\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.55, \"output\": 2.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-08\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"moonshotai/Kimi-K2.6\": {\n        \"id\": \"moonshotai/Kimi-K2.6\",\n        \"name\": \"moonshotai/Kimi-K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"moonshotai/Kimi-K2-Instruct\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct\",\n        \"name\": \"moonshotai/Kimi-K2-Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-13\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.58, \"output\": 2.29 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"nex-agi/DeepSeek-V3.1-Nex-N1\": {\n        \"id\": \"nex-agi/DeepSeek-V3.1-Nex-N1\",\n        \"name\": \"nex-agi/DeepSeek-V3.1-Nex-N1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-VL-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-32B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-21\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-VL-30B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-30B-A3B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-30B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-11\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 1 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Omni-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Omni-30B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Omni-30B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"Qwen/Qwen2.5-72B-Instruct-128K\": {\n        \"id\": \"Qwen/Qwen2.5-72B-Instruct-128K\",\n        \"name\": \"Qwen/Qwen2.5-72B-Instruct-128K\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.59, \"output\": 0.59 },\n        \"limit\": { \"context\": 131000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen2.5-VL-72B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-72B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-VL-72B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.59, \"output\": 0.59 },\n        \"limit\": { \"context\": 131000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen2.5-72B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-72B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-72B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.59, \"output\": 0.59 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0.6 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Omni-30B-A3B-Captioner\": {\n        \"id\": \"Qwen/Qwen3-Omni-30B-A3B-Captioner\",\n        \"name\": \"Qwen/Qwen3-Omni-30B-A3B-Captioner\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"Qwen/Qwen2.5-7B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-7B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-7B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.05 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"name\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.3 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen2.5-VL-7B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-7B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-VL-7B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.05 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/QwQ-32B\": {\n        \"id\": \"Qwen/QwQ-32B\",\n        \"name\": \"Qwen/QwQ-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-06\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.58 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-235B-A22B\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B\",\n        \"name\": \"Qwen/Qwen3-235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 1.42 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-Omni-30B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-Omni-30B-A3B-Thinking\",\n        \"name\": \"Qwen/Qwen3-Omni-30B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"Qwen/Qwen3-VL-235B-A22B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-235B-A22B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-235B-A22B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-VL-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-30B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-30B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-05\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 1 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Thinking\",\n        \"name\": \"Qwen/Qwen3-Next-80B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-VL-8B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-8B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-8B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 2 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen2.5-VL-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-32B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-VL-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.27 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.6 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-32B\": {\n        \"id\": \"Qwen/Qwen3-32B\",\n        \"name\": \"Qwen/Qwen3-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-VL-8B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-8B-Instruct\",\n        \"name\": \"Qwen/Qwen3-VL-8B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.68 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen2.5-14B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-14B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-14B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Thinking-2507\",\n        \"name\": \"Qwen/Qwen3-30B-A3B-Thinking-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.3 },\n        \"limit\": { \"context\": 262000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen3-VL-32B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-32B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-32B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-21\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 1.4 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-Coder-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-30B-A3B-Instruct\",\n        \"name\": \"Qwen/Qwen3-Coder-30B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-14B\": {\n        \"id\": \"Qwen/Qwen3-14B\",\n        \"name\": \"Qwen/Qwen3-14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"Qwen/Qwen2.5-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-32B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-19\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen2.5-Coder-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"name\": \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-11\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 33000, \"output\": 4000 }\n      },\n      \"Qwen/Qwen3-VL-235B-A22B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-VL-235B-A22B-Thinking\",\n        \"name\": \"Qwen/Qwen3-VL-235B-A22B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.45, \"output\": 3.5 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3-8B\": {\n        \"id\": \"Qwen/Qwen3-8B\",\n        \"name\": \"Qwen/Qwen3-8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.06 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"THUDM/GLM-4-9B-0414\": {\n        \"id\": \"THUDM/GLM-4-9B-0414\",\n        \"name\": \"THUDM/GLM-4-9B-0414\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.086, \"output\": 0.086 },\n        \"limit\": { \"context\": 33000, \"output\": 33000 }\n      },\n      \"THUDM/GLM-Z1-9B-0414\": {\n        \"id\": \"THUDM/GLM-Z1-9B-0414\",\n        \"name\": \"THUDM/GLM-Z1-9B-0414\",\n        \"family\": \"glm-z\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.086, \"output\": 0.086 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"THUDM/GLM-4-32B-0414\": {\n        \"id\": \"THUDM/GLM-4-32B-0414\",\n        \"name\": \"THUDM/GLM-4-32B-0414\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.27 },\n        \"limit\": { \"context\": 33000, \"output\": 33000 }\n      },\n      \"THUDM/GLM-Z1-32B-0414\": {\n        \"id\": \"THUDM/GLM-Z1-32B-0414\",\n        \"name\": \"THUDM/GLM-Z1-32B-0414\",\n        \"family\": \"glm-z\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-03\",\n        \"last_updated\": \"2025-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.42 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2-Exp\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2-Exp\",\n        \"name\": \"deepseek-ai/DeepSeek-V3.2-Exp\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-10\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.41 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B\",\n        \"name\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"deepseek-ai/DeepSeek-V3\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3\",\n        \"name\": \"deepseek-ai/DeepSeek-V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1-Terminus\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"name\": \"deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B\",\n        \"name\": \"deepseek-ai/DeepSeek-R1-Distill-Qwen-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"deepseek-ai/deepseek-vl2\": {\n        \"id\": \"deepseek-ai/deepseek-vl2\",\n        \"name\": \"deepseek-ai/deepseek-vl2\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-13\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 4000, \"output\": 4000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1\",\n        \"name\": \"deepseek-ai/DeepSeek-V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-R1\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1\",\n        \"name\": \"deepseek-ai/DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2.18 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"stepfun-ai/Step-3.5-Flash\": {\n        \"id\": \"stepfun-ai/Step-3.5-Flash\",\n        \"name\": \"stepfun-ai/Step-3.5-Flash\",\n        \"family\": \"step\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"baidu/ERNIE-4.5-300B-A47B\": {\n        \"id\": \"baidu/ERNIE-4.5-300B-A47B\",\n        \"name\": \"baidu/ERNIE-4.5-300B-A47B\",\n        \"family\": \"ernie\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-02\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 1.1 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"zai-org/GLM-5.1\": {\n        \"id\": \"zai-org/GLM-5.1\",\n        \"name\": \"zai-org/GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_write\": 0 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"zai-org/GLM-4.6\": {\n        \"id\": \"zai-org/GLM-4.6\",\n        \"name\": \"zai-org/GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.9 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"zai-org/GLM-4.5V\": {\n        \"id\": \"zai-org/GLM-4.5V\",\n        \"name\": \"zai-org/GLM-4.5V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.86 },\n        \"limit\": { \"context\": 66000, \"output\": 66000 }\n      },\n      \"zai-org/GLM-5V-Turbo\": {\n        \"id\": \"zai-org/GLM-5V-Turbo\",\n        \"name\": \"zai-org/GLM-5V-Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 4, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"zai-org/GLM-4.5\": {\n        \"id\": \"zai-org/GLM-4.5\",\n        \"name\": \"zai-org/GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"zai-org/GLM-4.7\": {\n        \"id\": \"zai-org/GLM-4.7\",\n        \"name\": \"zai-org/GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"zai-org/GLM-4.5-Air\": {\n        \"id\": \"zai-org/GLM-4.5-Air\",\n        \"name\": \"zai-org/GLM-4.5-Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.86 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"zai-org/GLM-5\": {\n        \"id\": \"zai-org/GLM-5\",\n        \"name\": \"zai-org/GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2 },\n        \"limit\": { \"context\": 205000, \"output\": 205000 }\n      },\n      \"zai-org/GLM-4.6V\": {\n        \"id\": \"zai-org/GLM-4.6V\",\n        \"name\": \"zai-org/GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-07\",\n        \"last_updated\": \"2025-12-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"MiniMaxAI/MiniMax-M2.1\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.1\",\n        \"name\": \"MiniMaxAI/MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 197000, \"output\": 131000 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-02-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 197000, \"output\": 131000 }\n      },\n      \"tencent/Hunyuan-A13B-Instruct\": {\n        \"id\": \"tencent/Hunyuan-A13B-Instruct\",\n        \"name\": \"tencent/Hunyuan-A13B-Instruct\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131000, \"output\": 131000 }\n      },\n      \"tencent/Hunyuan-MT-7B\": {\n        \"id\": \"tencent/Hunyuan-MT-7B\",\n        \"name\": \"tencent/Hunyuan-MT-7B\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 33000, \"output\": 33000 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"openai/gpt-oss-120b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.45 },\n        \"limit\": { \"context\": 131000, \"output\": 8000 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"openai/gpt-oss-20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.18 },\n        \"limit\": { \"context\": 131000, \"output\": 8000 }\n      },\n      \"ByteDance-Seed/Seed-OSS-36B-Instruct\": {\n        \"id\": \"ByteDance-Seed/Seed-OSS-36B-Instruct\",\n        \"name\": \"ByteDance-Seed/Seed-OSS-36B-Instruct\",\n        \"family\": \"seed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-04\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 0.57 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      }\n    }\n  },\n  \"vultr\": {\n    \"id\": \"vultr\",\n    \"env\": [\"VULTR_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.vultrinference.com/v1\",\n    \"name\": \"Vultr\",\n    \"doc\": \"https://api.vultrinference.com/\",\n    \"models\": {\n      \"DeepSeek-V3.2\": {\n        \"id\": \"DeepSeek-V3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 1.65 },\n        \"limit\": { \"context\": 127000, \"output\": 4096 }\n      },\n      \"Kimi-K2.5\": {\n        \"id\": \"Kimi-K2.5\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.75 },\n        \"limit\": { \"context\": 254000, \"output\": 32768 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-02-11\",\n        \"last_updated\": \"2025-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 194000, \"output\": 4096 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 129000, \"output\": 4096 }\n      },\n      \"GLM-5-FP8\": {\n        \"id\": \"GLM-5-FP8\",\n        \"name\": \"GLM 5 FP8\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.85, \"output\": 3.1 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      }\n    }\n  },\n  \"groq\": {\n    \"id\": \"groq\",\n    \"env\": [\"GROQ_API_KEY\"],\n    \"npm\": \"@ai-sdk/groq\",\n    \"name\": \"Groq\",\n    \"doc\": \"https://console.groq.com/docs/models\",\n    \"models\": {\n      \"llama-3.3-70b-versatile\": {\n        \"id\": \"llama-3.3-70b-versatile\",\n        \"name\": \"Llama 3.3 70B Versatile\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.59, \"output\": 0.79 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"llama-guard-3-8b\": {\n        \"id\": \"llama-guard-3-8b\",\n        \"name\": \"Llama Guard 3 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 0.99 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"mistral-saba-24b\": {\n        \"id\": \"mistral-saba-24b\",\n        \"name\": \"Mistral Saba 24B\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-02-06\",\n        \"last_updated\": \"2025-02-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.79, \"output\": 0.79 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 },\n        \"status\": \"deprecated\"\n      },\n      \"whisper-large-v3-turbo\": {\n        \"id\": \"whisper-large-v3-turbo\",\n        \"name\": \"Whisper Large v3 Turbo\",\n        \"family\": \"whisper\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 448, \"output\": 448 }\n      },\n      \"llama3-8b-8192\": {\n        \"id\": \"llama3-8b-8192\",\n        \"name\": \"Llama 3 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-03\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.08 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"allam-2-7b\": {\n        \"id\": \"allam-2-7b\",\n        \"name\": \"ALLaM-2-7b\",\n        \"family\": \"allam\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"qwen-qwq-32b\": {\n        \"id\": \"qwen-qwq-32b\",\n        \"name\": \"Qwen QwQ 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-11-27\",\n        \"last_updated\": \"2024-11-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 0.39 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 },\n        \"status\": \"deprecated\"\n      },\n      \"gemma2-9b-it\": {\n        \"id\": \"gemma2-9b-it\",\n        \"name\": \"Gemma 2 9B\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-27\",\n        \"last_updated\": \"2024-06-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"llama3-70b-8192\": {\n        \"id\": \"llama3-70b-8192\",\n        \"name\": \"Llama 3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-03\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.59, \"output\": 0.79 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"whisper-large-v3\": {\n        \"id\": \"whisper-large-v3\",\n        \"name\": \"Whisper Large V3\",\n        \"family\": \"whisper\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2023-09-01\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 448, \"output\": 448 }\n      },\n      \"llama-3.1-8b-instant\": {\n        \"id\": \"llama-3.1-8b-instant\",\n        \"name\": \"Llama 3.1 8B Instant\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.08 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"qwen/qwen3-32b\": {\n        \"id\": \"qwen/qwen3-32b\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11-08\",\n        \"release_date\": \"2024-12-23\",\n        \"last_updated\": \"2024-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 0.59 },\n        \"limit\": { \"context\": 131072, \"output\": 40960 }\n      },\n      \"meta-llama/llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"meta-llama/llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout 17B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11, \"output\": 0.34 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"meta-llama/llama-prompt-guard-2-86m\": {\n        \"id\": \"meta-llama/llama-prompt-guard-2-86m\",\n        \"name\": \"Llama Prompt Guard 2 86M\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 512, \"output\": 512 }\n      },\n      \"meta-llama/llama-4-maverick-17b-128e-instruct\": {\n        \"id\": \"meta-llama/llama-4-maverick-17b-128e-instruct\",\n        \"name\": \"Llama 4 Maverick 17B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 },\n        \"status\": \"deprecated\"\n      },\n      \"meta-llama/llama-prompt-guard-2-22m\": {\n        \"id\": \"meta-llama/llama-prompt-guard-2-22m\",\n        \"name\": \"Llama Prompt Guard 2 22M\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.03 },\n        \"limit\": { \"context\": 512, \"output\": 512 }\n      },\n      \"meta-llama/llama-guard-4-12b\": {\n        \"id\": \"meta-llama/llama-guard-4-12b\",\n        \"name\": \"Llama Guard 4 12B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 1024 },\n        \"status\": \"deprecated\"\n      },\n      \"moonshotai/kimi-k2-instruct\": {\n        \"id\": \"moonshotai/kimi-k2-instruct\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-14\",\n        \"last_updated\": \"2025-07-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 },\n        \"status\": \"deprecated\"\n      },\n      \"moonshotai/kimi-k2-instruct-0905\": {\n        \"id\": \"moonshotai/kimi-k2-instruct-0905\",\n        \"name\": \"Kimi K2 Instruct 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"canopylabs/orpheus-v1-english\": {\n        \"id\": \"canopylabs/orpheus-v1-english\",\n        \"name\": \"Orpheus V1 English\",\n        \"family\": \"canopylabs\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12-19\",\n        \"release_date\": \"2025-12-19\",\n        \"last_updated\": \"2025-12-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 4000, \"output\": 50000 }\n      },\n      \"canopylabs/orpheus-arabic-saudi\": {\n        \"id\": \"canopylabs/orpheus-arabic-saudi\",\n        \"name\": \"Orpheus Arabic Saudi\",\n        \"family\": \"canopylabs\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12-16\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 40, \"output\": 0 },\n        \"limit\": { \"context\": 4000, \"output\": 50000 }\n      },\n      \"groq/compound-mini\": {\n        \"id\": \"groq/compound-mini\",\n        \"name\": \"Compound Mini\",\n        \"family\": \"groq\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-04\",\n        \"release_date\": \"2025-09-04\",\n        \"last_updated\": \"2025-09-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"groq/compound\": {\n        \"id\": \"groq/compound\",\n        \"name\": \"Compound\",\n        \"family\": \"groq\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-04\",\n        \"release_date\": \"2025-09-04\",\n        \"last_updated\": \"2025-09-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"openai/gpt-oss-safeguard-20b\": {\n        \"id\": \"openai/gpt-oss-safeguard-20b\",\n        \"name\": \"Safety GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-05\",\n        \"last_updated\": \"2025-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3, \"cache_read\": 0.037 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      }\n    }\n  },\n  \"v0\": {\n    \"id\": \"v0\",\n    \"env\": [\"V0_API_KEY\"],\n    \"npm\": \"@ai-sdk/vercel\",\n    \"name\": \"v0\",\n    \"doc\": \"https://sdk.vercel.ai/providers/ai-sdk-providers/vercel\",\n    \"models\": {\n      \"v0-1.5-md\": {\n        \"id\": \"v0-1.5-md\",\n        \"name\": \"v0-1.5-md\",\n        \"family\": \"v0\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-09\",\n        \"last_updated\": \"2025-06-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"v0-1.0-md\": {\n        \"id\": \"v0-1.0-md\",\n        \"name\": \"v0-1.0-md\",\n        \"family\": \"v0\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"v0-1.5-lg\": {\n        \"id\": \"v0-1.5-lg\",\n        \"name\": \"v0-1.5-lg\",\n        \"family\": \"v0\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-09\",\n        \"last_updated\": \"2025-06-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75 },\n        \"limit\": { \"context\": 512000, \"output\": 32000 }\n      }\n    }\n  },\n  \"aihubmix\": {\n    \"id\": \"aihubmix\",\n    \"env\": [\"AIHUBMIX_API_KEY\"],\n    \"npm\": \"@aihubmix/ai-sdk-provider\",\n    \"name\": \"AIHubMix\",\n    \"doc\": \"https://docs.aihubmix.com\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.88, \"output\": 2.82 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.45 },\n        \"limit\": { \"context\": 131000, \"output\": 64000 }\n      },\n      \"coding-minimax-m2.1-free\": {\n        \"id\": \"coding-minimax-m2.1-free\",\n        \"name\": \"Coding MiniMax M2.1 Free\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1.1, \"cache_read\": 0.548 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"coding-glm-5.1\": {\n        \"id\": \"coding-glm-5.1\",\n        \"name\": \"Coding-GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-11\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.22 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"Kimi-K2-0905\": {\n        \"id\": \"Kimi-K2-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 1000000, \"output\": 65000 }\n      },\n      \"gemini-3-pro-preview-search\": {\n        \"id\": \"gemini-3-pro-preview-search\",\n        \"name\": \"Gemini 3 Pro Preview Search\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65000 }\n      },\n      \"qwen3.5-plus\": {\n        \"id\": \"qwen3.5-plus\",\n        \"name\": \"Qwen 3.5 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.11, \"output\": 0.66 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 2.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-15\",\n        \"last_updated\": \"2025-11-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-6-think\": {\n        \"id\": \"claude-sonnet-4-6-think\",\n        \"name\": \"Claude Sonnet 4.6 Think\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 20, \"cache_read\": 2.5 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 6, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 200000, \"output\": 65536 }\n      },\n      \"coding-glm-4.7\": {\n        \"id\": \"coding-glm-4.7\",\n        \"name\": \"Coding-GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.22, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"claude-opus-4-5\": {\n        \"id\": \"claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"deepseek-v3.2-think\": {\n        \"id\": \"deepseek-v3.2-think\",\n        \"name\": \"DeepSeek-V3.2-Think\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.45 },\n        \"limit\": { \"context\": 131000, \"output\": 64000 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5-Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 6, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1-Codex-Max\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"GPT-5-Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 7, \"output\": 28, \"cache_read\": 3.5 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-opus-4-1\": {\n        \"id\": \"claude-opus-4-1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 16.5,\n          \"output\": 82.5,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65000 }\n      },\n      \"coding-glm-4.7-free\": {\n        \"id\": \"coding-glm-4.7-free\",\n        \"name\": \"Coding GLM 4.7 Free\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4-Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"claude-opus-4-6-think\": {\n        \"id\": \"claude-opus-4-6-think\",\n        \"name\": \"Claude Opus 4.6 Think\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-11\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.84, \"output\": 3.38 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 5, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 2000000, \"output\": 65000 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"glm-4.6v\": {\n        \"id\": \"glm-4.6v\",\n        \"name\": \"GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.41 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"GPT-5-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.12 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 1.15 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"deepseek-v3.2-fast\": {\n        \"id\": \"deepseek-v3.2-fast\",\n        \"name\": \"DeepSeek-V3.2-Fast\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.1, \"output\": 3.29 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"coding-glm-5-free\": {\n        \"id\": \"coding-glm-5-free\",\n        \"name\": \"Coding-GLM-5-Free\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.82, \"output\": 3.29 },\n        \"limit\": { \"context\": 262144, \"output\": 131000 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen3-coder-next\": {\n        \"id\": \"qwen3-coder-next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-04\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.55 },\n        \"limit\": { \"context\": 262144, \"input\": 262144, \"output\": 65536 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"GPT-4.1 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"minimax-m2.1\": {\n        \"id\": \"minimax-m2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 1.15 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5-Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1 Codex Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-15\",\n        \"last_updated\": \"2025-11-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-15\",\n        \"last_updated\": \"2025-11-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3.3,\n          \"output\": 16.5,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.1,\n          \"output\": 5.5,\n          \"cache_read\": 0.11,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"qwen3-max-2026-01-23\": {\n        \"id\": \"qwen3-max-2026-01-23\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.34, \"output\": 1.37 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      }\n    }\n  },\n  \"deepinfra\": {\n    \"id\": \"deepinfra\",\n    \"env\": [\"DEEPINFRA_API_KEY\"],\n    \"npm\": \"@ai-sdk/deepinfra\",\n    \"name\": \"Deep Infra\",\n    \"doc\": \"https://deepinfra.com/models\",\n    \"models\": {\n      \"meta-llama/Llama-4-Scout-17B-16E-Instruct\": {\n        \"id\": \"meta-llama/Llama-4-Scout-17B-16E-Instruct\",\n        \"name\": \"Llama 4 Scout 17B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.3 },\n        \"limit\": { \"context\": 10000000, \"output\": 16384 }\n      },\n      \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\": {\n        \"id\": \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\",\n        \"name\": \"Llama 4 Maverick 17B FP8\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 1000000, \"output\": 16384 }\n      },\n      \"meta-llama/Llama-3.3-70B-Instruct-Turbo\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n        \"name\": \"Llama 3.3 70B Turbo\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.32 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/Llama-3.1-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.1-70B-Instruct\",\n        \"name\": \"Llama 3.1 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/Llama-3.1-70B-Instruct-Turbo\": {\n        \"id\": \"meta-llama/Llama-3.1-70B-Instruct-Turbo\",\n        \"name\": \"Llama 3.1 70B Turbo\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/Llama-3.1-8B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.1-8B-Instruct\",\n        \"name\": \"Llama 3.1 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.05 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/Llama-3.1-8B-Instruct-Turbo\": {\n        \"id\": \"meta-llama/Llama-3.1-8B-Instruct-Turbo\",\n        \"name\": \"Llama 3.1 8B Turbo\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.03 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2.8 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.47, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2.6\": {\n        \"id\": \"moonshotai/Kimi-K2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 3.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"moonshotai/Kimi-K2-Instruct\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct\",\n        \"name\": \"Kimi K2\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"anthropic/claude-3-7-sonnet-latest\": {\n        \"id\": \"anthropic/claude-3-7-sonnet-latest\",\n        \"name\": \"Claude Sonnet 3.7 (Latest)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-31\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.3, \"output\": 16.5, \"cache_read\": 0.33 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-4-opus\": {\n        \"id\": \"anthropic/claude-4-opus\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-06-12\",\n        \"last_updated\": \"2025-06-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 16.5, \"output\": 82.5 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"Qwen/Qwen3.5-35B-A3B\": {\n        \"id\": \"Qwen/Qwen3.5-35B-A3B\",\n        \"name\": \"Qwen 3.5 35B A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.95 },\n        \"limit\": { \"context\": 262144, \"output\": 81920 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"Qwen/Qwen3.5-397B-A17B\": {\n        \"id\": \"Qwen/Qwen3.5-397B-A17B\",\n        \"name\": \"Qwen 3.5 397B A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.54, \"output\": 3.4 },\n        \"limit\": { \"context\": 262144, \"output\": 81920 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"Qwen/Qwen3.6-35B-A3B\": {\n        \"id\": \"Qwen/Qwen3.6-35B-A3B\",\n        \"name\": \"Qwen3.6 35B A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1 },\n        \"limit\": { \"context\": 262144, \"output\": 81920 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.26, \"output\": 0.38, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 163840, \"output\": 64000 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek-R1-0528\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 2.15, \"cache_read\": 0.35 },\n        \"limit\": { \"context\": 163840, \"output\": 64000 }\n      },\n      \"zai-org/GLM-5.1\": {\n        \"id\": \"zai-org/GLM-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"zai-org/GLM-4.6\": {\n        \"id\": \"zai-org/GLM-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.43, \"output\": 1.74, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/GLM-4.5\": {\n        \"id\": \"zai-org/GLM-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 },\n        \"status\": \"deprecated\"\n      },\n      \"zai-org/GLM-4.7-Flash\": {\n        \"id\": \"zai-org/GLM-4.7-Flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.4 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"zai-org/GLM-4.7\": {\n        \"id\": \"zai-org/GLM-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.43, \"output\": 1.75, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"zai-org/GLM-5\": {\n        \"id\": \"zai-org/GLM-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 2.56, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"zai-org/GLM-4.6V\": {\n        \"id\": \"zai-org/GLM-4.6V\",\n        \"name\": \"GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.1\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.2 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      },\n      \"MiniMaxAI/MiniMax-M2\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2\",\n        \"name\": \"MiniMax M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.254, \"output\": 1.02 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.27,\n          \"output\": 0.95,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.24 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.14 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      }\n    }\n  },\n  \"wafer.ai\": {\n    \"id\": \"wafer.ai\",\n    \"env\": [\"WAFER_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://pass.wafer.ai/v1\",\n    \"name\": \"Wafer\",\n    \"doc\": \"https://docs.wafer.ai/wafer-pass\",\n    \"models\": {\n      \"GLM-5.1\": {\n        \"id\": \"GLM-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"Qwen3.5-397B-A17B\": {\n        \"id\": \"Qwen3.5-397B-A17B\",\n        \"name\": \"Qwen3.5 397B A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      }\n    }\n  },\n  \"iflowcn\": {\n    \"id\": \"iflowcn\",\n    \"env\": [\"IFLOW_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://apis.iflow.cn/v1\",\n    \"name\": \"iFlow\",\n    \"doc\": \"https://platform.iflow.cn/en/docs\",\n    \"models\": {\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek-V3.2-Exp\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"kimi-k2\": {\n        \"id\": \"kimi-k2\",\n        \"name\": \"Kimi-K2\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"qwen3-coder-plus\": {\n        \"id\": \"qwen3-coder-plus\",\n        \"name\": \"Qwen3-Coder-Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen3-235B-A22B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"qwen3-max\": {\n        \"id\": \"qwen3-max\",\n        \"name\": \"Qwen3-Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"qwen3-max-preview\": {\n        \"id\": \"qwen3-max-preview\",\n        \"name\": \"Qwen3-Max-Preview\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"qwen3-235b-a22b-instruct\": {\n        \"id\": \"qwen3-235b-a22b-instruct\",\n        \"name\": \"Qwen3-235B-A22B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"kimi-k2-0905\": {\n        \"id\": \"kimi-k2-0905\",\n        \"name\": \"Kimi-K2-0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"qwen3-vl-plus\": {\n        \"id\": \"qwen3-vl-plus\",\n        \"name\": \"Qwen3-VL-Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"qwen3-235b\": {\n        \"id\": \"qwen3-235b\",\n        \"name\": \"Qwen3-235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3-32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"deepseek-v3\": {\n        \"id\": \"deepseek-v3\",\n        \"name\": \"DeepSeek-V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2024-12-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"deepseek-r1\": {\n        \"id\": \"deepseek-r1\",\n        \"name\": \"DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      }\n    }\n  },\n  \"gitlab\": {\n    \"id\": \"gitlab\",\n    \"env\": [\"GITLAB_TOKEN\"],\n    \"npm\": \"gitlab-ai-provider\",\n    \"name\": \"GitLab Duo\",\n    \"doc\": \"https://docs.gitlab.com/user/duo_agent_platform/\",\n    \"models\": {\n      \"duo-chat-gpt-5-mini\": {\n        \"id\": \"duo-chat-gpt-5-mini\",\n        \"name\": \"Agentic Chat (GPT-5 Mini)\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2026-01-22\",\n        \"last_updated\": \"2026-01-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"duo-chat-gpt-5-2-codex\": {\n        \"id\": \"duo-chat-gpt-5-2-codex\",\n        \"name\": \"Agentic Chat (GPT-5.2 Codex)\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-22\",\n        \"last_updated\": \"2026-01-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"duo-chat-haiku-4-5\": {\n        \"id\": \"duo-chat-haiku-4-5\",\n        \"name\": \"Agentic Chat (Claude Haiku 4.5)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2026-01-08\",\n        \"last_updated\": \"2026-01-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"duo-chat-sonnet-4-6\": {\n        \"id\": \"duo-chat-sonnet-4-6\",\n        \"name\": \"Agentic Chat (Claude Sonnet 4.6)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"duo-chat-sonnet-4-5\": {\n        \"id\": \"duo-chat-sonnet-4-5\",\n        \"name\": \"Agentic Chat (Claude Sonnet 4.5)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2026-01-08\",\n        \"last_updated\": \"2026-01-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"duo-chat-opus-4-6\": {\n        \"id\": \"duo-chat-opus-4-6\",\n        \"name\": \"Agentic Chat (Claude Opus 4.6)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"duo-chat-opus-4-5\": {\n        \"id\": \"duo-chat-opus-4-5\",\n        \"name\": \"Agentic Chat (Claude Opus 4.5)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2026-01-08\",\n        \"last_updated\": \"2026-01-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"duo-chat-gpt-5-3-codex\": {\n        \"id\": \"duo-chat-gpt-5-3-codex\",\n        \"name\": \"Agentic Chat (GPT-5.3 Codex)\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"duo-chat-gpt-5-4\": {\n        \"id\": \"duo-chat-gpt-5-4\",\n        \"name\": \"Agentic Chat (GPT-5.4)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"duo-chat-gpt-5-4-nano\": {\n        \"id\": \"duo-chat-gpt-5-4-nano\",\n        \"name\": \"Agentic Chat (GPT-5.4 Nano)\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"duo-chat-gpt-5-codex\": {\n        \"id\": \"duo-chat-gpt-5-codex\",\n        \"name\": \"Agentic Chat (GPT-5 Codex)\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2026-01-22\",\n        \"last_updated\": \"2026-01-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"duo-chat-gpt-5-4-mini\": {\n        \"id\": \"duo-chat-gpt-5-4-mini\",\n        \"name\": \"Agentic Chat (GPT-5.4 Mini)\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"duo-chat-opus-4-7\": {\n        \"id\": \"duo-chat-opus-4-7\",\n        \"name\": \"Agentic Chat (Claude Opus 4.7)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"duo-chat-gpt-5-1\": {\n        \"id\": \"duo-chat-gpt-5-1\",\n        \"name\": \"Agentic Chat (GPT-5.1)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2026-01-22\",\n        \"last_updated\": \"2026-01-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"duo-chat-gpt-5-2\": {\n        \"id\": \"duo-chat-gpt-5-2\",\n        \"name\": \"Agentic Chat (GPT-5.2)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-23\",\n        \"last_updated\": \"2026-01-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      }\n    }\n  },\n  \"deepseek\": {\n    \"id\": \"deepseek\",\n    \"env\": [\"DEEPSEEK_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.deepseek.com\",\n    \"name\": \"DeepSeek\",\n    \"doc\": \"https://api-docs.deepseek.com/quick_start/pricing\",\n    \"models\": {\n      \"deepseek-v4-pro\": {\n        \"id\": \"deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"deepseek-reasoner\": {\n        \"id\": \"deepseek-reasoner\",\n        \"name\": \"DeepSeek Reasoner\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2026-02-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"deepseek-v4-flash\": {\n        \"id\": \"deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      },\n      \"deepseek-chat\": {\n        \"id\": \"deepseek-chat\",\n        \"name\": \"DeepSeek Chat\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2026-02-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1000000, \"output\": 384000 }\n      }\n    }\n  },\n  \"perplexity\": {\n    \"id\": \"perplexity\",\n    \"env\": [\"PERPLEXITY_API_KEY\"],\n    \"npm\": \"@ai-sdk/perplexity\",\n    \"name\": \"Perplexity\",\n    \"doc\": \"https://docs.perplexity.ai\",\n    \"models\": {\n      \"sonar-deep-research\": {\n        \"id\": \"sonar-deep-research\",\n        \"name\": \"Perplexity Sonar Deep Research\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-02-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"reasoning\": 3 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"sonar\": {\n        \"id\": \"sonar\",\n        \"name\": \"Sonar\",\n        \"family\": \"sonar\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"sonar-reasoning-pro\": {\n        \"id\": \"sonar-reasoning-pro\",\n        \"name\": \"Sonar Reasoning Pro\",\n        \"family\": \"sonar-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"sonar-pro\": {\n        \"id\": \"sonar-pro\",\n        \"name\": \"Sonar Pro\",\n        \"family\": \"sonar-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09-01\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      }\n    }\n  },\n  \"xiaomi\": {\n    \"id\": \"xiaomi\",\n    \"env\": [\"XIAOMI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.xiaomimimo.com/v1\",\n    \"name\": \"Xiaomi\",\n    \"doc\": \"https://platform.xiaomimimo.com/#/docs\",\n    \"models\": {\n      \"mimo-v2.5-pro\": {\n        \"id\": \"mimo-v2.5-pro\",\n        \"name\": \"MiMo-V2.5-Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 131072 }\n      },\n      \"mimo-v2.5\": {\n        \"id\": \"mimo-v2.5\",\n        \"name\": \"MiMo-V2.5\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.4,\n          \"output\": 2,\n          \"cache_read\": 0.08,\n          \"context_over_200k\": { \"input\": 0.8, \"output\": 4, \"cache_read\": 0.16 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 131072 }\n      },\n      \"mimo-v2-flash\": {\n        \"id\": \"mimo-v2-flash\",\n        \"name\": \"MiMo-V2-Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12-01\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"mimo-v2-omni\": {\n        \"id\": \"mimo-v2-omni\",\n        \"name\": \"MiMo-V2-Omni\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"mimo-v2-pro\": {\n        \"id\": \"mimo-v2-pro\",\n        \"name\": \"MiMo-V2-Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      }\n    }\n  },\n  \"azure-cognitive-services\": {\n    \"id\": \"azure-cognitive-services\",\n    \"env\": [\n      \"AZURE_COGNITIVE_SERVICES_RESOURCE_NAME\",\n      \"AZURE_COGNITIVE_SERVICES_API_KEY\"\n    ],\n    \"npm\": \"@ai-sdk/azure\",\n    \"name\": \"Azure Cognitive Services\",\n    \"doc\": \"https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models\",\n    \"models\": {\n      \"claude-opus-4-5\": {\n        \"id\": \"claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"claude-opus-4-1\": {\n        \"id\": \"claude-opus-4-1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-31\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"gpt-5.4-nano\": {\n        \"id\": \"gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"deepseek-r1\": {\n        \"id\": \"deepseek-r1\",\n        \"name\": \"DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"gpt-4\": {\n        \"id\": \"gpt-4\",\n        \"name\": \"GPT-4\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-03-14\",\n        \"last_updated\": \"2023-03-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 60, \"output\": 120 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"phi-3-medium-128k-instruct\": {\n        \"id\": \"phi-3-medium-128k-instruct\",\n        \"name\": \"Phi-3-medium-instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"image\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"phi-3-small-128k-instruct\": {\n        \"id\": \"phi-3-small-128k-instruct\",\n        \"name\": \"Phi-3-small-instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta-llama-3.1-405b-instruct\": {\n        \"id\": \"meta-llama-3.1-405b-instruct\",\n        \"name\": \"Meta-Llama-3.1-405B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 5.33, \"output\": 16 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"llama-3.2-90b-vision-instruct\": {\n        \"id\": \"llama-3.2-90b-vision-instruct\",\n        \"name\": \"Llama-3.2-90B-Vision-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.04, \"output\": 2.04 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1 Codex Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"deepseek-v3.1\": {\n        \"id\": \"deepseek-v3.1\",\n        \"name\": \"DeepSeek-V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"phi-3.5-mini-instruct\": {\n        \"id\": \"phi-3.5-mini-instruct\",\n        \"name\": \"Phi-3.5-mini-instruct\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-3.5-turbo-instruct\": {\n        \"id\": \"gpt-3.5-turbo-instruct\",\n        \"name\": \"GPT-3.5 Turbo Instruct\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-09-21\",\n        \"last_updated\": \"2023-09-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 2 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"mistral-medium-2505\": {\n        \"id\": \"mistral-medium-2505\",\n        \"name\": \"Mistral Medium 3\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-4-turbo-vision\": {\n        \"id\": \"gpt-4-turbo-vision\",\n        \"name\": \"GPT-4 Turbo Vision\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"phi-4-reasoning-plus\": {\n        \"id\": \"phi-4-reasoning-plus\",\n        \"name\": \"Phi-4-reasoning-plus\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.125, \"output\": 0.5 },\n        \"limit\": { \"context\": 32000, \"output\": 4096 }\n      },\n      \"text-embedding-3-small\": {\n        \"id\": \"text-embedding-3-small\",\n        \"name\": \"text-embedding-3-small\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 8191, \"output\": 1536 }\n      },\n      \"mistral-small-2503\": {\n        \"id\": \"mistral-small-2503\",\n        \"name\": \"Mistral Small 3.1\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"phi-3-mini-128k-instruct\": {\n        \"id\": \"phi-3-mini-128k-instruct\",\n        \"name\": \"Phi-3-mini-instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistral-large-2411\": {\n        \"id\": \"mistral-large-2411\",\n        \"name\": \"Mistral Large 24.11\",\n        \"family\": \"mistral-large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"phi-4-multimodal\": {\n        \"id\": \"phi-4-multimodal\",\n        \"name\": \"Phi-4-multimodal\",\n        \"family\": \"phi\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.32, \"input_audio\": 4 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"ministral-3b\": {\n        \"id\": \"ministral-3b\",\n        \"name\": \"Ministral 3B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"phi-3.5-moe-instruct\": {\n        \"id\": \"phi-3.5-moe-instruct\",\n        \"name\": \"Phi-3.5-MoE-instruct\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.16, \"output\": 0.64 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"text-embedding-ada-002\": {\n        \"id\": \"text-embedding-ada-002\",\n        \"name\": \"text-embedding-ada-002\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2022-12-15\",\n        \"last_updated\": \"2022-12-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"llama-3.3-70b-instruct\": {\n        \"id\": \"llama-3.3-70b-instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.71, \"output\": 0.71 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"deepseek-v3.2-speciale\": {\n        \"id\": \"deepseek-v3.2-speciale\",\n        \"name\": \"DeepSeek-V3.2-Speciale\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.58, \"output\": 1.68 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"GPT-5-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"text-embedding-3-large\": {\n        \"id\": \"text-embedding-3-large\",\n        \"name\": \"text-embedding-3-large\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0 },\n        \"limit\": { \"context\": 8191, \"output\": 3072 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-02-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models\",\n          \"shape\": \"completions\"\n        }\n      },\n      \"phi-4-mini\": {\n        \"id\": \"phi-4-mini\",\n        \"name\": \"Phi-4-mini\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-3.5-turbo-0301\": {\n        \"id\": \"gpt-3.5-turbo-0301\",\n        \"name\": \"GPT-3.5 Turbo 0301\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 2 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"deepseek-r1-0528\": {\n        \"id\": \"deepseek-r1-0528\",\n        \"name\": \"DeepSeek-R1-0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"gpt-3.5-turbo-0613\": {\n        \"id\": \"gpt-3.5-turbo-0613\",\n        \"name\": \"GPT-3.5 Turbo 0613\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-06-13\",\n        \"last_updated\": \"2023-06-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 4 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"meta-llama-3.1-70b-instruct\": {\n        \"id\": \"meta-llama-3.1-70b-instruct\",\n        \"name\": \"Meta-Llama-3.1-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.68, \"output\": 3.54 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"llama-4-maverick-17b-128e-instruct-fp8\": {\n        \"id\": \"llama-4-maverick-17b-128e-instruct-fp8\",\n        \"name\": \"Llama 4 Maverick 17B 128E Instruct FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"cohere-embed-v3-english\": {\n        \"id\": \"cohere-embed-v3-english\",\n        \"name\": \"Embed v3 English\",\n        \"family\": \"cohere-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-11-07\",\n        \"last_updated\": \"2023-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 512, \"output\": 1024 }\n      },\n      \"cohere-embed-v3-multilingual\": {\n        \"id\": \"cohere-embed-v3-multilingual\",\n        \"name\": \"Embed v3 Multilingual\",\n        \"family\": \"cohere-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-11-07\",\n        \"last_updated\": \"2023-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 512, \"output\": 1024 }\n      },\n      \"gpt-5.2-chat\": {\n        \"id\": \"gpt-5.2-chat\",\n        \"name\": \"GPT-5.2 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-3.5-turbo-1106\": {\n        \"id\": \"gpt-3.5-turbo-1106\",\n        \"name\": \"GPT-3.5 Turbo 1106\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2023-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 2 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"phi-3-medium-4k-instruct\": {\n        \"id\": \"phi-3-medium-4k-instruct\",\n        \"name\": \"Phi-3-medium-instruct (4k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 4096, \"output\": 1024 }\n      },\n      \"cohere-command-a\": {\n        \"id\": \"cohere-command-a\",\n        \"name\": \"Command A\",\n        \"family\": \"command-a\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"output\": 8000 }\n      },\n      \"llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout 17B 16E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.78 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-5-chat\": {\n        \"id\": \"gpt-5-chat\",\n        \"name\": \"GPT-5 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-10-24\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"phi-4\": {\n        \"id\": \"phi-4\",\n        \"name\": \"Phi-4\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.125, \"output\": 0.5 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"codestral-2501\": {\n        \"id\": \"codestral-2501\",\n        \"name\": \"Codestral 25.01\",\n        \"family\": \"codestral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"llama-3.2-11b-vision-instruct\": {\n        \"id\": \"llama-3.2-11b-vision-instruct\",\n        \"name\": \"Llama-3.2-11B-Vision-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.37, \"output\": 0.37 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"gpt-4-32k\": {\n        \"id\": \"gpt-4-32k\",\n        \"name\": \"GPT-4 32K\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-03-14\",\n        \"last_updated\": \"2023-03-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 60, \"output\": 120 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"meta-llama-3-70b-instruct\": {\n        \"id\": \"meta-llama-3-70b-instruct\",\n        \"name\": \"Meta-Llama-3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.68, \"output\": 3.54 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"model-router\": {\n        \"id\": \"model-router\",\n        \"name\": \"Model Router\",\n        \"family\": \"model-router\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-05-19\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"mai-ds-r1\": {\n        \"id\": \"mai-ds-r1\",\n        \"name\": \"MAI-DS-R1\",\n        \"family\": \"mai\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-5.1-chat\": {\n        \"id\": \"gpt-5.1-chat\",\n        \"name\": \"GPT-5.1 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"image\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o1-mini\": {\n        \"id\": \"o1-mini\",\n        \"name\": \"o1-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"o1\": {\n        \"id\": \"o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"cohere-embed-v-4-0\": {\n        \"id\": \"cohere-embed-v-4-0\",\n        \"name\": \"Embed v4\",\n        \"family\": \"cohere-embed\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 1536 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistral-nemo\": {\n        \"id\": \"mistral-nemo\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"grok-4-fast-reasoning\": {\n        \"id\": \"grok-4-fast-reasoning\",\n        \"name\": \"Grok 4 Fast (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"image\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"meta-llama-3.1-8b-instruct\": {\n        \"id\": \"meta-llama-3.1-8b-instruct\",\n        \"name\": \"Meta-Llama-3.1-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.61 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"phi-4-mini-reasoning\": {\n        \"id\": \"phi-4-mini-reasoning\",\n        \"name\": \"Phi-4-mini-reasoning\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"phi-3-small-8k-instruct\": {\n        \"id\": \"phi-3-small-8k-instruct\",\n        \"name\": \"Phi-3-small-instruct (8k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"phi-4-reasoning\": {\n        \"id\": \"phi-4-reasoning\",\n        \"name\": \"Phi-4-reasoning\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.125, \"output\": 0.5 },\n        \"limit\": { \"context\": 32000, \"output\": 4096 }\n      },\n      \"deepseek-v3-0324\": {\n        \"id\": \"deepseek-v3-0324\",\n        \"name\": \"DeepSeek-V3-0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.14, \"output\": 4.56 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"phi-3-mini-4k-instruct\": {\n        \"id\": \"phi-3-mini-4k-instruct\",\n        \"name\": \"Phi-3-mini-instruct (4k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 4096, \"output\": 1024 }\n      },\n      \"gpt-5.4-pro\": {\n        \"id\": \"gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"meta-llama-3-8b-instruct\": {\n        \"id\": \"meta-llama-3-8b-instruct\",\n        \"name\": \"Meta-Llama-3-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.61 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"codex-mini\": {\n        \"id\": \"codex-mini\",\n        \"name\": \"Codex Mini\",\n        \"family\": \"gpt-codex-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-05-16\",\n        \"last_updated\": \"2025-05-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 6, \"cache_read\": 0.375 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"o1-preview\": {\n        \"id\": \"o1-preview\",\n        \"name\": \"o1-preview\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 16.5, \"output\": 66, \"cache_read\": 8.25 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-3.5-turbo-0125\": {\n        \"id\": \"gpt-3.5-turbo-0125\",\n        \"name\": \"GPT-3.5 Turbo 0125\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.58, \"output\": 1.68 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"GPT-4.1 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"cohere-command-r-08-2024\": {\n        \"id\": \"cohere-command-r-08-2024\",\n        \"name\": \"Command R\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"gpt-5.5\": {\n        \"id\": \"gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 30,\n          \"cache_read\": 0.5,\n          \"context_over_200k\": { \"input\": 10, \"output\": 45, \"cache_read\": 1 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"gpt-4-turbo\": {\n        \"id\": \"gpt-4-turbo\",\n        \"name\": \"GPT-4 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"grok-4\": {\n        \"id\": \"grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"reasoning\": 15,\n          \"cache_read\": 0.75\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"grok-3\": {\n        \"id\": \"grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"cohere-command-r-plus-08-2024\": {\n        \"id\": \"cohere-command-r-plus-08-2024\",\n        \"name\": \"Command R+\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"grok-3-mini\": {\n        \"id\": \"grok-3-mini\",\n        \"name\": \"Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.5,\n          \"reasoning\": 0.5,\n          \"cache_read\": 0.075\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"GPT-5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"output\": 272000 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"Grok 4 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"o3\": {\n        \"id\": \"o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o-mini\": {\n        \"id\": \"gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o3-mini\": {\n        \"id\": \"o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      }\n    }\n  },\n  \"berget\": {\n    \"id\": \"berget\",\n    \"env\": [\"BERGET_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.berget.ai/v1\",\n    \"name\": \"Berget.AI\",\n    \"doc\": \"https://api.berget.ai\",\n    \"models\": {\n      \"meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-04-27\",\n        \"last_updated\": \"2025-04-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.99, \"output\": 0.99 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"mistralai/Mistral-Small-3.2-24B-Instruct-2506\": {\n        \"id\": \"mistralai/Mistral-Small-3.2-24B-Instruct-2506\",\n        \"name\": \"Mistral Small 3.2 24B Instruct 2506\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-10-01\",\n        \"last_updated\": \"2025-10-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.33, \"output\": 0.33 },\n        \"limit\": { \"context\": 32000, \"output\": 8192 }\n      },\n      \"zai-org/GLM-4.7\": {\n        \"id\": \"zai-org/GLM-4.7\",\n        \"name\": \"GLM 4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.77, \"output\": 2.75 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT-OSS-120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.44, \"output\": 0.99 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"google/gemma-4-31B-it\": {\n        \"id\": \"google/gemma-4-31B-it\",\n        \"name\": \"Gemma 4 31B Instruct\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.275, \"output\": 0.55 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      }\n    }\n  },\n  \"evroc\": {\n    \"id\": \"evroc\",\n    \"env\": [\"EVROC_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://models.think.evroc.com/v1\",\n    \"name\": \"evroc\",\n    \"doc\": \"https://docs.evroc.com/products/think/overview.html\",\n    \"models\": {\n      \"KBLab/kb-whisper-large\": {\n        \"id\": \"KBLab/kb-whisper-large\",\n        \"name\": \"KB Whisper\",\n        \"family\": \"whisper\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.00236, \"output\": 0.00236, \"output_audio\": 2.36 },\n        \"limit\": { \"context\": 448, \"output\": 448 }\n      },\n      \"nvidia/Llama-3.3-70B-Instruct-FP8\": {\n        \"id\": \"nvidia/Llama-3.3-70B-Instruct-FP8\",\n        \"name\": \"Llama 3.3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.18, \"output\": 1.18 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.47, \"output\": 5.9 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/Voxtral-Small-24B-2507\": {\n        \"id\": \"mistralai/Voxtral-Small-24B-2507\",\n        \"name\": \"Voxtral Small 24B\",\n        \"family\": \"voxtral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"audio\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.00236, \"output\": 0.00236, \"output_audio\": 2.36 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"mistralai/Magistral-Small-2509\": {\n        \"id\": \"mistralai/Magistral-Small-2509\",\n        \"name\": \"Magistral Small 1.2 24B\",\n        \"family\": \"magistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-06-01\",\n        \"last_updated\": \"2025-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.59, \"output\": 2.36 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistralai/devstral-small-2-24b-instruct-2512\": {\n        \"id\": \"mistralai/devstral-small-2-24b-instruct-2512\",\n        \"name\": \"Devstral Small 2 24B Instruct 2512\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.47 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"Qwen/Qwen3-Embedding-8B\": {\n        \"id\": \"Qwen/Qwen3-Embedding-8B\",\n        \"name\": \"Qwen3 Embedding 8B\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.12 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"Qwen/Qwen3-VL-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-30B-A3B-Instruct\",\n        \"name\": \"Qwen3 VL 30B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.24, \"output\": 0.94 },\n        \"limit\": { \"context\": 100000, \"output\": 100000 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Instruct-2507-FP8\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Instruct-2507-FP8\",\n        \"name\": \"Qwen3 30B 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.42 },\n        \"limit\": { \"context\": 64000, \"output\": 64000 }\n      },\n      \"microsoft/Phi-4-multimodal-instruct\": {\n        \"id\": \"microsoft/Phi-4-multimodal-instruct\",\n        \"name\": \"Phi-4 15B\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.24, \"output\": 0.47 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.24, \"output\": 0.94 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"openai/whisper-large-v3\": {\n        \"id\": \"openai/whisper-large-v3\",\n        \"name\": \"Whisper 3 Large\",\n        \"family\": \"whisper\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-01\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.00236, \"output\": 0.00236, \"output_audio\": 2.36 },\n        \"limit\": { \"context\": 448, \"output\": 4096 }\n      },\n      \"intfloat/multilingual-e5-large-instruct\": {\n        \"id\": \"intfloat/multilingual-e5-large-instruct\",\n        \"name\": \"E5 Multi-Lingual Large Embeddings 0.6B\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.12 },\n        \"limit\": { \"context\": 512, \"output\": 512 }\n      }\n    }\n  },\n  \"fireworks-ai\": {\n    \"id\": \"fireworks-ai\",\n    \"env\": [\"FIREWORKS_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.fireworks.ai/inference/v1/\",\n    \"name\": \"Fireworks AI\",\n    \"doc\": \"https://fireworks.ai/docs/\",\n    \"models\": {\n      \"accounts/fireworks/models/qwen3p6-plus\": {\n        \"id\": \"accounts/fireworks/models/qwen3p6-plus\",\n        \"name\": \"Qwen 3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-04\",\n        \"last_updated\": \"2026-04-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"accounts/fireworks/models/glm-5\": {\n        \"id\": \"accounts/fireworks/models/glm-5\",\n        \"name\": \"GLM 5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"accounts/fireworks/models/glm-4p7\": {\n        \"id\": \"accounts/fireworks/models/glm-4p7\",\n        \"name\": \"GLM 4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 198000, \"output\": 198000 }\n      },\n      \"accounts/fireworks/models/kimi-k2-thinking\": {\n        \"id\": \"accounts/fireworks/models/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.3 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"accounts/fireworks/models/kimi-k2-instruct\": {\n        \"id\": \"accounts/fireworks/models/kimi-k2-instruct\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"accounts/fireworks/models/deepseek-v3p2\": {\n        \"id\": \"accounts/fireworks/models/deepseek-v3p2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 160000, \"output\": 160000 }\n      },\n      \"accounts/fireworks/models/kimi-k2p6\": {\n        \"id\": \"accounts/fireworks/models/kimi-k2p6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-17\",\n        \"last_updated\": \"2026-04-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"accounts/fireworks/models/kimi-k2p5\": {\n        \"id\": \"accounts/fireworks/models/kimi-k2p5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"accounts/fireworks/models/minimax-m2p7\": {\n        \"id\": \"accounts/fireworks/models/minimax-m2p7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-12\",\n        \"last_updated\": \"2026-04-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      },\n      \"accounts/fireworks/models/glm-4p5-air\": {\n        \"id\": \"accounts/fireworks/models/glm-4p5-air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.88 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"accounts/fireworks/models/glm-5p1\": {\n        \"id\": \"accounts/fireworks/models/glm-5p1\",\n        \"name\": \"GLM 5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 202800, \"output\": 131072 }\n      },\n      \"accounts/fireworks/models/gpt-oss-120b\": {\n        \"id\": \"accounts/fireworks/models/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"accounts/fireworks/models/minimax-m2p5\": {\n        \"id\": \"accounts/fireworks/models/minimax-m2p5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      },\n      \"accounts/fireworks/models/glm-4p5\": {\n        \"id\": \"accounts/fireworks/models/glm-4p5\",\n        \"name\": \"GLM 4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.19 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"accounts/fireworks/models/minimax-m2p1\": {\n        \"id\": \"accounts/fireworks/models/minimax-m2p1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"accounts/fireworks/models/gpt-oss-20b\": {\n        \"id\": \"accounts/fireworks/models/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"accounts/fireworks/models/deepseek-v3p1\": {\n        \"id\": \"accounts/fireworks/models/deepseek-v3p1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"accounts/fireworks/routers/kimi-k2p5-turbo\": {\n        \"id\": \"accounts/fireworks/routers/kimi-k2p5-turbo\",\n        \"name\": \"Kimi K2.5 Turbo (firepass)\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      }\n    }\n  },\n  \"openrouter\": {\n    \"id\": \"openrouter\",\n    \"env\": [\"OPENROUTER_API_KEY\"],\n    \"npm\": \"@openrouter/ai-sdk-provider\",\n    \"api\": \"https://openrouter.ai/api/v1\",\n    \"name\": \"OpenRouter\",\n    \"doc\": \"https://openrouter.ai/models\",\n    \"models\": {\n      \"qwen/qwen3.6-plus\": {\n        \"id\": \"qwen/qwen3.6-plus\",\n        \"name\": \"Qwen3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.325, \"output\": 1.95 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen-2.5-coder-32b-instruct\": {\n        \"id\": \"qwen/qwen-2.5-coder-32b-instruct\",\n        \"name\": \"Qwen2.5 Coder 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-11-11\",\n        \"last_updated\": \"2024-11-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"qwen/qwen3-235b-a22b-07-25\": {\n        \"id\": \"qwen/qwen3-235b-a22b-07-25\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-07-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.85 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"qwen/qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen/qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.078, \"output\": 0.312 },\n        \"limit\": { \"context\": 262144, \"output\": 81920 }\n      },\n      \"qwen/qwen3.5-plus-02-15\": {\n        \"id\": \"qwen/qwen3.5-plus-02-15\",\n        \"name\": \"Qwen3.5 Plus 2026-02-15\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3 Next 80B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-11\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 1.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen3-30b-a3b-instruct-2507\": {\n        \"id\": \"qwen/qwen3-30b-a3b-instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"qwen/qwen3-max\": {\n        \"id\": \"qwen/qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen/qwen3.5-flash-02-23\": {\n        \"id\": \"qwen/qwen3.5-flash-02-23\",\n        \"name\": \"Qwen: Qwen3.5-Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-25\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.065, \"output\": 0.26 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen2.5-vl-72b-instruct\": {\n        \"id\": \"qwen/qwen2.5-vl-72b-instruct\",\n        \"name\": \"Qwen2.5 VL 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-02-01\",\n        \"last_updated\": \"2025-02-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"qwen/qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3 Coder 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-07-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.27 },\n        \"limit\": { \"context\": 160000, \"output\": 65536 }\n      },\n      \"qwen/qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3 Next 80B A3B Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-11\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 1.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen3-coder-flash\": {\n        \"id\": \"qwen/qwen3-coder-flash\",\n        \"name\": \"Qwen3 Coder Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 128000, \"output\": 66536 }\n      },\n      \"qwen/qwen3-coder\": {\n        \"id\": \"qwen/qwen3-coder\",\n        \"name\": \"Qwen3 Coder\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"qwen/qwen3.5-397b-a17b\": {\n        \"id\": \"qwen/qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-30b-a3b-thinking-2507\": {\n        \"id\": \"qwen/qwen3-30b-a3b-thinking-2507\",\n        \"name\": \"Qwen3 30B A3B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"qwen/qwen3-coder:exacto\": {\n        \"id\": \"qwen/qwen3-coder:exacto\",\n        \"name\": \"Qwen3 Coder (exacto)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.38, \"output\": 1.53 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"meta-llama/llama-3.2-11b-vision-instruct\": {\n        \"id\": \"meta-llama/llama-3.2-11b-vision-instruct\",\n        \"name\": \"Llama 3.2 11B Vision Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"meta-llama/llama-3.2-3b-instruct:free\": {\n        \"id\": \"meta-llama/llama-3.2-3b-instruct:free\",\n        \"name\": \"Llama 3.2 3B Instruct (free)\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"meta-llama/llama-3.3-70b-instruct:free\": {\n        \"id\": \"meta-llama/llama-3.3-70b-instruct:free\",\n        \"name\": \"Llama 3.3 70B Instruct (free)\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"black-forest-labs/flux.2-flex\": {\n        \"id\": \"black-forest-labs/flux.2-flex\",\n        \"name\": \"FLUX.2 Flex\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 67344, \"output\": 67344 }\n      },\n      \"black-forest-labs/flux.2-klein-4b\": {\n        \"id\": \"black-forest-labs/flux.2-klein-4b\",\n        \"name\": \"FLUX.2 Klein 4B\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"black-forest-labs/flux.2-max\": {\n        \"id\": \"black-forest-labs/flux.2-max\",\n        \"name\": \"FLUX.2 Max\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 46864, \"output\": 46864 }\n      },\n      \"black-forest-labs/flux.2-pro\": {\n        \"id\": \"black-forest-labs/flux.2-pro\",\n        \"name\": \"FLUX.2 Pro\",\n        \"family\": \"flux\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 46864, \"output\": 46864 }\n      },\n      \"sourceful/riverflow-v2-standard-preview\": {\n        \"id\": \"sourceful/riverflow-v2-standard-preview\",\n        \"name\": \"Riverflow V2 Standard Preview\",\n        \"family\": \"sourceful\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"sourceful/riverflow-v2-fast-preview\": {\n        \"id\": \"sourceful/riverflow-v2-fast-preview\",\n        \"name\": \"Riverflow V2 Fast Preview\",\n        \"family\": \"sourceful\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"sourceful/riverflow-v2-max-preview\": {\n        \"id\": \"sourceful/riverflow-v2-max-preview\",\n        \"name\": \"Riverflow V2 Max Preview\",\n        \"family\": \"sourceful\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"nvidia/nemotron-3-super-120b-a12b:free\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b:free\",\n        \"name\": \"Nemotron 3 Super (free)\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"nvidia/nemotron-nano-12b-v2-vl:free\": {\n        \"id\": \"nvidia/nemotron-nano-12b-v2-vl:free\",\n        \"name\": \"Nemotron Nano 12B 2 VL (free)\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-10-28\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"nvidia/nemotron-3-super-120b-a12b\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b\",\n        \"name\": \"Nemotron 3 Super\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"nvidia/nemotron-nano-9b-v2\": {\n        \"id\": \"nvidia/nemotron-nano-9b-v2\",\n        \"name\": \"nvidia-nemotron-nano-9b-v2\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-08-18\",\n        \"last_updated\": \"2025-08-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.16 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nvidia/nemotron-3-nano-30b-a3b:free\": {\n        \"id\": \"nvidia/nemotron-3-nano-30b-a3b:free\",\n        \"name\": \"Nemotron 3 Nano 30B A3B (free)\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-12-14\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"nvidia/nemotron-nano-9b-v2:free\": {\n        \"id\": \"nvidia/nemotron-nano-9b-v2:free\",\n        \"name\": \"Nemotron Nano 9B V2 (free)\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-08-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"moonshotai/kimi-k2\": {\n        \"id\": \"moonshotai/kimi-k2\",\n        \"name\": \"Kimi K2\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2-0905\": {\n        \"id\": \"moonshotai/kimi-k2-0905\",\n        \"name\": \"Kimi K2 Instruct 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2.6\": {\n        \"id\": \"moonshotai/kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2-0905:exacto\": {\n        \"id\": \"moonshotai/kimi-k2-0905:exacto\",\n        \"name\": \"Kimi K2 Instruct 0905 (exacto)\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4.1\": {\n        \"id\": \"anthropic/claude-opus-4.1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-opus-4.6\": {\n        \"id\": \"anthropic/claude-opus-4.6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-haiku-4.5\": {\n        \"id\": \"anthropic/claude-haiku-4.5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4.5\": {\n        \"id\": \"anthropic/claude-opus-4.5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-30\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-opus-4.7\": {\n        \"id\": \"anthropic/claude-opus-4.7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-3.7-sonnet\": {\n        \"id\": \"anthropic/claude-3.7-sonnet\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4.6\": {\n        \"id\": \"anthropic/claude-sonnet-4.6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4.5\": {\n        \"id\": \"anthropic/claude-sonnet-4.5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"stepfun/step-3.5-flash\": {\n        \"id\": \"stepfun/step-3.5-flash\",\n        \"name\": \"Step 3.5 Flash\",\n        \"family\": \"step\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"mistralai/mistral-medium-3.1\": {\n        \"id\": \"mistralai/mistral-medium-3.1\",\n        \"name\": \"Mistral Medium 3.1\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-08-12\",\n        \"last_updated\": \"2025-08-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/devstral-medium-2507\": {\n        \"id\": \"mistralai/devstral-medium-2507\",\n        \"name\": \"Devstral Medium\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-07-10\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistralai/mistral-small-3.1-24b-instruct\": {\n        \"id\": \"mistralai/mistral-small-3.1-24b-instruct\",\n        \"name\": \"Mistral Small 3.1 24B Instruct\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-17\",\n        \"last_updated\": \"2025-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"mistralai/mistral-small-3.2-24b-instruct\": {\n        \"id\": \"mistralai/mistral-small-3.2-24b-instruct\",\n        \"name\": \"Mistral Small 3.2 24B Instruct\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-06-20\",\n        \"last_updated\": \"2025-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 96000, \"output\": 8192 }\n      },\n      \"mistralai/codestral-2508\": {\n        \"id\": \"mistralai/codestral-2508\",\n        \"name\": \"Codestral 2508\",\n        \"family\": \"codestral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"mistralai/mistral-small-2603\": {\n        \"id\": \"mistralai/mistral-small-2603\",\n        \"name\": \"Mistral Small 4\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/devstral-2512\": {\n        \"id\": \"mistralai/devstral-2512\",\n        \"name\": \"Devstral 2 2512\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-09-12\",\n        \"last_updated\": \"2025-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/devstral-small-2507\": {\n        \"id\": \"mistralai/devstral-small-2507\",\n        \"name\": \"Devstral Small 1.1\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-07-10\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistralai/mistral-medium-3\": {\n        \"id\": \"mistralai/mistral-medium-3\",\n        \"name\": \"Mistral Medium 3\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistralai/devstral-small-2505\": {\n        \"id\": \"mistralai/devstral-small-2505\",\n        \"name\": \"Devstral Small\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.12 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"nousresearch/hermes-4-70b\": {\n        \"id\": \"nousresearch/hermes-4-70b\",\n        \"name\": \"Hermes 4 70B\",\n        \"family\": \"hermes\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-08-25\",\n        \"last_updated\": \"2025-08-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nousresearch/hermes-3-llama-3.1-405b:free\": {\n        \"id\": \"nousresearch/hermes-3-llama-3.1-405b:free\",\n        \"name\": \"Hermes 3 405B Instruct (free)\",\n        \"family\": \"hermes\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-08-16\",\n        \"last_updated\": \"2024-08-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nousresearch/hermes-4-405b\": {\n        \"id\": \"nousresearch/hermes-4-405b\",\n        \"name\": \"Hermes 4 405B\",\n        \"family\": \"hermes\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-08-25\",\n        \"last_updated\": \"2025-08-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"bytedance-seed/seedream-4.5\": {\n        \"id\": \"bytedance-seed/seedream-4.5\",\n        \"name\": \"Seedream 4.5\",\n        \"family\": \"seed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"image\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"deepseek/deepseek-v3.2\": {\n        \"id\": \"deepseek/deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 0.4 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-chat-v3.1\": {\n        \"id\": \"deepseek/deepseek-chat-v3.1\",\n        \"name\": \"DeepSeek-V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek/deepseek-chat-v3-0324\": {\n        \"id\": \"deepseek/deepseek-chat-v3-0324\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 16384, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek/deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-01-23\",\n        \"last_updated\": \"2025-01-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-v3.2-speciale\": {\n        \"id\": \"deepseek/deepseek-v3.2-speciale\",\n        \"name\": \"DeepSeek V3.2 Speciale\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.41 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-v3.1-terminus:exacto\": {\n        \"id\": \"deepseek/deepseek-v3.1-terminus:exacto\",\n        \"name\": \"DeepSeek V3.1 Terminus (exacto)\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-v3.1-terminus\": {\n        \"id\": \"deepseek/deepseek-v3.1-terminus\",\n        \"name\": \"DeepSeek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-r1\": {\n        \"id\": \"deepseek/deepseek-r1\",\n        \"name\": \"DeepSeek: R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.5 },\n        \"limit\": { \"context\": 64000, \"output\": 16000 }\n      },\n      \"xiaomi/mimo-v2-flash\": {\n        \"id\": \"xiaomi/mimo-v2-flash\",\n        \"name\": \"MiMo-V2-Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-14\",\n        \"last_updated\": \"2025-12-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"xiaomi/mimo-v2-omni\": {\n        \"id\": \"xiaomi/mimo-v2-omni\",\n        \"name\": \"MiMo-V2-Omni\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"xiaomi/mimo-v2-pro\": {\n        \"id\": \"xiaomi/mimo-v2-pro\",\n        \"name\": \"MiMo-V2-Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"openrouter/elephant-alpha\": {\n        \"id\": \"openrouter/elephant-alpha\",\n        \"name\": \"Elephant (free)\",\n        \"family\": \"elephant\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-13\",\n        \"last_updated\": \"2026-04-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"openrouter/pareto-code\": {\n        \"id\": \"openrouter/pareto-code\",\n        \"name\": \"Pareto Code Router\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"openrouter/free\": {\n        \"id\": \"openrouter/free\",\n        \"name\": \"Free Models Router\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-02-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 8000 }\n      },\n      \"cognitivecomputations/dolphin-mistral-24b-venice-edition:free\": {\n        \"id\": \"cognitivecomputations/dolphin-mistral-24b-venice-edition:free\",\n        \"name\": \"Uncensored (free)\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"inception/mercury-edit-2\": {\n        \"id\": \"inception/mercury-edit-2\",\n        \"name\": \"Mercury Edit 2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"inception/mercury-2\": {\n        \"id\": \"inception/mercury-2\",\n        \"name\": \"Mercury 2\",\n        \"family\": \"mercury\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-04\",\n        \"last_updated\": \"2026-03-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 50000 }\n      },\n      \"x-ai/grok-4.20-multi-agent-beta\": {\n        \"id\": \"x-ai/grok-4.20-multi-agent-beta\",\n        \"name\": \"Grok 4.20 Multi - Agent Beta\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-12\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 6,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 12 }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 },\n        \"status\": \"beta\"\n      },\n      \"x-ai/grok-4.20-beta\": {\n        \"id\": \"x-ai/grok-4.20-beta\",\n        \"name\": \"Grok 4.20 Beta\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-12\",\n        \"last_updated\": \"2026-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 6,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 12 }\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 },\n        \"status\": \"beta\"\n      },\n      \"x-ai/grok-4.1-fast\": {\n        \"id\": \"x-ai/grok-4.1-fast\",\n        \"name\": \"Grok 4.1 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 0.5,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.05\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"x-ai/grok-3-mini\": {\n        \"id\": \"x-ai/grok-3-mini\",\n        \"name\": \"Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.5,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.5\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"x-ai/grok-3-mini-beta\": {\n        \"id\": \"x-ai/grok-3-mini-beta\",\n        \"name\": \"Grok 3 Mini Beta\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.5,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.5\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"x-ai/grok-code-fast-1\": {\n        \"id\": \"x-ai/grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"x-ai/grok-3\": {\n        \"id\": \"x-ai/grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.75,\n          \"cache_write\": 15\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"x-ai/grok-4\": {\n        \"id\": \"x-ai/grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.75,\n          \"cache_write\": 15\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"x-ai/grok-4-fast\": {\n        \"id\": \"x-ai/grok-4-fast\",\n        \"name\": \"Grok 4 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 0.5,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.05\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"x-ai/grok-3-beta\": {\n        \"id\": \"x-ai/grok-3-beta\",\n        \"name\": \"Grok 3 Beta\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.75,\n          \"cache_write\": 15\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"prime-intellect/intellect-3\": {\n        \"id\": \"prime-intellect/intellect-3\",\n        \"name\": \"Intellect 3\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-01-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"minimax/minimax-m2\": {\n        \"id\": \"minimax/minimax-m2\",\n        \"name\": \"MiniMax M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-23\",\n        \"last_updated\": \"2025-10-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.28,\n          \"output\": 1.15,\n          \"cache_read\": 0.28,\n          \"cache_write\": 1.15\n        },\n        \"limit\": { \"context\": 196600, \"output\": 118000 }\n      },\n      \"minimax/minimax-m1\": {\n        \"id\": \"minimax/minimax-m1\",\n        \"name\": \"MiniMax M1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 40000 }\n      },\n      \"minimax/minimax-m2.5:free\": {\n        \"id\": \"minimax/minimax-m2.5:free\",\n        \"name\": \"MiniMax M2.5 (free)\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-01\": {\n        \"id\": \"minimax/minimax-01\",\n        \"name\": \"MiniMax-01\",\n        \"family\": \"minimax\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-01-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 1000000, \"output\": 1000000 }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.7\": {\n        \"id\": \"minimax/minimax-m2.7\",\n        \"name\": \"MiniMax M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"z-ai/glm-5\": {\n        \"id\": \"z-ai/glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 131000 }\n      },\n      \"z-ai/glm-4.7\": {\n        \"id\": \"z-ai/glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.6\": {\n        \"id\": \"z-ai/glm-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"z-ai/glm-5.1\": {\n        \"id\": \"z-ai/glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.5-air\": {\n        \"id\": \"z-ai/glm-4.5-air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 128000, \"output\": 96000 }\n      },\n      \"z-ai/glm-4.5v\": {\n        \"id\": \"z-ai/glm-4.5v\",\n        \"name\": \"GLM 4.5V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-11\",\n        \"last_updated\": \"2025-08-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 64000, \"output\": 16384 }\n      },\n      \"z-ai/glm-4.5-air:free\": {\n        \"id\": \"z-ai/glm-4.5-air:free\",\n        \"name\": \"GLM 4.5 Air (free)\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 96000 }\n      },\n      \"z-ai/glm-4.7-flash\": {\n        \"id\": \"z-ai/glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.4 },\n        \"limit\": { \"context\": 200000, \"output\": 65535 }\n      },\n      \"z-ai/glm-5-turbo\": {\n        \"id\": \"z-ai/glm-5-turbo\",\n        \"name\": \"GLM-5-Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.96,\n          \"output\": 3.2,\n          \"cache_read\": 0.192,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.5\": {\n        \"id\": \"z-ai/glm-4.5\",\n        \"name\": \"GLM 4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 128000, \"output\": 96000 }\n      },\n      \"z-ai/glm-4.6:exacto\": {\n        \"id\": \"z-ai/glm-4.6:exacto\",\n        \"name\": \"GLM 4.6 (exacto)\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"arcee-ai/trinity-large-thinking\": {\n        \"id\": \"arcee-ai/trinity-large-thinking\",\n        \"name\": \"Trinity Large Thinking\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.85 },\n        \"limit\": { \"context\": 262144, \"output\": 80000 }\n      },\n      \"arcee-ai/trinity-large-preview:free\": {\n        \"id\": \"arcee-ai/trinity-large-preview:free\",\n        \"name\": \"Trinity Large Preview\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"GPT-4o-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.4-pro\": {\n        \"id\": \"openai/gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180, \"cache_read\": 30 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"openai/gpt-oss-120b:free\": {\n        \"id\": \"openai/gpt-oss-120b:free\",\n        \"name\": \"gpt-oss-120b (free)\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"GPT-5.1-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"o4 Mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-oss-20b:free\": {\n        \"id\": \"openai/gpt-oss-20b:free\",\n        \"name\": \"gpt-oss-20b (free)\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-5.1-chat\": {\n        \"id\": \"openai/gpt-5.1-chat\",\n        \"name\": \"GPT-5.1 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-oss-120b:exacto\": {\n        \"id\": \"openai/gpt-oss-120b:exacto\",\n        \"name\": \"GPT OSS 120B (exacto)\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.24 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-5-chat\": {\n        \"id\": \"openai/gpt-5-chat\",\n        \"name\": \"GPT-5 Chat (latest)\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-codex-max\": {\n        \"id\": \"openai/gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1-Codex-Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-pro\": {\n        \"id\": \"openai/gpt-5-pro\",\n        \"name\": \"GPT-5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"output\": 272000 }\n      },\n      \"openai/gpt-oss-safeguard-20b\": {\n        \"id\": \"openai/gpt-oss-safeguard-20b\",\n        \"name\": \"GPT OSS Safeguard 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-29\",\n        \"last_updated\": \"2025-10-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"openai/gpt-5.2-chat\": {\n        \"id\": \"openai/gpt-5.2-chat\",\n        \"name\": \"GPT-5.2 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.4-mini\": {\n        \"id\": \"openai/gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1-mini\": {\n        \"id\": \"openai/gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.072, \"output\": 0.28 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-5-codex\": {\n        \"id\": \"openai/gpt-5-codex\",\n        \"name\": \"GPT-5 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.3-codex\": {\n        \"id\": \"openai/gpt-5.3-codex\",\n        \"name\": \"GPT-5.3-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-image\": {\n        \"id\": \"openai/gpt-5-image\",\n        \"name\": \"GPT-5 Image\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-10-14\",\n        \"last_updated\": \"2025-10-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"GPT-5.2-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"openai/gpt-5.2-pro\": {\n        \"id\": \"openai/gpt-5.2-pro\",\n        \"name\": \"GPT-5.2 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-nano\": {\n        \"id\": \"openai/gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.1-codex-mini\": {\n        \"id\": \"openai/gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1-Codex-Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.4-nano\": {\n        \"id\": \"openai/gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"google/gemini-2.5-flash-lite\": {\n        \"id\": \"google/gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-4-31b-it\": {\n        \"id\": \"google/gemma-4-31b-it\",\n        \"name\": \"Gemma 4 31B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"google/gemma-3-12b-it:free\": {\n        \"id\": \"google/gemma-3-12b-it:free\",\n        \"name\": \"Gemma 3 12B (free)\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"google/gemma-4-31b-it:free\": {\n        \"id\": \"google/gemma-4-31b-it:free\",\n        \"name\": \"Gemma 4 31B (free)\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-07-17\",\n        \"last_updated\": \"2025-07-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5, \"cache_read\": 0.0375 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3.1-flash-lite-preview\": {\n        \"id\": \"google/gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"pdf\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.5,\n          \"reasoning\": 1.5,\n          \"cache_read\": 0.025,\n          \"cache_write\": 0.083,\n          \"input_audio\": 0.5,\n          \"output_audio\": 0.5\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-4-26b-a4b-it:free\": {\n        \"id\": \"google/gemma-4-26b-a4b-it:free\",\n        \"name\": \"Gemma 4 26B A4B (free)\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-03\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"google/gemini-2.5-pro-preview-06-05\": {\n        \"id\": \"google/gemini-2.5-pro-preview-06-05\",\n        \"name\": \"Gemini 2.5 Pro Preview 06-05\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-3-4b-it:free\": {\n        \"id\": \"google/gemma-3-4b-it:free\",\n        \"name\": \"Gemma 3 4B (free)\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"google/gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"google/gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview 09-25\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3-pro-preview\": {\n        \"id\": \"google/gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12 },\n        \"limit\": { \"context\": 1050000, \"output\": 66000 }\n      },\n      \"google/gemini-2.5-flash-preview-09-2025\": {\n        \"id\": \"google/gemini-2.5-flash-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Preview 09-25\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5, \"cache_read\": 0.031 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-3-12b-it\": {\n        \"id\": \"google/gemma-3-12b-it\",\n        \"name\": \"Gemma 3 12B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"google/gemma-3-4b-it\": {\n        \"id\": \"google/gemma-3-4b-it\",\n        \"name\": \"Gemma 3 4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01703, \"output\": 0.06815 },\n        \"limit\": { \"context\": 96000, \"output\": 96000 }\n      },\n      \"google/gemini-3.1-flash-image-preview\": {\n        \"id\": \"google/gemini-3.1-flash-image-preview\",\n        \"name\": \"Gemini 3.1 Flash Image Preview (Nano Banana 2)\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"google/gemini-2.0-flash-001\": {\n        \"id\": \"google/gemini-2.0-flash-001\",\n        \"name\": \"Gemini 2.0 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"google/gemini-3-flash-preview\": {\n        \"id\": \"google/gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-3-27b-it:free\": {\n        \"id\": \"google/gemma-3-27b-it:free\",\n        \"name\": \"Gemma 3 27B (free)\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"google/gemma-3n-e4b-it:free\": {\n        \"id\": \"google/gemma-3n-e4b-it:free\",\n        \"name\": \"Gemma 3n 4B (free)\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2000 }\n      },\n      \"google/gemma-3-27b-it\": {\n        \"id\": \"google/gemma-3-27b-it\",\n        \"name\": \"Gemma 3 27B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.15 },\n        \"limit\": { \"context\": 96000, \"output\": 96000 }\n      },\n      \"google/gemini-2.5-pro-preview-05-06\": {\n        \"id\": \"google/gemini-2.5-pro-preview-05-06\",\n        \"name\": \"Gemini 2.5 Pro Preview 05-06\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2025-05-06\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-2-9b-it\": {\n        \"id\": \"google/gemma-2-9b-it\",\n        \"name\": \"Gemma 2 9B\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-06-28\",\n        \"last_updated\": \"2024-06-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.09 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"google/gemma-3n-e4b-it\": {\n        \"id\": \"google/gemma-3n-e4b-it\",\n        \"name\": \"Gemma 3n 4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.04 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"google/gemini-3.1-pro-preview-customtools\": {\n        \"id\": \"google/gemini-3.1-pro-preview-customtools\",\n        \"name\": \"Gemini 3.1 Pro Preview Custom Tools\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"reasoning\": 12,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3.1-pro-preview\": {\n        \"id\": \"google/gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"reasoning\": 12,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-3n-e2b-it:free\": {\n        \"id\": \"google/gemma-3n-e2b-it:free\",\n        \"name\": \"Gemma 3n 2B (free)\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2000 }\n      },\n      \"google/gemma-4-26b-a4b-it\": {\n        \"id\": \"google/gemma-4-26b-a4b-it\",\n        \"name\": \"Gemma 4 26B A4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-03\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"liquid/lfm-2.5-1.2b-instruct:free\": {\n        \"id\": \"liquid/lfm-2.5-1.2b-instruct:free\",\n        \"name\": \"LFM2.5-1.2B-Instruct (free)\",\n        \"family\": \"liquid\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"liquid/lfm-2.5-1.2b-thinking:free\": {\n        \"id\": \"liquid/lfm-2.5-1.2b-thinking:free\",\n        \"name\": \"LFM2.5-1.2B-Thinking (free)\",\n        \"family\": \"liquid\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"anthropic/claude-3.5-haiku\": {\n        \"id\": \"anthropic/claude-3.5-haiku\",\n        \"name\": \"Claude Haiku 3.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4\": {\n        \"id\": \"anthropic/claude-opus-4\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-v4-pro\": {\n        \"id\": \"deepseek/deepseek-v4-pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1048576, \"output\": 393216 }\n      },\n      \"deepseek/deepseek-v4-flash\": {\n        \"id\": \"deepseek/deepseek-v4-flash\",\n        \"name\": \"DeepSeek V4 Flash\",\n        \"family\": \"deepseek-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.28, \"cache_read\": 0.028 },\n        \"limit\": { \"context\": 1048576, \"output\": 393216 }\n      },\n      \"xiaomi/mimo-v2.5-pro\": {\n        \"id\": \"xiaomi/mimo-v2.5-pro\",\n        \"name\": \"MiMo-V2.5-Pro\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 131072 }\n      },\n      \"xiaomi/mimo-v2.5\": {\n        \"id\": \"xiaomi/mimo-v2.5\",\n        \"name\": \"MiMo-V2.5\",\n        \"family\": \"mimo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.4,\n          \"output\": 2,\n          \"cache_read\": 0.08,\n          \"context_over_200k\": { \"input\": 0.8, \"output\": 4, \"cache_read\": 0.16 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 131072 }\n      },\n      \"openai/gpt-5.5\": {\n        \"id\": \"openai/gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 30,\n          \"cache_read\": 0.5,\n          \"context_over_200k\": { \"input\": 10, \"output\": 45, \"cache_read\": 1 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.5,\n          \"output\": 15,\n          \"cache_read\": 0.25,\n          \"context_over_200k\": { \"input\": 5, \"output\": 22.5, \"cache_read\": 0.5 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.125,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 15,\n            \"cache_read\": 0.25\n          }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      }\n    }\n  },\n  \"qiniu-ai\": {\n    \"id\": \"qiniu-ai\",\n    \"env\": [\"QINIU_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.qnaigc.com/v1\",\n    \"name\": \"Qiniu\",\n    \"doc\": \"https://developer.qiniu.com/aitokenapi\",\n    \"models\": {\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1048576, \"output\": 64000 }\n      },\n      \"qwen-turbo\": {\n        \"id\": \"qwen-turbo\",\n        \"name\": \"Qwen-Turbo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1000000, \"output\": 4096 }\n      },\n      \"doubao-seed-2.0-pro\": {\n        \"id\": \"doubao-seed-2.0-pro\",\n        \"name\": \"Doubao Seed 2.0 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash-image\": {\n        \"id\": \"gemini-2.5-flash-image\",\n        \"name\": \"Gemini 2.5 Flash Image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-22\",\n        \"last_updated\": \"2025-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"kimi-k2\": {\n        \"id\": \"kimi-k2\",\n        \"name\": \"Kimi K2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1048576, \"output\": 64000 }\n      },\n      \"claude-3.5-haiku\": {\n        \"id\": \"claude-3.5-haiku\",\n        \"name\": \"Claude 3.5 Haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"deepseek-v3-0324\": {\n        \"id\": \"deepseek-v3-0324\",\n        \"name\": \"DeepSeek-V3-0324\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 16000 }\n      },\n      \"gemini-3.0-pro-image-preview\": {\n        \"id\": \"gemini-3.0-pro-image-preview\",\n        \"name\": \"Gemini 3.0 Pro Image Preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-12\",\n        \"last_updated\": \"2025-08-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 262144, \"output\": 4096 }\n      },\n      \"claude-4.5-haiku\": {\n        \"id\": \"claude-4.5-haiku\",\n        \"name\": \"Claude 4.5 Haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-16\",\n        \"last_updated\": \"2025-10-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3 Next 80B A3B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-12\",\n        \"last_updated\": \"2025-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen3-30b-a3b-instruct-2507\": {\n        \"id\": \"qwen3-30b-a3b-instruct-2507\",\n        \"name\": \"Qwen3 30b A3b Instruct 2507\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-04\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"doubao-seed-2.0-code\": {\n        \"id\": \"doubao-seed-2.0-code\",\n        \"name\": \"Doubao Seed 2.0 Code\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"gemini-2.0-flash\": {\n        \"id\": \"gemini-2.0-flash\",\n        \"name\": \"Gemini 2.0 Flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"doubao-seed-1.6\": {\n        \"id\": \"doubao-seed-1.6\",\n        \"name\": \"Doubao-Seed 1.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-15\",\n        \"last_updated\": \"2025-08-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"qwen3-max\": {\n        \"id\": \"qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"claude-4.5-sonnet\": {\n        \"id\": \"claude-4.5-sonnet\",\n        \"name\": \"Claude 4.5 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-3.5-sonnet\": {\n        \"id\": \"claude-3.5-sonnet\",\n        \"name\": \"Claude 3.5 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-09\",\n        \"last_updated\": \"2025-09-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 8200 }\n      },\n      \"claude-3.7-sonnet\": {\n        \"id\": \"claude-3.7-sonnet\",\n        \"name\": \"Claude 3.7 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"qwen3-max-preview\": {\n        \"id\": \"qwen3-max-preview\",\n        \"name\": \"Qwen3 Max Preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-06\",\n        \"last_updated\": \"2025-09-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"mimo-v2-flash\": {\n        \"id\": \"mimo-v2-flash\",\n        \"name\": \"Mimo-V2-Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"doubao-1.5-thinking-pro\": {\n        \"id\": \"doubao-1.5-thinking-pro\",\n        \"name\": \"Doubao 1.5 Thinking Pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 16000 }\n      },\n      \"claude-4.1-opus\": {\n        \"id\": \"claude-4.1-opus\",\n        \"name\": \"Claude 4.1 Opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-06\",\n        \"last_updated\": \"2025-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"doubao-seed-1.6-flash\": {\n        \"id\": \"doubao-seed-1.6-flash\",\n        \"name\": \"Doubao-Seed 1.6 Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-15\",\n        \"last_updated\": \"2025-08-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"claude-4.5-opus\": {\n        \"id\": \"claude-4.5-opus\",\n        \"name\": \"Claude 4.5 Opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"gemini-3.0-pro-preview\": {\n        \"id\": \"gemini-3.0-pro-preview\",\n        \"name\": \"Gemini 3.0 Pro Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"pdf\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"qwen2.5-vl-72b-instruct\": {\n        \"id\": \"qwen2.5-vl-72b-instruct\",\n        \"name\": \"Qwen 2.5 VL 72B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"qwen-max-2025-01-25\": {\n        \"id\": \"qwen-max-2025-01-25\",\n        \"name\": \"Qwen2.5-Max-2025-01-25\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"doubao-seed-1.6-thinking\": {\n        \"id\": \"doubao-seed-1.6-thinking\",\n        \"name\": \"Doubao-Seed 1.6 Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-15\",\n        \"last_updated\": \"2025-08-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"deepseek-r1-0528\": {\n        \"id\": \"deepseek-r1-0528\",\n        \"name\": \"DeepSeek-R1-0528\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"gemini-2.0-flash-lite\": {\n        \"id\": \"gemini-2.0-flash-lite\",\n        \"name\": \"Gemini 2.0 Flash Lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"doubao-seed-2.0-mini\": {\n        \"id\": \"doubao-seed-2.0-mini\",\n        \"name\": \"Doubao Seed 2.0 Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"gpt-oss-120b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-06\",\n        \"last_updated\": \"2025-08-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"doubao-1.5-vision-pro\": {\n        \"id\": \"doubao-1.5-vision-pro\",\n        \"name\": \"Doubao 1.5 Vision Pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 16000 }\n      },\n      \"qwen2.5-vl-7b-instruct\": {\n        \"id\": \"qwen2.5-vl-7b-instruct\",\n        \"name\": \"Qwen 2.5 VL 7B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"qwen3-vl-30b-a3b-thinking\": {\n        \"id\": \"qwen3-vl-30b-a3b-thinking\",\n        \"name\": \"Qwen3-Vl 30b A3b Thinking\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-09\",\n        \"last_updated\": \"2026-02-09\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 131000, \"output\": 4096 }\n      },\n      \"qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3 Next 80B A3B Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-12\",\n        \"last_updated\": \"2025-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"Qwen3 235b A22B Instruct 2507\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-12\",\n        \"last_updated\": \"2025-08-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 262144, \"output\": 64000 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-14\",\n        \"last_updated\": \"2025-08-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 262000, \"output\": 4096 }\n      },\n      \"kling-v2-6\": {\n        \"id\": \"kling-v2-6\",\n        \"name\": \"Kling-V2 6\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-13\",\n        \"last_updated\": \"2026-01-13\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"video\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 99999999, \"output\": 99999999 }\n      },\n      \"glm-4.5\": {\n        \"id\": \"glm-4.5\",\n        \"name\": \"GLM 4.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"qwen3-235b-a22b\": {\n        \"id\": \"qwen3-235b-a22b\",\n        \"name\": \"Qwen 3 235B A22B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"doubao-1.5-pro-32k\": {\n        \"id\": \"doubao-1.5-pro-32k\",\n        \"name\": \"Doubao 1.5 Pro 32k\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 12000 }\n      },\n      \"claude-4.0-sonnet\": {\n        \"id\": \"claude-4.0-sonnet\",\n        \"name\": \"Claude 4.0 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"qwen3-30b-a3b\": {\n        \"id\": \"qwen3-30b-a3b\",\n        \"name\": \"Qwen3 30B A3B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 40000, \"output\": 4096 }\n      },\n      \"gpt-oss-20b\": {\n        \"id\": \"gpt-oss-20b\",\n        \"name\": \"gpt-oss-20b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-06\",\n        \"last_updated\": \"2025-08-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen3.5-397b-a17b\": {\n        \"id\": \"qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B A17B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-22\",\n        \"last_updated\": \"2026-02-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"qwen-vl-max-2025-01-25\": {\n        \"id\": \"qwen-vl-max-2025-01-25\",\n        \"name\": \"Qwen VL-MAX-2025-01-25\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"qwen3-30b-a3b-thinking-2507\": {\n        \"id\": \"qwen3-30b-a3b-thinking-2507\",\n        \"name\": \"Qwen3 30b A3b Thinking 2507\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-04\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 126000, \"output\": 32000 }\n      },\n      \"gemini-3.0-flash-preview\": {\n        \"id\": \"gemini-3.0-flash-preview\",\n        \"name\": \"Gemini 3.0 Flash Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-18\",\n        \"last_updated\": \"2025-12-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"claude-4.0-opus\": {\n        \"id\": \"claude-4.0-opus\",\n        \"name\": \"Claude 4.0 Opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"deepseek-v3.1\": {\n        \"id\": \"deepseek-v3.1\",\n        \"name\": \"DeepSeek-V3.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3 32B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 40000, \"output\": 4096 }\n      },\n      \"MiniMax-M1\": {\n        \"id\": \"MiniMax-M1\",\n        \"name\": \"MiniMax M1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1000000, \"output\": 80000 }\n      },\n      \"doubao-seed-2.0-lite\": {\n        \"id\": \"doubao-seed-2.0-lite\",\n        \"name\": \"Doubao Seed 2.0 Lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"deepseek-v3\": {\n        \"id\": \"deepseek-v3\",\n        \"name\": \"DeepSeek-V3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 16000 }\n      },\n      \"deepseek-r1\": {\n        \"id\": \"deepseek-r1\",\n        \"name\": \"DeepSeek-R1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-07\",\n        \"last_updated\": \"2025-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 100000 }\n      },\n      \"moonshotai/kimi-k2-0905\": {\n        \"id\": \"moonshotai/kimi-k2-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-08\",\n        \"last_updated\": \"2025-09-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 100000 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Moonshotai/Kimi-K2.5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"stepfun/step-3.5-flash\": {\n        \"id\": \"stepfun/step-3.5-flash\",\n        \"name\": \"Stepfun/Step-3.5 Flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-02-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 64000, \"output\": 4096 }\n      },\n      \"deepseek/deepseek-v3.2-exp-thinking\": {\n        \"id\": \"deepseek/deepseek-v3.2-exp-thinking\",\n        \"name\": \"DeepSeek/DeepSeek-V3.2-Exp-Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-math-v2\": {\n        \"id\": \"deepseek/deepseek-math-v2\",\n        \"name\": \"Deepseek/Deepseek-Math-V2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-04\",\n        \"last_updated\": \"2025-12-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 160000, \"output\": 160000 }\n      },\n      \"deepseek/deepseek-v3.2-exp\": {\n        \"id\": \"deepseek/deepseek-v3.2-exp\",\n        \"name\": \"DeepSeek/DeepSeek-V3.2-Exp\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-v3.2-251201\": {\n        \"id\": \"deepseek/deepseek-v3.2-251201\",\n        \"name\": \"Deepseek/DeepSeek-V3.2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-v3.1-terminus-thinking\": {\n        \"id\": \"deepseek/deepseek-v3.1-terminus-thinking\",\n        \"name\": \"DeepSeek/DeepSeek-V3.1-Terminus-Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"deepseek/deepseek-v3.1-terminus\": {\n        \"id\": \"deepseek/deepseek-v3.1-terminus\",\n        \"name\": \"DeepSeek/DeepSeek-V3.1-Terminus\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"xiaomi/mimo-v2-flash\": {\n        \"id\": \"xiaomi/mimo-v2-flash\",\n        \"name\": \"Xiaomi/Mimo-V2-Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-26\",\n        \"last_updated\": \"2025-12-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"meituan/longcat-flash-lite\": {\n        \"id\": \"meituan/longcat-flash-lite\",\n        \"name\": \"Meituan/Longcat-Flash-Lite\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-02-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 320000 }\n      },\n      \"meituan/longcat-flash-chat\": {\n        \"id\": \"meituan/longcat-flash-chat\",\n        \"name\": \"Meituan/Longcat-Flash-Chat\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-05\",\n        \"last_updated\": \"2025-11-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"x-ai/grok-4.1-fast-non-reasoning\": {\n        \"id\": \"x-ai/grok-4.1-fast-non-reasoning\",\n        \"name\": \"X-Ai/Grok 4.1 Fast Non Reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-19\",\n        \"last_updated\": \"2025-12-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"x-ai/grok-4-fast-reasoning\": {\n        \"id\": \"x-ai/grok-4-fast-reasoning\",\n        \"name\": \"X-Ai/Grok-4-Fast-Reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-18\",\n        \"last_updated\": \"2025-12-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"x-ai/grok-4-fast-non-reasoning\": {\n        \"id\": \"x-ai/grok-4-fast-non-reasoning\",\n        \"name\": \"X-Ai/Grok-4-Fast-Non-Reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-18\",\n        \"last_updated\": \"2025-12-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"x-ai/grok-4.1-fast\": {\n        \"id\": \"x-ai/grok-4.1-fast\",\n        \"name\": \"x-AI/Grok-4.1-Fast\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"x-ai/grok-4.1-fast-reasoning\": {\n        \"id\": \"x-ai/grok-4.1-fast-reasoning\",\n        \"name\": \"X-Ai/Grok 4.1 Fast Reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-19\",\n        \"last_updated\": \"2025-12-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 20000000, \"output\": 2000000 }\n      },\n      \"x-ai/grok-code-fast-1\": {\n        \"id\": \"x-ai/grok-code-fast-1\",\n        \"name\": \"x-AI/Grok-Code-Fast 1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-02\",\n        \"last_updated\": \"2025-09-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"x-ai/grok-4-fast\": {\n        \"id\": \"x-ai/grok-4-fast\",\n        \"name\": \"x-AI/Grok-4-Fast\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-20\",\n        \"last_updated\": \"2025-09-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"minimax/minimax-m2\": {\n        \"id\": \"minimax/minimax-m2\",\n        \"name\": \"Minimax/Minimax-M2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-28\",\n        \"last_updated\": \"2025-10-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"Minimax/Minimax-M2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 204800, \"output\": 128000 }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"Minimax/Minimax-M2.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 204800, \"output\": 128000 }\n      },\n      \"minimax/minimax-m2.5-highspeed\": {\n        \"id\": \"minimax/minimax-m2.5-highspeed\",\n        \"name\": \"Minimax/Minimax-M2.5 Highspeed\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 204800, \"output\": 128000 }\n      },\n      \"stepfun-ai/gelab-zero-4b-preview\": {\n        \"id\": \"stepfun-ai/gelab-zero-4b-preview\",\n        \"name\": \"Stepfun-Ai/Gelab Zero 4b Preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 8192, \"output\": 4096 }\n      },\n      \"z-ai/glm-5\": {\n        \"id\": \"z-ai/glm-5\",\n        \"name\": \"Z-Ai/GLM 5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"z-ai/glm-4.7\": {\n        \"id\": \"z-ai/glm-4.7\",\n        \"name\": \"Z-Ai/GLM 4.7\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"z-ai/glm-4.6\": {\n        \"id\": \"z-ai/glm-4.6\",\n        \"name\": \"Z-AI/GLM 4.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-11\",\n        \"last_updated\": \"2025-10-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"z-ai/autoglm-phone-9b\": {\n        \"id\": \"z-ai/autoglm-phone-9b\",\n        \"name\": \"Z-Ai/Autoglm Phone 9b\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 12800, \"output\": 4096 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"OpenAI/GPT-5\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"OpenAI/GPT-5.2\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      }\n    }\n  },\n  \"abacus\": {\n    \"id\": \"abacus\",\n    \"env\": [\"ABACUS_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://routellm.abacus.ai/v1\",\n    \"name\": \"Abacus\",\n    \"doc\": \"https://abacus.ai/help/api\",\n    \"models\": {\n      \"llama-3.3-70b-versatile\": {\n        \"id\": \"llama-3.3-70b-versatile\",\n        \"name\": \"Llama 3.3 70B Versatile\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.59, \"output\": 0.79 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"claude-opus-4-20250514\": {\n        \"id\": \"claude-opus-4-20250514\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-14\",\n        \"last_updated\": \"2025-05-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"o3-mini\": {\n        \"id\": \"o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o-mini\": {\n        \"id\": \"gpt-4o-mini\",\n        \"name\": \"GPT-4o Mini\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o3\": {\n        \"id\": \"o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3.1-flash-lite-preview\": {\n        \"id\": \"gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-01\",\n        \"last_updated\": \"2026-03-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.5,\n          \"cache_read\": 0.025,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"o3-pro\": {\n        \"id\": \"o3-pro\",\n        \"name\": \"o3-pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-06-10\",\n        \"last_updated\": \"2025-06-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 20, \"output\": 40 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"claude-opus-4-1-20250805\": {\n        \"id\": \"claude-opus-4-1-20250805\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"qwen-2.5-coder-32b\": {\n        \"id\": \"qwen-2.5-coder-32b\",\n        \"name\": \"Qwen 2.5 Coder 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-11\",\n        \"last_updated\": \"2024-11-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.79, \"output\": 0.79 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-5.2-chat-latest\": {\n        \"id\": \"gpt-5.2-chat-latest\",\n        \"name\": \"GPT-5.2 Chat Latest\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2026-01-01\",\n        \"last_updated\": \"2026-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"Grok 4 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"output\": 16384 }\n      },\n      \"claude-3-7-sonnet-20250219\": {\n        \"id\": \"claude-3-7-sonnet-20250219\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-31\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen3-max\": {\n        \"id\": \"qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1 Codex Max\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-4o-2024-11-20\": {\n        \"id\": \"gpt-4o-2024-11-20\",\n        \"name\": \"GPT-4o (2024-11-20)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-11-20\",\n        \"last_updated\": \"2024-11-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-17\",\n        \"last_updated\": \"2025-11-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"output\": 16384 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 Mini\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"GPT-5 Codex\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.3-chat-latest\": {\n        \"id\": \"gpt-5.3-chat-latest\",\n        \"name\": \"GPT-5.3 Chat Latest\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-01\",\n        \"last_updated\": \"2026-03-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-20250514\": {\n        \"id\": \"claude-sonnet-4-20250514\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-14\",\n        \"last_updated\": \"2025-05-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5.3-codex-xhigh\": {\n        \"id\": \"gpt-5.3-codex-xhigh\",\n        \"name\": \"GPT-5.3 Codex XHigh\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"kimi-k2-turbo-preview\": {\n        \"id\": \"kimi-k2-turbo-preview\",\n        \"name\": \"Kimi K2 Turbo Preview\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-08\",\n        \"last_updated\": \"2025-07-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 8 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-opus-4-5-20251101\": {\n        \"id\": \"claude-opus-4-5-20251101\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"GPT-4.1 Nano\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"grok-4-0709\": {\n        \"id\": \"grok-4-0709\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gemini-3.1-pro-preview\": {\n        \"id\": \"gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.1-chat-latest\": {\n        \"id\": \"gpt-5.1-chat-latest\",\n        \"name\": \"GPT-5.1 Chat Latest\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"route-llm\": {\n        \"id\": \"route-llm\",\n        \"name\": \"Route LLM\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\": {\n        \"id\": \"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8\",\n        \"name\": \"Llama 4 Maverick 17B 128E Instruct FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.59 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"meta-llama/Meta-Llama-3.1-8B-Instruct\": {\n        \"id\": \"meta-llama/Meta-Llama-3.1-8B-Instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.05 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo\": {\n        \"id\": \"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo\",\n        \"name\": \"Llama 3.1 405B Instruct Turbo\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3.5, \"output\": 3.5 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"deepseek/deepseek-v3.1\": {\n        \"id\": \"deepseek/deepseek-v3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 1.66 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"Qwen/Qwen2.5-72B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-72B-Instruct\",\n        \"name\": \"Qwen 2.5 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-19\",\n        \"last_updated\": \"2024-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11, \"output\": 0.38 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"Qwen/QwQ-32B\": {\n        \"id\": \"Qwen/QwQ-32B\",\n        \"name\": \"QwQ 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-28\",\n        \"last_updated\": \"2024-11-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-32B\": {\n        \"id\": \"Qwen/Qwen3-32B\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.29 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"Qwen/qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"Qwen/qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2025-07-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-15\",\n        \"last_updated\": \"2025-06-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.4 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1-Terminus\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"name\": \"DeepSeek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-01\",\n        \"last_updated\": \"2025-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"deepseek-ai/DeepSeek-R1\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1\",\n        \"name\": \"DeepSeek R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3, \"output\": 7 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"zai-org/glm-5\": {\n        \"id\": \"zai-org/glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/glm-4.7\": {\n        \"id\": \"zai-org/glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-01\",\n        \"last_updated\": \"2025-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"zai-org/glm-4.6\": {\n        \"id\": \"zai-org/glm-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"zai-org/glm-4.5\": {\n        \"id\": \"zai-org/glm-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT-OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.44 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      }\n    }\n  },\n  \"302ai\": {\n    \"id\": \"302ai\",\n    \"env\": [\"302AI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.302.ai/v1\",\n    \"name\": \"302.AI\",\n    \"doc\": \"https://doc.302.ai\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"glm-5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.6 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"claude-opus-4-20250514\": {\n        \"id\": \"claude-opus-4-20250514\",\n        \"name\": \"claude-opus-4-20250514\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"grok-4.1\": {\n        \"id\": \"grok-4.1\",\n        \"name\": \"grok-4.1\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 10 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"deepseek-v3.2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 0.43 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"mistral-large-2512\": {\n        \"id\": \"mistral-large-2512\",\n        \"name\": \"mistral-large-2512\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 3.3 },\n        \"limit\": { \"context\": 128000, \"output\": 262144 }\n      },\n      \"claude-opus-4-5-20251101-thinking\": {\n        \"id\": \"claude-opus-4-5-20251101-thinking\",\n        \"name\": \"claude-opus-4-5-20251101-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"glm-4.7\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.286, \"output\": 1.142 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"claude-sonnet-4-5-20250929-thinking\": {\n        \"id\": \"claude-sonnet-4-5-20250929-thinking\",\n        \"name\": \"claude-sonnet-4-5-20250929-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gemini-2.5-flash-image\": {\n        \"id\": \"gemini-2.5-flash-image\",\n        \"name\": \"gemini-2.5-flash-image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-10-08\",\n        \"last_updated\": \"2025-10-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 30 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"MiniMax-M2.1\": {\n        \"id\": \"MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-19\",\n        \"last_updated\": \"2025-12-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 131072 }\n      },\n      \"glm-for-coding\": {\n        \"id\": \"glm-for-coding\",\n        \"name\": \"glm-for-coding\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.086, \"output\": 0.343 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"claude-sonnet-4-6\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-02-18\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"grok-4.20-multi-agent-beta-0309\": {\n        \"id\": \"grok-4.20-multi-agent-beta-0309\",\n        \"name\": \"grok-4.20-multi-agent-beta-0309\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"qwen-max-latest\": {\n        \"id\": \"qwen-max-latest\",\n        \"name\": \"Qwen-Max-Latest\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-04-03\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.343, \"output\": 1.372 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"gpt-5-thinking\": {\n        \"id\": \"gpt-5-thinking\",\n        \"name\": \"gpt-5-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"glm-4.5-x\": {\n        \"id\": \"glm-4.5-x\",\n        \"name\": \"glm-4.5-x\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.143, \"output\": 2.29 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"gemini-2.5-flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"doubao-seed-1-8-251215\": {\n        \"id\": \"doubao-seed-1-8-251215\",\n        \"name\": \"doubao-seed-1-8-251215\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-18\",\n        \"last_updated\": \"2025-12-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.114, \"output\": 0.286 },\n        \"limit\": { \"context\": 224000, \"output\": 64000 }\n      },\n      \"claude-3-5-haiku-20241022\": {\n        \"id\": \"claude-3-5-haiku-20241022\",\n        \"name\": \"claude-3-5-haiku-20241022\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 4 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"glm-4.5-airx\": {\n        \"id\": \"glm-4.5-airx\",\n        \"name\": \"glm-4.5-airx\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.572, \"output\": 1.714 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"MiniMax-M2.7\": {\n        \"id\": \"MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-19\",\n        \"last_updated\": \"2026-03-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"claude-opus-4-1-20250805\": {\n        \"id\": \"claude-opus-4-1-20250805\",\n        \"name\": \"claude-opus-4-1-20250805\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"deepseek-reasoner\": {\n        \"id\": \"deepseek-reasoner\",\n        \"name\": \"Deepseek-Reasoner\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 0.43 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"grok-4-fast-reasoning\": {\n        \"id\": \"grok-4-fast-reasoning\",\n        \"name\": \"grok-4-fast-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"glm-4.7-flashx\": {\n        \"id\": \"glm-4.7-flashx\",\n        \"name\": \"glm-4.7-flashx\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0715, \"output\": 0.429 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"gpt-5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash-nothink\": {\n        \"id\": \"gemini-2.5-flash-nothink\",\n        \"name\": \"gemini-2.5-flash-nothink\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-24\",\n        \"last_updated\": \"2025-06-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen-plus\": {\n        \"id\": \"qwen-plus\",\n        \"name\": \"Qwen-Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 1.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"kimi-k2-thinking-turbo\": {\n        \"id\": \"kimi-k2-thinking-turbo\",\n        \"name\": \"kimi-k2-thinking-turbo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.265, \"output\": 9.119 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"kimi-k2-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.575, \"output\": 2.3 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"claude-opus-4-5\": {\n        \"id\": \"claude-opus-4-5\",\n        \"name\": \"claude-opus-4-5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"MiniMax-M2.7-highspeed\": {\n        \"id\": \"MiniMax-M2.7-highspeed\",\n        \"name\": \"MiniMax-M2.7-highspeed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-19\",\n        \"last_updated\": \"2026-03-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 4.8 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"gpt-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5.2-chat-latest\": {\n        \"id\": \"gpt-5.2-chat-latest\",\n        \"name\": \"gpt-5.2-chat-latest\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-12\",\n        \"last_updated\": \"2025-12-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"grok-4-fast-non-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"MiniMax-M2\": {\n        \"id\": \"MiniMax-M2\",\n        \"name\": \"MiniMax-M2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-26\",\n        \"last_updated\": \"2025-10-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.33, \"output\": 1.32 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-26\",\n        \"last_updated\": \"2025-09-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"doubao-seed-code-preview-251028\": {\n        \"id\": \"doubao-seed-code-preview-251028\",\n        \"name\": \"doubao-seed-code-preview-251028\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-11\",\n        \"last_updated\": \"2025-11-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 1.14 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"gpt-5-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen3-max-2025-09-23\": {\n        \"id\": \"qwen3-max-2025-09-23\",\n        \"name\": \"qwen3-max-2025-09-23\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2025-09-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.86, \"output\": 3.43 },\n        \"limit\": { \"context\": 258048, \"output\": 65536 }\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"glm-4.6\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.286, \"output\": 1.142 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"gpt-5.4-mini-2026-03-17\": {\n        \"id\": \"gpt-5.4-mini-2026-03-17\",\n        \"name\": \"gpt-5.4-mini-2026-03-17\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-03-19\",\n        \"last_updated\": \"2026-03-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"gpt-5-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-10-08\",\n        \"last_updated\": \"2025-10-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"output\": 272000 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"claude-haiku-4-5-20251001\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-10-16\",\n        \"last_updated\": \"2025-10-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"gemini-3-pro-preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"qwen-flash\": {\n        \"id\": \"qwen-flash\",\n        \"name\": \"Qwen-Flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.022, \"output\": 0.22 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"gemini-3-pro-image-preview\": {\n        \"id\": \"gemini-3-pro-image-preview\",\n        \"name\": \"gemini-3-pro-image-preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 120 },\n        \"limit\": { \"context\": 32768, \"output\": 64000 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"grok-4-1-fast-non-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gemini-2.5-flash-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-preview-09-2025\",\n        \"name\": \"gemini-2.5-flash-preview-09-2025\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-26\",\n        \"last_updated\": \"2025-09-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"grok-4-1-fast-reasoning\": {\n        \"id\": \"grok-4-1-fast-reasoning\",\n        \"name\": \"grok-4-1-fast-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"claude-opus-4-6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"gpt-5.4-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-03-19\",\n        \"last_updated\": \"2026-03-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gemini-3.1-flash-image-preview\": {\n        \"id\": \"gemini-3.1-flash-image-preview\",\n        \"name\": \"gemini-3.1-flash-image-preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-27\",\n        \"last_updated\": \"2026-02-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 60 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"grok-4.20-beta-0309-reasoning\": {\n        \"id\": \"grok-4.20-beta-0309-reasoning\",\n        \"name\": \"grok-4.20-beta-0309-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"chatgpt-4o-latest\": {\n        \"id\": \"chatgpt-4o-latest\",\n        \"name\": \"chatgpt-4o-latest\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-08-08\",\n        \"last_updated\": \"2024-08-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"gpt-4.1-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"gpt-5.4-nano-2026-03-17\": {\n        \"id\": \"gpt-5.4-nano-2026-03-17\",\n        \"name\": \"gpt-5.4-nano-2026-03-17\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-03-19\",\n        \"last_updated\": \"2026-03-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"glm-5.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-10\",\n        \"last_updated\": \"2026-04-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.86, \"output\": 3.5 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"gemini-3-flash-preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-12-18\",\n        \"last_updated\": \"2025-12-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"gemini-2.5-pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"deepseek-v3.2-thinking\": {\n        \"id\": \"deepseek-v3.2-thinking\",\n        \"name\": \"DeepSeek-V3.2-Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 0.43 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"claude-opus-4-6-thinking\": {\n        \"id\": \"claude-opus-4-6-thinking\",\n        \"name\": \"claude-opus-4-6-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"grok-4.20-beta-0309-non-reasoning\": {\n        \"id\": \"grok-4.20-beta-0309-non-reasoning\",\n        \"name\": \"grok-4.20-beta-0309-non-reasoning\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gemini-2.0-flash-lite\": {\n        \"id\": \"gemini-2.0-flash-lite\",\n        \"name\": \"gemini-2.0-flash-lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-06-16\",\n        \"last_updated\": \"2025-06-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 2000000, \"output\": 8192 }\n      },\n      \"glm-4.6v\": {\n        \"id\": \"glm-4.6v\",\n        \"name\": \"GLM-4.6V\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.145, \"output\": 0.43 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"glm-4.5-air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1143, \"output\": 0.286 },\n        \"limit\": { \"context\": 128000, \"output\": 98304 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"gpt-5.2\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-12\",\n        \"last_updated\": \"2025-12-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"qwen3-235b-a22b-instruct-2507\": {\n        \"id\": \"qwen3-235b-a22b-instruct-2507\",\n        \"name\": \"qwen3-235b-a22b-instruct-2507\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 1.143 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"glm-4.5v\": {\n        \"id\": \"glm-4.5v\",\n        \"name\": \"GLM-4.5V\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-12\",\n        \"last_updated\": \"2025-08-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 0.86 },\n        \"limit\": { \"context\": 64000, \"output\": 16384 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"qwen3-coder-480b-a35b-instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.86, \"output\": 3.43 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"claude-3-5-haiku-latest\": {\n        \"id\": \"claude-3-5-haiku-latest\",\n        \"name\": \"claude-3-5-haiku-latest\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 4 },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"glm-5v-turbo\": {\n        \"id\": \"glm-5v-turbo\",\n        \"name\": \"glm-5v-turbo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.72, \"output\": 3.2 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-5-turbo\": {\n        \"id\": \"glm-5-turbo\",\n        \"name\": \"glm-5-turbo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.72, \"output\": 3.2 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"deepseek-chat\": {\n        \"id\": \"deepseek-chat\",\n        \"name\": \"Deepseek-Chat\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-11-29\",\n        \"last_updated\": \"2024-11-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 0.43 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"claude-sonnet-4-20250514\": {\n        \"id\": \"claude-sonnet-4-20250514\",\n        \"name\": \"claude-sonnet-4-20250514\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"glm-4.5\": {\n        \"id\": \"glm-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.286, \"output\": 1.142 },\n        \"limit\": { \"context\": 128000, \"output\": 98304 }\n      },\n      \"kimi-k2-0905-preview\": {\n        \"id\": \"kimi-k2-0905-preview\",\n        \"name\": \"kimi-k2-0905-preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.632, \"output\": 2.53 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen3-235b-a22b\": {\n        \"id\": \"qwen3-235b-a22b\",\n        \"name\": \"Qwen3-235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 2.86 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"claude-opus-4-5-20251101\": {\n        \"id\": \"claude-opus-4-5-20251101\",\n        \"name\": \"claude-opus-4-5-20251101\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"claude-sonnet-4-5-20250929\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"claude-opus-4-1-20250805-thinking\": {\n        \"id\": \"claude-opus-4-1-20250805-thinking\",\n        \"name\": \"claude-opus-4-1-20250805-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-05-27\",\n        \"last_updated\": \"2025-05-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75 },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"qwen3-30b-a3b\": {\n        \"id\": \"qwen3-30b-a3b\",\n        \"name\": \"Qwen3-30B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-29\",\n        \"last_updated\": \"2025-04-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.11, \"output\": 1.08 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"ministral-14b-2512\": {\n        \"id\": \"ministral-14b-2512\",\n        \"name\": \"ministral-14b-2512\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.33, \"output\": 0.33 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"doubao-seed-1-6-vision-250815\": {\n        \"id\": \"doubao-seed-1-6-vision-250815\",\n        \"name\": \"doubao-seed-1-6-vision-250815\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.114, \"output\": 1.143 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"gpt-4.1-nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"gpt-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"claude-opus-4-7\": {\n        \"id\": \"claude-opus-4-7\",\n        \"name\": \"claude-opus-4-7\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-17\",\n        \"last_updated\": \"2026-04-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-6-thinking\": {\n        \"id\": \"claude-sonnet-4-6-thinking\",\n        \"name\": \"claude-sonnet-4-6-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-02-18\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"MiniMax-M1\": {\n        \"id\": \"MiniMax-M1\",\n        \"name\": \"MiniMax-M1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-16\",\n        \"last_updated\": \"2025-06-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.132, \"output\": 1.254 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"gpt-5.1\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"claude-sonnet-4-5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"doubao-seed-1-6-thinking-250715\": {\n        \"id\": \"doubao-seed-1-6-thinking-250715\",\n        \"name\": \"doubao-seed-1-6-thinking-250715\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-15\",\n        \"last_updated\": \"2025-07-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.121, \"output\": 1.21 },\n        \"limit\": { \"context\": 256000, \"output\": 16000 }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"claude-haiku-4-5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02\",\n        \"release_date\": \"2025-10-16\",\n        \"last_updated\": \"2025-10-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5.1-chat-latest\": {\n        \"id\": \"gpt-5.1-chat-latest\",\n        \"name\": \"gpt-5.1-chat-latest\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5.4-nano\": {\n        \"id\": \"gpt-5.4-nano\",\n        \"name\": \"gpt-5.4-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2026-03-19\",\n        \"last_updated\": \"2026-03-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      }\n    }\n  },\n  \"meganova\": {\n    \"id\": \"meganova\",\n    \"env\": [\"MEGANOVA_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.meganova.ai/v1\",\n    \"name\": \"Meganova\",\n    \"doc\": \"https://docs.meganova.ai\",\n    \"models\": {\n      \"meta-llama/Llama-3.3-70B-Instruct\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct\",\n        \"name\": \"Llama 3.3 70B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/Mistral-Small-3.2-24B-Instruct-2506\": {\n        \"id\": \"mistralai/Mistral-Small-3.2-24B-Instruct-2506\",\n        \"name\": \"Mistral Small 3.2 24B Instruct\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-06-20\",\n        \"last_updated\": \"2025-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"mistralai/Mistral-Nemo-Instruct-2407\": {\n        \"id\": \"mistralai/Mistral-Nemo-Instruct-2407\",\n        \"name\": \"Mistral Nemo Instruct 2407\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.04 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"Qwen/Qwen2.5-VL-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-32B-Instruct\",\n        \"name\": \"Qwen2.5 VL 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.6 },\n        \"limit\": { \"context\": 262000, \"output\": 262000 }\n      },\n      \"Qwen/Qwen3.5-Plus\": {\n        \"id\": \"Qwen/Qwen3.5-Plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02\",\n        \"last_updated\": \"2026-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2.4, \"reasoning\": 2.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-03\",\n        \"last_updated\": \"2025-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.26, \"output\": 0.38 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2-Exp\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2-Exp\",\n        \"name\": \"DeepSeek V3.2 Exp\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-10\",\n        \"last_updated\": \"2025-10-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.4 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek R1 0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2.15 },\n        \"limit\": { \"context\": 163840, \"output\": 64000 }\n      },\n      \"deepseek-ai/DeepSeek-V3-0324\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3-0324\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.88 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-25\",\n        \"last_updated\": \"2025-08-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"output\": 164000 }\n      },\n      \"XiaomiMiMo/MiMo-V2-Flash\": {\n        \"id\": \"XiaomiMiMo/MiMo-V2-Flash\",\n        \"name\": \"MiMo V2 Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 32000 }\n      },\n      \"zai-org/GLM-4.6\": {\n        \"id\": \"zai-org/GLM-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 1.9 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"zai-org/GLM-4.7\": {\n        \"id\": \"zai-org/GLM-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"zai-org/GLM-5\": {\n        \"id\": \"zai-org/GLM-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 2.56 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.1\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.2 },\n        \"limit\": { \"context\": 196608, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"inception\": {\n    \"id\": \"inception\",\n    \"env\": [\"INCEPTION_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.inceptionlabs.ai/v1/\",\n    \"name\": \"Inception\",\n    \"doc\": \"https://platform.inceptionlabs.ai/docs\",\n    \"models\": {\n      \"mercury-edit-2\": {\n        \"id\": \"mercury-edit-2\",\n        \"name\": \"Mercury Edit 2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"mercury-2\": {\n        \"id\": \"mercury-2\",\n        \"name\": \"Mercury 2\",\n        \"family\": \"mercury\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 50000 }\n      }\n    }\n  },\n  \"nano-gpt\": {\n    \"id\": \"nano-gpt\",\n    \"env\": [\"NANO_GPT_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://nano-gpt.com/api/v1\",\n    \"name\": \"NanoGPT\",\n    \"doc\": \"https://docs.nano-gpt.com\",\n    \"models\": {\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"Qwen2.5-32B-EVA-v0.2\": {\n        \"id\": \"Qwen2.5-32B-EVA-v0.2\",\n        \"name\": \"Qwen 2.5 32b EVA\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-09-01\",\n        \"last_updated\": \"2024-09-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.493, \"output\": 0.493 },\n        \"limit\": { \"context\": 24576, \"input\": 24576, \"output\": 8192 }\n      },\n      \"qwen-long\": {\n        \"id\": \"qwen-long\",\n        \"name\": \"Qwen Long 10M\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-25\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.408 },\n        \"limit\": { \"context\": 10000000, \"input\": 10000000, \"output\": 8192 }\n      },\n      \"ernie-4.5-8k-preview\": {\n        \"id\": \"ernie-4.5-8k-preview\",\n        \"name\": \"Ernie 4.5 8k Preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.66, \"output\": 2.6 },\n        \"limit\": { \"context\": 8000, \"input\": 8000, \"output\": 16384 }\n      },\n      \"jamba-large\": {\n        \"id\": \"jamba-large\",\n        \"name\": \"Jamba Large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.989, \"output\": 7.99 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 4096 }\n      },\n      \"claude-opus-4-20250514\": {\n        \"id\": \"claude-opus-4-20250514\",\n        \"name\": \"Claude 4 Opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-14\",\n        \"last_updated\": \"2025-05-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"qwen-turbo\": {\n        \"id\": \"qwen-turbo\",\n        \"name\": \"Qwen Turbo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04998, \"output\": 0.2006 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 8192 }\n      },\n      \"claude-3-7-sonnet-thinking:128000\": {\n        \"id\": \"claude-3-7-sonnet-thinking:128000\",\n        \"name\": \"Claude 3.7 Sonnet Thinking (128K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"v0-1.5-md\": {\n        \"id\": \"v0-1.5-md\",\n        \"name\": \"v0 1.5 MD\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-04\",\n        \"last_updated\": \"2025-07-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"Llama-3.3-70B-Ignition-v0.1\": {\n        \"id\": \"Llama-3.3-70B-Ignition-v0.1\",\n        \"name\": \"Llama 3.3 70B Ignition v0.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"claude-opus-4-1-thinking:32768\": {\n        \"id\": \"claude-opus-4-1-thinking:32768\",\n        \"name\": \"Claude 4.1 Opus Thinking (32K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"doubao-1.5-vision-pro-32k\": {\n        \"id\": \"doubao-1.5-vision-pro-32k\",\n        \"name\": \"Doubao 1.5 Vision Pro 32k\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-22\",\n        \"last_updated\": \"2025-01-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.459, \"output\": 1.377 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 8192 }\n      },\n      \"phi-4-mini-instruct\": {\n        \"id\": \"phi-4-mini-instruct\",\n        \"name\": \"Phi 4 Mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"ernie-5.0-thinking-latest\": {\n        \"id\": \"ernie-5.0-thinking-latest\",\n        \"name\": \"Ernie 5.0 Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"claude-sonnet-4-5-20250929-thinking\": {\n        \"id\": \"claude-sonnet-4-5-20250929-thinking\",\n        \"name\": \"Claude Sonnet 4.5 Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"claude-opus-4-1-thinking:1024\": {\n        \"id\": \"claude-opus-4-1-thinking:1024\",\n        \"name\": \"Claude 4.1 Opus Thinking (1K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"gemini-exp-1206\": {\n        \"id\": \"gemini-exp-1206\",\n        \"name\": \"Gemini 2.0 Pro 1206\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.258, \"output\": 4.998 },\n        \"limit\": { \"context\": 2097152, \"input\": 2097152, \"output\": 8192 }\n      },\n      \"claude-opus-4-thinking:8192\": {\n        \"id\": \"claude-opus-4-thinking:8192\",\n        \"name\": \"Claude 4 Opus Thinking (8K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"Magistral-Small-2506\": {\n        \"id\": \"Magistral-Small-2506\",\n        \"name\": \"Magistral Small 2506\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.4 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"claude-opus-4-thinking:1024\": {\n        \"id\": \"claude-opus-4-thinking:1024\",\n        \"name\": \"Claude 4 Opus Thinking (1K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"qwen-max\": {\n        \"id\": \"qwen-max\",\n        \"name\": \"Qwen 2.5 Max\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-04-03\",\n        \"last_updated\": \"2024-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5997, \"output\": 6.392 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 8192 }\n      },\n      \"Llama-3.3-70B-Forgotten-Abomination-v5.0\": {\n        \"id\": \"Llama-3.3-70B-Forgotten-Abomination-v5.0\",\n        \"name\": \"Llama 3.3 70B Forgotten Abomination v5.0\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"glm-4-plus-0111\": {\n        \"id\": \"glm-4-plus-0111\",\n        \"name\": \"GLM 4 Plus 0111\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 9.996 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"qwq-32b\": {\n        \"id\": \"qwq-32b\",\n        \"name\": \"Qwen: QwQ 32B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25599999, \"output\": 0.30499999 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"glm-4.1v-thinking-flashx\": {\n        \"id\": \"glm-4.1v-thinking-flashx\",\n        \"name\": \"GLM 4.1V Thinking FlashX\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 64000, \"input\": 64000, \"output\": 8192 }\n      },\n      \"claude-3-7-sonnet-thinking:1024\": {\n        \"id\": \"claude-3-7-sonnet-thinking:1024\",\n        \"name\": \"Claude 3.7 Sonnet Thinking (1K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"asi1-mini\": {\n        \"id\": \"asi1-mini\",\n        \"name\": \"ASI1 Mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"Llama-3.3-70B-Legion-V2.1\": {\n        \"id\": \"Llama-3.3-70B-Legion-V2.1\",\n        \"name\": \"Llama 3.3 70B Legion V2.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"doubao-seed-1-8-251215\": {\n        \"id\": \"doubao-seed-1-8-251215\",\n        \"name\": \"Doubao Seed 1.8\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-15\",\n        \"last_updated\": \"2025-12-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.612, \"output\": 6.12 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"Llama-3.3-70B-Forgotten-Safeword-3.6\": {\n        \"id\": \"Llama-3.3-70B-Forgotten-Safeword-3.6\",\n        \"name\": \"Llama 3.3 70B Forgotten Safeword 3.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Magnum-v4-SE\": {\n        \"id\": \"Llama-3.3-70B-Magnum-v4-SE\",\n        \"name\": \"Llama 3.3 70B Magnum v4 SE\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Fallen-v1\": {\n        \"id\": \"Llama-3.3-70B-Fallen-v1\",\n        \"name\": \"Llama 3.3 70B Fallen v1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"doubao-1-5-thinking-pro-vision-250415\": {\n        \"id\": \"doubao-1-5-thinking-pro-vision-250415\",\n        \"name\": \"Doubao 1.5 Thinking Pro Vision\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.4 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"doubao-seed-code-preview-latest\": {\n        \"id\": \"doubao-seed-code-preview-latest\",\n        \"name\": \"Doubao Seed Code Preview\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"claude-opus-4-thinking:32000\": {\n        \"id\": \"claude-opus-4-thinking:32000\",\n        \"name\": \"Claude 4 Opus Thinking (32K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"venice-uncensored:web\": {\n        \"id\": \"venice-uncensored:web\",\n        \"name\": \"Venice Uncensored Web\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-01\",\n        \"last_updated\": \"2024-05-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 80000, \"input\": 80000, \"output\": 16384 }\n      },\n      \"Gemma-3-27B-Big-Tiger-v3\": {\n        \"id\": \"Gemma-3-27B-Big-Tiger-v3\",\n        \"name\": \"Gemma 3 27B Big Tiger v3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"deepseek-v3-0324\": {\n        \"id\": \"deepseek-v3-0324\",\n        \"name\": \"DeepSeek Chat 0324\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"command-a-reasoning-08-2025\": {\n        \"id\": \"command-a-reasoning-08-2025\",\n        \"name\": \"Cohere Command A (08/2025)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-22\",\n        \"last_updated\": \"2025-08-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 8192 }\n      },\n      \"claude-3-5-haiku-20241022\": {\n        \"id\": \"claude-3-5-haiku-20241022\",\n        \"name\": \"Claude 3.5 Haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 4 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 8192 }\n      },\n      \"claude-opus-4-1-20250805\": {\n        \"id\": \"claude-opus-4-1-20250805\",\n        \"name\": \"Claude 4.1 Opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"Gemma-3-27B-Glitter\": {\n        \"id\": \"Gemma-3-27B-Glitter\",\n        \"name\": \"Gemma 3 27B Glitter\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"qwen3-vl-235b-a22b-instruct-original\": {\n        \"id\": \"qwen3-vl-235b-a22b-instruct-original\",\n        \"name\": \"Qwen3 VL 235B A22B Instruct Original\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.2 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"Llama-3.3-70B-GeneticLemonade-Opus\": {\n        \"id\": \"Llama-3.3-70B-GeneticLemonade-Opus\",\n        \"name\": \"Llama 3.3 70B GeneticLemonade Opus\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"gemini-2.5-pro-preview-06-05\": {\n        \"id\": \"gemini-2.5-pro-preview-06-05\",\n        \"name\": \"Gemini 2.5 Pro Preview 0605\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"deepseek-reasoner\": {\n        \"id\": \"deepseek-reasoner\",\n        \"name\": \"DeepSeek Reasoner\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.7 },\n        \"limit\": { \"context\": 64000, \"input\": 64000, \"output\": 65536 }\n      },\n      \"Baichuan-M2\": {\n        \"id\": \"Baichuan-M2\",\n        \"name\": \"Baichuan M2 32B Medical\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15.73, \"output\": 15.73 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"sonar-deep-research\": {\n        \"id\": \"sonar-deep-research\",\n        \"name\": \"Perplexity Deep Research\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-25\",\n        \"last_updated\": \"2025-02-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.4, \"output\": 13.6 },\n        \"limit\": { \"context\": 60000, \"input\": 60000, \"output\": 128000 }\n      },\n      \"Llama-3.3-70B-ArliAI-RPMax-v1.4\": {\n        \"id\": \"Llama-3.3-70B-ArliAI-RPMax-v1.4\",\n        \"name\": \"Llama 3.3 70B RPMax v1.4\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"auto-model-basic\": {\n        \"id\": \"auto-model-basic\",\n        \"name\": \"Auto model (Basic)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 1000000 }\n      },\n      \"qwen3.6-max-preview\": {\n        \"id\": \"qwen3.6-max-preview\",\n        \"name\": \"Qwen3.6 Max Preview\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.3, \"output\": 7.8 },\n        \"limit\": { \"context\": 245800, \"output\": 65536 }\n      },\n      \"qwen-plus\": {\n        \"id\": \"qwen-plus\",\n        \"name\": \"Qwen Plus\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3995, \"output\": 1.2002 },\n        \"limit\": { \"context\": 995904, \"input\": 995904, \"output\": 32768 }\n      },\n      \"gemini-2.0-flash-thinking-exp-1219\": {\n        \"id\": \"gemini-2.0-flash-thinking-exp-1219\",\n        \"name\": \"Gemini 2.0 Flash Thinking 1219\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-19\",\n        \"last_updated\": \"2024-12-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.408 },\n        \"limit\": { \"context\": 32767, \"input\": 32767, \"output\": 8192 }\n      },\n      \"gemini-2.5-pro-preview-03-25\": {\n        \"id\": \"gemini-2.5-pro-preview-03-25\",\n        \"name\": \"Gemini 2.5 Pro Preview 0325\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"Llama-3.3-70B-Mokume-Gane-R1\": {\n        \"id\": \"Llama-3.3-70B-Mokume-Gane-R1\",\n        \"name\": \"Llama 3.3 70B Mokume Gane R1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"phi-4-multimodal-instruct\": {\n        \"id\": \"phi-4-multimodal-instruct\",\n        \"name\": \"Phi 4 Multimodal\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.11 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"gemini-2.5-flash-preview-05-20:thinking\": {\n        \"id\": \"gemini-2.5-flash-preview-05-20:thinking\",\n        \"name\": \"Gemini 2.5 Flash 0520 Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 3.5 },\n        \"limit\": { \"context\": 1048000, \"input\": 1048000, \"output\": 65536 }\n      },\n      \"qwen3-30b-a3b-instruct-2507\": {\n        \"id\": \"qwen3-30b-a3b-instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct 2507\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-20\",\n        \"last_updated\": \"2025-02-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"doubao-1-5-thinking-pro-250415\": {\n        \"id\": \"doubao-1-5-thinking-pro-250415\",\n        \"name\": \"Doubao 1.5 Thinking Pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-17\",\n        \"last_updated\": \"2025-04-17\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.4 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"qwen25-vl-72b-instruct\": {\n        \"id\": \"qwen25-vl-72b-instruct\",\n        \"name\": \"Qwen25 VL 72b\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-10\",\n        \"last_updated\": \"2025-05-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.69989, \"output\": 0.69989 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 32768 }\n      },\n      \"glm-4-airx\": {\n        \"id\": \"glm-4-airx\",\n        \"name\": \"GLM-4 AirX\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-06-05\",\n        \"last_updated\": \"2024-06-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 2.006 },\n        \"limit\": { \"context\": 8000, \"input\": 8000, \"output\": 4096 }\n      },\n      \"glm-z1-airx\": {\n        \"id\": \"glm-z1-airx\",\n        \"name\": \"GLM Z1 AirX\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Cirrus-x1\": {\n        \"id\": \"Llama-3.3-70B-Cirrus-x1\",\n        \"name\": \"Llama 3.3 70B Cirrus x1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"yi-medium-200k\": {\n        \"id\": \"yi-medium-200k\",\n        \"name\": \"Yi Medium 200k\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-03-01\",\n        \"last_updated\": \"2024-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.499, \"output\": 2.499 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 4096 }\n      },\n      \"ernie-x1-turbo-32k\": {\n        \"id\": \"ernie-x1-turbo-32k\",\n        \"name\": \"Ernie X1 Turbo 32k\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-08\",\n        \"last_updated\": \"2025-05-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.165, \"output\": 0.66 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 16384 }\n      },\n      \"step-2-mini\": {\n        \"id\": \"step-2-mini\",\n        \"name\": \"Step-2 Mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-05\",\n        \"last_updated\": \"2024-07-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.408 },\n        \"limit\": { \"context\": 8000, \"input\": 8000, \"output\": 4096 }\n      },\n      \"qwen3-vl-235b-a22b-thinking\": {\n        \"id\": \"qwen3-vl-235b-a22b-thinking\",\n        \"name\": \"Qwen3 VL 235B A22B Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 6 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"kimi-thinking-preview\": {\n        \"id\": \"kimi-thinking-preview\",\n        \"name\": \"Kimi Thinking Preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 31.46, \"output\": 31.46 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Vulpecula-R1\": {\n        \"id\": \"Llama-3.3-70B-Vulpecula-R1\",\n        \"name\": \"Llama 3.3 70B Vulpecula R1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"glm-4-flash\": {\n        \"id\": \"glm-4-flash\",\n        \"name\": \"GLM-4 Flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2024-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1003 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"claude-opus-4-5-20251101:thinking\": {\n        \"id\": \"claude-opus-4-5-20251101:thinking\",\n        \"name\": \"Claude 4.5 Opus Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 25.007 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"MiniMax-M2\": {\n        \"id\": \"MiniMax-M2\",\n        \"name\": \"MiniMax M2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-10-25\",\n        \"last_updated\": \"2025-10-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 1.53 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 131072 }\n      },\n      \"yi-large\": {\n        \"id\": \"yi-large\",\n        \"name\": \"Yi Large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.196, \"output\": 3.196 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 4096 }\n      },\n      \"venice-uncensored\": {\n        \"id\": \"venice-uncensored\",\n        \"name\": \"Venice Uncensored\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"deepclaude\": {\n        \"id\": \"deepclaude\",\n        \"name\": \"DeepClaude\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-01\",\n        \"last_updated\": \"2025-02-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"Llama-3.3-70B-Magnum-v4-SE-Cirrus-x1-SLERP\": {\n        \"id\": \"Llama-3.3-70B-Magnum-v4-SE-Cirrus-x1-SLERP\",\n        \"name\": \"Llama 3.3 70B Magnum v4 SE Cirrus x1 SLERP\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"claude-3-7-sonnet-20250219\": {\n        \"id\": \"claude-3-7-sonnet-20250219\",\n        \"name\": \"Claude 3.7 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 16000 }\n      },\n      \"gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview (09/2025)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"claude-3-7-sonnet-thinking\": {\n        \"id\": \"claude-3-7-sonnet-thinking\",\n        \"name\": \"Claude 3.7 Sonnet Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 16000 }\n      },\n      \"exa-research\": {\n        \"id\": \"exa-research\",\n        \"name\": \"Exa (Research)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-04\",\n        \"last_updated\": \"2025-06-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 2.5 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 8192 }\n      },\n      \"GLM-4.5-Air-Derestricted-Steam\": {\n        \"id\": \"GLM-4.5-Air-Derestricted-Steam\",\n        \"name\": \"GLM 4.5 Air Derestricted Steam\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 220600, \"input\": 220600, \"output\": 65536 }\n      },\n      \"brave-pro\": {\n        \"id\": \"brave-pro\",\n        \"name\": \"Brave (Pro)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-03-02\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 5 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 8192 }\n      },\n      \"yi-lightning\": {\n        \"id\": \"yi-lightning\",\n        \"name\": \"Yi Lightning\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-10-16\",\n        \"last_updated\": \"2024-10-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.2006 },\n        \"limit\": { \"context\": 12000, \"input\": 12000, \"output\": 4096 }\n      },\n      \"glm-4-air-0111\": {\n        \"id\": \"glm-4-air-0111\",\n        \"name\": \"GLM 4 Air 0111\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-11\",\n        \"last_updated\": \"2025-01-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1394, \"output\": 0.1394 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"claude-haiku-4-5-20251001\": {\n        \"id\": \"claude-haiku-4-5-20251001\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"gemini-2.5-flash-nothinking\": {\n        \"id\": \"gemini-2.5-flash-nothinking\",\n        \"name\": \"Gemini 2.5 Flash (No Thinking)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"Llama-3.3-70B-ArliAI-RPMax-v3\": {\n        \"id\": \"Llama-3.3-70B-ArliAI-RPMax-v3\",\n        \"name\": \"Llama 3.3 70B ArliAI RPMax v3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"sonar\": {\n        \"id\": \"sonar\",\n        \"name\": \"Perplexity Simple\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.003, \"output\": 1.003 },\n        \"limit\": { \"context\": 127000, \"input\": 127000, \"output\": 128000 }\n      },\n      \"glm-z1-air\": {\n        \"id\": \"glm-z1-air\",\n        \"name\": \"GLM Z1 Air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.07 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Strawberrylemonade-v1.2\": {\n        \"id\": \"Llama-3.3-70B-Strawberrylemonade-v1.2\",\n        \"name\": \"Llama 3.3 70B StrawberryLemonade v1.2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"QwQ-32B-ArliAI-RpR-v1\": {\n        \"id\": \"QwQ-32B-ArliAI-RpR-v1\",\n        \"name\": \"QwQ 32b Arli V1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"Llama-3.3-70B-Mhnnn-x1\": {\n        \"id\": \"Llama-3.3-70B-Mhnnn-x1\",\n        \"name\": \"Llama 3.3 70B Mhnnn x1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"claude-opus-4-thinking\": {\n        \"id\": \"claude-opus-4-thinking\",\n        \"name\": \"Claude 4 Opus Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-07-15\",\n        \"last_updated\": \"2025-07-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"gemini-3-pro-image-preview\": {\n        \"id\": \"gemini-3-pro-image-preview\",\n        \"name\": \"Gemini 3 Pro Image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"Gemma-3-27B-ArliAI-RPMax-v3\": {\n        \"id\": \"Gemma-3-27B-ArliAI-RPMax-v3\",\n        \"name\": \"Gemma 3 27B RPMax v3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-03\",\n        \"last_updated\": \"2025-07-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"deepseek-reasoner-cheaper\": {\n        \"id\": \"deepseek-reasoner-cheaper\",\n        \"name\": \"Deepseek R1 Cheaper\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"Baichuan4-Air\": {\n        \"id\": \"Baichuan4-Air\",\n        \"name\": \"Baichuan 4 Air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.157, \"output\": 0.157 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"universal-summarizer\": {\n        \"id\": \"universal-summarizer\",\n        \"name\": \"Universal Summarizer\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-05-01\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 30 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"gemini-2.5-flash-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Preview (09/2025)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro-exp-03-25\": {\n        \"id\": \"gemini-2.5-pro-exp-03-25\",\n        \"name\": \"Gemini 2.5 Pro Experimental 0325\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"hunyuan-t1-latest\": {\n        \"id\": \"hunyuan-t1-latest\",\n        \"name\": \"Hunyuan T1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-22\",\n        \"last_updated\": \"2025-03-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 0.66 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"claude-opus-4-1-thinking\": {\n        \"id\": \"claude-opus-4-1-thinking\",\n        \"name\": \"Claude 4.1 Opus Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"grok-3-mini-beta\": {\n        \"id\": \"grok-3-mini-beta\",\n        \"name\": \"Grok 3 Mini Beta\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 131072 }\n      },\n      \"Llama-3.3-70B-ArliAI-RPMax-v2\": {\n        \"id\": \"Llama-3.3-70B-ArliAI-RPMax-v2\",\n        \"name\": \"Llama 3.3 70B ArliAI RPMax v2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"brave\": {\n        \"id\": \"brave\",\n        \"name\": \"Brave (Answers)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-03-02\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 5 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 8192 }\n      },\n      \"hunyuan-turbos-20250226\": {\n        \"id\": \"hunyuan-turbos-20250226\",\n        \"name\": \"Hunyuan Turbo S\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-27\",\n        \"last_updated\": \"2025-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.187, \"output\": 0.374 },\n        \"limit\": { \"context\": 24000, \"input\": 24000, \"output\": 8192 }\n      },\n      \"gemini-2.5-flash-preview-05-20\": {\n        \"id\": \"gemini-2.5-flash-preview-05-20\",\n        \"name\": \"Gemini 2.5 Flash 0520\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 1048000, \"input\": 1048000, \"output\": 65536 }\n      },\n      \"sonar-reasoning-pro\": {\n        \"id\": \"sonar-reasoning-pro\",\n        \"name\": \"Perplexity Reasoning Pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 7.9985 },\n        \"limit\": { \"context\": 127000, \"input\": 127000, \"output\": 128000 }\n      },\n      \"gemini-2.0-flash-thinking-exp-01-21\": {\n        \"id\": \"gemini-2.0-flash-thinking-exp-01-21\",\n        \"name\": \"Gemini 2.0 Flash Thinking 0121\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-21\",\n        \"last_updated\": \"2025-01-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 1.003 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 8192 }\n      },\n      \"glm-4-air\": {\n        \"id\": \"glm-4-air\",\n        \"name\": \"GLM-4 Air\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-06-05\",\n        \"last_updated\": \"2024-06-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.2006 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"Llama-3.3-70B-MiraiFanfare\": {\n        \"id\": \"Llama-3.3-70B-MiraiFanfare\",\n        \"name\": \"Llama 3.3 70b Mirai Fanfare\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.493, \"output\": 0.493 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-The-Omega-Directive-Unslop-v2.0\": {\n        \"id\": \"Llama-3.3-70B-The-Omega-Directive-Unslop-v2.0\",\n        \"name\": \"Llama 3.3 70B Omega Directive Unslop v2.0\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Gemma-3-27B-it-Abliterated\": {\n        \"id\": \"Gemma-3-27B-it-Abliterated\",\n        \"name\": \"Gemma 3 27B IT Abliterated\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-03\",\n        \"last_updated\": \"2025-07-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.42, \"output\": 0.42 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 96000 }\n      },\n      \"azure-o1\": {\n        \"id\": \"azure-o1\",\n        \"name\": \"Azure o1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-17\",\n        \"last_updated\": \"2024-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 59.993 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"glm-4-long\": {\n        \"id\": \"glm-4-long\",\n        \"name\": \"GLM-4 Long\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2024-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.2006 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 4096 }\n      },\n      \"claude-sonnet-4-thinking:1024\": {\n        \"id\": \"claude-sonnet-4-thinking:1024\",\n        \"name\": \"Claude 4 Sonnet Thinking (1K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"gemini-2.0-flash-001\": {\n        \"id\": \"gemini-2.0-flash-001\",\n        \"name\": \"Gemini 2.0 Flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.408 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 8192 }\n      },\n      \"qwen-3.6-plus\": {\n        \"id\": \"qwen-3.6-plus\",\n        \"name\": \"Qwen 3.6 Plus\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.45, \"output\": 2.7 },\n        \"limit\": { \"context\": 991800, \"output\": 65536 }\n      },\n      \"doubao-seed-2-0-lite-260215\": {\n        \"id\": \"doubao-seed-2-0-lite-260215\",\n        \"name\": \"Doubao Seed 2.0 Lite\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1462, \"output\": 0.8738 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32000 }\n      },\n      \"Gemma-3-27B-it\": {\n        \"id\": \"Gemma-3-27B-it\",\n        \"name\": \"Gemma 3 27B IT\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"doubao-seed-1-6-thinking-250615\": {\n        \"id\": \"doubao-seed-1-6-thinking-250615\",\n        \"name\": \"Doubao Seed 1.6 Thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-15\",\n        \"last_updated\": \"2025-06-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.204, \"output\": 2.04 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"sarvan-medium\": {\n        \"id\": \"sarvan-medium\",\n        \"name\": \"Sarvam Medium\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"Gemma-3-27B-CardProjector-v4\": {\n        \"id\": \"Gemma-3-27B-CardProjector-v4\",\n        \"name\": \"Gemma 3 27B CardProjector v4\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"GLM-4.5-Air-Derestricted-Iceblink-ReExtract\": {\n        \"id\": \"GLM-4.5-Air-Derestricted-Iceblink-ReExtract\",\n        \"name\": \"GLM 4.5 Air Derestricted Iceblink ReExtract\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-12\",\n        \"last_updated\": \"2025-12-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 98304 }\n      },\n      \"doubao-seed-1-6-250615\": {\n        \"id\": \"doubao-seed-1-6-250615\",\n        \"name\": \"Doubao Seed 1.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-15\",\n        \"last_updated\": \"2025-06-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.204, \"output\": 0.51 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3 Coder 30B A3B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"study_gpt-chatgpt-4o-latest\": {\n        \"id\": \"study_gpt-chatgpt-4o-latest\",\n        \"name\": \"Study Mode\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 16384 }\n      },\n      \"Llama-3.3+(3v3.3)-70B-TenyxChat-DaybreakStorywriter\": {\n        \"id\": \"Llama-3.3+(3v3.3)-70B-TenyxChat-DaybreakStorywriter\",\n        \"name\": \"Llama 3.3+ 70B TenyxChat DaybreakStorywriter\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"GLM-4.5-Air-Derestricted-Steam-ReExtract\": {\n        \"id\": \"GLM-4.5-Air-Derestricted-Steam-ReExtract\",\n        \"name\": \"GLM 4.5 Air Derestricted Steam ReExtract\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-12\",\n        \"last_updated\": \"2025-12-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 65536 }\n      },\n      \"sonar-pro\": {\n        \"id\": \"sonar-pro\",\n        \"name\": \"Perplexity Pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 128000 }\n      },\n      \"exa-answer\": {\n        \"id\": \"exa-answer\",\n        \"name\": \"Exa (Answer)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-04\",\n        \"last_updated\": \"2025-06-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 2.5 },\n        \"limit\": { \"context\": 4096, \"input\": 4096, \"output\": 4096 }\n      },\n      \"Llama-3.3-70B-Incandescent-Malevolence\": {\n        \"id\": \"Llama-3.3-70B-Incandescent-Malevolence\",\n        \"name\": \"Llama 3.3 70B Incandescent Malevolence\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"qwen-image\": {\n        \"id\": \"qwen-image\",\n        \"name\": \"Qwen Image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"gemini-2.0-flash-lite\": {\n        \"id\": \"gemini-2.0-flash-lite\",\n        \"name\": \"Gemini 2.0 Flash Lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0748, \"output\": 0.306 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 8192 }\n      },\n      \"GLM-4.5-Air-Derestricted\": {\n        \"id\": \"GLM-4.5-Air-Derestricted\",\n        \"name\": \"GLM 4.5 Air Derestricted\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 202600, \"input\": 202600, \"output\": 98304 }\n      },\n      \"deepseek-math-v2\": {\n        \"id\": \"deepseek-math-v2\",\n        \"name\": \"DeepSeek Math V2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-03\",\n        \"last_updated\": \"2025-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"mistral-small-31-24b-instruct\": {\n        \"id\": \"mistral-small-31-24b-instruct\",\n        \"name\": \"Mistral Small 31 24b Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 131072 }\n      },\n      \"jamba-mini\": {\n        \"id\": \"jamba-mini\",\n        \"name\": \"Jamba Mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1989, \"output\": 0.408 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 4096 }\n      },\n      \"kimi-k2-instruct-fast\": {\n        \"id\": \"kimi-k2-instruct-fast\",\n        \"name\": \"Kimi K2 0711 Fast\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-15\",\n        \"last_updated\": \"2025-07-15\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 16384 }\n      },\n      \"jamba-large-1.6\": {\n        \"id\": \"jamba-large-1.6\",\n        \"name\": \"Jamba Large 1.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.989, \"output\": 7.99 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 4096 }\n      },\n      \"learnlm-1.5-pro-experimental\": {\n        \"id\": \"learnlm-1.5-pro-experimental\",\n        \"name\": \"Gemini LearnLM Experimental\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-14\",\n        \"last_updated\": \"2024-05-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.502, \"output\": 10.506 },\n        \"limit\": { \"context\": 32767, \"input\": 32767, \"output\": 8192 }\n      },\n      \"qvq-max\": {\n        \"id\": \"qvq-max\",\n        \"name\": \"Qwen: QvQ Max\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-28\",\n        \"last_updated\": \"2025-03-28\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.4, \"output\": 5.3 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"Llama-3.3-70B-Sapphira-0.1\": {\n        \"id\": \"Llama-3.3-70B-Sapphira-0.1\",\n        \"name\": \"Llama 3.3 70B Sapphira 0.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"claude-opus-4-1-thinking:32000\": {\n        \"id\": \"claude-opus-4-1-thinking:32000\",\n        \"name\": \"Claude 4.1 Opus Thinking (32K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"Llama-3.3-70B-Electranova-v1.0\": {\n        \"id\": \"Llama-3.3-70B-Electranova-v1.0\",\n        \"name\": \"Llama 3.3 70B Electranova v1.0\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Anthrobomination\": {\n        \"id\": \"Llama-3.3-70B-Anthrobomination\",\n        \"name\": \"Llama 3.3 70B Anthrobomination\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"gemini-2.5-flash-lite-preview-09-2025-thinking\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-09-2025-thinking\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview (09/2025) – Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"GLM-4.5-Air-Derestricted-Iceblink\": {\n        \"id\": \"GLM-4.5-Air-Derestricted-Iceblink\",\n        \"name\": \"GLM 4.5 Air Derestricted Iceblink\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 98304 }\n      },\n      \"KAT-Coder-Pro-V1\": {\n        \"id\": \"KAT-Coder-Pro-V1\",\n        \"name\": \"KAT Coder Pro V1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-10-28\",\n        \"last_updated\": \"2025-10-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 6 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"doubao-seed-1-6-flash-250615\": {\n        \"id\": \"doubao-seed-1-6-flash-250615\",\n        \"name\": \"Doubao Seed 1.6 Flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-15\",\n        \"last_updated\": \"2025-06-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0374, \"output\": 0.374 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"auto-model-standard\": {\n        \"id\": \"auto-model-standard\",\n        \"name\": \"Auto model (Standard)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 1000000 }\n      },\n      \"Llama-3.3-70B-Sapphira-0.2\": {\n        \"id\": \"Llama-3.3-70B-Sapphira-0.2\",\n        \"name\": \"Llama 3.3 70B Sapphira 0.2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"gemini-3-pro-preview-thinking\": {\n        \"id\": \"gemini-3-pro-preview-thinking\",\n        \"name\": \"Gemini 3 Pro Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"grok-3-fast-beta\": {\n        \"id\": \"grok-3-fast-beta\",\n        \"name\": \"Grok 3 Fast Beta\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 131072 }\n      },\n      \"doubao-seed-2-0-code-preview-260215\": {\n        \"id\": \"doubao-seed-2-0-code-preview-260215\",\n        \"name\": \"Doubao Seed 2.0 Code Preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.782, \"output\": 3.893 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-thinking:32768\": {\n        \"id\": \"claude-sonnet-4-thinking:32768\",\n        \"name\": \"Claude 4 Sonnet Thinking (32K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"gemini-2.0-pro-exp-02-05\": {\n        \"id\": \"gemini-2.0-pro-exp-02-05\",\n        \"name\": \"Gemini 2.0 Pro 0205\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-05\",\n        \"last_updated\": \"2025-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.989, \"output\": 7.956 },\n        \"limit\": { \"context\": 2097152, \"input\": 2097152, \"output\": 8192 }\n      },\n      \"glm-4-plus\": {\n        \"id\": \"glm-4-plus\",\n        \"name\": \"GLM-4 Plus\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2024-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 7.497, \"output\": 7.497 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"ernie-x1-32k\": {\n        \"id\": \"ernie-x1-32k\",\n        \"name\": \"Ernie X1 32k\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-08\",\n        \"last_updated\": \"2025-05-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.33, \"output\": 1.32 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 16384 }\n      },\n      \"GLM-4.5-Air-Derestricted-Iceblink-v2\": {\n        \"id\": \"GLM-4.5-Air-Derestricted-Iceblink-v2\",\n        \"name\": \"GLM 4.5 Air Derestricted Iceblink v2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 158600, \"input\": 158600, \"output\": 65536 }\n      },\n      \"Meta-Llama-3-1-8B-Instruct-FP8\": {\n        \"id\": \"Meta-Llama-3-1-8B-Instruct-FP8\",\n        \"name\": \"Llama 3.1 8B (decentralized)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0.03 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-GeneticLemonade-Unleashed-v3\": {\n        \"id\": \"Llama-3.3-70B-GeneticLemonade-Unleashed-v3\",\n        \"name\": \"Llama 3.3 70B GeneticLemonade Unleashed v3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-RAWMAW\": {\n        \"id\": \"Llama-3.3-70B-RAWMAW\",\n        \"name\": \"Llama 3.3 70B RAWMAW\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Damascus-R1\": {\n        \"id\": \"Llama-3.3-70B-Damascus-R1\",\n        \"name\": \"Damascus R1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"jamba-mini-1.6\": {\n        \"id\": \"jamba-mini-1.6\",\n        \"name\": \"Jamba Mini 1.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1989, \"output\": 0.408 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 4096 }\n      },\n      \"doubao-seed-2-0-pro-260215\": {\n        \"id\": \"doubao-seed-2-0-pro-260215\",\n        \"name\": \"Doubao Seed 2.0 Pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.782, \"output\": 3.876 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-thinking:64000\": {\n        \"id\": \"claude-sonnet-4-thinking:64000\",\n        \"name\": \"Claude 4 Sonnet Thinking (64K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"Gemma-3-27B-Nidum-Uncensored\": {\n        \"id\": \"Gemma-3-27B-Nidum-Uncensored\",\n        \"name\": \"Gemma 3 27B Nidum Uncensored\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 96000 }\n      },\n      \"gemini-2.5-flash-preview-09-2025-thinking\": {\n        \"id\": \"gemini-2.5-flash-preview-09-2025-thinking\",\n        \"name\": \"Gemini 2.5 Flash Preview (09/2025) – Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"glm-zero-preview\": {\n        \"id\": \"glm-zero-preview\",\n        \"name\": \"GLM Zero Preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.802, \"output\": 1.802 },\n        \"limit\": { \"context\": 8000, \"input\": 8000, \"output\": 4096 }\n      },\n      \"deepseek-chat\": {\n        \"id\": \"deepseek-chat\",\n        \"name\": \"DeepSeek V3/Deepseek Chat\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-27\",\n        \"last_updated\": \"2025-02-27\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"chroma\": {\n        \"id\": \"chroma\",\n        \"name\": \"Chroma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-12\",\n        \"last_updated\": \"2025-08-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"claude-3-7-sonnet-thinking:32768\": {\n        \"id\": \"claude-3-7-sonnet-thinking:32768\",\n        \"name\": \"Claude 3.7 Sonnet Thinking (32K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-07-15\",\n        \"last_updated\": \"2025-07-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"doubao-seed-2-0-mini-260215\": {\n        \"id\": \"doubao-seed-2-0-mini-260215\",\n        \"name\": \"Doubao Seed 2.0 Mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0493, \"output\": 0.4845 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32000 }\n      },\n      \"Llama-3.3-70B-Dark-Ages-v0.1\": {\n        \"id\": \"Llama-3.3-70B-Dark-Ages-v0.1\",\n        \"name\": \"Llama 3.3 70B Dark Ages v0.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3+(3.1v3.3)-70B-Hanami-x1\": {\n        \"id\": \"Llama-3.3+(3.1v3.3)-70B-Hanami-x1\",\n        \"name\": \"Llama 3.3+ 70B Hanami x1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"claude-sonnet-4-thinking\": {\n        \"id\": \"claude-sonnet-4-thinking\",\n        \"name\": \"Claude 4 Sonnet Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"claude-sonnet-4-20250514\": {\n        \"id\": \"claude-sonnet-4-20250514\",\n        \"name\": \"Claude 4 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"glm-4\": {\n        \"id\": \"glm-4\",\n        \"name\": \"GLM-4\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-01-16\",\n        \"last_updated\": \"2024-01-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 14.994 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"hidream\": {\n        \"id\": \"hidream\",\n        \"name\": \"Hidream\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"brave-research\": {\n        \"id\": \"brave-research\",\n        \"name\": \"Brave (Research)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-03-02\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 5 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"glm-4.1v-thinking-flash\": {\n        \"id\": \"glm-4.1v-thinking-flash\",\n        \"name\": \"GLM 4.1V Thinking Flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 64000, \"input\": 64000, \"output\": 8192 }\n      },\n      \"Llama-3.3-70B-Shakudo\": {\n        \"id\": \"Llama-3.3-70B-Shakudo\",\n        \"name\": \"Llama 3.3 70B Shakudo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"ernie-x1.1-preview\": {\n        \"id\": \"ernie-x1.1-preview\",\n        \"name\": \"ERNIE X1.1\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-10\",\n        \"last_updated\": \"2025-09-10\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 64000, \"input\": 64000, \"output\": 8192 }\n      },\n      \"auto-model-premium\": {\n        \"id\": \"auto-model-premium\",\n        \"name\": \"Auto model (Premium)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 1000000 }\n      },\n      \"Mistral-Nemo-12B-Instruct-2407\": {\n        \"id\": \"Mistral-Nemo-12B-Instruct-2407\",\n        \"name\": \"Mistral Nemo 12B Instruct 2407\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"doubao-1-5-thinking-vision-pro-250428\": {\n        \"id\": \"doubao-1-5-thinking-vision-pro-250428\",\n        \"name\": \"Doubao 1.5 Thinking Vision Pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-15\",\n        \"last_updated\": \"2025-05-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.55, \"output\": 1.43 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Electra-R1\": {\n        \"id\": \"Llama-3.3-70B-Electra-R1\",\n        \"name\": \"Llama 3.3 70B Electra R1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"claude-opus-4-5-20251101\": {\n        \"id\": \"claude-opus-4-5-20251101\",\n        \"name\": \"Claude 4.5 Opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 25.007 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"doubao-1.5-pro-32k\": {\n        \"id\": \"doubao-1.5-pro-32k\",\n        \"name\": \"Doubao 1.5 Pro 32k\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-22\",\n        \"last_updated\": \"2025-01-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1343, \"output\": 0.3349 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 8192 }\n      },\n      \"GLM-4.6-Derestricted-v5\": {\n        \"id\": \"GLM-4.6-Derestricted-v5\",\n        \"name\": \"GLM 4.6 Derestricted v5\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.5 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 8192 }\n      },\n      \"claude-opus-4-1-thinking:8192\": {\n        \"id\": \"claude-opus-4-1-thinking:8192\",\n        \"name\": \"Claude 4.1 Opus Thinking (8K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"Llama-3.3-70B-Argunaut-1-SFT\": {\n        \"id\": \"Llama-3.3-70B-Argunaut-1-SFT\",\n        \"name\": \"Llama 3.3 70B Argunaut 1 SFT\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Fallen-R1-v1\": {\n        \"id\": \"Llama-3.3-70B-Fallen-R1-v1\",\n        \"name\": \"Llama 3.3 70B Fallen R1 v1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"GLM-4.5-Air-Derestricted-Iceblink-v2-ReExtract\": {\n        \"id\": \"GLM-4.5-Air-Derestricted-Iceblink-v2-ReExtract\",\n        \"name\": \"GLM 4.5 Air Derestricted Iceblink v2 ReExtract\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-12\",\n        \"last_updated\": \"2025-12-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 65536 }\n      },\n      \"Llama-3.3-70B-MS-Nevoria\": {\n        \"id\": \"Llama-3.3-70B-MS-Nevoria\",\n        \"name\": \"Llama 3.3 70B MS Nevoria\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"claude-sonnet-4-thinking:8192\": {\n        \"id\": \"claude-sonnet-4-thinking:8192\",\n        \"name\": \"Claude 4 Sonnet Thinking (8K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"claude-sonnet-4-5-20250929\": {\n        \"id\": \"claude-sonnet-4-5-20250929\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"doubao-1.5-pro-256k\": {\n        \"id\": \"doubao-1.5-pro-256k\",\n        \"name\": \"Doubao 1.5 Pro 256k\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.799, \"output\": 1.445 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Nova\": {\n        \"id\": \"Llama-3.3-70B-Nova\",\n        \"name\": \"Llama 3.3 70B Nova\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"gemini-2.5-pro-preview-05-06\": {\n        \"id\": \"gemini-2.5-pro-preview-05-06\",\n        \"name\": \"Gemini 2.5 Pro Preview 0506\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2025-05-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"step-r1-v-mini\": {\n        \"id\": \"step-r1-v-mini\",\n        \"name\": \"Step R1 V Mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-08\",\n        \"last_updated\": \"2025-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 11 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"KAT-Coder-Air-V1\": {\n        \"id\": \"KAT-Coder-Air-V1\",\n        \"name\": \"KAT Coder Air V1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-10-28\",\n        \"last_updated\": \"2025-10-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"Llama-3.3-70B-Predatorial-Extasy\": {\n        \"id\": \"Llama-3.3-70B-Predatorial-Extasy\",\n        \"name\": \"Llama 3.3 70B Predatorial Extasy\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-StrawberryLemonade-v1.0\": {\n        \"id\": \"Llama-3.3-70B-StrawberryLemonade-v1.0\",\n        \"name\": \"Llama 3.3 70B StrawberryLemonade v1.0\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Progenitor-V3.3\": {\n        \"id\": \"Llama-3.3-70B-Progenitor-V3.3\",\n        \"name\": \"Llama 3.3 70B Progenitor V3.3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Baichuan4-Turbo\": {\n        \"id\": \"Baichuan4-Turbo\",\n        \"name\": \"Baichuan 4 Turbo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.42, \"output\": 2.42 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"deepseek-r1-sambanova\": {\n        \"id\": \"deepseek-r1-sambanova\",\n        \"name\": \"DeepSeek R1 Fast\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-20\",\n        \"last_updated\": \"2025-02-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 6.987 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"auto-model\": {\n        \"id\": \"auto-model\",\n        \"name\": \"Auto model\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-06-01\",\n        \"last_updated\": \"2024-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 1000000 }\n      },\n      \"gemini-2.0-pro-reasoner\": {\n        \"id\": \"gemini-2.0-pro-reasoner\",\n        \"name\": \"Gemini 2.0 Pro Reasoner\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-05\",\n        \"last_updated\": \"2025-02-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.292, \"output\": 4.998 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"ernie-x1-32k-preview\": {\n        \"id\": \"ernie-x1-32k-preview\",\n        \"name\": \"Ernie X1 32k\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.33, \"output\": 1.32 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 16384 }\n      },\n      \"gemini-2.5-flash-lite-preview-06-17\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-06-17\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"step-2-16k-exp\": {\n        \"id\": \"step-2-16k-exp\",\n        \"name\": \"Step-2 16k Exp\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-05\",\n        \"last_updated\": \"2024-07-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 7.004, \"output\": 19.992 },\n        \"limit\": { \"context\": 16000, \"input\": 16000, \"output\": 8192 }\n      },\n      \"v0-1.0-md\": {\n        \"id\": \"v0-1.0-md\",\n        \"name\": \"v0 1.0 MD\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-04\",\n        \"last_updated\": \"2025-07-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"KAT-Coder-Exp-72B-1010\": {\n        \"id\": \"KAT-Coder-Exp-72B-1010\",\n        \"name\": \"KAT Coder Exp 72B 1010\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-10-28\",\n        \"last_updated\": \"2025-10-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"azure-gpt-4o-mini\": {\n        \"id\": \"azure-gpt-4o-mini\",\n        \"name\": \"Azure gpt-4o-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1496, \"output\": 0.595 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"fastgpt\": {\n        \"id\": \"fastgpt\",\n        \"name\": \"Web Answer\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-08-01\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 7.5, \"output\": 7.5 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"gemini-2.5-flash-preview-04-17:thinking\": {\n        \"id\": \"gemini-2.5-flash-preview-04-17:thinking\",\n        \"name\": \"Gemini 2.5 Flash Preview Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-17\",\n        \"last_updated\": \"2025-04-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 3.5 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"ernie-5.0-thinking-preview\": {\n        \"id\": \"ernie-5.0-thinking-preview\",\n        \"name\": \"Ernie 5.0 Thinking Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"jamba-large-1.7\": {\n        \"id\": \"jamba-large-1.7\",\n        \"name\": \"Jamba Large 1.7\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.989, \"output\": 7.99 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 4096 }\n      },\n      \"azure-o3-mini\": {\n        \"id\": \"azure-o3-mini\",\n        \"name\": \"Azure o3-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.088, \"output\": 4.3996 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 65536 }\n      },\n      \"z-image-turbo\": {\n        \"id\": \"z-image-turbo\",\n        \"name\": \"Z Image Turbo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-27\",\n        \"last_updated\": \"2025-11-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"output\": 0 }\n      },\n      \"step-3\": {\n        \"id\": \"step-3\",\n        \"name\": \"Step-3\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-07-31\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2499, \"output\": 0.6494 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 8192 }\n      },\n      \"deepseek-chat-cheaper\": {\n        \"id\": \"deepseek-chat-cheaper\",\n        \"name\": \"DeepSeek V3/Chat Cheaper\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"claude-3-7-sonnet-thinking:8192\": {\n        \"id\": \"claude-3-7-sonnet-thinking:8192\",\n        \"name\": \"Claude 3.7 Sonnet Thinking (8K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 64000 }\n      },\n      \"gemini-2.0-flash-exp-image-generation\": {\n        \"id\": \"gemini-2.0-flash-exp-image-generation\",\n        \"name\": \"Gemini Text + Image\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 32767, \"input\": 32767, \"output\": 8192 }\n      },\n      \"ernie-4.5-turbo-128k\": {\n        \"id\": \"ernie-4.5-turbo-128k\",\n        \"name\": \"Ernie 4.5 Turbo 128k\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-08\",\n        \"last_updated\": \"2025-05-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.132, \"output\": 0.55 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"claude-3-7-sonnet-reasoner\": {\n        \"id\": \"claude-3-7-sonnet-reasoner\",\n        \"name\": \"Claude 3.7 Sonnet Reasoner\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-29\",\n        \"last_updated\": \"2025-03-29\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"grok-3-beta\": {\n        \"id\": \"grok-3-beta\",\n        \"name\": \"Grok 3 Beta\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 131072 }\n      },\n      \"Llama-3.3+(3.1v3.3)-70B-New-Dawn-v1.1\": {\n        \"id\": \"Llama-3.3+(3.1v3.3)-70B-New-Dawn-v1.1\",\n        \"name\": \"Llama 3.3+ 70B New Dawn v1.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"exa-research-pro\": {\n        \"id\": \"exa-research-pro\",\n        \"name\": \"Exa (Research Pro)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-04\",\n        \"last_updated\": \"2025-06-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 2.5 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"MiniMax-M1\": {\n        \"id\": \"MiniMax-M1\",\n        \"name\": \"MiniMax M1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-16\",\n        \"last_updated\": \"2025-06-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1394, \"output\": 1.3328 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 131072 }\n      },\n      \"claude-opus-4-thinking:32768\": {\n        \"id\": \"claude-opus-4-thinking:32768\",\n        \"name\": \"Claude 4 Opus Thinking (32K)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.994, \"output\": 75.004 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 32000 }\n      },\n      \"azure-gpt-4o\": {\n        \"id\": \"azure-gpt-4o\",\n        \"name\": \"Azure gpt-4o\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.499, \"output\": 9.996 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Aurora-Borealis\": {\n        \"id\": \"Llama-3.3-70B-Aurora-Borealis\",\n        \"name\": \"Llama 3.3 70B Aurora Borealis\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-The-Omega-Directive-Unslop-v2.1\": {\n        \"id\": \"Llama-3.3-70B-The-Omega-Directive-Unslop-v2.1\",\n        \"name\": \"Llama 3.3 70B Omega Directive Unslop v2.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"Llama-3.3-70B-Cu-Mai-R1\": {\n        \"id\": \"Llama-3.3-70B-Cu-Mai-R1\",\n        \"name\": \"Llama 3.3 70B Cu Mai R1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"jamba-mini-1.7\": {\n        \"id\": \"jamba-mini-1.7\",\n        \"name\": \"Jamba Mini 1.7\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1989, \"output\": 0.408 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 4096 }\n      },\n      \"Llama-3.3-70B-Bigger-Body\": {\n        \"id\": \"Llama-3.3-70B-Bigger-Body\",\n        \"name\": \"Llama 3.3 70B Bigger Body\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"grok-3-mini-fast-beta\": {\n        \"id\": \"grok-3-mini-fast-beta\",\n        \"name\": \"Grok 3 Mini Fast Beta\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 4 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 131072 }\n      },\n      \"azure-gpt-4-turbo\": {\n        \"id\": \"azure-gpt-4-turbo\",\n        \"name\": \"Azure gpt-4-turbo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 30.005 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"claude-3-5-sonnet-20241022\": {\n        \"id\": \"claude-3-5-sonnet-20241022\",\n        \"name\": \"Claude 3.5 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 8192 }\n      },\n      \"gemini-2.5-flash-preview-04-17\": {\n        \"id\": \"gemini-2.5-flash-preview-04-17\",\n        \"name\": \"Gemini 2.5 Flash Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-17\",\n        \"last_updated\": \"2025-04-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"ernie-4.5-turbo-vl-32k\": {\n        \"id\": \"ernie-4.5-turbo-vl-32k\",\n        \"name\": \"Ernie 4.5 Turbo VL 32k\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-08\",\n        \"last_updated\": \"2025-05-08\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.495, \"output\": 1.43 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 16384 }\n      },\n      \"claude-3-5-sonnet-20240620\": {\n        \"id\": \"claude-3-5-sonnet-20240620\",\n        \"name\": \"Claude 3.5 Sonnet Old\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2024-06-20\",\n        \"last_updated\": \"2024-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.994 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 8192 }\n      },\n      \"deepseek-r1\": {\n        \"id\": \"deepseek-r1\",\n        \"name\": \"DeepSeek R1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"v0-1.5-lg\": {\n        \"id\": \"v0-1.5-lg\",\n        \"name\": \"v0 1.5 LG\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-04\",\n        \"last_updated\": \"2025-07-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 75 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 64000 }\n      },\n      \"qwen3-max-2026-01-23\": {\n        \"id\": \"qwen3-max-2026-01-23\",\n        \"name\": \"Qwen3 Max 2026-01-23\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-26\",\n        \"last_updated\": \"2026-01-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2002, \"output\": 6.001 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"qwen/Qwen3.6-35B-A3B:thinking\": {\n        \"id\": \"qwen/Qwen3.6-35B-A3B:thinking\",\n        \"name\": \"Qwen3.6 35B A3B Thinking\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-04-19\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 1.74 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen/Qwen3.6-35B-A3B\": {\n        \"id\": \"qwen/Qwen3.6-35B-A3B\",\n        \"name\": \"Qwen3.6 35B A3B\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-04-17\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 1.74 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"qwen/qwen3.5-397b-a17b\": {\n        \"id\": \"qwen/qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 258048, \"input\": 258048, \"output\": 65536 }\n      },\n      \"cohere/command-r\": {\n        \"id\": \"cohere/command-r\",\n        \"name\": \"Cohere: Command R\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-03-11\",\n        \"last_updated\": \"2024-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.476, \"output\": 1.428 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"cohere/command-r-plus-08-2024\": {\n        \"id\": \"cohere/command-r-plus-08-2024\",\n        \"name\": \"Cohere: Command R+\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.856, \"output\": 14.246 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"meta-llama/llama-3.1-8b-instruct\": {\n        \"id\": \"meta-llama/llama-3.1-8b-instruct\",\n        \"name\": \"Llama 3.1 8b Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0544, \"output\": 0.0544 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/llama-3.2-3b-instruct\": {\n        \"id\": \"meta-llama/llama-3.2-3b-instruct\",\n        \"name\": \"Llama 3.2 3b Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0306, \"output\": 0.0493 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 8192 }\n      },\n      \"meta-llama/llama-4-scout\": {\n        \"id\": \"meta-llama/llama-4-scout\",\n        \"name\": \"Llama 4 Scout\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.085, \"output\": 0.46 },\n        \"limit\": { \"context\": 328000, \"input\": 328000, \"output\": 65536 }\n      },\n      \"meta-llama/llama-3.3-70b-instruct\": {\n        \"id\": \"meta-llama/llama-3.3-70b-instruct\",\n        \"name\": \"Llama 3.3 70b Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-02-27\",\n        \"last_updated\": \"2025-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.23 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/llama-4-maverick\": {\n        \"id\": \"meta-llama/llama-4-maverick\",\n        \"name\": \"Llama 4 Maverick\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.18000000000000002, \"output\": 0.8 },\n        \"limit\": { \"context\": 1048576, \"input\": 1048576, \"output\": 65536 }\n      },\n      \"meta-llama/llama-3.2-90b-vision-instruct\": {\n        \"id\": \"meta-llama/llama-3.2-90b-vision-instruct\",\n        \"name\": \"Llama 3.2 Medium\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.9009999999999999, \"output\": 0.9009999999999999 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 16384 }\n      },\n      \"meganova-ai/manta-mini-1.0\": {\n        \"id\": \"meganova-ai/manta-mini-1.0\",\n        \"name\": \"Manta Mini 1.0\",\n        \"family\": \"nova\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-20\",\n        \"last_updated\": \"2025-12-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0.16 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 8192 }\n      },\n      \"meganova-ai/manta-pro-1.0\": {\n        \"id\": \"meganova-ai/manta-pro-1.0\",\n        \"name\": \"Manta Pro 1.0\",\n        \"family\": \"nova\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-20\",\n        \"last_updated\": \"2025-12-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.060000000000000005, \"output\": 0.5 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"meganova-ai/manta-flash-1.0\": {\n        \"id\": \"meganova-ai/manta-flash-1.0\",\n        \"name\": \"Manta Flash 1.0\",\n        \"family\": \"nova\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-20\",\n        \"last_updated\": \"2025-12-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0.16 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Tongyi-Zhiwen/QwenLong-L1-32B\": {\n        \"id\": \"Tongyi-Zhiwen/QwenLong-L1-32B\",\n        \"name\": \"QwenLong L1 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-25\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13999999999999999, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 40960 }\n      },\n      \"Gryphe/MythoMax-L2-13b\": {\n        \"id\": \"Gryphe/MythoMax-L2-13b\",\n        \"name\": \"MythoMax 13B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1003 },\n        \"limit\": { \"context\": 4000, \"input\": 4000, \"output\": 4096 }\n      },\n      \"Doctor-Shotgun/MS3.2-24B-Magnum-Diamond\": {\n        \"id\": \"Doctor-Shotgun/MS3.2-24B-Magnum-Diamond\",\n        \"name\": \"MS3.2 24B Magnum Diamond\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 32768 }\n      },\n      \"raifle/sorcererlm-8x22b\": {\n        \"id\": \"raifle/sorcererlm-8x22b\",\n        \"name\": \"SorcererLM 8x22B\",\n        \"family\": \"mixtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.505, \"output\": 4.505 },\n        \"limit\": { \"context\": 16000, \"input\": 16000, \"output\": 8192 }\n      },\n      \"LatitudeGames/Wayfarer-Large-70B-Llama-3.3\": {\n        \"id\": \"LatitudeGames/Wayfarer-Large-70B-Llama-3.3\",\n        \"name\": \"Llama 3.3 70B Wayfarer\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-20\",\n        \"last_updated\": \"2025-02-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.700000007, \"output\": 0.700000007 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"pamanseau/OpenReasoning-Nemotron-32B\": {\n        \"id\": \"pamanseau/OpenReasoning-Nemotron-32B\",\n        \"name\": \"OpenReasoning Nemotron 32B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 65536 }\n      },\n      \"mlabonne/NeuralDaredevil-8B-abliterated\": {\n        \"id\": \"mlabonne/NeuralDaredevil-8B-abliterated\",\n        \"name\": \"Neural Daredevil 8B abliterated\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.44, \"output\": 0.44 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 8192 }\n      },\n      \"Sao10K/L3-8B-Stheno-v3.2\": {\n        \"id\": \"Sao10K/L3-8B-Stheno-v3.2\",\n        \"name\": \"Sao10K Stheno 8b\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-11-29\",\n        \"last_updated\": \"2024-11-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.2006 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"Sao10K/L3.1-70B-Euryale-v2.2\": {\n        \"id\": \"Sao10K/L3.1-70B-Euryale-v2.2\",\n        \"name\": \"Llama 3.1 70B Euryale\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.357 },\n        \"limit\": { \"context\": 20480, \"input\": 20480, \"output\": 16384 }\n      },\n      \"Sao10K/L3.1-70B-Hanami-x1\": {\n        \"id\": \"Sao10K/L3.1-70B-Hanami-x1\",\n        \"name\": \"Llama 3.1 70B Hanami\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Sao10K/L3.3-70B-Euryale-v2.3\": {\n        \"id\": \"Sao10K/L3.3-70B-Euryale-v2.3\",\n        \"name\": \"Llama 3.3 70B Euryale\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 20480, \"input\": 20480, \"output\": 16384 }\n      },\n      \"VongolaChouko/Starcannon-Unleashed-12B-v1.0\": {\n        \"id\": \"VongolaChouko/Starcannon-Unleashed-12B-v1.0\",\n        \"name\": \"Mistral Nemo Starcannon 12b v1\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"abacusai/Dracarys-72B-Instruct\": {\n        \"id\": \"abacusai/Dracarys-72B-Instruct\",\n        \"name\": \"Llama 3.1 70B Dracarys 2\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-02\",\n        \"last_updated\": \"2025-08-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"nvidia/Llama-3.1-Nemotron-Ultra-253B-v1\": {\n        \"id\": \"nvidia/Llama-3.1-Nemotron-Ultra-253B-v1\",\n        \"name\": \"Nvidia Nemotron Ultra 253B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-03\",\n        \"last_updated\": \"2025-07-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 0.8 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"nvidia/nvidia-nemotron-nano-9b-v2\": {\n        \"id\": \"nvidia/nvidia-nemotron-nano-9b-v2\",\n        \"name\": \"Nvidia Nemotron Nano 9B v2\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-18\",\n        \"last_updated\": \"2025-08-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"nvidia/Llama-3_3-Nemotron-Super-49B-v1_5\": {\n        \"id\": \"nvidia/Llama-3_3-Nemotron-Super-49B-v1_5\",\n        \"name\": \"Nvidia Nemotron Super 49B v1.5\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.25 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF\": {\n        \"id\": \"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF\",\n        \"name\": \"Nvidia Nemotron 70b\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.357, \"output\": 0.408 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"nvidia/Llama-3.3-Nemotron-Super-49B-v1\": {\n        \"id\": \"nvidia/Llama-3.3-Nemotron-Super-49B-v1\",\n        \"name\": \"Nvidia Nemotron Super 49B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"nvidia/nemotron-3-nano-30b-a3b\": {\n        \"id\": \"nvidia/nemotron-3-nano-30b-a3b\",\n        \"name\": \"Nvidia Nemotron 3 Nano 30B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-15\",\n        \"last_updated\": \"2025-12-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 262144 }\n      },\n      \"allenai/molmo-2-8b\": {\n        \"id\": \"allenai/molmo-2-8b\",\n        \"name\": \"Molmo 2 8B\",\n        \"family\": \"allenai\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 36864, \"input\": 36864, \"output\": 36864 }\n      },\n      \"allenai/olmo-3-32b-think\": {\n        \"id\": \"allenai/olmo-3-32b-think\",\n        \"name\": \"Olmo 3 32B Think\",\n        \"family\": \"allenai\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2025-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.44999999999999996 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"allenai/olmo-3.1-32b-think\": {\n        \"id\": \"allenai/olmo-3.1-32b-think\",\n        \"name\": \"Olmo 3.1 32B Think\",\n        \"family\": \"allenai\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-25\",\n        \"last_updated\": \"2026-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.5 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 8192 }\n      },\n      \"allenai/olmo-3.1-32b-instruct\": {\n        \"id\": \"allenai/olmo-3.1-32b-instruct\",\n        \"name\": \"Olmo 3.1 32B Instruct\",\n        \"family\": \"allenai\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-25\",\n        \"last_updated\": \"2026-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 8192 }\n      },\n      \"Salesforce/Llama-xLAM-2-70b-fc-r\": {\n        \"id\": \"Salesforce/Llama-xLAM-2-70b-fc-r\",\n        \"name\": \"Llama-xLAM-2 70B fc-r\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-13\",\n        \"last_updated\": \"2025-04-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 2.5 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"Steelskull/L3.3-Cu-Mai-R1-70b\": {\n        \"id\": \"Steelskull/L3.3-Cu-Mai-R1-70b\",\n        \"name\": \"Llama 3.3 70B Cu Mai\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Steelskull/L3.3-MS-Evayale-70B\": {\n        \"id\": \"Steelskull/L3.3-MS-Evayale-70B\",\n        \"name\": \"Evayale 70b \",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Steelskull/L3.3-MS-Nevoria-70b\": {\n        \"id\": \"Steelskull/L3.3-MS-Nevoria-70b\",\n        \"name\": \"Steelskull Nevoria 70b\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Steelskull/L3.3-Nevoria-R1-70b\": {\n        \"id\": \"Steelskull/L3.3-Nevoria-R1-70b\",\n        \"name\": \"Steelskull Nevoria R1 70b\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Steelskull/L3.3-Electra-R1-70b\": {\n        \"id\": \"Steelskull/L3.3-Electra-R1-70b\",\n        \"name\": \"Steelskull Electra R1 70b\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.69989, \"output\": 0.69989 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Steelskull/L3.3-MS-Evalebis-70b\": {\n        \"id\": \"Steelskull/L3.3-MS-Evalebis-70b\",\n        \"name\": \"MS Evalebis 70b\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"GalrionSoftworks/MN-LooseCannon-12B-v1\": {\n        \"id\": \"GalrionSoftworks/MN-LooseCannon-12B-v1\",\n        \"name\": \"MN-LooseCannon-12B-v1\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"moonshotai/kimi-k2-thinking-turbo-original\": {\n        \"id\": \"moonshotai/kimi-k2-thinking-turbo-original\",\n        \"name\": \"Kimi K2 Thinking Turbo Original\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.15, \"output\": 8 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2-instruct\": {\n        \"id\": \"moonshotai/kimi-k2-instruct\",\n        \"name\": \"Kimi K2 Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 2 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 8192 }\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 262144 }\n      },\n      \"moonshotai/kimi-k2-thinking-original\": {\n        \"id\": \"moonshotai/kimi-k2-thinking-original\",\n        \"name\": \"Kimi K2 Thinking Original\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 16384 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-26\",\n        \"last_updated\": \"2026-01-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.9 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 65536 }\n      },\n      \"moonshotai/kimi-k2.6:thinking\": {\n        \"id\": \"moonshotai/kimi-k2.6:thinking\",\n        \"name\": \"Kimi K2.6 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.53, \"output\": 2.73 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"moonshotai/kimi-k2.5:thinking\": {\n        \"id\": \"moonshotai/kimi-k2.5:thinking\",\n        \"name\": \"Kimi K2.5 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-26\",\n        \"last_updated\": \"2026-01-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.9 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 65536 }\n      },\n      \"moonshotai/kimi-k2.6\": {\n        \"id\": \"moonshotai/kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.53, \"output\": 2.73 },\n        \"limit\": { \"context\": 256000, \"output\": 65536 }\n      },\n      \"moonshotai/kimi-k2-instruct-0711\": {\n        \"id\": \"moonshotai/kimi-k2-instruct-0711\",\n        \"name\": \"Kimi K2 0711\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"moonshotai/Kimi-Dev-72B\": {\n        \"id\": \"moonshotai/Kimi-Dev-72B\",\n        \"name\": \"Kimi Dev 72B\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 131072 }\n      },\n      \"Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B\": {\n        \"id\": \"Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B\",\n        \"name\": \"Nemotron Tenyxchat Storybreaker 70b\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B\": {\n        \"id\": \"Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B\",\n        \"name\": \"Llama 3.05 Storybreaker Ministral 70b\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"LLM360/K2-Think\": {\n        \"id\": \"LLM360/K2-Think\",\n        \"name\": \"K2-Think\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"dmind/dmind-1\": {\n        \"id\": \"dmind/dmind-1\",\n        \"name\": \"DMind-1\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-01\",\n        \"last_updated\": \"2025-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.6 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"dmind/dmind-1-mini\": {\n        \"id\": \"dmind/dmind-1-mini\",\n        \"name\": \"DMind-1-Mini\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-01\",\n        \"last_updated\": \"2025-06-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.4 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4.6\": {\n        \"id\": \"anthropic/claude-opus-4.6\",\n        \"name\": \"Claude 4.6 Opus\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 25.007 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4.6:thinking\": {\n        \"id\": \"anthropic/claude-sonnet-4.6:thinking\",\n        \"name\": \"Claude Sonnet 4.6 Thinking\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.993999999999998 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4.6\": {\n        \"id\": \"anthropic/claude-sonnet-4.6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.992, \"output\": 14.993999999999998 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-opus-4.6:thinking:medium\": {\n        \"id\": \"anthropic/claude-opus-4.6:thinking:medium\",\n        \"name\": \"Claude 4.6 Opus Thinking Medium\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 25.007 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-opus-4.6:thinking:low\": {\n        \"id\": \"anthropic/claude-opus-4.6:thinking:low\",\n        \"name\": \"Claude 4.6 Opus Thinking Low\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 25.007 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-opus-4.6:thinking\": {\n        \"id\": \"anthropic/claude-opus-4.6:thinking\",\n        \"name\": \"Claude 4.6 Opus Thinking\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 25.007 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-opus-4.6:thinking:max\": {\n        \"id\": \"anthropic/claude-opus-4.6:thinking:max\",\n        \"name\": \"Claude 4.6 Opus Thinking Max\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 25.007 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 128000 }\n      },\n      \"ReadyArt/The-Omega-Abomination-L-70B-v1.0\": {\n        \"id\": \"ReadyArt/The-Omega-Abomination-L-70B-v1.0\",\n        \"name\": \"The Omega Abomination V1\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2024-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.95 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0\": {\n        \"id\": \"ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0\",\n        \"name\": \"Omega Directive 24B Unslop v2.0\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 0.5 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 32768 }\n      },\n      \"mistralai/mistral-large\": {\n        \"id\": \"mistralai/mistral-large\",\n        \"name\": \"Mistral Large 2411\",\n        \"family\": \"mistral-large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-02-26\",\n        \"last_updated\": \"2024-02-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 6.001 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 256000 }\n      },\n      \"mistralai/mistral-7b-instruct\": {\n        \"id\": \"mistralai/mistral-7b-instruct\",\n        \"name\": \"Mistral 7B Instruct\",\n        \"family\": \"mistral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-27\",\n        \"last_updated\": \"2024-05-27\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0544, \"output\": 0.0544 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"mistralai/ministral-8b-2512\": {\n        \"id\": \"mistralai/ministral-8b-2512\",\n        \"name\": \"Ministral 8B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-04\",\n        \"last_updated\": \"2025-12-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 262144, \"input\": 262144, \"output\": 32768 }\n      },\n      \"mistralai/ministral-3b-2512\": {\n        \"id\": \"mistralai/ministral-3b-2512\",\n        \"name\": \"Ministral 3B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-04\",\n        \"last_updated\": \"2025-12-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 32768 }\n      },\n      \"mistralai/devstral-2-123b-instruct-2512\": {\n        \"id\": \"mistralai/devstral-2-123b-instruct-2512\",\n        \"name\": \"Devstral 2 123B\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.4 },\n        \"limit\": { \"context\": 262144, \"input\": 262144, \"output\": 65536 }\n      },\n      \"mistralai/ministral-14b-instruct-2512\": {\n        \"id\": \"mistralai/ministral-14b-instruct-2512\",\n        \"name\": \"Ministral 3 14B\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"input\": 262144, \"output\": 32768 }\n      },\n      \"mistralai/mistral-large-3-675b-instruct-2512\": {\n        \"id\": \"mistralai/mistral-large-3-675b-instruct-2512\",\n        \"name\": \"Mistral Large 3 675B\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"input\": 262144, \"output\": 256000 }\n      },\n      \"mistralai/mixtral-8x22b-instruct-v0.1\": {\n        \"id\": \"mistralai/mixtral-8x22b-instruct-v0.1\",\n        \"name\": \"Mixtral 8x22B\",\n        \"family\": \"mixtral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8999999999999999, \"output\": 0.8999999999999999 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 32768 }\n      },\n      \"mistralai/mistral-saba\": {\n        \"id\": \"mistralai/mistral-saba\",\n        \"name\": \"Mistral Saba\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1989, \"output\": 0.595 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 32768 }\n      },\n      \"mistralai/mistral-medium-3.1\": {\n        \"id\": \"mistralai/mistral-medium-3.1\",\n        \"name\": \"Mistral Medium 3.1\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 32768 }\n      },\n      \"mistralai/mistral-tiny\": {\n        \"id\": \"mistralai/mistral-tiny\",\n        \"name\": \"Mistral Tiny\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-12-11\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25499999999999995, \"output\": 0.25499999999999995 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 8192 }\n      },\n      \"mistralai/Devstral-Small-2505\": {\n        \"id\": \"mistralai/Devstral-Small-2505\",\n        \"name\": \"Mistral Devstral Small 2505\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-02\",\n        \"last_updated\": \"2025-08-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.060000000000000005,\n          \"output\": 0.060000000000000005\n        },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"mistralai/mistral-small-creative\": {\n        \"id\": \"mistralai/mistral-small-creative\",\n        \"name\": \"Mistral Small Creative\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"mistralai/codestral-2508\": {\n        \"id\": \"mistralai/codestral-2508\",\n        \"name\": \"Codestral 2508\",\n        \"family\": \"codestral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.8999999999999999 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"mistralai/mixtral-8x7b-instruct-v0.1\": {\n        \"id\": \"mistralai/mixtral-8x7b-instruct-v0.1\",\n        \"name\": \"Mixtral 8x7B\",\n        \"family\": \"mixtral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.27 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"mistralai/ministral-14b-2512\": {\n        \"id\": \"mistralai/ministral-14b-2512\",\n        \"name\": \"Ministral 14B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-04\",\n        \"last_updated\": \"2025-12-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 262144, \"input\": 262144, \"output\": 32768 }\n      },\n      \"mistralai/Mistral-Nemo-Instruct-2407\": {\n        \"id\": \"mistralai/Mistral-Nemo-Instruct-2407\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1207 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"mistralai/mistral-medium-3\": {\n        \"id\": \"mistralai/mistral-medium-3\",\n        \"name\": \"Mistral Medium 3\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 32768 }\n      },\n      \"CrucibleLab/L3.3-70B-Loki-V2.0\": {\n        \"id\": \"CrucibleLab/L3.3-70B-Loki-V2.0\",\n        \"name\": \"L3.3 70B Loki v2.0\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-22\",\n        \"last_updated\": \"2026-01-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"TheDrummer 2/Magidonia-24B-v4.3\": {\n        \"id\": \"TheDrummer 2/Magidonia-24B-v4.3\",\n        \"name\": \"The Drummer Magidonia 24B v4.3\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-25\",\n        \"last_updated\": \"2025-12-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1207 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"TheDrummer 2/Cydonia-24B-v4\": {\n        \"id\": \"TheDrummer 2/Cydonia-24B-v4\",\n        \"name\": \"The Drummer Cydonia 24B v4\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2025-07-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.2414 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 32768 }\n      },\n      \"TheDrummer 2/Anubis-70B-v1.1\": {\n        \"id\": \"TheDrummer 2/Anubis-70B-v1.1\",\n        \"name\": \"Anubis 70B v1.1\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.31, \"output\": 0.31 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 16384 }\n      },\n      \"TheDrummer 2/Cydonia-24B-v2\": {\n        \"id\": \"TheDrummer 2/Cydonia-24B-v2\",\n        \"name\": \"The Drummer Cydonia 24B v2\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1207 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 32768 }\n      },\n      \"TheDrummer 2/skyfall-36b-v2\": {\n        \"id\": \"TheDrummer 2/skyfall-36b-v2\",\n        \"name\": \"TheDrummer Skyfall 36B V2\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 64000, \"input\": 64000, \"output\": 32768 }\n      },\n      \"TheDrummer 2/Rocinante-12B-v1.1\": {\n        \"id\": \"TheDrummer 2/Rocinante-12B-v1.1\",\n        \"name\": \"Rocinante 12b\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.408, \"output\": 0.595 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"TheDrummer 2/Cydonia-24B-v4.1\": {\n        \"id\": \"TheDrummer 2/Cydonia-24B-v4.1\",\n        \"name\": \"The Drummer Cydonia 24B v4.1\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1207 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 32768 }\n      },\n      \"TheDrummer 2/Anubis-70B-v1\": {\n        \"id\": \"TheDrummer 2/Anubis-70B-v1\",\n        \"name\": \"Anubis 70B v1\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.31, \"output\": 0.31 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 16384 }\n      },\n      \"TheDrummer 2/Cydonia-24B-v4.3\": {\n        \"id\": \"TheDrummer 2/Cydonia-24B-v4.3\",\n        \"name\": \"The Drummer Cydonia 24B v4.3\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-25\",\n        \"last_updated\": \"2025-12-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1207 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 32768 }\n      },\n      \"TheDrummer 2/UnslopNemo-12B-v4.1\": {\n        \"id\": \"TheDrummer 2/UnslopNemo-12B-v4.1\",\n        \"name\": \"UnslopNemo 12b v4\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"inflatebot/MN-12B-Mag-Mell-R1\": {\n        \"id\": \"inflatebot/MN-12B-Mag-Mell-R1\",\n        \"name\": \"Mag Mell R1\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"soob3123/Veiled-Calla-12B\": {\n        \"id\": \"soob3123/Veiled-Calla-12B\",\n        \"name\": \"Veiled Calla 12B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-13\",\n        \"last_updated\": \"2025-04-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"soob3123/amoral-gemma3-27B-v2\": {\n        \"id\": \"soob3123/amoral-gemma3-27B-v2\",\n        \"name\": \"Amoral Gemma3 27B v2\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-23\",\n        \"last_updated\": \"2025-05-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"soob3123/GrayLine-Qwen3-8B\": {\n        \"id\": \"soob3123/GrayLine-Qwen3-8B\",\n        \"name\": \"Grayline Qwen3 8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 32768 }\n      },\n      \"meituan-longcat/LongCat-Flash-Chat-FP8\": {\n        \"id\": \"meituan-longcat/LongCat-Flash-Chat-FP8\",\n        \"name\": \"LongCat Flash\",\n        \"family\": \"longcat\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-31\",\n        \"last_updated\": \"2025-08-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"essentialai/rnj-1-instruct\": {\n        \"id\": \"essentialai/rnj-1-instruct\",\n        \"name\": \"RNJ-1 Instruct 8B\",\n        \"family\": \"rnj\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-13\",\n        \"last_updated\": \"2025-12-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"Infermatic/MN-12B-Inferor-v0.0\": {\n        \"id\": \"Infermatic/MN-12B-Inferor-v0.0\",\n        \"name\": \"Mistral Nemo Inferor 12B\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25499999999999995, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"nex-agi/deepseek-v3.1-nex-n1\": {\n        \"id\": \"nex-agi/deepseek-v3.1-nex-n1\",\n        \"name\": \"DeepSeek V3.1 Nex N1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-10\",\n        \"last_updated\": \"2025-12-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27999999999999997, \"output\": 0.42000000000000004 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2\": {\n        \"id\": \"EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2\",\n        \"name\": \"EVA-Qwen2.5-32B-v0.2\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7989999999999999, \"output\": 0.7989999999999999 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1\": {\n        \"id\": \"EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1\",\n        \"name\": \"EVA-LLaMA-3.33-70B-v0.1\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 2.006 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0\": {\n        \"id\": \"EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0\",\n        \"name\": \"EVA Llama 3.33 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 2.006 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2\": {\n        \"id\": \"EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2\",\n        \"name\": \"EVA-Qwen2.5-72B-v0.2\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7989999999999999, \"output\": 0.7989999999999999 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"deepcogito/cogito-v2.1-671b\": {\n        \"id\": \"deepcogito/cogito-v2.1-671b\",\n        \"name\": \"Cogito v2.1 671B MoE\",\n        \"family\": \"cogito\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 1.25 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"deepcogito/cogito-v1-preview-qwen-32B\": {\n        \"id\": \"deepcogito/cogito-v1-preview-qwen-32B\",\n        \"name\": \"Cogito v1 Preview Qwen 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-10\",\n        \"last_updated\": \"2025-05-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.7999999999999998, \"output\": 1.7999999999999998 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"MarinaraSpaghetti/NemoMix-Unleashed-12B\": {\n        \"id\": \"MarinaraSpaghetti/NemoMix-Unleashed-12B\",\n        \"name\": \"NemoMix 12B Unleashed\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"deepseek/deepseek-v3.2\": {\n        \"id\": \"deepseek/deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27999999999999997, \"output\": 0.42000000000000004 },\n        \"limit\": { \"context\": 163000, \"input\": 163000, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-v3.2:thinking\": {\n        \"id\": \"deepseek/deepseek-v3.2:thinking\",\n        \"name\": \"DeepSeek V3.2 Thinking\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27999999999999997, \"output\": 0.42000000000000004 },\n        \"limit\": { \"context\": 163000, \"input\": 163000, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-prover-v2-671b\": {\n        \"id\": \"deepseek/deepseek-prover-v2-671b\",\n        \"name\": \"DeepSeek Prover v2 671B\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-30\",\n        \"last_updated\": \"2025-04-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 2.5 },\n        \"limit\": { \"context\": 160000, \"input\": 160000, \"output\": 16384 }\n      },\n      \"deepseek/deepseek-v3.2-speciale\": {\n        \"id\": \"deepseek/deepseek-v3.2-speciale\",\n        \"name\": \"DeepSeek V3.2 Speciale\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27999999999999997, \"output\": 0.42000000000000004 },\n        \"limit\": { \"context\": 163000, \"input\": 163000, \"output\": 65536 }\n      },\n      \"xiaomi/mimo-v2-flash\": {\n        \"id\": \"xiaomi/mimo-v2-flash\",\n        \"name\": \"MiMo V2 Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.102, \"output\": 0.306 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"xiaomi/mimo-v2-flash-thinking\": {\n        \"id\": \"xiaomi/mimo-v2-flash-thinking\",\n        \"name\": \"MiMo V2 Flash (Thinking)\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.102, \"output\": 0.306 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"xiaomi/mimo-v2-flash-original\": {\n        \"id\": \"xiaomi/mimo-v2-flash-original\",\n        \"name\": \"MiMo V2 Flash Original\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.102, \"output\": 0.306 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"xiaomi/mimo-v2-flash-thinking-original\": {\n        \"id\": \"xiaomi/mimo-v2-flash-thinking-original\",\n        \"name\": \"MiMo V2 Flash (Thinking) Original\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.102, \"output\": 0.306 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated\": {\n        \"id\": \"huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated\",\n        \"name\": \"DeepSeek R1 Llama 70B Abliterated\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated\": {\n        \"id\": \"huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated\",\n        \"name\": \"DeepSeek R1 Qwen Abliterated\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.4, \"output\": 1.4 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"huihui-ai/Llama-3.1-Nemotron-70B-Instruct-HF-abliterated\": {\n        \"id\": \"huihui-ai/Llama-3.1-Nemotron-70B-Instruct-HF-abliterated\",\n        \"name\": \"Nemotron 3.1 70B abliterated\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"huihui-ai/Llama-3.3-70B-Instruct-abliterated\": {\n        \"id\": \"huihui-ai/Llama-3.3-70B-Instruct-abliterated\",\n        \"name\": \"Llama 3.3 70B Instruct abliterated\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"huihui-ai/Qwen2.5-32B-Instruct-abliterated\": {\n        \"id\": \"huihui-ai/Qwen2.5-32B-Instruct-abliterated\",\n        \"name\": \"Qwen 2.5 32B Abliterated\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-06\",\n        \"last_updated\": \"2025-01-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 8192 }\n      },\n      \"chutesai/Mistral-Small-3.2-24B-Instruct-2506\": {\n        \"id\": \"chutesai/Mistral-Small-3.2-24B-Instruct-2506\",\n        \"name\": \"Mistral Small 3.2 24b Instruct\",\n        \"family\": \"chutesai\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.4 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 131072 }\n      },\n      \"cognitivecomputations/dolphin-2.9.2-qwen2-72b\": {\n        \"id\": \"cognitivecomputations/dolphin-2.9.2-qwen2-72b\",\n        \"name\": \"Dolphin 72b\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-27\",\n        \"last_updated\": \"2025-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.306, \"output\": 0.306 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 4096 }\n      },\n      \"microsoft/wizardlm-2-8x22b\": {\n        \"id\": \"microsoft/wizardlm-2-8x22b\",\n        \"name\": \"WizardLM-2 8x22B\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 8192 }\n      },\n      \"microsoft/MAI-DS-R1-FP8\": {\n        \"id\": \"microsoft/MAI-DS-R1-FP8\",\n        \"name\": \"Microsoft DeepSeek R1\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"aion-labs/aion-rp-llama-3.1-8b\": {\n        \"id\": \"aion-labs/aion-rp-llama-3.1-8b\",\n        \"name\": \"Llama 3.1 8b (uncensored)\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.2006 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"aion-labs/aion-1.0-mini\": {\n        \"id\": \"aion-labs/aion-1.0-mini\",\n        \"name\": \"Aion 1.0 mini (DeepSeek)\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-20\",\n        \"last_updated\": \"2025-02-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7989999999999999, \"output\": 1.394 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 8192 }\n      },\n      \"aion-labs/aion-1.0\": {\n        \"id\": \"aion-labs/aion-1.0\",\n        \"name\": \"Aion 1.0\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-01\",\n        \"last_updated\": \"2025-02-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.995, \"output\": 7.99 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 8192 }\n      },\n      \"x-ai/grok-4-07-09\": {\n        \"id\": \"x-ai/grok-4-07-09\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 131072 }\n      },\n      \"x-ai/grok-4.1-fast\": {\n        \"id\": \"x-ai/grok-4.1-fast\",\n        \"name\": \"Grok 4.1 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"input\": 2000000, \"output\": 131072 }\n      },\n      \"x-ai/grok-4.1-fast-reasoning\": {\n        \"id\": \"x-ai/grok-4.1-fast-reasoning\",\n        \"name\": \"Grok 4.1 Fast Reasoning\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"input\": 2000000, \"output\": 131072 }\n      },\n      \"x-ai/grok-code-fast-1\": {\n        \"id\": \"x-ai/grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 131072 }\n      },\n      \"x-ai/grok-4-fast:thinking\": {\n        \"id\": \"x-ai/grok-4-fast:thinking\",\n        \"name\": \"Grok 4 Fast Thinking\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"input\": 2000000, \"output\": 131072 }\n      },\n      \"x-ai/grok-4-fast\": {\n        \"id\": \"x-ai/grok-4-fast\",\n        \"name\": \"Grok 4 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-20\",\n        \"last_updated\": \"2025-09-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 2000000, \"input\": 2000000, \"output\": 131072 }\n      },\n      \"THUDM/GLM-4-9B-0414\": {\n        \"id\": \"THUDM/GLM-4-9B-0414\",\n        \"name\": \"GLM 4 9B 0414\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 8000 }\n      },\n      \"THUDM/GLM-Z1-9B-0414\": {\n        \"id\": \"THUDM/GLM-Z1-9B-0414\",\n        \"name\": \"GLM Z1 9B 0414\",\n        \"family\": \"glm-z\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 8000 }\n      },\n      \"THUDM/GLM-Z1-Rumination-32B-0414\": {\n        \"id\": \"THUDM/GLM-Z1-Rumination-32B-0414\",\n        \"name\": \"GLM Z1 Rumination 32B 0414\",\n        \"family\": \"glm-z\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 65536 }\n      },\n      \"THUDM/GLM-4-32B-0414\": {\n        \"id\": \"THUDM/GLM-4-32B-0414\",\n        \"name\": \"GLM 4 32B 0414\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"THUDM/GLM-Z1-32B-0414\": {\n        \"id\": \"THUDM/GLM-Z1-32B-0414\",\n        \"name\": \"GLM Z1 32B 0414\",\n        \"family\": \"glm-z\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"TEE/glm-5\": {\n        \"id\": \"TEE/glm-5\",\n        \"name\": \"GLM 5 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 3.5 },\n        \"limit\": { \"context\": 203000, \"input\": 203000, \"output\": 65535 }\n      },\n      \"TEE/deepseek-v3.2\": {\n        \"id\": \"TEE/deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2 TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1 },\n        \"limit\": { \"context\": 164000, \"input\": 164000, \"output\": 65536 }\n      },\n      \"TEE/glm-4.7\": {\n        \"id\": \"TEE/glm-4.7\",\n        \"name\": \"GLM 4.7 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.85, \"output\": 3.3 },\n        \"limit\": { \"context\": 131000, \"input\": 131000, \"output\": 65535 }\n      },\n      \"TEE/kimi-k2.5-thinking\": {\n        \"id\": \"TEE/kimi-k2.5-thinking\",\n        \"name\": \"Kimi K2.5 Thinking TEE\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.9 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65535 }\n      },\n      \"TEE/kimi-k2-thinking\": {\n        \"id\": \"TEE/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking TEE\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65535 }\n      },\n      \"TEE/qwen3-30b-a3b-instruct-2507\": {\n        \"id\": \"TEE/qwen3-30b-a3b-instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct 2507 TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.44999999999999996 },\n        \"limit\": { \"context\": 262000, \"input\": 262000, \"output\": 32768 }\n      },\n      \"TEE/llama3-3-70b\": {\n        \"id\": \"TEE/llama3-3-70b\",\n        \"name\": \"Llama 3.3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-03\",\n        \"last_updated\": \"2025-07-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"TEE/glm-4.6\": {\n        \"id\": \"TEE/glm-4.6\",\n        \"name\": \"GLM 4.6 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 2 },\n        \"limit\": { \"context\": 203000, \"input\": 203000, \"output\": 65535 }\n      },\n      \"TEE/qwen2.5-vl-72b-instruct\": {\n        \"id\": \"TEE/qwen2.5-vl-72b-instruct\",\n        \"name\": \"Qwen2.5 VL 72B TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-02-01\",\n        \"last_updated\": \"2025-02-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 8192 }\n      },\n      \"TEE/deepseek-r1-0528\": {\n        \"id\": \"TEE/deepseek-r1-0528\",\n        \"name\": \"DeepSeek R1 0528 TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"TEE/gpt-oss-120b\": {\n        \"id\": \"TEE/gpt-oss-120b\",\n        \"name\": \"GPT-OSS 120B TEE\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 16384 }\n      },\n      \"TEE/kimi-k2.5\": {\n        \"id\": \"TEE/kimi-k2.5\",\n        \"name\": \"Kimi K2.5 TEE\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.9 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65535 }\n      },\n      \"TEE/qwen3-coder\": {\n        \"id\": \"TEE/qwen3-coder\",\n        \"name\": \"Qwen3 Coder 480B TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"TEE/glm-4.7-flash\": {\n        \"id\": \"TEE/glm-4.7-flash\",\n        \"name\": \"GLM 4.7 Flash TEE\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.5 },\n        \"limit\": { \"context\": 203000, \"input\": 203000, \"output\": 65535 }\n      },\n      \"TEE/gemma-3-27b-it\": {\n        \"id\": \"TEE/gemma-3-27b-it\",\n        \"name\": \"Gemma 3 27B TEE\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 8192 }\n      },\n      \"TEE/gpt-oss-20b\": {\n        \"id\": \"TEE/gpt-oss-20b\",\n        \"name\": \"GPT-OSS 20B TEE\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 8192 }\n      },\n      \"TEE/qwen3.5-397b-a17b\": {\n        \"id\": \"TEE/qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B A17B TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-28\",\n        \"last_updated\": \"2026-02-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 258048, \"input\": 258048, \"output\": 65536 }\n      },\n      \"TEE/minimax-m2.1\": {\n        \"id\": \"TEE/minimax-m2.1\",\n        \"name\": \"MiniMax M2.1 TEE\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 131072 }\n      },\n      \"TEE/deepseek-v3.1\": {\n        \"id\": \"TEE/deepseek-v3.1\",\n        \"name\": \"DeepSeek V3.1 TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 2.5 },\n        \"limit\": { \"context\": 164000, \"input\": 164000, \"output\": 8192 }\n      },\n      \"baseten/Kimi-K2-Instruct-FP4\": {\n        \"id\": \"baseten/Kimi-K2-Instruct-FP4\",\n        \"name\": \"Kimi K2 0711 Instruct FP4\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2025-07-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2-her\": {\n        \"id\": \"minimax/minimax-m2-her\",\n        \"name\": \"MiniMax M2-her\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-24\",\n        \"last_updated\": \"2026-01-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.30200000000000005, \"output\": 1.2069999999999999 },\n        \"limit\": { \"context\": 65532, \"input\": 65532, \"output\": 2048 }\n      },\n      \"minimax/minimax-01\": {\n        \"id\": \"minimax/minimax-01\",\n        \"name\": \"MiniMax 01\",\n        \"family\": \"minimax\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-01-15\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1394, \"output\": 1.1219999999999999 },\n        \"limit\": { \"context\": 1000192, \"input\": 1000192, \"output\": 16384 }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"input\": 204800, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-12-19\",\n        \"last_updated\": \"2025-12-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.33, \"output\": 1.32 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2.7\": {\n        \"id\": \"minimax/minimax-m2.7\",\n        \"name\": \"MiniMax M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"input\": 204800, \"output\": 131072 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek R1 0528\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 163840 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1-Terminus:thinking\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1-Terminus:thinking\",\n        \"name\": \"DeepSeek V3.1 Terminus (Thinking)\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1-Terminus\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1-Terminus\",\n        \"name\": \"DeepSeek V3.1 Terminus\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-02\",\n        \"last_updated\": \"2025-08-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"deepseek-ai/deepseek-v3.2-exp-thinking\": {\n        \"id\": \"deepseek-ai/deepseek-v3.2-exp-thinking\",\n        \"name\": \"DeepSeek V3.2 Exp Thinking\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27999999999999997, \"output\": 0.42000000000000004 },\n        \"limit\": { \"context\": 163840, \"input\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/deepseek-v3.2-exp\": {\n        \"id\": \"deepseek-ai/deepseek-v3.2-exp\",\n        \"name\": \"DeepSeek V3.2 Exp\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27999999999999997, \"output\": 0.42000000000000004 },\n        \"limit\": { \"context\": 163840, \"input\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1:thinking\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1:thinking\",\n        \"name\": \"DeepSeek V3.1 Thinking\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.7 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"stepfun-ai/step-3.5-flash\": {\n        \"id\": \"stepfun-ai/step-3.5-flash\",\n        \"name\": \"Step 3.5 Flash\",\n        \"family\": \"step\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-02-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 256000 }\n      },\n      \"stepfun-ai/step-3.5-flash:thinking\": {\n        \"id\": \"stepfun-ai/step-3.5-flash:thinking\",\n        \"name\": \"Step 3.5 Flash Thinking\",\n        \"family\": \"step\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-02-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 256000 }\n      },\n      \"failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5\": {\n        \"id\": \"failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5\",\n        \"name\": \"Llama 3 70B abliterated\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 8192 }\n      },\n      \"baidu/ernie-4.5-vl-28b-a3b\": {\n        \"id\": \"baidu/ernie-4.5-vl-28b-a3b\",\n        \"name\": \"ERNIE 4.5 VL 28B\",\n        \"family\": \"ernie\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13999999999999999, \"output\": 0.5599999999999999 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 16384 }\n      },\n      \"baidu/ernie-4.5-300b-a47b\": {\n        \"id\": \"baidu/ernie-4.5-300b-a47b\",\n        \"name\": \"ERNIE 4.5 300B\",\n        \"family\": \"ernie\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 1.15 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 16384 }\n      },\n      \"zai-org/glm-5\": {\n        \"id\": \"zai-org/glm-5\",\n        \"name\": \"GLM 5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2.55 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 128000 }\n      },\n      \"zai-org/glm-4.7\": {\n        \"id\": \"zai-org/glm-4.7\",\n        \"name\": \"GLM 4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.8 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 128000 }\n      },\n      \"zai-org/glm-5.1\": {\n        \"id\": \"zai-org/glm-5.1\",\n        \"name\": \"GLM 5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2.55 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 131072 }\n      },\n      \"zai-org/glm-4.7-flash\": {\n        \"id\": \"zai-org/glm-4.7-flash\",\n        \"name\": \"GLM 4.7 Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.4 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 128000 }\n      },\n      \"zai-org/glm-5:thinking\": {\n        \"id\": \"zai-org/glm-5:thinking\",\n        \"name\": \"GLM 5 Thinking\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2.55 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 128000 }\n      },\n      \"zai-org/glm-5.1:thinking\": {\n        \"id\": \"zai-org/glm-5.1:thinking\",\n        \"name\": \"GLM 5.1 Thinking\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2.55 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 131072 }\n      },\n      \"NousResearch 2/DeepHermes-3-Mistral-24B-Preview\": {\n        \"id\": \"NousResearch 2/DeepHermes-3-Mistral-24B-Preview\",\n        \"name\": \"DeepHermes-3 Mistral 24B (Preview)\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-05-10\",\n        \"last_updated\": \"2025-05-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"NousResearch 2/hermes-3-llama-3.1-70b\": {\n        \"id\": \"NousResearch 2/hermes-3-llama-3.1-70b\",\n        \"name\": \"Hermes 3 70B\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-07\",\n        \"last_updated\": \"2026-01-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.408, \"output\": 0.408 },\n        \"limit\": { \"context\": 65536, \"input\": 65536, \"output\": 8192 }\n      },\n      \"NousResearch 2/hermes-4-70b\": {\n        \"id\": \"NousResearch 2/hermes-4-70b\",\n        \"name\": \"Hermes 4 Medium\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-03\",\n        \"last_updated\": \"2025-07-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.39949999999999997 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"NousResearch 2/hermes-4-405b:thinking\": {\n        \"id\": \"NousResearch 2/hermes-4-405b:thinking\",\n        \"name\": \"Hermes 4 Large (Thinking)\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"NousResearch 2/Hermes-4-70B:thinking\": {\n        \"id\": \"NousResearch 2/Hermes-4-70B:thinking\",\n        \"name\": \"Hermes 4 (Thinking)\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-17\",\n        \"last_updated\": \"2025-09-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.39949999999999997 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"NousResearch 2/hermes-4-405b\": {\n        \"id\": \"NousResearch 2/hermes-4-405b\",\n        \"name\": \"Hermes 4 Large\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"z-ai/glm-4.6:thinking\": {\n        \"id\": \"z-ai/glm-4.6:thinking\",\n        \"name\": \"GLM 4.6 Thinking\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.5 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 65535 }\n      },\n      \"z-ai/glm-4.6\": {\n        \"id\": \"z-ai/glm-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.5 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 65535 }\n      },\n      \"z-ai/glm-4.5v:thinking\": {\n        \"id\": \"z-ai/glm-4.5v:thinking\",\n        \"name\": \"GLM 4.5V Thinking\",\n        \"family\": \"glmv\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-22\",\n        \"last_updated\": \"2025-11-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 1.7999999999999998 },\n        \"limit\": { \"context\": 64000, \"input\": 64000, \"output\": 96000 }\n      },\n      \"z-ai/glm-4.5v\": {\n        \"id\": \"z-ai/glm-4.5v\",\n        \"name\": \"GLM 4.5V\",\n        \"family\": \"glmv\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-22\",\n        \"last_updated\": \"2025-11-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 1.7999999999999998 },\n        \"limit\": { \"context\": 64000, \"input\": 64000, \"output\": 96000 }\n      },\n      \"arcee-ai/trinity-mini\": {\n        \"id\": \"arcee-ai/trinity-mini\",\n        \"name\": \"Trinity Mini\",\n        \"family\": \"trinity-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.045000000000000005, \"output\": 0.15 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 8192 }\n      },\n      \"arcee-ai/trinity-large\": {\n        \"id\": \"arcee-ai/trinity-large\",\n        \"name\": \"Trinity Large\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"input\": 131072, \"output\": 8192 }\n      },\n      \"alibaba/qwen3.6-flash\": {\n        \"id\": \"alibaba/qwen3.6-flash\",\n        \"name\": \"Qwen3.6 Flash\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-04-17\",\n        \"last_updated\": \"2026-04-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.19, \"output\": 1.16 },\n        \"limit\": { \"context\": 991800, \"output\": 65536 }\n      },\n      \"shisa-ai/shisa-v2-llama3.3-70b\": {\n        \"id\": \"shisa-ai/shisa-v2-llama3.3-70b\",\n        \"name\": \"Shisa V2 Llama 3.3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-07-26\",\n        \"last_updated\": \"2025-07-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 0.5 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"shisa-ai/shisa-v2.1-llama3.3-70b\": {\n        \"id\": \"shisa-ai/shisa-v2.1-llama3.3-70b\",\n        \"name\": \"Shisa V2.1 Llama 3.3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 0.5 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 4096 }\n      },\n      \"anthracite-org/magnum-v2-72b\": {\n        \"id\": \"anthracite-org/magnum-v2-72b\",\n        \"name\": \"Magnum V2 72B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 2.992 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"anthracite-org/magnum-v4-72b\": {\n        \"id\": \"anthracite-org/magnum-v4-72b\",\n        \"name\": \"Magnum v4 72B\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 2.992 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"featherless-ai/Qwerky-72B\": {\n        \"id\": \"featherless-ai/Qwerky-72B\",\n        \"name\": \"Qwerky 72B\",\n        \"family\": \"qwerky\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 0.5 },\n        \"limit\": { \"context\": 32000, \"input\": 32000, \"output\": 8192 }\n      },\n      \"inflection/inflection-3-pi\": {\n        \"id\": \"inflection/inflection-3-pi\",\n        \"name\": \"Inflection 3 Pi\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-10-11\",\n        \"last_updated\": \"2024-10-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.499, \"output\": 9.996 },\n        \"limit\": { \"context\": 8000, \"input\": 8000, \"output\": 4096 }\n      },\n      \"inflection/inflection-3-productivity\": {\n        \"id\": \"inflection/inflection-3-productivity\",\n        \"name\": \"Inflection 3 Productivity\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-10-11\",\n        \"last_updated\": \"2024-10-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.499, \"output\": 9.996 },\n        \"limit\": { \"context\": 8000, \"input\": 8000, \"output\": 4096 }\n      },\n      \"MiniMaxAI/MiniMax-M1-80k\": {\n        \"id\": \"MiniMaxAI/MiniMax-M1-80k\",\n        \"name\": \"MiniMax M1 80K\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-06-16\",\n        \"last_updated\": \"2025-06-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6052, \"output\": 2.4225000000000003 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 131072 }\n      },\n      \"tencent/Hunyuan-MT-7B\": {\n        \"id\": \"tencent/Hunyuan-MT-7B\",\n        \"name\": \"Hunyuan MT 7B\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2025-09-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 20 },\n        \"limit\": { \"context\": 8192, \"input\": 8192, \"output\": 8192 }\n      },\n      \"openai/o1-preview\": {\n        \"id\": \"openai/o1-preview\",\n        \"name\": \"OpenAI o1-preview\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.993999999999998, \"output\": 59.993 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 32768 }\n      },\n      \"openai/o3-mini\": {\n        \"id\": \"openai/o3-mini\",\n        \"name\": \"OpenAI o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.1-2025-11-13\": {\n        \"id\": \"openai/gpt-5.1-2025-11-13\",\n        \"name\": \"GPT-5.1 (2025-11-13)\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 32768 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1496, \"output\": 0.595 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/o3\": {\n        \"id\": \"openai/o3\",\n        \"name\": \"OpenAI o3\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4-turbo-preview\": {\n        \"id\": \"openai/gpt-4-turbo-preview\",\n        \"name\": \"GPT-4 Turbo Preview\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 30.004999999999995 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"GPT 5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"GPT 5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"OpenAI o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/o1\": {\n        \"id\": \"openai/o1\",\n        \"name\": \"OpenAI o1\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-17\",\n        \"last_updated\": \"2024-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 14.993999999999998, \"output\": 59.993 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o\": {\n        \"id\": \"openai/gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.499, \"output\": 9.996 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.1-chat\": {\n        \"id\": \"openai/gpt-5.1-chat\",\n        \"name\": \"GPT 5.1 Chat\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o-mini-search-preview\": {\n        \"id\": \"openai/gpt-4o-mini-search-preview\",\n        \"name\": \"GPT-4o mini Search Preview\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.088, \"output\": 0.35 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"GPT 5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-codex-max\": {\n        \"id\": \"openai/gpt-5.1-codex-max\",\n        \"name\": \"GPT 5.1 Codex Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 20 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-pro\": {\n        \"id\": \"openai/gpt-5-pro\",\n        \"name\": \"GPT 5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o-2024-11-20\": {\n        \"id\": \"openai/gpt-4o-2024-11-20\",\n        \"name\": \"GPT-4o (2024-11-20)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-11-20\",\n        \"last_updated\": \"2024-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4o-search-preview\": {\n        \"id\": \"openai/gpt-4o-search-preview\",\n        \"name\": \"GPT-4o Search Preview\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.47, \"output\": 5.88 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-oss-safeguard-20b\": {\n        \"id\": \"openai/gpt-oss-safeguard-20b\",\n        \"name\": \"GPT OSS Safeguard 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-10-29\",\n        \"last_updated\": \"2025-10-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.2-chat\": {\n        \"id\": \"openai/gpt-5.2-chat\",\n        \"name\": \"GPT 5.2 Chat\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-01\",\n        \"last_updated\": \"2026-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 16384 }\n      },\n      \"openai/o4-mini-deep-research\": {\n        \"id\": \"openai/o4-mini-deep-research\",\n        \"name\": \"OpenAI o4-mini Deep Research\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/o3-mini-high\": {\n        \"id\": \"openai/o3-mini-high\",\n        \"name\": \"OpenAI o3-mini (High)\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.64, \"output\": 2.588 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/o3-deep-research\": {\n        \"id\": \"openai/o3-deep-research\",\n        \"name\": \"OpenAI o3 Deep Research\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/chatgpt-4o-latest\": {\n        \"id\": \"openai/chatgpt-4o-latest\",\n        \"name\": \"ChatGPT 4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4.998, \"output\": 14.993999999999998 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4.1-mini\": {\n        \"id\": \"openai/gpt-4.1-mini\",\n        \"name\": \"GPT 4.1 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6 },\n        \"limit\": { \"context\": 1047576, \"input\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-3.5-turbo\": {\n        \"id\": \"openai/gpt-3.5-turbo\",\n        \"name\": \"GPT-3.5 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2022-11-30\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 16385, \"input\": 16385, \"output\": 4096 }\n      },\n      \"openai/o4-mini-high\": {\n        \"id\": \"openai/o4-mini-high\",\n        \"name\": \"OpenAI o4-mini high\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/o3-mini-low\": {\n        \"id\": \"openai/o3-mini-low\",\n        \"name\": \"OpenAI o3-mini (Low)\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2025-01-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.25 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5-codex\": {\n        \"id\": \"openai/gpt-5-codex\",\n        \"name\": \"GPT-5 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 256000, \"input\": 256000, \"output\": 32768 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT 5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-01-01\",\n        \"last_updated\": \"2026-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4-turbo\": {\n        \"id\": \"openai/gpt-4-turbo\",\n        \"name\": \"GPT-4 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 4096 }\n      },\n      \"openai/o3-pro-2025-06-10\": {\n        \"id\": \"openai/o3-pro-2025-06-10\",\n        \"name\": \"OpenAI o3-pro (2025-06-10)\",\n        \"family\": \"o-pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-06-10\",\n        \"last_updated\": \"2025-06-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 9.996, \"output\": 19.992 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o-2024-08-06\": {\n        \"id\": \"openai/gpt-4o-2024-08-06\",\n        \"name\": \"GPT-4o (2024-08-06)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-08-06\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.499, \"output\": 9.996 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"GPT 5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-chat-latest\": {\n        \"id\": \"openai/gpt-5-chat-latest\",\n        \"name\": \"GPT 5 Chat\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.04, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4.1-nano\": {\n        \"id\": \"openai/gpt-4.1-nano\",\n        \"name\": \"GPT 4.1 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1047576, \"input\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.2-pro\": {\n        \"id\": \"openai/gpt-5.2-pro\",\n        \"name\": \"GPT 5.2 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2026-01-01\",\n        \"last_updated\": \"2026-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-nano\": {\n        \"id\": \"openai/gpt-5-nano\",\n        \"name\": \"GPT 5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"GPT 4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-09-10\",\n        \"last_updated\": \"2025-09-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 1047576, \"input\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.1-codex-mini\": {\n        \"id\": \"openai/gpt-5.1-codex-mini\",\n        \"name\": \"GPT 5.1 Codex Mini\",\n        \"family\": \"gpt-codex-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"GPT 5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-chat-latest\": {\n        \"id\": \"openai/gpt-5.1-chat-latest\",\n        \"name\": \"GPT 5.1 Chat (Latest)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 400000, \"output\": 16384 }\n      },\n      \"openai/o1-pro\": {\n        \"id\": \"openai/o1-pro\",\n        \"name\": \"OpenAI o1 Pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-25\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 150, \"output\": 600 },\n        \"limit\": { \"context\": 200000, \"input\": 200000, \"output\": 100000 }\n      },\n      \"unsloth/gemma-3-1b-it\": {\n        \"id\": \"unsloth/gemma-3-1b-it\",\n        \"name\": \"Gemma 3 1B IT\",\n        \"family\": \"unsloth\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1003, \"output\": 0.1003 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"unsloth/gemma-3-12b-it\": {\n        \"id\": \"unsloth/gemma-3-12b-it\",\n        \"name\": \"Gemma 3 12B IT\",\n        \"family\": \"unsloth\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.272, \"output\": 0.272 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 131072 }\n      },\n      \"unsloth/gemma-3-4b-it\": {\n        \"id\": \"unsloth/gemma-3-4b-it\",\n        \"name\": \"Gemma 3 4B IT\",\n        \"family\": \"unsloth\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2006, \"output\": 0.2006 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"unsloth/gemma-3-27b-it\": {\n        \"id\": \"unsloth/gemma-3-27b-it\",\n        \"name\": \"Gemma 3 27B IT\",\n        \"family\": \"unsloth\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-03-10\",\n        \"last_updated\": \"2025-03-10\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2992, \"output\": 0.2992 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 96000 }\n      },\n      \"tngtech/tng-r1t-chimera\": {\n        \"id\": \"tngtech/tng-r1t-chimera\",\n        \"name\": \"TNG R1T Chimera\",\n        \"family\": \"tngtech\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-11-26\",\n        \"last_updated\": \"2025-11-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"tngtech/DeepSeek-TNG-R1T2-Chimera\": {\n        \"id\": \"tngtech/DeepSeek-TNG-R1T2-Chimera\",\n        \"name\": \"DeepSeek TNG R1T2 Chimera\",\n        \"family\": \"tngtech\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.31, \"output\": 0.31 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 }\n      },\n      \"amazon/nova-2-lite-v1\": {\n        \"id\": \"amazon/nova-2-lite-v1\",\n        \"name\": \"Amazon Nova 2 Lite\",\n        \"family\": \"nova\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5099999999999999, \"output\": 4.25 },\n        \"limit\": { \"context\": 1000000, \"input\": 1000000, \"output\": 65535 }\n      },\n      \"amazon/nova-micro-v1\": {\n        \"id\": \"amazon/nova-micro-v1\",\n        \"name\": \"Amazon Nova Micro 1.0\",\n        \"family\": \"nova-micro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0357, \"output\": 0.1394 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 5120 }\n      },\n      \"amazon/nova-pro-v1\": {\n        \"id\": \"amazon/nova-pro-v1\",\n        \"name\": \"Amazon Nova Pro 1.0\",\n        \"family\": \"nova-pro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7989999999999999, \"output\": 3.1959999999999997 },\n        \"limit\": { \"context\": 300000, \"input\": 300000, \"output\": 32000 }\n      },\n      \"amazon/nova-lite-v1\": {\n        \"id\": \"amazon/nova-lite-v1\",\n        \"name\": \"Amazon Nova Lite 1.0\",\n        \"family\": \"nova-lite\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0595, \"output\": 0.238 },\n        \"limit\": { \"context\": 300000, \"input\": 300000, \"output\": 5120 }\n      },\n      \"google/gemini-3-flash-preview-thinking\": {\n        \"id\": \"google/gemini-3-flash-preview-thinking\",\n        \"name\": \"Gemini 3 Flash Thinking\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"google/gemini-3-flash-preview\": {\n        \"id\": \"google/gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash (Preview)\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 1048756, \"input\": 1048756, \"output\": 65536 }\n      },\n      \"google/gemini-flash-1.5\": {\n        \"id\": \"google/gemini-flash-1.5\",\n        \"name\": \"Gemini 1.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-05-14\",\n        \"last_updated\": \"2024-05-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0748, \"output\": 0.306 },\n        \"limit\": { \"context\": 2000000, \"input\": 2000000, \"output\": 8192 }\n      },\n      \"miromind-ai/mirothinker-v1.5-235b\": {\n        \"id\": \"miromind-ai/mirothinker-v1.5-235b\",\n        \"name\": \"MiroThinker v1.5 235B\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2026-01-07\",\n        \"last_updated\": \"2026-01-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 32768, \"input\": 32768, \"output\": 4000 }\n      },\n      \"nothingiisreal/L3.1-70B-Celeste-V0.1-BF16\": {\n        \"id\": \"nothingiisreal/L3.1-70B-Celeste-V0.1-BF16\",\n        \"name\": \"Llama 3.1 70B Celeste v0.1\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.49299999999999994, \"output\": 0.49299999999999994 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 16384 }\n      },\n      \"Alibaba-NLP/Tongyi-DeepResearch-30B-A3B\": {\n        \"id\": \"Alibaba-NLP/Tongyi-DeepResearch-30B-A3B\",\n        \"name\": \"Tongyi DeepResearch 30B A3B\",\n        \"family\": \"yi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.08, \"output\": 0.24000000000000002 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 65536 }\n      },\n      \"undi95/remm-slerp-l2-13b\": {\n        \"id\": \"undi95/remm-slerp-l2-13b\",\n        \"name\": \"ReMM SLERP 13B\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7989999999999999, \"output\": 1.2069999999999999 },\n        \"limit\": { \"context\": 6144, \"input\": 6144, \"output\": 4096 }\n      },\n      \"NeverSleep/Lumimaid-v0.2-70B\": {\n        \"id\": \"NeverSleep/Lumimaid-v0.2-70B\",\n        \"name\": \"Lumimaid v0.2\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1.5 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      },\n      \"NeverSleep/Llama-3-Lumimaid-70B-v0.1\": {\n        \"id\": \"NeverSleep/Llama-3-Lumimaid-70B-v0.1\",\n        \"name\": \"Lumimaid 70b\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.006, \"output\": 2.006 },\n        \"limit\": { \"context\": 16384, \"input\": 16384, \"output\": 8192 }\n      }\n    }\n  },\n  \"modelscope\": {\n    \"id\": \"modelscope\",\n    \"env\": [\"MODELSCOPE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api-inference.modelscope.cn/v1\",\n    \"name\": \"ModelScope\",\n    \"doc\": \"https://modelscope.cn/docs/model-service/API-Inference/intro\",\n    \"models\": {\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen3-235B-A22B-Thinking-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-07-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Thinking-2507\",\n        \"name\": \"Qwen3 30B A3B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"Qwen/Qwen3-Coder-30B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-30B-A3B-Instruct\",\n        \"name\": \"Qwen3 Coder 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-07-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"ZhipuAI/GLM-4.6\": {\n        \"id\": \"ZhipuAI/GLM-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 98304 }\n      },\n      \"ZhipuAI/GLM-4.5\": {\n        \"id\": \"ZhipuAI/GLM-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      }\n    }\n  },\n  \"azure\": {\n    \"id\": \"azure\",\n    \"env\": [\"AZURE_RESOURCE_NAME\", \"AZURE_API_KEY\"],\n    \"npm\": \"@ai-sdk/azure\",\n    \"name\": \"Azure\",\n    \"doc\": \"https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models\",\n    \"models\": {\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.58, \"output\": 1.68 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-3.5-turbo-0125\": {\n        \"id\": \"gpt-3.5-turbo-0125\",\n        \"name\": \"GPT-3.5 Turbo 0125\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"o1-preview\": {\n        \"id\": \"o1-preview\",\n        \"name\": \"o1-preview\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 16.5, \"output\": 66, \"cache_read\": 8.25 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"codex-mini\": {\n        \"id\": \"codex-mini\",\n        \"name\": \"Codex Mini\",\n        \"family\": \"gpt-codex-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-05-16\",\n        \"last_updated\": \"2025-05-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 6, \"cache_read\": 0.375 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"meta-llama-3-8b-instruct\": {\n        \"id\": \"meta-llama-3-8b-instruct\",\n        \"name\": \"Meta-Llama-3-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.61 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"gpt-5.4-pro\": {\n        \"id\": \"gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"phi-3-mini-4k-instruct\": {\n        \"id\": \"phi-3-mini-4k-instruct\",\n        \"name\": \"Phi-3-mini-instruct (4k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 4096, \"output\": 1024 }\n      },\n      \"deepseek-v3-0324\": {\n        \"id\": \"deepseek-v3-0324\",\n        \"name\": \"DeepSeek-V3-0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.14, \"output\": 4.56 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"phi-4-reasoning\": {\n        \"id\": \"phi-4-reasoning\",\n        \"name\": \"Phi-4-reasoning\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.125, \"output\": 0.5 },\n        \"limit\": { \"context\": 32000, \"output\": 4096 }\n      },\n      \"phi-3-small-8k-instruct\": {\n        \"id\": \"phi-3-small-8k-instruct\",\n        \"name\": \"Phi-3-small-instruct (8k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"phi-4-mini-reasoning\": {\n        \"id\": \"phi-4-mini-reasoning\",\n        \"name\": \"Phi-4-mini-reasoning\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"meta-llama-3.1-8b-instruct\": {\n        \"id\": \"meta-llama-3.1-8b-instruct\",\n        \"name\": \"Meta-Llama-3.1-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.61 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"image\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"grok-4-fast-reasoning\": {\n        \"id\": \"grok-4-fast-reasoning\",\n        \"name\": \"Grok 4 Fast (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"mistral-nemo\": {\n        \"id\": \"mistral-nemo\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"cohere-embed-v-4-0\": {\n        \"id\": \"cohere-embed-v-4-0\",\n        \"name\": \"Embed v4\",\n        \"family\": \"cohere-embed\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-15\",\n        \"last_updated\": \"2025-04-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 1536 }\n      },\n      \"claude-opus-4-5\": {\n        \"id\": \"claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"grok-4-20-reasoning\": {\n        \"id\": \"grok-4-20-reasoning\",\n        \"name\": \"Grok 4.20 (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 262000, \"output\": 8192 },\n        \"status\": \"beta\"\n      },\n      \"o1\": {\n        \"id\": \"o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"o1-mini\": {\n        \"id\": \"o1-mini\",\n        \"name\": \"o1-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"gpt-5.1-chat\": {\n        \"id\": \"gpt-5.1-chat\",\n        \"name\": \"GPT-5.1 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"image\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"mai-ds-r1\": {\n        \"id\": \"mai-ds-r1\",\n        \"name\": \"MAI-DS-R1\",\n        \"family\": \"mai\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"model-router\": {\n        \"id\": \"model-router\",\n        \"name\": \"Model Router\",\n        \"family\": \"model-router\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-05-19\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"meta-llama-3-70b-instruct\": {\n        \"id\": \"meta-llama-3-70b-instruct\",\n        \"name\": \"Meta-Llama-3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2024-04-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.68, \"output\": 3.54 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"gpt-4-32k\": {\n        \"id\": \"gpt-4-32k\",\n        \"name\": \"GPT-4 32K\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-03-14\",\n        \"last_updated\": \"2023-03-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 60, \"output\": 120 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"llama-3.2-11b-vision-instruct\": {\n        \"id\": \"llama-3.2-11b-vision-instruct\",\n        \"name\": \"Llama-3.2-11B-Vision-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.37, \"output\": 0.37 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"codestral-2501\": {\n        \"id\": \"codestral-2501\",\n        \"name\": \"Codestral 25.01\",\n        \"family\": \"codestral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"phi-4\": {\n        \"id\": \"phi-4\",\n        \"name\": \"Phi-4\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.125, \"output\": 0.5 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-5-chat\": {\n        \"id\": \"gpt-5-chat\",\n        \"name\": \"GPT-5 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-10-24\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout 17B 16E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.78 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"claude-opus-4-1\": {\n        \"id\": \"claude-opus-4-1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"cohere-command-a\": {\n        \"id\": \"cohere-command-a\",\n        \"name\": \"Command A\",\n        \"family\": \"command-a\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"output\": 8000 }\n      },\n      \"phi-3-medium-4k-instruct\": {\n        \"id\": \"phi-3-medium-4k-instruct\",\n        \"name\": \"Phi-3-medium-instruct (4k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 4096, \"output\": 1024 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-27\",\n        \"last_updated\": \"2025-06-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 },\n        \"status\": \"beta\"\n      },\n      \"grok-4-1-fast-reasoning\": {\n        \"id\": \"grok-4-1-fast-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-27\",\n        \"last_updated\": \"2025-06-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 8192 },\n        \"status\": \"beta\"\n      },\n      \"gpt-3.5-turbo-1106\": {\n        \"id\": \"gpt-3.5-turbo-1106\",\n        \"name\": \"GPT-3.5 Turbo 1106\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2023-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 2 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"gpt-5.2-chat\": {\n        \"id\": \"gpt-5.2-chat\",\n        \"name\": \"GPT-5.2 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"cohere-embed-v3-multilingual\": {\n        \"id\": \"cohere-embed-v3-multilingual\",\n        \"name\": \"Embed v3 Multilingual\",\n        \"family\": \"cohere-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-11-07\",\n        \"last_updated\": \"2023-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 512, \"output\": 1024 }\n      },\n      \"cohere-embed-v3-english\": {\n        \"id\": \"cohere-embed-v3-english\",\n        \"name\": \"Embed v3 English\",\n        \"family\": \"cohere-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-11-07\",\n        \"last_updated\": \"2023-11-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 512, \"output\": 1024 }\n      },\n      \"llama-4-maverick-17b-128e-instruct-fp8\": {\n        \"id\": \"llama-4-maverick-17b-128e-instruct-fp8\",\n        \"name\": \"Llama 4 Maverick 17B 128E Instruct FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-5.3-chat\": {\n        \"id\": \"gpt-5.3-chat\",\n        \"name\": \"GPT-5.3 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"meta-llama-3.1-70b-instruct\": {\n        \"id\": \"meta-llama-3.1-70b-instruct\",\n        \"name\": \"Meta-Llama-3.1-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.68, \"output\": 3.54 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"gpt-3.5-turbo-0613\": {\n        \"id\": \"gpt-3.5-turbo-0613\",\n        \"name\": \"GPT-3.5 Turbo 0613\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-06-13\",\n        \"last_updated\": \"2023-06-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 4 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"deepseek-r1-0528\": {\n        \"id\": \"deepseek-r1-0528\",\n        \"name\": \"DeepSeek-R1-0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"gpt-3.5-turbo-0301\": {\n        \"id\": \"gpt-3.5-turbo-0301\",\n        \"name\": \"GPT-3.5 Turbo 0301\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 2 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"phi-4-mini\": {\n        \"id\": \"phi-4-mini\",\n        \"name\": \"Phi-4-mini\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-02-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai-compatible\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models\",\n          \"shape\": \"completions\"\n        }\n      },\n      \"text-embedding-3-large\": {\n        \"id\": \"text-embedding-3-large\",\n        \"name\": \"text-embedding-3-large\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0 },\n        \"limit\": { \"context\": 8191, \"output\": 3072 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"GPT-5-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"deepseek-v3.2-speciale\": {\n        \"id\": \"deepseek-v3.2-speciale\",\n        \"name\": \"DeepSeek-V3.2-Speciale\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.58, \"output\": 1.68 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"llama-3.3-70b-instruct\": {\n        \"id\": \"llama-3.3-70b-instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.71, \"output\": 0.71 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"text-embedding-ada-002\": {\n        \"id\": \"text-embedding-ada-002\",\n        \"name\": \"text-embedding-ada-002\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2022-12-15\",\n        \"last_updated\": \"2022-12-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"phi-3.5-moe-instruct\": {\n        \"id\": \"phi-3.5-moe-instruct\",\n        \"name\": \"Phi-3.5-MoE-instruct\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.16, \"output\": 0.64 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"ministral-3b\": {\n        \"id\": \"ministral-3b\",\n        \"name\": \"Ministral 3B\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-03\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"grok-4-20-non-reasoning\": {\n        \"id\": \"grok-4-20-non-reasoning\",\n        \"name\": \"Grok 4.20 (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-09\",\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 262000, \"output\": 8192 },\n        \"status\": \"beta\"\n      },\n      \"phi-4-multimodal\": {\n        \"id\": \"phi-4-multimodal\",\n        \"name\": \"Phi-4-multimodal\",\n        \"family\": \"phi\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.32, \"input_audio\": 4 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistral-large-2411\": {\n        \"id\": \"mistral-large-2411\",\n        \"name\": \"Mistral Large 24.11\",\n        \"family\": \"mistral-large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"phi-3-mini-128k-instruct\": {\n        \"id\": \"phi-3-mini-128k-instruct\",\n        \"name\": \"Phi-3-mini-instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"mistral-small-2503\": {\n        \"id\": \"mistral-small-2503\",\n        \"name\": \"Mistral Small 3.1\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"text-embedding-3-small\": {\n        \"id\": \"text-embedding-3-small\",\n        \"name\": \"text-embedding-3-small\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 8191, \"output\": 1536 }\n      },\n      \"phi-4-reasoning-plus\": {\n        \"id\": \"phi-4-reasoning-plus\",\n        \"name\": \"Phi-4-reasoning-plus\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.125, \"output\": 0.5 },\n        \"limit\": { \"context\": 32000, \"output\": 4096 }\n      },\n      \"gpt-4-turbo-vision\": {\n        \"id\": \"gpt-4-turbo-vision\",\n        \"name\": \"GPT-4 Turbo Vision\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"mistral-medium-2505\": {\n        \"id\": \"mistral-medium-2505\",\n        \"name\": \"Mistral Medium 3\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"gpt-3.5-turbo-instruct\": {\n        \"id\": \"gpt-3.5-turbo-instruct\",\n        \"name\": \"GPT-3.5 Turbo Instruct\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-08\",\n        \"release_date\": \"2023-09-21\",\n        \"last_updated\": \"2023-09-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 2 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"phi-3.5-mini-instruct\": {\n        \"id\": \"phi-3.5-mini-instruct\",\n        \"name\": \"Phi-3.5-mini-instruct\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-08-20\",\n        \"last_updated\": \"2024-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"deepseek-v3.1\": {\n        \"id\": \"deepseek-v3.1\",\n        \"name\": \"DeepSeek-V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.56, \"output\": 1.68 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1 Codex Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"llama-3.2-90b-vision-instruct\": {\n        \"id\": \"llama-3.2-90b-vision-instruct\",\n        \"name\": \"Llama-3.2-90B-Vision-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.04, \"output\": 2.04 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"meta-llama-3.1-405b-instruct\": {\n        \"id\": \"meta-llama-3.1-405b-instruct\",\n        \"name\": \"Meta-Llama-3.1-405B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 5.33, \"output\": 16 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"phi-3-small-128k-instruct\": {\n        \"id\": \"phi-3-small-128k-instruct\",\n        \"name\": \"Phi-3-small-instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"image\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-31\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"phi-3-medium-128k-instruct\": {\n        \"id\": \"phi-3-medium-128k-instruct\",\n        \"name\": \"Phi-3-medium-instruct (128k)\",\n        \"family\": \"phi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2024-04-23\",\n        \"last_updated\": \"2024-04-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.68 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-4\": {\n        \"id\": \"gpt-4\",\n        \"name\": \"GPT-4\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-03-14\",\n        \"last_updated\": \"2023-03-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 60, \"output\": 120 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"deepseek-r1\": {\n        \"id\": \"deepseek-r1\",\n        \"name\": \"DeepSeek-R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.35, \"output\": 5.4 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.4-nano\": {\n        \"id\": \"gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1\"\n        }\n      },\n      \"o3-mini\": {\n        \"id\": \"o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o-mini\": {\n        \"id\": \"gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o3\": {\n        \"id\": \"o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"grok-4-fast-non-reasoning\": {\n        \"id\": \"grok-4-fast-non-reasoning\",\n        \"name\": \"Grok 4 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1 Codex Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"GPT-5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"output\": 272000 }\n      },\n      \"grok-3-mini\": {\n        \"id\": \"grok-3-mini\",\n        \"name\": \"Grok 3 Mini\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 0.5,\n          \"reasoning\": 0.5,\n          \"cache_read\": 0.075\n        },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"cohere-command-r-plus-08-2024\": {\n        \"id\": \"cohere-command-r-plus-08-2024\",\n        \"name\": \"Command R+\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"grok-3\": {\n        \"id\": \"grok-3\",\n        \"name\": \"Grok 3\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"grok-4\": {\n        \"id\": \"grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"reasoning\": 15,\n          \"cache_read\": 0.75\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"gpt-4-turbo\": {\n        \"id\": \"gpt-4-turbo\",\n        \"name\": \"GPT-4 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-5.5\": {\n        \"id\": \"gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 30,\n          \"cache_read\": 0.5,\n          \"context_over_200k\": { \"input\": 10, \"output\": 45, \"cache_read\": 1 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"cohere-command-r-08-2024\": {\n        \"id\": \"cohere-command-r-08-2024\",\n        \"name\": \"Command R\",\n        \"family\": \"command-r\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06-01\",\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"GPT-4.1 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      }\n    }\n  },\n  \"kimi-for-coding\": {\n    \"id\": \"kimi-for-coding\",\n    \"env\": [\"KIMI_API_KEY\"],\n    \"npm\": \"@ai-sdk/anthropic\",\n    \"api\": \"https://api.kimi.com/coding/v1\",\n    \"name\": \"Kimi For Coding\",\n    \"doc\": \"https://www.kimi.com/coding/docs/en/third-party-agents.html\",\n    \"models\": {\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-11\",\n        \"last_updated\": \"2025-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"k2p5\": {\n        \"id\": \"k2p5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"k2p6\": {\n        \"id\": \"k2p6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04\",\n        \"last_updated\": \"2026-04\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      }\n    }\n  },\n  \"nova\": {\n    \"id\": \"nova\",\n    \"env\": [\"NOVA_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.nova.amazon.com/v1\",\n    \"name\": \"Nova\",\n    \"doc\": \"https://nova.amazon.com/dev/documentation\",\n    \"models\": {\n      \"nova-2-lite-v1\": {\n        \"id\": \"nova-2-lite-v1\",\n        \"name\": \"Nova 2 Lite\",\n        \"family\": \"nova-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"reasoning\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"nova-2-pro-v1\": {\n        \"id\": \"nova-2-pro-v1\",\n        \"name\": \"Nova 2 Pro\",\n        \"family\": \"nova-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-03\",\n        \"last_updated\": \"2026-01-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"reasoning\": 0 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      }\n    }\n  },\n  \"baseten\": {\n    \"id\": \"baseten\",\n    \"env\": [\"BASETEN_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://inference.baseten.co/v1\",\n    \"name\": \"Baseten\",\n    \"doc\": \"https://docs.baseten.co/development/model-apis/overview\",\n    \"models\": {\n      \"nvidia/Nemotron-120B-A12B\": {\n        \"id\": \"nvidia/Nemotron-120B-A12B\",\n        \"name\": \"Nemotron 3 Super\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2026-02\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.75 },\n        \"limit\": { \"context\": 262144, \"output\": 32678 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-01-30\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"status\": \"deprecated\"\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Kimi K2 Instruct 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"status\": \"deprecated\"\n      },\n      \"moonshotai/Kimi-K2.6\": {\n        \"id\": \"moonshotai/Kimi-K2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2026-03-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.45 },\n        \"limit\": { \"context\": 163800, \"output\": 131100 },\n        \"status\": \"deprecated\"\n      },\n      \"deepseek-ai/DeepSeek-V3-0324\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3-0324\",\n        \"name\": \"DeepSeek V3 0324\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.77, \"output\": 0.77 },\n        \"limit\": { \"context\": 164000, \"output\": 131000 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-25\",\n        \"last_updated\": \"2025-08-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 164000, \"output\": 131000 }\n      },\n      \"zai-org/GLM-4.6\": {\n        \"id\": \"zai-org/GLM-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-09-16\",\n        \"last_updated\": \"2025-09-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 200000, \"output\": 200000 }\n      },\n      \"zai-org/GLM-4.7\": {\n        \"id\": \"zai-org/GLM-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/GLM-5\": {\n        \"id\": \"zai-org/GLM-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 3.15 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204000, \"output\": 204000 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      }\n    }\n  },\n  \"minimax\": {\n    \"id\": \"minimax\",\n    \"env\": [\"MINIMAX_API_KEY\"],\n    \"npm\": \"@ai-sdk/anthropic\",\n    \"api\": \"https://api.minimax.io/anthropic/v1\",\n    \"name\": \"MiniMax (minimax.io)\",\n    \"doc\": \"https://platform.minimax.io/docs/guides/quickstart\",\n    \"models\": {\n      \"MiniMax-M2.1\": {\n        \"id\": \"MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7\": {\n        \"id\": \"MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7-highspeed\": {\n        \"id\": \"MiniMax-M2.7-highspeed\",\n        \"name\": \"MiniMax-M2.7-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2\": {\n        \"id\": \"MiniMax-M2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 196608, \"output\": 128000 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.5-highspeed\": {\n        \"id\": \"MiniMax-M2.5-highspeed\",\n        \"name\": \"MiniMax-M2.5-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"chutes\": {\n    \"id\": \"chutes\",\n    \"env\": [\"CHUTES_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://llm.chutes.ai/v1\",\n    \"name\": \"Chutes\",\n    \"doc\": \"https://llm.chutes.ai/v1/models\",\n    \"models\": {\n      \"NousResearch/DeepHermes-3-Mistral-24B-Preview\": {\n        \"id\": \"NousResearch/DeepHermes-3-Mistral-24B-Preview\",\n        \"name\": \"DeepHermes 3 Mistral 24B Preview\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.1 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"NousResearch/Hermes-4-70B\": {\n        \"id\": \"NousResearch/Hermes-4-70B\",\n        \"name\": \"Hermes 4 70B\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11, \"output\": 0.38 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"NousResearch/Hermes-4-405B-FP8-TEE\": {\n        \"id\": \"NousResearch/Hermes-4-405B-FP8-TEE\",\n        \"name\": \"Hermes 4 405B FP8 TEE\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"NousResearch/Hermes-4.3-36B\": {\n        \"id\": \"NousResearch/Hermes-4.3-36B\",\n        \"name\": \"Hermes 4.3 36B\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.39 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"NousResearch/Hermes-4-14B\": {\n        \"id\": \"NousResearch/Hermes-4-14B\",\n        \"name\": \"Hermes 4 14B\",\n        \"family\": \"nousresearch\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0.05 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16\": {\n        \"id\": \"nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16\",\n        \"name\": \"NVIDIA Nemotron 3 Nano 30B A3B BF16\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2.5-TEE\": {\n        \"id\": \"moonshotai/Kimi-K2.5-TEE\",\n        \"name\": \"Kimi K2.5 TEE\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 65535 }\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Kimi K2 Instruct 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.39, \"output\": 1.9, \"cache_read\": 0.195 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2-Thinking-TEE\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking-TEE\",\n        \"name\": \"Kimi K2 Thinking TEE\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.75 },\n        \"limit\": { \"context\": 262144, \"output\": 65535 }\n      },\n      \"moonshotai/Kimi-K2.6-TEE\": {\n        \"id\": \"moonshotai/Kimi-K2.6-TEE\",\n        \"name\": \"Kimi K2.6 TEE\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-23\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.44, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/Devstral-2-123B-Instruct-2512-TEE\": {\n        \"id\": \"mistralai/Devstral-2-123B-Instruct-2512-TEE\",\n        \"name\": \"Devstral 2 123B Instruct 2512 TEE\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-10\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.22 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3Guard-Gen-0.6B\": {\n        \"id\": \"Qwen/Qwen3Guard-Gen-0.6B\",\n        \"name\": \"Qwen3Guard Gen 0.6B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"Qwen/Qwen3-30B-A3B\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B\",\n        \"name\": \"Qwen3 30B A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.22 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct FP8 TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.95, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen2.5-72B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-72B-Instruct\",\n        \"name\": \"Qwen2.5 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"Qwen/Qwen3-Coder-Next\": {\n        \"id\": \"Qwen/Qwen3-Coder-Next\",\n        \"name\": \"Qwen3 Coder Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3.5-397B-A17B-TEE\": {\n        \"id\": \"Qwen/Qwen3.5-397B-A17B-TEE\",\n        \"name\": \"Qwen3.5 397B A17B TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-18\",\n        \"last_updated\": \"2026-02-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.39, \"output\": 2.34, \"cache_read\": 0.195 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen3 235B A22B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-30B-A3B-Instruct-2507\": {\n        \"id\": \"Qwen/Qwen3-30B-A3B-Instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.33 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-235B-A22B\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B\",\n        \"name\": \"Qwen3 235B A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"Qwen/Qwen2.5-VL-72B-Instruct-TEE\": {\n        \"id\": \"Qwen/Qwen2.5-VL-72B-Instruct-TEE\",\n        \"name\": \"Qwen2.5 VL 72B Instruct TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"Qwen/Qwen3-VL-235B-A22B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-VL-235B-A22B-Instruct\",\n        \"name\": \"Qwen3 VL 235B A22B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507-TEE\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507-TEE\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507 TEE\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.55, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen2.5-VL-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-VL-32B-Instruct\",\n        \"name\": \"Qwen2.5 VL 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.22 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"Qwen/Qwen3-32B\": {\n        \"id\": \"Qwen/Qwen3-32B\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.24, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"name\": \"Qwen3 Next 80B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-14B\": {\n        \"id\": \"Qwen/Qwen3-14B\",\n        \"name\": \"Qwen3 14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.22 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"Qwen/Qwen2.5-Coder-32B-Instruct\": {\n        \"id\": \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"name\": \"Qwen2.5 Coder 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.11 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"chutesai/Mistral-Small-3.2-24B-Instruct-2506\": {\n        \"id\": \"chutesai/Mistral-Small-3.2-24B-Instruct-2506\",\n        \"name\": \"Mistral Small 3.2 24B Instruct 2506\",\n        \"family\": \"chutesai\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.18 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"chutesai/Mistral-Small-3.1-24B-Instruct-2503\": {\n        \"id\": \"chutesai/Mistral-Small-3.1-24B-Instruct-2503\",\n        \"name\": \"Mistral Small 3.1 24B Instruct 2503\",\n        \"family\": \"chutesai\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.11, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"rednote-hilab/dots.ocr\": {\n        \"id\": \"rednote-hilab/dots.ocr\",\n        \"name\": \"dots.ocr\",\n        \"family\": \"rednote\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"OpenGVLab/InternVL3-78B-TEE\": {\n        \"id\": \"OpenGVLab/InternVL3-78B-TEE\",\n        \"name\": \"InternVL3 78B TEE\",\n        \"family\": \"opengvlab\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-06\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.39 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"deepseek-ai/DeepSeek-R1-Distill-Llama-70B\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-Distill-Llama-70B\",\n        \"name\": \"DeepSeek R1 Distill Llama 70B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.11 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"deepseek-ai/DeepSeek-V3-0324-TEE\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3-0324-TEE\",\n        \"name\": \"DeepSeek V3 0324 TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.19, \"output\": 0.87, \"cache_read\": 0.095 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1-TEE\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1-TEE\",\n        \"name\": \"DeepSeek V3.1 TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3\",\n        \"name\": \"DeepSeek V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2-Speciale-TEE\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2-Speciale-TEE\",\n        \"name\": \"DeepSeek V3.2 Speciale TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.41 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.1-Terminus-TEE\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.1-Terminus-TEE\",\n        \"name\": \"DeepSeek V3.1 Terminus TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.23, \"output\": 0.9 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-R1-TEE\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-TEE\",\n        \"name\": \"DeepSeek R1 TEE\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2-TEE\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2-TEE\",\n        \"name\": \"DeepSeek V3.2 TEE\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 0.42, \"cache_read\": 0.14 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528-TEE\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528-TEE\",\n        \"name\": \"DeepSeek R1 0528 TEE\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.75 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"XiaomiMiMo/MiMo-V2-Flash\": {\n        \"id\": \"XiaomiMiMo/MiMo-V2-Flash\",\n        \"name\": \"MiMo V2 Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.29 },\n        \"limit\": { \"context\": 262144, \"output\": 32000 }\n      },\n      \"zai-org/GLM-4.6-TEE\": {\n        \"id\": \"zai-org/GLM-4.6-TEE\",\n        \"name\": \"GLM 4.6 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.7, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 65536 }\n      },\n      \"zai-org/GLM-4.5-FP8\": {\n        \"id\": \"zai-org/GLM-4.5-FP8\",\n        \"name\": \"GLM 4.5 FP8\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"zai-org/GLM-4.6-FP8\": {\n        \"id\": \"zai-org/GLM-4.6-FP8\",\n        \"name\": \"GLM 4.6 FP8\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"zai-org/GLM-4.7-Flash\": {\n        \"id\": \"zai-org/GLM-4.7-Flash\",\n        \"name\": \"GLM 4.7 Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.35 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"zai-org/GLM-4.7-FP8\": {\n        \"id\": \"zai-org/GLM-4.7-FP8\",\n        \"name\": \"GLM 4.7 FP8\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"zai-org/GLM-4.5-TEE\": {\n        \"id\": \"zai-org/GLM-4.5-TEE\",\n        \"name\": \"GLM 4.5 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.55 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"zai-org/GLM-5-TEE\": {\n        \"id\": \"zai-org/GLM-5-TEE\",\n        \"name\": \"GLM 5 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 3.15, \"cache_read\": 0.475 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"zai-org/GLM-5.1-TEE\": {\n        \"id\": \"zai-org/GLM-5.1-TEE\",\n        \"name\": \"GLM 5.1 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-08\",\n        \"last_updated\": \"2026-04-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 3.15, \"cache_read\": 0.475 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"zai-org/GLM-5-Turbo\": {\n        \"id\": \"zai-org/GLM-5-Turbo\",\n        \"name\": \"GLM 5 Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.49, \"output\": 1.96, \"cache_read\": 0.245 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"zai-org/GLM-4.5-Air\": {\n        \"id\": \"zai-org/GLM-4.5-Air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.22 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"zai-org/GLM-4.7-TEE\": {\n        \"id\": \"zai-org/GLM-4.7-TEE\",\n        \"name\": \"GLM 4.7 TEE\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.5 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"zai-org/GLM-4.6V\": {\n        \"id\": \"zai-org/GLM-4.6V\",\n        \"name\": \"GLM 4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5-TEE\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5-TEE\",\n        \"name\": \"MiniMax M2.5 TEE\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-02-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.1, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 196608, \"output\": 65536 }\n      },\n      \"MiniMaxAI/MiniMax-M2.1-TEE\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.1-TEE\",\n        \"name\": \"MiniMax M2.1 TEE\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 1.12 },\n        \"limit\": { \"context\": 196608, \"output\": 65536 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"gpt oss 20b\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai/gpt-oss-120b-TEE\": {\n        \"id\": \"openai/gpt-oss-120b-TEE\",\n        \"name\": \"gpt oss 120b TEE\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.18 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"unsloth/Mistral-Small-24B-Instruct-2501\": {\n        \"id\": \"unsloth/Mistral-Small-24B-Instruct-2501\",\n        \"name\": \"Mistral Small 24B Instruct 2501\",\n        \"family\": \"unsloth\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.11 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"unsloth/Llama-3.2-1B-Instruct\": {\n        \"id\": \"unsloth/Llama-3.2-1B-Instruct\",\n        \"name\": \"Llama 3.2 1B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"unsloth/gemma-3-12b-it\": {\n        \"id\": \"unsloth/gemma-3-12b-it\",\n        \"name\": \"gemma 3 12b it\",\n        \"family\": \"unsloth\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"unsloth/gemma-3-4b-it\": {\n        \"id\": \"unsloth/gemma-3-4b-it\",\n        \"name\": \"gemma 3 4b it\",\n        \"family\": \"unsloth\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0.03 },\n        \"limit\": { \"context\": 96000, \"output\": 96000 }\n      },\n      \"unsloth/gemma-3-27b-it\": {\n        \"id\": \"unsloth/gemma-3-27b-it\",\n        \"name\": \"gemma 3 27b it\",\n        \"family\": \"unsloth\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.15, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"unsloth/Mistral-Nemo-Instruct-2407\": {\n        \"id\": \"unsloth/Mistral-Nemo-Instruct-2407\",\n        \"name\": \"Mistral Nemo Instruct 2407\",\n        \"family\": \"unsloth\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.04, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"unsloth/Llama-3.2-3B-Instruct\": {\n        \"id\": \"unsloth/Llama-3.2-3B-Instruct\",\n        \"name\": \"Llama 3.2 3B Instruct\",\n        \"family\": \"unsloth\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-12\",\n        \"last_updated\": \"2025-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"tngtech/TNG-R1T-Chimera-TEE\": {\n        \"id\": \"tngtech/TNG-R1T-Chimera-TEE\",\n        \"name\": \"TNG R1T Chimera TEE\",\n        \"family\": \"tngtech\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.85 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"tngtech/TNG-R1T-Chimera-Turbo\": {\n        \"id\": \"tngtech/TNG-R1T-Chimera-Turbo\",\n        \"name\": \"TNG R1T Chimera Turbo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.6 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"tngtech/DeepSeek-TNG-R1T2-Chimera\": {\n        \"id\": \"tngtech/DeepSeek-TNG-R1T2-Chimera\",\n        \"name\": \"DeepSeek TNG R1T2 Chimera\",\n        \"family\": \"tngtech\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.85 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"tngtech/DeepSeek-R1T-Chimera\": {\n        \"id\": \"tngtech/DeepSeek-R1T-Chimera\",\n        \"name\": \"DeepSeek R1T Chimera\",\n        \"family\": \"tngtech\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"miromind-ai/MiroThinker-v1.5-235B\": {\n        \"id\": \"miromind-ai/MiroThinker-v1.5-235B\",\n        \"name\": \"MiroThinker V1.5 235B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-10\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 8192 }\n      }\n    }\n  },\n  \"abliteration-ai\": {\n    \"id\": \"abliteration-ai\",\n    \"env\": [\"ABLIT_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.abliteration.ai/v1\",\n    \"name\": \"abliteration.ai\",\n    \"doc\": \"https://docs.abliteration.ai/models\",\n    \"models\": {\n      \"abliterated-model\": {\n        \"id\": \"abliterated-model\",\n        \"name\": \"Abliterated Model\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-06\",\n        \"last_updated\": \"2026-01-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3, \"output\": 3 },\n        \"limit\": { \"context\": 150000, \"input\": 150000, \"output\": 8192 }\n      }\n    }\n  },\n  \"bailing\": {\n    \"id\": \"bailing\",\n    \"env\": [\"BAILING_API_TOKEN\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.tbox.cn/api/llm/v1/chat/completions\",\n    \"name\": \"Bailing\",\n    \"doc\": \"https://alipaytbox.yuque.com/sxs0ba/ling/intro\",\n    \"models\": {\n      \"Ling-1T\": {\n        \"id\": \"Ling-1T\",\n        \"name\": \"Ling-1T\",\n        \"family\": \"ling\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-10\",\n        \"last_updated\": \"2025-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.57, \"output\": 2.29 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"Ring-1T\": {\n        \"id\": \"Ring-1T\",\n        \"name\": \"Ring-1T\",\n        \"family\": \"ring\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-10\",\n        \"last_updated\": \"2025-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.57, \"output\": 2.29 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      }\n    }\n  },\n  \"kilo\": {\n    \"id\": \"kilo\",\n    \"env\": [\"KILO_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.kilo.ai/api/gateway\",\n    \"name\": \"Kilo Gateway\",\n    \"doc\": \"https://kilo.ai\",\n    \"models\": {\n      \"qwen/qwen-turbo\": {\n        \"id\": \"qwen/qwen-turbo\",\n        \"name\": \"Qwen: Qwen-Turbo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0325, \"output\": 0.13, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen/qwen3.5-9b\": {\n        \"id\": \"qwen/qwen3.5-9b\",\n        \"name\": \"Qwen: Qwen3.5-9B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-10\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.15 },\n        \"limit\": { \"context\": 256000, \"output\": 32768 }\n      },\n      \"qwen/qwen3-235b-a22b-2507\": {\n        \"id\": \"qwen/qwen3-235b-a22b-2507\",\n        \"name\": \"Qwen: Qwen3 235B A22B Instruct 2507\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.071, \"output\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 52429 }\n      },\n      \"qwen/qwen3.6-plus\": {\n        \"id\": \"qwen/qwen3.6-plus\",\n        \"name\": \"Qwen: Qwen3.6 Plus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.325,\n          \"output\": 1.95,\n          \"cache_read\": 0.0325,\n          \"cache_write\": 0.40625\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen-max\": {\n        \"id\": \"qwen/qwen-max\",\n        \"name\": \"Qwen: Qwen-Max \",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-03\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.04, \"output\": 4.16, \"cache_read\": 0.32 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"qwen/qwen-2.5-coder-32b-instruct\": {\n        \"id\": \"qwen/qwen-2.5-coder-32b-instruct\",\n        \"name\": \"Qwen2.5 Coder 32B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"qwen/qwq-32b\": {\n        \"id\": \"qwen/qwq-32b\",\n        \"name\": \"Qwen: QwQ 32B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-28\",\n        \"last_updated\": \"2025-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.4 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"qwen/qwen3.5-27b\": {\n        \"id\": \"qwen/qwen3.5-27b\",\n        \"name\": \"Qwen: Qwen3.5-27B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.195, \"output\": 1.56 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-coder-plus\": {\n        \"id\": \"qwen/qwen3-coder-plus\",\n        \"name\": \"Qwen: Qwen3 Coder Plus\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.65, \"output\": 3.25, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen3-235b-a22b-thinking-2507\": {\n        \"id\": \"qwen/qwen3-235b-a22b-thinking-2507\",\n        \"name\": \"Qwen: Qwen3 235B A22B Thinking 2507\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen3-vl-235b-a22b-instruct\": {\n        \"id\": \"qwen/qwen3-vl-235b-a22b-instruct\",\n        \"name\": \"Qwen: Qwen3 VL 235B A22B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.88, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 262144, \"output\": 52429 }\n      },\n      \"qwen/qwen-plus\": {\n        \"id\": \"qwen/qwen-plus\",\n        \"name\": \"Qwen: Qwen-Plus\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.2, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"qwen/qwen3.5-plus-02-15\": {\n        \"id\": \"qwen/qwen3.5-plus-02-15\",\n        \"name\": \"Qwen: Qwen3.5 Plus 2026-02-15\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.26, \"output\": 1.56 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen: Qwen3 Next 80B A3B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 1.1 },\n        \"limit\": { \"context\": 131072, \"output\": 52429 }\n      },\n      \"qwen/qwen3-30b-a3b-instruct-2507\": {\n        \"id\": \"qwen/qwen3-30b-a3b-instruct-2507\",\n        \"name\": \"Qwen: Qwen3 30B A3B Instruct 2507\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.3, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwen2.5-vl-32b-instruct\": {\n        \"id\": \"qwen/qwen2.5-vl-32b-instruct\",\n        \"name\": \"Qwen: Qwen2.5 VL 32B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"qwen/qwen3-vl-8b-thinking\": {\n        \"id\": \"qwen/qwen3-vl-8b-thinking\",\n        \"name\": \"Qwen: Qwen3 VL 8B Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.117, \"output\": 1.365 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-vl-8b-instruct\": {\n        \"id\": \"qwen/qwen3-vl-8b-instruct\",\n        \"name\": \"Qwen: Qwen3 VL 8B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-vl-235b-a22b-thinking\": {\n        \"id\": \"qwen/qwen3-vl-235b-a22b-thinking\",\n        \"name\": \"Qwen: Qwen3 VL 235B A22B Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-24\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.26, \"output\": 2.6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen-plus-2025-07-28:thinking\": {\n        \"id\": \"qwen/qwen-plus-2025-07-28:thinking\",\n        \"name\": \"Qwen: Qwen Plus 0728 (thinking)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-09\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.26, \"output\": 0.78 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"qwen/qwen3-vl-30b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-vl-30b-a3b-instruct\",\n        \"name\": \"Qwen: Qwen3 VL 30B A3B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-05\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.52 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-14b\": {\n        \"id\": \"qwen/qwen3-14b\",\n        \"name\": \"Qwen: Qwen3 14B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"qwen/qwen-vl-plus\": {\n        \"id\": \"qwen/qwen-vl-plus\",\n        \"name\": \"Qwen: Qwen VL Plus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1365, \"output\": 0.4095, \"cache_read\": 0.042 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen/qwen3-max\": {\n        \"id\": \"qwen/qwen3-max\",\n        \"name\": \"Qwen: Qwen3 Max\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen/qwen3.5-35b-a3b\": {\n        \"id\": \"qwen/qwen3.5-35b-a3b\",\n        \"name\": \"Qwen: Qwen3.5-35B-A3B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1625, \"output\": 1.3 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3.5-flash-02-23\": {\n        \"id\": \"qwen/qwen3.5-flash-02-23\",\n        \"name\": \"Qwen: Qwen3.5-Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen2.5-vl-72b-instruct\": {\n        \"id\": \"qwen/qwen2.5-vl-72b-instruct\",\n        \"name\": \"Qwen: Qwen2.5 VL 72B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 0.8, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"qwen/qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen/qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen: Qwen3 Coder 30B A3B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-07-31\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.27 },\n        \"limit\": { \"context\": 160000, \"output\": 32768 }\n      },\n      \"qwen/qwen3.5-122b-a10b\": {\n        \"id\": \"qwen/qwen3.5-122b-a10b\",\n        \"name\": \"Qwen: Qwen3.5-122B-A10B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.26, \"output\": 2.08 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-vl-30b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-vl-30b-a3b-thinking\",\n        \"name\": \"Qwen: Qwen3 VL 30B A3B Thinking\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 1.56 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen-2.5-7b-instruct\": {\n        \"id\": \"qwen/qwen-2.5-7b-instruct\",\n        \"name\": \"Qwen: Qwen2.5 7B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.1 },\n        \"limit\": { \"context\": 32768, \"output\": 6554 }\n      },\n      \"qwen/qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen/qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen: Qwen3 Next 80B A3B Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.0975, \"output\": 0.78 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-coder-flash\": {\n        \"id\": \"qwen/qwen3-coder-flash\",\n        \"name\": \"Qwen: Qwen3 Coder Flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.195, \"output\": 0.975, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen/qwen3-coder\": {\n        \"id\": \"qwen/qwen3-coder\",\n        \"name\": \"Qwen: Qwen3 Coder 480B A35B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 1, \"cache_read\": 0.022 },\n        \"limit\": { \"context\": 262144, \"output\": 52429 }\n      },\n      \"qwen/qwen3-max-thinking\": {\n        \"id\": \"qwen/qwen3-max-thinking\",\n        \"name\": \"Qwen: Qwen3 Max Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-23\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.78, \"output\": 3.9 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen/qwen-vl-max\": {\n        \"id\": \"qwen/qwen-vl-max\",\n        \"name\": \"Qwen: Qwen VL Max\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-08\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 3.2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-vl-32b-instruct\": {\n        \"id\": \"qwen/qwen3-vl-32b-instruct\",\n        \"name\": \"Qwen: Qwen3 VL 32B Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-21\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.104, \"output\": 0.416 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen/qwen3-235b-a22b\": {\n        \"id\": \"qwen/qwen3-235b-a22b\",\n        \"name\": \"Qwen: Qwen3 235B A22B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.455, \"output\": 1.82, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen/qwen-2.5-72b-instruct\": {\n        \"id\": \"qwen/qwen-2.5-72b-instruct\",\n        \"name\": \"Qwen2.5 72B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.39 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"qwen/qwen3-8b\": {\n        \"id\": \"qwen/qwen3-8b\",\n        \"name\": \"Qwen: Qwen3 8B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 40960, \"output\": 8192 }\n      },\n      \"qwen/qwen3-30b-a3b\": {\n        \"id\": \"qwen/qwen3-30b-a3b\",\n        \"name\": \"Qwen: Qwen3 30B A3B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.28, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"qwen/qwen-plus-2025-07-28\": {\n        \"id\": \"qwen/qwen-plus-2025-07-28\",\n        \"name\": \"Qwen: Qwen Plus 0728\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-09\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.26, \"output\": 0.78 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"qwen/qwen3.5-397b-a17b\": {\n        \"id\": \"qwen/qwen3.5-397b-a17b\",\n        \"name\": \"Qwen: Qwen3.5 397B A17B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.39, \"output\": 2.34 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-coder-next\": {\n        \"id\": \"qwen/qwen3-coder-next\",\n        \"name\": \"Qwen: Qwen3 Coder Next\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.75, \"cache_read\": 0.035 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-30b-a3b-thinking-2507\": {\n        \"id\": \"qwen/qwen3-30b-a3b-thinking-2507\",\n        \"name\": \"Qwen: Qwen3 30B A3B Thinking 2507\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-29\",\n        \"last_updated\": \"2025-07-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.051, \"output\": 0.34 },\n        \"limit\": { \"context\": 32768, \"output\": 6554 }\n      },\n      \"qwen/qwen3-32b\": {\n        \"id\": \"qwen/qwen3-32b\",\n        \"name\": \"Qwen: Qwen3 32B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.24, \"cache_read\": 0.04 },\n        \"limit\": { \"context\": 40960, \"output\": 40960 }\n      },\n      \"qwen/qwen2.5-coder-7b-instruct\": {\n        \"id\": \"qwen/qwen2.5-coder-7b-instruct\",\n        \"name\": \"Qwen: Qwen2.5 Coder 7B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-17\",\n        \"last_updated\": \"2024-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.09 },\n        \"limit\": { \"context\": 32768, \"output\": 6554 }\n      },\n      \"cohere/command-a\": {\n        \"id\": \"cohere/command-a\",\n        \"name\": \"Cohere: Command A\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"cohere/command-r7b-12-2024\": {\n        \"id\": \"cohere/command-r7b-12-2024\",\n        \"name\": \"Cohere: Command R7B (12-2024)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-02-27\",\n        \"last_updated\": \"2024-02-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.0375, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"cohere/command-r-08-2024\": {\n        \"id\": \"cohere/command-r-08-2024\",\n        \"name\": \"Cohere: Command R (08-2024)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"cohere/command-r-plus-08-2024\": {\n        \"id\": \"cohere/command-r-plus-08-2024\",\n        \"name\": \"Cohere: Command R+ (08-2024)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-30\",\n        \"last_updated\": \"2024-08-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 4000 }\n      },\n      \"meta-llama/llama-3-70b-instruct\": {\n        \"id\": \"meta-llama/llama-3-70b-instruct\",\n        \"name\": \"Meta: Llama 3 70B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.51, \"output\": 0.74 },\n        \"limit\": { \"context\": 8192, \"output\": 8000 }\n      },\n      \"meta-llama/llama-3.1-8b-instruct\": {\n        \"id\": \"meta-llama/llama-3.1-8b-instruct\",\n        \"name\": \"Meta: Llama 3.1 8B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.05 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"meta-llama/llama-3.2-3b-instruct\": {\n        \"id\": \"meta-llama/llama-3.2-3b-instruct\",\n        \"name\": \"Meta: Llama 3.2 3B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.051, \"output\": 0.34 },\n        \"limit\": { \"context\": 80000, \"output\": 16384 }\n      },\n      \"meta-llama/llama-guard-3-8b\": {\n        \"id\": \"meta-llama/llama-guard-3-8b\",\n        \"name\": \"Llama Guard 3 8B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-18\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.06 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"meta-llama/llama-3-8b-instruct\": {\n        \"id\": \"meta-llama/llama-3-8b-instruct\",\n        \"name\": \"Meta: Llama 3 8B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-25\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.04 },\n        \"limit\": { \"context\": 8192, \"output\": 16384 }\n      },\n      \"meta-llama/llama-3.2-11b-vision-instruct\": {\n        \"id\": \"meta-llama/llama-3.2-11b-vision-instruct\",\n        \"name\": \"Meta: Llama 3.2 11B Vision Instruct\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-25\",\n        \"last_updated\": \"2024-09-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.049, \"output\": 0.049 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/llama-4-scout\": {\n        \"id\": \"meta-llama/llama-4-scout\",\n        \"name\": \"Meta: Llama 4 Scout\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.08, \"output\": 0.3 },\n        \"limit\": { \"context\": 327680, \"output\": 16384 }\n      },\n      \"meta-llama/llama-3.3-70b-instruct\": {\n        \"id\": \"meta-llama/llama-3.3-70b-instruct\",\n        \"name\": \"Meta: Llama 3.3 70B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-01\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.32 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"meta-llama/llama-4-maverick\": {\n        \"id\": \"meta-llama/llama-4-maverick\",\n        \"name\": \"Meta: Llama 4 Maverick\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-12-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 1048576, \"output\": 16384 }\n      },\n      \"meta-llama/llama-3.2-1b-instruct\": {\n        \"id\": \"meta-llama/llama-3.2-1b-instruct\",\n        \"name\": \"Meta: Llama 3.2 1B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-18\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.027, \"output\": 0.2 },\n        \"limit\": { \"context\": 60000, \"output\": 12000 }\n      },\n      \"meta-llama/llama-guard-4-12b\": {\n        \"id\": \"meta-llama/llama-guard-4-12b\",\n        \"name\": \"Meta: Llama Guard 4 12B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 163840, \"output\": 32768 }\n      },\n      \"meta-llama/llama-3.1-70b-instruct\": {\n        \"id\": \"meta-llama/llama-3.1-70b-instruct\",\n        \"name\": \"Meta: Llama 3.1 70B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-16\",\n        \"last_updated\": \"2024-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"bytedance/ui-tars-1.5-7b\": {\n        \"id\": \"bytedance/ui-tars-1.5-7b\",\n        \"name\": \"ByteDance: UI-TARS 7B \",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 2048 }\n      },\n      \"writer/palmyra-x5\": {\n        \"id\": \"writer/palmyra-x5\",\n        \"name\": \"Writer: Palmyra X5\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-28\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 6 },\n        \"limit\": { \"context\": 1040000, \"output\": 8192 }\n      },\n      \"eleutherai/llemma_7b\": {\n        \"id\": \"eleutherai/llemma_7b\",\n        \"name\": \"EleutherAI: Llemma 7b\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 1.2 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"gryphe/mythomax-l2-13b\": {\n        \"id\": \"gryphe/mythomax-l2-13b\",\n        \"name\": \"MythoMax 13B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-25\",\n        \"last_updated\": \"2024-04-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.06 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"sao10k/l3.1-euryale-70b\": {\n        \"id\": \"sao10k/l3.1-euryale-70b\",\n        \"name\": \"Sao10K: Llama 3.1 Euryale 70B v2.2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-28\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.85, \"output\": 0.85 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"sao10k/l3.3-euryale-70b\": {\n        \"id\": \"sao10k/l3.3-euryale-70b\",\n        \"name\": \"Sao10K: Llama 3.3 Euryale 70B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-18\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.65, \"output\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"sao10k/l3-lunaris-8b\": {\n        \"id\": \"sao10k/l3-lunaris-8b\",\n        \"name\": \"Sao10K: Llama 3 8B Lunaris\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.05 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"sao10k/l3.1-70b-hanami-x1\": {\n        \"id\": \"sao10k/l3.1-70b-hanami-x1\",\n        \"name\": \"Sao10K: Llama 3.1 70B Hanami x1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-08\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3, \"output\": 3 },\n        \"limit\": { \"context\": 16000, \"output\": 16000 }\n      },\n      \"sao10k/l3-euryale-70b\": {\n        \"id\": \"sao10k/l3-euryale-70b\",\n        \"name\": \"Sao10k: Llama 3 Euryale 70B v2.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-18\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.48, \"output\": 1.48 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"morph/morph-v3-fast\": {\n        \"id\": \"morph/morph-v3-fast\",\n        \"name\": \"Morph: Morph V3 Fast\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-15\",\n        \"last_updated\": \"2024-08-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 1.2 },\n        \"limit\": { \"context\": 81920, \"output\": 38000 }\n      },\n      \"morph/morph-v3-large\": {\n        \"id\": \"morph/morph-v3-large\",\n        \"name\": \"Morph: Morph V3 Large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-15\",\n        \"last_updated\": \"2024-08-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.9, \"output\": 1.9 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"mancer/weaver\": {\n        \"id\": \"mancer/weaver\",\n        \"name\": \"Mancer: Weaver (alpha)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2023-08-02\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 1 },\n        \"limit\": { \"context\": 8000, \"output\": 2000 }\n      },\n      \"rekaai/reka-flash-3\": {\n        \"id\": \"rekaai/reka-flash-3\",\n        \"name\": \"Reka Flash 3\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.2 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"rekaai/reka-edge\": {\n        \"id\": \"rekaai/reka-edge\",\n        \"name\": \"Reka Edge\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"nvidia/llama-3.3-nemotron-super-49b-v1.5\": {\n        \"id\": \"nvidia/llama-3.3-nemotron-super-49b-v1.5\",\n        \"name\": \"NVIDIA: Llama 3.3 Nemotron Super 49B V1.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-16\",\n        \"last_updated\": \"2025-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"nvidia/nemotron-3-super-120b-a12b:free\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b:free\",\n        \"name\": \"NVIDIA: Nemotron 3 Super (free)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-12\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"nvidia/nemotron-nano-12b-v2-vl\": {\n        \"id\": \"nvidia/nemotron-nano-12b-v2-vl\",\n        \"name\": \"NVIDIA: Nemotron Nano 12B 2 VL\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-28\",\n        \"last_updated\": \"2026-01-31\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"nvidia/nemotron-3-super-120b-a12b\": {\n        \"id\": \"nvidia/nemotron-3-super-120b-a12b\",\n        \"name\": \"NVIDIA: Nemotron 3 Super\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"nvidia/nemotron-nano-9b-v2\": {\n        \"id\": \"nvidia/nemotron-nano-9b-v2\",\n        \"name\": \"NVIDIA: Nemotron Nano 9B V2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-18\",\n        \"last_updated\": \"2025-08-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.16 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"nvidia/llama-3.1-nemotron-70b-instruct\": {\n        \"id\": \"nvidia/llama-3.1-nemotron-70b-instruct\",\n        \"name\": \"NVIDIA: Llama 3.1 Nemotron 70B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-12\",\n        \"last_updated\": \"2024-10-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 1.2 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"nvidia/llama-3.1-nemotron-ultra-253b-v1\": {\n        \"id\": \"nvidia/llama-3.1-nemotron-ultra-253b-v1\",\n        \"name\": \"NVIDIA: Llama 3.1 Nemotron Ultra 253B v1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-08\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nvidia/nemotron-3-nano-30b-a3b\": {\n        \"id\": \"nvidia/nemotron-3-nano-30b-a3b\",\n        \"name\": \"NVIDIA: Nemotron 3 Nano 30B A3B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2 },\n        \"limit\": { \"context\": 262144, \"output\": 52429 }\n      },\n      \"allenai/olmo-3-32b-think\": {\n        \"id\": \"allenai/olmo-3-32b-think\",\n        \"name\": \"AllenAI: Olmo 3 32B Think\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-22\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.5 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"allenai/olmo-2-0325-32b-instruct\": {\n        \"id\": \"allenai/olmo-2-0325-32b-instruct\",\n        \"name\": \"AllenAI: Olmo 2 32B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"allenai/olmo-3.1-32b-instruct\": {\n        \"id\": \"allenai/olmo-3.1-32b-instruct\",\n        \"name\": \"AllenAI: Olmo 3.1 32B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-07\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 65536, \"output\": 32768 }\n      },\n      \"moonshotai/kimi-k2\": {\n        \"id\": \"moonshotai/kimi-k2\",\n        \"name\": \"MoonshotAI: Kimi K2 0711\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.2 },\n        \"limit\": { \"context\": 131000, \"output\": 26215 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"MoonshotAI: Kimi K2 Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.47, \"output\": 2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 65535 }\n      },\n      \"moonshotai/kimi-k2-0905\": {\n        \"id\": \"moonshotai/kimi-k2-0905\",\n        \"name\": \"MoonshotAI: Kimi K2 0905\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"MoonshotAI: Kimi K2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.2 },\n        \"limit\": { \"context\": 262144, \"output\": 65535 }\n      },\n      \"moonshotai/kimi-k2.6\": {\n        \"id\": \"moonshotai/kimi-k2.6\",\n        \"name\": \"MoonshotAI: Kimi K2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"switchpoint/router\": {\n        \"id\": \"switchpoint/router\",\n        \"name\": \"Switchpoint Router\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-12\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.85, \"output\": 3.4 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"relace/relace-apply-3\": {\n        \"id\": \"relace/relace-apply-3\",\n        \"name\": \"Relace: Relace Apply 3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-09-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.85, \"output\": 1.25 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"relace/relace-search\": {\n        \"id\": \"relace/relace-search\",\n        \"name\": \"Relace: Relace Search\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Anthropic: Claude Sonnet 4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-3.5-haiku\": {\n        \"id\": \"anthropic/claude-3.5-haiku\",\n        \"name\": \"Anthropic: Claude 3.5 Haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4.1\": {\n        \"id\": \"anthropic/claude-opus-4.1\",\n        \"name\": \"Anthropic: Claude Opus 4.1\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-3.7-sonnet:thinking\": {\n        \"id\": \"anthropic/claude-3.7-sonnet:thinking\",\n        \"name\": \"Anthropic: Claude 3.7 Sonnet (thinking)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4.6\": {\n        \"id\": \"anthropic/claude-opus-4.6\",\n        \"name\": \"Anthropic: Claude Opus 4.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-haiku-4.5\": {\n        \"id\": \"anthropic/claude-haiku-4.5\",\n        \"name\": \"Anthropic: Claude Haiku 4.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4\": {\n        \"id\": \"anthropic/claude-opus-4\",\n        \"name\": \"Anthropic: Claude Opus 4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-opus-4.5\": {\n        \"id\": \"anthropic/claude-opus-4.5\",\n        \"name\": \"Anthropic: Claude Opus 4.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-3.7-sonnet\": {\n        \"id\": \"anthropic/claude-3.7-sonnet\",\n        \"name\": \"Anthropic: Claude 3.7 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-sonnet-4.6\": {\n        \"id\": \"anthropic/claude-sonnet-4.6\",\n        \"name\": \"Anthropic: Claude Sonnet 4.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-opus-4.6-fast\": {\n        \"id\": \"anthropic/claude-opus-4.6-fast\",\n        \"name\": \"Anthropic: Claude Opus 4.6 (Fast)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 30,\n          \"output\": 150,\n          \"cache_read\": 3,\n          \"cache_write\": 37.5\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-sonnet-4.5\": {\n        \"id\": \"anthropic/claude-sonnet-4.5\",\n        \"name\": \"Anthropic: Claude Sonnet 4.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"anthropic/claude-3-haiku\": {\n        \"id\": \"anthropic/claude-3-haiku\",\n        \"name\": \"Anthropic: Claude 3 Haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-03-07\",\n        \"last_updated\": \"2024-03-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.25,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"stepfun/step-3.5-flash\": {\n        \"id\": \"stepfun/step-3.5-flash\",\n        \"name\": \"StepFun: Step 3.5 Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-29\",\n        \"last_updated\": \"2026-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"mistralai/mistral-large\": {\n        \"id\": \"mistralai/mistral-large\",\n        \"name\": \"Mistral Large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-24\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 25600 }\n      },\n      \"mistralai/mistral-large-2512\": {\n        \"id\": \"mistralai/mistral-large-2512\",\n        \"name\": \"Mistral: Mistral Large 3 2512\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 52429 }\n      },\n      \"mistralai/mistral-small-24b-instruct-2501\": {\n        \"id\": \"mistralai/mistral-small-24b-instruct-2501\",\n        \"name\": \"Mistral: Mistral Small 3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-29\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.05, \"output\": 0.08 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"mistralai/ministral-8b-2512\": {\n        \"id\": \"mistralai/ministral-8b-2512\",\n        \"name\": \"Mistral: Ministral 3 8B 2512\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"mistralai/ministral-3b-2512\": {\n        \"id\": \"mistralai/ministral-3b-2512\",\n        \"name\": \"Mistral: Ministral 3 3B 2512\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"mistralai/mistral-nemo\": {\n        \"id\": \"mistralai/mistral-nemo\",\n        \"name\": \"Mistral: Mistral Nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.04 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"mistralai/mistral-7b-instruct-v0.1\": {\n        \"id\": \"mistralai/mistral-7b-instruct-v0.1\",\n        \"name\": \"Mistral: Mistral 7B Instruct v0.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.11, \"output\": 0.19 },\n        \"limit\": { \"context\": 2824, \"output\": 565 }\n      },\n      \"mistralai/mistral-large-2407\": {\n        \"id\": \"mistralai/mistral-large-2407\",\n        \"name\": \"Mistral Large 2407\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-19\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"mistralai/mistral-saba\": {\n        \"id\": \"mistralai/mistral-saba\",\n        \"name\": \"Mistral: Saba\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"mistralai/mistral-medium-3.1\": {\n        \"id\": \"mistralai/mistral-medium-3.1\",\n        \"name\": \"Mistral: Mistral Medium 3.1\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-12\",\n        \"last_updated\": \"2025-08-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"mistralai/mixtral-8x7b-instruct\": {\n        \"id\": \"mistralai/mixtral-8x7b-instruct\",\n        \"name\": \"Mistral: Mixtral 8x7B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-12-10\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.54, \"output\": 0.54 },\n        \"limit\": { \"context\": 32768, \"output\": 16384 }\n      },\n      \"mistralai/devstral-medium\": {\n        \"id\": \"mistralai/devstral-medium\",\n        \"name\": \"Mistral: Devstral Medium\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-10\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"mistralai/mixtral-8x22b-instruct\": {\n        \"id\": \"mistralai/mixtral-8x22b-instruct\",\n        \"name\": \"Mistral: Mixtral 8x22B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-17\",\n        \"last_updated\": \"2024-04-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 65536, \"output\": 13108 }\n      },\n      \"mistralai/voxtral-small-24b-2507\": {\n        \"id\": \"mistralai/voxtral-small-24b-2507\",\n        \"name\": \"Mistral: Voxtral Small 24B 2507\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-01\",\n        \"last_updated\": \"2025-07-01\",\n        \"modalities\": { \"input\": [\"text\", \"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 32000, \"output\": 6400 }\n      },\n      \"mistralai/mistral-small-creative\": {\n        \"id\": \"mistralai/mistral-small-creative\",\n        \"name\": \"Mistral: Mistral Small Creative\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"mistralai/mistral-small-3.1-24b-instruct\": {\n        \"id\": \"mistralai/mistral-small-3.1-24b-instruct\",\n        \"name\": \"Mistral: Mistral Small 3.1 24B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 0.56, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 128000, \"output\": 131072 }\n      },\n      \"mistralai/pixtral-large-2411\": {\n        \"id\": \"mistralai/pixtral-large-2411\",\n        \"name\": \"Mistral: Pixtral Large 2411\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-19\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"mistralai/mistral-small-3.2-24b-instruct\": {\n        \"id\": \"mistralai/mistral-small-3.2-24b-instruct\",\n        \"name\": \"Mistral: Mistral Small 3.2 24B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-20\",\n        \"last_updated\": \"2025-06-20\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.18, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistralai/codestral-2508\": {\n        \"id\": \"mistralai/codestral-2508\",\n        \"name\": \"Mistral: Codestral 2508\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-01\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"output\": 51200 }\n      },\n      \"mistralai/devstral-small\": {\n        \"id\": \"mistralai/devstral-small\",\n        \"name\": \"Mistral: Devstral Small 1.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"mistralai/mistral-large-2411\": {\n        \"id\": \"mistralai/mistral-large-2411\",\n        \"name\": \"Mistral Large 2411\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-24\",\n        \"last_updated\": \"2024-11-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"mistralai/mistral-small-2603\": {\n        \"id\": \"mistralai/mistral-small-2603\",\n        \"name\": \"Mistral: Mistral Small 4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/devstral-2512\": {\n        \"id\": \"mistralai/devstral-2512\",\n        \"name\": \"Mistral: Devstral 2 2512\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-12\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"mistralai/ministral-14b-2512\": {\n        \"id\": \"mistralai/ministral-14b-2512\",\n        \"name\": \"Mistral: Ministral 3 14B 2512\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 262144, \"output\": 52429 }\n      },\n      \"mistralai/mistral-medium-3\": {\n        \"id\": \"mistralai/mistral-medium-3\",\n        \"name\": \"Mistral: Mistral Medium 3\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"ai21/jamba-large-1.7\": {\n        \"id\": \"ai21/jamba-large-1.7\",\n        \"name\": \"AI21: Jamba Large 1.7\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-09\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 256000, \"output\": 4096 }\n      },\n      \"kwaipilot/kat-coder-pro-v2\": {\n        \"id\": \"kwaipilot/kat-coder-pro-v2\",\n        \"name\": \"Kwaipilot: KAT-Coder-Pro V2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 256000, \"output\": 80000 }\n      },\n      \"nousresearch/hermes-3-llama-3.1-405b\": {\n        \"id\": \"nousresearch/hermes-3-llama-3.1-405b\",\n        \"name\": \"Nous: Hermes 3 405B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-16\",\n        \"last_updated\": \"2024-08-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"nousresearch/hermes-3-llama-3.1-70b\": {\n        \"id\": \"nousresearch/hermes-3-llama-3.1-70b\",\n        \"name\": \"Nous: Hermes 3 70B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-18\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.3 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"nousresearch/hermes-4-70b\": {\n        \"id\": \"nousresearch/hermes-4-70b\",\n        \"name\": \"Nous: Hermes 4 70B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-25\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.4, \"cache_read\": 0.055 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"nousresearch/hermes-2-pro-llama-3-8b\": {\n        \"id\": \"nousresearch/hermes-2-pro-llama-3-8b\",\n        \"name\": \"NousResearch: Hermes 2 Pro - Llama-3 8B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-05-27\",\n        \"last_updated\": \"2024-06-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.14 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"nousresearch/hermes-4-405b\": {\n        \"id\": \"nousresearch/hermes-4-405b\",\n        \"name\": \"Nous: Hermes 4 405B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-25\",\n        \"last_updated\": \"2025-08-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"upstage/solar-pro-3\": {\n        \"id\": \"upstage/solar-pro-3\",\n        \"name\": \"Upstage: Solar Pro 3\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"essentialai/rnj-1-instruct\": {\n        \"id\": \"essentialai/rnj-1-instruct\",\n        \"name\": \"EssentialAI: Rnj 1 Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 32768, \"output\": 6554 }\n      },\n      \"nex-agi/deepseek-v3.1-nex-n1\": {\n        \"id\": \"nex-agi/deepseek-v3.1-nex-n1\",\n        \"name\": \"Nex AGI: DeepSeek V3.1 Nex N1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 1 },\n        \"limit\": { \"context\": 131072, \"output\": 163840 }\n      },\n      \"bytedance-seed/seed-1.6-flash\": {\n        \"id\": \"bytedance-seed/seed-1.6-flash\",\n        \"name\": \"ByteDance Seed: Seed 1.6 Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"bytedance-seed/dola-seed-2.0-pro:free\": {\n        \"id\": \"bytedance-seed/dola-seed-2.0-pro:free\",\n        \"name\": \"ByteDance Seed: Dola Seed 2.0 Pro (free)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"bytedance-seed/seed-2.0-mini\": {\n        \"id\": \"bytedance-seed/seed-2.0-mini\",\n        \"name\": \"ByteDance Seed: Seed-2.0-Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-27\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"bytedance-seed/seed-1.6\": {\n        \"id\": \"bytedance-seed/seed-1.6\",\n        \"name\": \"ByteDance Seed: Seed 1.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"bytedance-seed/seed-2.0-lite\": {\n        \"id\": \"bytedance-seed/seed-2.0-lite\",\n        \"name\": \"ByteDance Seed: Seed-2.0-Lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-10\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"deepcogito/cogito-v2.1-671b\": {\n        \"id\": \"deepcogito/cogito-v2.1-671b\",\n        \"name\": \"Deep Cogito: Cogito v2.1 671B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.25, \"output\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"deepseek/deepseek-v3.2\": {\n        \"id\": \"deepseek/deepseek-v3.2\",\n        \"name\": \"DeepSeek: DeepSeek V3.2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.26, \"output\": 0.38, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-chat-v3.1\": {\n        \"id\": \"deepseek/deepseek-chat-v3.1\",\n        \"name\": \"DeepSeek: DeepSeek V3.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.75 },\n        \"limit\": { \"context\": 32768, \"output\": 7168 }\n      },\n      \"deepseek/deepseek-chat-v3-0324\": {\n        \"id\": \"deepseek/deepseek-chat-v3-0324\",\n        \"name\": \"DeepSeek: DeepSeek V3 0324\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-24\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.77, \"cache_read\": 0.095 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-r1-distill-llama-70b\": {\n        \"id\": \"deepseek/deepseek-r1-distill-llama-70b\",\n        \"name\": \"DeepSeek: R1 Distill Llama 70B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-23\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 0.8, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"deepseek/deepseek-r1-distill-qwen-32b\": {\n        \"id\": \"deepseek/deepseek-r1-distill-qwen-32b\",\n        \"name\": \"DeepSeek: R1 Distill Qwen 32B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.29, \"output\": 0.29 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"deepseek/deepseek-r1-0528\": {\n        \"id\": \"deepseek/deepseek-r1-0528\",\n        \"name\": \"DeepSeek: R1 0528\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.15, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-v3.2-exp\": {\n        \"id\": \"deepseek/deepseek-v3.2-exp\",\n        \"name\": \"DeepSeek: DeepSeek V3.2 Exp\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.41 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek/deepseek-v3.2-speciale\": {\n        \"id\": \"deepseek/deepseek-v3.2-speciale\",\n        \"name\": \"DeepSeek: DeepSeek V3.2 Speciale\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 1.2, \"cache_read\": 0.135 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek/deepseek-chat\": {\n        \"id\": \"deepseek/deepseek-chat\",\n        \"name\": \"DeepSeek: DeepSeek V3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.32, \"output\": 0.89, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"deepseek/deepseek-v3.1-terminus\": {\n        \"id\": \"deepseek/deepseek-v3.1-terminus\",\n        \"name\": \"DeepSeek: DeepSeek V3.1 Terminus\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.21, \"output\": 0.79, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 163840, \"output\": 32768 }\n      },\n      \"deepseek/deepseek-r1\": {\n        \"id\": \"deepseek/deepseek-r1\",\n        \"name\": \"DeepSeek: R1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.5 },\n        \"limit\": { \"context\": 64000, \"output\": 16000 }\n      },\n      \"perplexity/sonar-deep-research\": {\n        \"id\": \"perplexity/sonar-deep-research\",\n        \"name\": \"Perplexity: Sonar Deep Research\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-27\",\n        \"last_updated\": \"2025-01-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 128000, \"output\": 25600 }\n      },\n      \"perplexity/sonar\": {\n        \"id\": \"perplexity/sonar\",\n        \"name\": \"Perplexity: Sonar\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 1 },\n        \"limit\": { \"context\": 127072, \"output\": 25415 }\n      },\n      \"perplexity/sonar-reasoning-pro\": {\n        \"id\": \"perplexity/sonar-reasoning-pro\",\n        \"name\": \"Perplexity: Sonar Reasoning Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8 },\n        \"limit\": { \"context\": 128000, \"output\": 25600 }\n      },\n      \"perplexity/sonar-pro\": {\n        \"id\": \"perplexity/sonar-pro\",\n        \"name\": \"Perplexity: Sonar Pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 8000 }\n      },\n      \"perplexity/sonar-pro-search\": {\n        \"id\": \"perplexity/sonar-pro-search\",\n        \"name\": \"Perplexity: Sonar Pro Search\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-31\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15 },\n        \"limit\": { \"context\": 200000, \"output\": 8000 }\n      },\n      \"xiaomi/mimo-v2-flash\": {\n        \"id\": \"xiaomi/mimo-v2-flash\",\n        \"name\": \"Xiaomi: MiMo-V2-Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.29, \"cache_read\": 0.045 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"xiaomi/mimo-v2-omni\": {\n        \"id\": \"xiaomi/mimo-v2-omni\",\n        \"name\": \"Xiaomi: MiMo-V2-Omni\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"xiaomi/mimo-v2-pro\": {\n        \"id\": \"xiaomi/mimo-v2-pro\",\n        \"name\": \"Xiaomi: MiMo-V2-Pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1048576, \"output\": 131072 }\n      },\n      \"meituan/longcat-flash-chat\": {\n        \"id\": \"meituan/longcat-flash-chat\",\n        \"name\": \"Meituan: LongCat Flash Chat\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-30\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"ibm-granite/granite-4.0-h-micro\": {\n        \"id\": \"ibm-granite/granite-4.0-h-micro\",\n        \"name\": \"IBM: Granite 4.0 Micro\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-20\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.017, \"output\": 0.11 },\n        \"limit\": { \"context\": 131000, \"output\": 32768 }\n      },\n      \"openrouter/auto\": {\n        \"id\": \"openrouter/auto\",\n        \"name\": \"Auto Router\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"image\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 2000000, \"output\": 32768 }\n      },\n      \"openrouter/elephant-alpha\": {\n        \"id\": \"openrouter/elephant-alpha\",\n        \"name\": \"Elephant (new)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-15\",\n        \"last_updated\": \"2026-04-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 },\n        \"status\": \"alpha\"\n      },\n      \"openrouter/bodybuilder\": {\n        \"id\": \"openrouter/bodybuilder\",\n        \"name\": \"Body Builder (beta)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 },\n        \"status\": \"beta\"\n      },\n      \"openrouter/free\": {\n        \"id\": \"openrouter/free\",\n        \"name\": \"Free Models Router\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 32768 }\n      },\n      \"kilo-auto/small\": {\n        \"id\": \"kilo-auto/small\",\n        \"name\": \"Kilo Auto Small\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"kilo-auto/balanced\": {\n        \"id\": \"kilo-auto/balanced\",\n        \"name\": \"Kilo Auto Balanced\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 3 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"kilo-auto/frontier\": {\n        \"id\": \"kilo-auto/frontier\",\n        \"name\": \"Kilo Auto Frontier\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 25 },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"kilo-auto/free\": {\n        \"id\": \"kilo-auto/free\",\n        \"name\": \"Kilo Auto Free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"microsoft/wizardlm-2-8x22b\": {\n        \"id\": \"microsoft/wizardlm-2-8x22b\",\n        \"name\": \"WizardLM-2 8x22B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-04-24\",\n        \"last_updated\": \"2024-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.62, \"output\": 0.62 },\n        \"limit\": { \"context\": 65535, \"output\": 8000 }\n      },\n      \"microsoft/phi-4\": {\n        \"id\": \"microsoft/phi-4\",\n        \"name\": \"Microsoft: Phi 4\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.14 },\n        \"limit\": { \"context\": 16384, \"output\": 16384 }\n      },\n      \"inception/mercury-edit-2\": {\n        \"id\": \"inception/mercury-edit-2\",\n        \"name\": \"Mercury Edit 2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"inception/mercury-2\": {\n        \"id\": \"inception/mercury-2\",\n        \"name\": \"Inception: Mercury 2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 0.75, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 128000, \"output\": 50000 }\n      },\n      \"aion-labs/aion-2.0\": {\n        \"id\": \"aion-labs/aion-2.0\",\n        \"name\": \"AionLabs: Aion-2.0\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 1.6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"aion-labs/aion-rp-llama-3.1-8b\": {\n        \"id\": \"aion-labs/aion-rp-llama-3.1-8b\",\n        \"name\": \"AionLabs: Aion-RP 1.0 (8B)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 1.6 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"aion-labs/aion-1.0-mini\": {\n        \"id\": \"aion-labs/aion-1.0-mini\",\n        \"name\": \"AionLabs: Aion-1.0-Mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.7, \"output\": 1.4 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"aion-labs/aion-1.0\": {\n        \"id\": \"aion-labs/aion-1.0\",\n        \"name\": \"AionLabs: Aion-1.0\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 4, \"output\": 8 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"x-ai/grok-code-fast-1:optimized:free\": {\n        \"id\": \"x-ai/grok-code-fast-1:optimized:free\",\n        \"name\": \"xAI: Grok Code Fast 1 Optimized (experimental, free)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-27\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"x-ai/grok-4.20-multi-agent\": {\n        \"id\": \"x-ai/grok-4.20-multi-agent\",\n        \"name\": \"xAI: Grok 4.20 Multi-Agent\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-31\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"x-ai/grok-4.1-fast\": {\n        \"id\": \"x-ai/grok-4.1-fast\",\n        \"name\": \"xAI: Grok 4.1 Fast\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-19\",\n        \"last_updated\": \"2025-11-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"x-ai/grok-3-mini\": {\n        \"id\": \"x-ai/grok-3-mini\",\n        \"name\": \"xAI: Grok 3 Mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"x-ai/grok-4.20\": {\n        \"id\": \"x-ai/grok-4.20\",\n        \"name\": \"xAI: Grok 4.20\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-31\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 6, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 2000000, \"output\": 2000000 }\n      },\n      \"x-ai/grok-3-mini-beta\": {\n        \"id\": \"x-ai/grok-3-mini-beta\",\n        \"name\": \"xAI: Grok 3 Mini Beta\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 0.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"x-ai/grok-code-fast-1\": {\n        \"id\": \"x-ai/grok-code-fast-1\",\n        \"name\": \"xAI: Grok Code Fast 1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 10000 }\n      },\n      \"x-ai/grok-3\": {\n        \"id\": \"x-ai/grok-3\",\n        \"name\": \"xAI: Grok 3\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"x-ai/grok-4\": {\n        \"id\": \"x-ai/grok-4\",\n        \"name\": \"xAI: Grok 4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 256000, \"output\": 51200 }\n      },\n      \"x-ai/grok-4-fast\": {\n        \"id\": \"x-ai/grok-4-fast\",\n        \"name\": \"xAI: Grok 4 Fast\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-19\",\n        \"last_updated\": \"2025-08-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"x-ai/grok-3-beta\": {\n        \"id\": \"x-ai/grok-3-beta\",\n        \"name\": \"xAI: Grok 3 Beta\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-02-17\",\n        \"last_updated\": \"2025-02-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"alpindale/goliath-120b\": {\n        \"id\": \"alpindale/goliath-120b\",\n        \"name\": \"Goliath 120B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2023-11-10\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3.75, \"output\": 7.5 },\n        \"limit\": { \"context\": 6144, \"output\": 1024 }\n      },\n      \"prime-intellect/intellect-3\": {\n        \"id\": \"prime-intellect/intellect-3\",\n        \"name\": \"Prime Intellect: INTELLECT-3\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-26\",\n        \"last_updated\": \"2026-02-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"minimax/minimax-m2\": {\n        \"id\": \"minimax/minimax-m2\",\n        \"name\": \"MiniMax: MiniMax M2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-23\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.255, \"output\": 1, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      },\n      \"minimax/minimax-m2-her\": {\n        \"id\": \"minimax/minimax-m2-her\",\n        \"name\": \"MiniMax: MiniMax M2-her\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-23\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 65536, \"output\": 2048 }\n      },\n      \"minimax/minimax-m1\": {\n        \"id\": \"minimax/minimax-m1\",\n        \"name\": \"MiniMax: MiniMax M1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 40000 }\n      },\n      \"minimax/minimax-01\": {\n        \"id\": \"minimax/minimax-01\",\n        \"name\": \"MiniMax: MiniMax-01\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-01-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.1 },\n        \"limit\": { \"context\": 1000192, \"output\": 1000192 }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"MiniMax: MiniMax M2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 1.2, \"cache_read\": 0.029 },\n        \"limit\": { \"context\": 196608, \"output\": 196608 }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"MiniMax: MiniMax M2.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.95, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 196608, \"output\": 39322 }\n      },\n      \"minimax/minimax-m2.7\": {\n        \"id\": \"minimax/minimax-m2.7\",\n        \"name\": \"MiniMax: MiniMax M2.7\",\n        \"family\": \"minimax-m2.7\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"baidu/ernie-4.5-21b-a3b-thinking\": {\n        \"id\": \"baidu/ernie-4.5-21b-a3b-thinking\",\n        \"name\": \"Baidu: ERNIE 4.5 21B A3B Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"baidu/ernie-4.5-vl-28b-a3b\": {\n        \"id\": \"baidu/ernie-4.5-vl-28b-a3b\",\n        \"name\": \"Baidu: ERNIE 4.5 VL 28B A3B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.56 },\n        \"limit\": { \"context\": 30000, \"output\": 8000 }\n      },\n      \"baidu/ernie-4.5-300b-a47b\": {\n        \"id\": \"baidu/ernie-4.5-300b-a47b\",\n        \"name\": \"Baidu: ERNIE 4.5 300B A47B \",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.1 },\n        \"limit\": { \"context\": 123000, \"output\": 12000 }\n      },\n      \"baidu/ernie-4.5-21b-a3b\": {\n        \"id\": \"baidu/ernie-4.5-21b-a3b\",\n        \"name\": \"Baidu: ERNIE 4.5 21B A3B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-06-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.28 },\n        \"limit\": { \"context\": 120000, \"output\": 8000 }\n      },\n      \"baidu/ernie-4.5-vl-424b-a47b\": {\n        \"id\": \"baidu/ernie-4.5-vl-424b-a47b\",\n        \"name\": \"Baidu: ERNIE 4.5 VL 424B A47B \",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.42, \"output\": 1.25 },\n        \"limit\": { \"context\": 123000, \"output\": 16000 }\n      },\n      \"z-ai/glm-5\": {\n        \"id\": \"z-ai/glm-5\",\n        \"name\": \"Z.ai: GLM 5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.72, \"output\": 2.3 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.7\": {\n        \"id\": \"z-ai/glm-4.7\",\n        \"name\": \"Z.ai: GLM 4.7\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.38, \"output\": 1.98, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 65535 }\n      },\n      \"z-ai/glm-4.6\": {\n        \"id\": \"z-ai/glm-4.6\",\n        \"name\": \"Z.ai: GLM 4.6\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.39, \"output\": 1.9, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 204800, \"output\": 204800 }\n      },\n      \"z-ai/glm-5.1\": {\n        \"id\": \"z-ai/glm-5.1\",\n        \"name\": \"Z.ai: GLM 5.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.26, \"output\": 3.96 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.6v\": {\n        \"id\": \"z-ai/glm-4.6v\",\n        \"name\": \"Z.ai: GLM 4.6V\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2026-01-10\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.5-air\": {\n        \"id\": \"z-ai/glm-4.5-air\",\n        \"name\": \"Z.ai: GLM 4.5 Air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.13, \"output\": 0.85, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"z-ai/glm-4.5v\": {\n        \"id\": \"z-ai/glm-4.5v\",\n        \"name\": \"Z.ai: GLM 4.5V\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-11\",\n        \"last_updated\": \"2025-08-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"z-ai/glm-4.7-flash\": {\n        \"id\": \"z-ai/glm-4.7-flash\",\n        \"name\": \"Z.ai: GLM 4.7 Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 202752, \"output\": 40551 }\n      },\n      \"z-ai/glm-5v-turbo\": {\n        \"id\": \"z-ai/glm-5v-turbo\",\n        \"name\": \"Z.ai: GLM 5V Turbo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.2, \"output\": 4, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"z-ai/glm-5-turbo\": {\n        \"id\": \"z-ai/glm-5-turbo\",\n        \"name\": \"Z.ai: GLM 5 Turbo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-15\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.2, \"output\": 4, \"cache_read\": 0.24 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.5\": {\n        \"id\": \"z-ai/glm-4.5\",\n        \"name\": \"Z.ai: GLM 4.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"z-ai/glm-4-32b\": {\n        \"id\": \"z-ai/glm-4-32b\",\n        \"name\": \"Z.ai: GLM 4 32B \",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"arcee-ai/coder-large\": {\n        \"id\": \"arcee-ai/coder-large\",\n        \"name\": \"Arcee AI: Coder Large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 0.8 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"arcee-ai/trinity-large-thinking:free\": {\n        \"id\": \"arcee-ai/trinity-large-thinking:free\",\n        \"name\": \"Arcee AI: Trinity Large Thinking (free)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"arcee-ai/trinity-large-thinking\": {\n        \"id\": \"arcee-ai/trinity-large-thinking\",\n        \"name\": \"Arcee AI: Trinity Large Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.22, \"output\": 0.85 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"arcee-ai/spotlight\": {\n        \"id\": \"arcee-ai/spotlight\",\n        \"name\": \"Arcee AI: Spotlight\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.18, \"output\": 0.18 },\n        \"limit\": { \"context\": 131072, \"output\": 65537 }\n      },\n      \"arcee-ai/virtuoso-large\": {\n        \"id\": \"arcee-ai/virtuoso-large\",\n        \"name\": \"Arcee AI: Virtuoso Large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.75, \"output\": 1.2 },\n        \"limit\": { \"context\": 131072, \"output\": 64000 }\n      },\n      \"arcee-ai/trinity-mini\": {\n        \"id\": \"arcee-ai/trinity-mini\",\n        \"name\": \"Arcee AI: Trinity Mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.045, \"output\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"arcee-ai/maestro-reasoning\": {\n        \"id\": \"arcee-ai/maestro-reasoning\",\n        \"name\": \"Arcee AI: Maestro Reasoning\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.9, \"output\": 3.3 },\n        \"limit\": { \"context\": 131072, \"output\": 32000 }\n      },\n      \"alfredpros/codellama-7b-instruct-solidity\": {\n        \"id\": \"alfredpros/codellama-7b-instruct-solidity\",\n        \"name\": \"AlfredPros: CodeLLaMa 7B Instruct Solidity\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.8, \"output\": 1.2 },\n        \"limit\": { \"context\": 4096, \"output\": 4096 }\n      },\n      \"alibaba/tongyi-deepresearch-30b-a3b\": {\n        \"id\": \"alibaba/tongyi-deepresearch-30b-a3b\",\n        \"name\": \"Tongyi DeepResearch 30B A3B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-18\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.09, \"output\": 0.45 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"anthracite-org/magnum-v4-72b\": {\n        \"id\": \"anthracite-org/magnum-v4-72b\",\n        \"name\": \"Magnum v4 72B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3, \"output\": 5 },\n        \"limit\": { \"context\": 16384, \"output\": 2048 }\n      },\n      \"inflection/inflection-3-pi\": {\n        \"id\": \"inflection/inflection-3-pi\",\n        \"name\": \"Inflection: Inflection 3 Pi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 8000, \"output\": 1024 }\n      },\n      \"inflection/inflection-3-productivity\": {\n        \"id\": \"inflection/inflection-3-productivity\",\n        \"name\": \"Inflection: Inflection 3 Productivity\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-10-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 8000, \"output\": 1024 }\n      },\n      \"tencent/hunyuan-a13b-instruct\": {\n        \"id\": \"tencent/hunyuan-a13b-instruct\",\n        \"name\": \"Tencent: Hunyuan A13B Instruct\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-30\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.57 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"openai/gpt-audio\": {\n        \"id\": \"openai/gpt-audio\",\n        \"name\": \"OpenAI: GPT Audio\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"text\"],\n          \"output\": [\"audio\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o3-mini\": {\n        \"id\": \"openai/o3-mini\",\n        \"name\": \"OpenAI: o3 Mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"OpenAI: GPT-4o-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o3\": {\n        \"id\": \"openai/o3\",\n        \"name\": \"OpenAI: o3\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.4-pro\": {\n        \"id\": \"openai/gpt-5.4-pro\",\n        \"name\": \"OpenAI: GPT-5.4 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-03-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180 },\n        \"limit\": { \"context\": 1050000, \"output\": 128000 }\n      },\n      \"openai/o3-pro\": {\n        \"id\": \"openai/o3-pro\",\n        \"name\": \"OpenAI: o3 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 20, \"output\": 80 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4-turbo-preview\": {\n        \"id\": \"openai/gpt-4-turbo-preview\",\n        \"name\": \"OpenAI: GPT-4 Turbo Preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-4o-2024-05-13\": {\n        \"id\": \"openai/gpt-4o-2024-05-13\",\n        \"name\": \"OpenAI: GPT-4o (2024-05-13)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"OpenAI: GPT-5.1-Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"OpenAI: GPT-5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"OpenAI: o4 Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.275 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o1\": {\n        \"id\": \"openai/o1\",\n        \"name\": \"OpenAI: o1\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o\": {\n        \"id\": \"openai/gpt-4o\",\n        \"name\": \"OpenAI: GPT-4o\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.1-chat\": {\n        \"id\": \"openai/gpt-5.1-chat\",\n        \"name\": \"OpenAI: GPT-5.1 Chat\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4o-mini-search-preview\": {\n        \"id\": \"openai/gpt-4o-mini-search-preview\",\n        \"name\": \"OpenAI: GPT-4o-mini Search Preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"OpenAI: GPT-5 Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-chat\": {\n        \"id\": \"openai/gpt-5-chat\",\n        \"name\": \"OpenAI: GPT-5 Chat\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.1-codex-max\": {\n        \"id\": \"openai/gpt-5.1-codex-max\",\n        \"name\": \"OpenAI: GPT-5.1-Codex-Max\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-pro\": {\n        \"id\": \"openai/gpt-5-pro\",\n        \"name\": \"OpenAI: GPT-5 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o-audio-preview\": {\n        \"id\": \"openai/gpt-4o-audio-preview\",\n        \"name\": \"OpenAI: GPT-4o Audio\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-15\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"text\"],\n          \"output\": [\"audio\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4o-2024-11-20\": {\n        \"id\": \"openai/gpt-4o-2024-11-20\",\n        \"name\": \"OpenAI: GPT-4o (2024-11-20)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-20\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-4o-search-preview\": {\n        \"id\": \"openai/gpt-4o-search-preview\",\n        \"name\": \"OpenAI: GPT-4o Search Preview\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-audio-mini\": {\n        \"id\": \"openai/gpt-audio-mini\",\n        \"name\": \"OpenAI: GPT Audio Mini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-01-20\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"text\"],\n          \"output\": [\"audio\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.4 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-oss-safeguard-20b\": {\n        \"id\": \"openai/gpt-oss-safeguard-20b\",\n        \"name\": \"OpenAI: gpt-oss-safeguard-20b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-29\",\n        \"last_updated\": \"2025-10-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3, \"cache_read\": 0.037 },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"openai/gpt-5.2-chat\": {\n        \"id\": \"openai/gpt-5.2-chat\",\n        \"name\": \"OpenAI: GPT-5.2 Chat\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o4-mini-deep-research\": {\n        \"id\": \"openai/o4-mini-deep-research\",\n        \"name\": \"OpenAI: o4 Mini Deep Research\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.4-mini\": {\n        \"id\": \"openai/gpt-5.4-mini\",\n        \"name\": \"OpenAI: GPT-5.4 Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/o3-mini-high\": {\n        \"id\": \"openai/o3-mini-high\",\n        \"name\": \"OpenAI: o3 Mini High\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-01-31\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o3-deep-research\": {\n        \"id\": \"openai/o3-deep-research\",\n        \"name\": \"OpenAI: o3 Deep Research\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 40, \"cache_read\": 2.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4.1-mini\": {\n        \"id\": \"openai/gpt-4.1-mini\",\n        \"name\": \"OpenAI: GPT-4.1 Mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-3.5-turbo\": {\n        \"id\": \"openai/gpt-3.5-turbo\",\n        \"name\": \"OpenAI: GPT-3.5 Turbo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 16385, \"output\": 4096 }\n      },\n      \"openai/o4-mini-high\": {\n        \"id\": \"openai/o4-mini-high\",\n        \"name\": \"OpenAI: o4 Mini High\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2025-04-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.3-chat\": {\n        \"id\": \"openai/gpt-5.3-chat\",\n        \"name\": \"OpenAI: GPT-5.3 Chat\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"release_date\": \"2026-03-04\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-3.5-turbo-0613\": {\n        \"id\": \"openai/gpt-3.5-turbo-0613\",\n        \"name\": \"OpenAI: GPT-3.5 Turbo (older v0613)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-06-13\",\n        \"last_updated\": \"2023-06-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 2 },\n        \"limit\": { \"context\": 4095, \"output\": 4096 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"OpenAI: gpt-oss-120b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.039, \"output\": 0.19 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"openai/gpt-5-codex\": {\n        \"id\": \"openai/gpt-5-codex\",\n        \"name\": \"OpenAI: GPT-5 Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"OpenAI: GPT-5.2\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o:extended\": {\n        \"id\": \"openai/gpt-4o:extended\",\n        \"name\": \"OpenAI: GPT-4o (extended)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 6, \"output\": 18 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"openai/gpt-5.3-codex\": {\n        \"id\": \"openai/gpt-5.3-codex\",\n        \"name\": \"OpenAI: GPT-5.3-Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-02-25\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4-0314\": {\n        \"id\": \"openai/gpt-4-0314\",\n        \"name\": \"OpenAI: GPT-4 (older v0314)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-05-28\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 60 },\n        \"limit\": { \"context\": 8191, \"output\": 4096 }\n      },\n      \"openai/gpt-5-image\": {\n        \"id\": \"openai/gpt-5-image\",\n        \"name\": \"OpenAI: GPT-5 Image\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"pdf\", \"text\"],\n          \"output\": [\"image\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4-turbo\": {\n        \"id\": \"openai/gpt-4-turbo\",\n        \"name\": \"OpenAI: GPT-4 Turbo\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-09-13\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-4-1106-preview\": {\n        \"id\": \"openai/gpt-4-1106-preview\",\n        \"name\": \"OpenAI: GPT-4 Turbo (older v1106)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-5-image-mini\": {\n        \"id\": \"openai/gpt-5-image-mini\",\n        \"name\": \"OpenAI: GPT-5 Image Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-16\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"pdf\", \"text\"],\n          \"output\": [\"image\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 2 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o-2024-08-06\": {\n        \"id\": \"openai/gpt-4o-2024-08-06\",\n        \"name\": \"OpenAI: GPT-4o (2024-08-06)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-08-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"OpenAI: GPT-5.2-Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"OpenAI: gpt-oss-20b\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.14 },\n        \"limit\": { \"context\": 131072, \"output\": 26215 }\n      },\n      \"openai/gpt-4.1-nano\": {\n        \"id\": \"openai/gpt-4.1-nano\",\n        \"name\": \"OpenAI: GPT-4.1 Nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.2-pro\": {\n        \"id\": \"openai/gpt-5.2-pro\",\n        \"name\": \"OpenAI: GPT-5.2 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-3.5-turbo-instruct\": {\n        \"id\": \"openai/gpt-3.5-turbo-instruct\",\n        \"name\": \"OpenAI: GPT-3.5 Turbo Instruct\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-09-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 2 },\n        \"limit\": { \"context\": 4095, \"output\": 4096 }\n      },\n      \"openai/gpt-3.5-turbo-16k\": {\n        \"id\": \"openai/gpt-3.5-turbo-16k\",\n        \"name\": \"OpenAI: GPT-3.5 Turbo 16k\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-08-28\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 4 },\n        \"limit\": { \"context\": 16385, \"output\": 4096 }\n      },\n      \"openai/gpt-5-nano\": {\n        \"id\": \"openai/gpt-5-nano\",\n        \"name\": \"OpenAI: GPT-5 Nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"OpenAI: GPT-4.1\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.1-codex-mini\": {\n        \"id\": \"openai/gpt-5.1-codex-mini\",\n        \"name\": \"OpenAI: GPT-5.1-Codex-Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"OpenAI: GPT-5.1\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4o-mini-2024-07-18\": {\n        \"id\": \"openai/gpt-4o-mini-2024-07-18\",\n        \"name\": \"OpenAI: GPT-4o-mini (2024-07-18)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o1-pro\": {\n        \"id\": \"openai/o1-pro\",\n        \"name\": \"OpenAI: o1-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-03-19\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 150, \"output\": 600 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4\": {\n        \"id\": \"openai/gpt-4\",\n        \"name\": \"OpenAI: GPT-4\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2023-03-14\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 60 },\n        \"limit\": { \"context\": 8191, \"output\": 4096 }\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"OpenAI: GPT-5.4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"release_date\": \"2026-03-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15 },\n        \"limit\": { \"context\": 1050000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.4-nano\": {\n        \"id\": \"openai/gpt-5.4-nano\",\n        \"name\": \"OpenAI: GPT-5.4 Nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": { \"input\": [\"image\", \"pdf\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"tngtech/deepseek-r1t2-chimera\": {\n        \"id\": \"tngtech/deepseek-r1t2-chimera\",\n        \"name\": \"TNG: DeepSeek R1T2 Chimera\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-08\",\n        \"last_updated\": \"2025-07-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.85, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"amazon/nova-premier-v1\": {\n        \"id\": \"amazon/nova-premier-v1\",\n        \"name\": \"Amazon: Nova Premier 1.0\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 12.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 32000 }\n      },\n      \"amazon/nova-2-lite-v1\": {\n        \"id\": \"amazon/nova-2-lite-v1\",\n        \"name\": \"Amazon: Nova 2 Lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-01\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65535 }\n      },\n      \"amazon/nova-micro-v1\": {\n        \"id\": \"amazon/nova-micro-v1\",\n        \"name\": \"Amazon: Nova Micro 1.0\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.035, \"output\": 0.14 },\n        \"limit\": { \"context\": 128000, \"output\": 5120 }\n      },\n      \"amazon/nova-pro-v1\": {\n        \"id\": \"amazon/nova-pro-v1\",\n        \"name\": \"Amazon: Nova Pro 1.0\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-03\",\n        \"last_updated\": \"2024-12-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 3.2 },\n        \"limit\": { \"context\": 300000, \"output\": 5120 }\n      },\n      \"amazon/nova-lite-v1\": {\n        \"id\": \"amazon/nova-lite-v1\",\n        \"name\": \"Amazon: Nova Lite 1.0\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.06, \"output\": 0.24 },\n        \"limit\": { \"context\": 300000, \"output\": 5120 }\n      },\n      \"thedrummer/rocinante-12b\": {\n        \"id\": \"thedrummer/rocinante-12b\",\n        \"name\": \"TheDrummer: Rocinante 12B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-09-30\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.17, \"output\": 0.43 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"thedrummer/unslopnemo-12b\": {\n        \"id\": \"thedrummer/unslopnemo-12b\",\n        \"name\": \"TheDrummer: UnslopNemo 12B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-11-09\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 0.4 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"thedrummer/skyfall-36b-v2\": {\n        \"id\": \"thedrummer/skyfall-36b-v2\",\n        \"name\": \"TheDrummer: Skyfall 36B V2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 0.8 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"thedrummer/cydonia-24b-v4.1\": {\n        \"id\": \"thedrummer/cydonia-24b-v4.1\",\n        \"name\": \"TheDrummer: Cydonia 24B V4.1\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-27\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.5 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"google/gemini-2.5-flash-lite\": {\n        \"id\": \"google/gemini-2.5-flash-lite\",\n        \"name\": \"Google: Gemini 2.5 Flash Lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.4,\n          \"reasoning\": 0.4,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.083333\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"google/gemma-4-31b-it\": {\n        \"id\": \"google/gemma-4-31b-it\",\n        \"name\": \"Google: Gemma 4 31B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.14, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"google/gemini-2.5-flash-image\": {\n        \"id\": \"google/gemini-2.5-flash-image\",\n        \"name\": \"Google: Nano Banana (Gemini 2.5 Flash Image)\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-08\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\"],\n          \"output\": [\"image\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Google: Gemini 2.5 Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"reasoning\": 2.5,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.083333\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"google/gemini-3.1-flash-lite-preview\": {\n        \"id\": \"google/gemini-3.1-flash-lite-preview\",\n        \"name\": \"Google: Gemini 3.1 Flash Lite Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1.5, \"reasoning\": 1.5 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"google/gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"Google: Gemini 2.5 Flash Lite Preview 09-2025\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.4,\n          \"reasoning\": 0.4,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.083333\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3-pro-image-preview\": {\n        \"id\": \"google/gemini-3-pro-image-preview\",\n        \"name\": \"Google: Nano Banana Pro (Gemini 3 Pro Image Preview)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\"],\n          \"output\": [\"image\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"reasoning\": 12 },\n        \"limit\": { \"context\": 65536, \"output\": 32768 }\n      },\n      \"google/gemma-3-12b-it\": {\n        \"id\": \"google/gemma-3-12b-it\",\n        \"name\": \"Google: Gemma 3 12B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.13, \"cache_read\": 0.015 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"google/gemini-2.5-pro-preview\": {\n        \"id\": \"google/gemini-2.5-pro-preview\",\n        \"name\": \"Google: Gemini 2.5 Pro Preview 06-05\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"reasoning\": 10,\n          \"cache_read\": 0.125,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-3-4b-it\": {\n        \"id\": \"google/gemma-3-4b-it\",\n        \"name\": \"Google: Gemma 3 4B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.08 },\n        \"limit\": { \"context\": 131072, \"output\": 19200 }\n      },\n      \"google/gemini-3.1-flash-image-preview\": {\n        \"id\": \"google/gemini-3.1-flash-image-preview\",\n        \"name\": \"Google: Nano Banana 2 (Gemini 3.1 Flash Image Preview)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\"],\n          \"output\": [\"image\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3 },\n        \"limit\": { \"context\": 65536, \"output\": 65536 }\n      },\n      \"google/gemini-2.0-flash-001\": {\n        \"id\": \"google/gemini-2.0-flash-001\",\n        \"name\": \"Google: Gemini 2.0 Flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.4,\n          \"cache_read\": 0.025,\n          \"cache_write\": 0.083333\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"google/gemini-3-flash-preview\": {\n        \"id\": \"google/gemini-3-flash-preview\",\n        \"name\": \"Google: Gemini 3 Flash Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"reasoning\": 3,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.083333\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Google: Gemini 2.5 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"reasoning\": 10,\n          \"cache_read\": 0.125,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/lyria-3-clip-preview\": {\n        \"id\": \"google/lyria-3-clip-preview\",\n        \"name\": \"Google: Lyria 3 Clip Preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\"],\n          \"output\": [\"audio\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-2-27b-it\": {\n        \"id\": \"google/gemma-2-27b-it\",\n        \"name\": \"Google: Gemma 2 27B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-24\",\n        \"last_updated\": \"2024-06-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.65, \"output\": 0.65 },\n        \"limit\": { \"context\": 8192, \"output\": 2048 }\n      },\n      \"google/gemma-3-27b-it\": {\n        \"id\": \"google/gemma-3-27b-it\",\n        \"name\": \"Google: Gemma 3 27B\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.11, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"google/gemini-2.5-pro-preview-05-06\": {\n        \"id\": \"google/gemini-2.5-pro-preview-05-06\",\n        \"name\": \"Google: Gemini 2.5 Pro Preview 05-06\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"reasoning\": 10,\n          \"cache_read\": 0.125,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65535 }\n      },\n      \"google/gemma-2-9b-it\": {\n        \"id\": \"google/gemma-2-9b-it\",\n        \"name\": \"Google: Gemma 2 9B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2024-06-28\",\n        \"last_updated\": \"2024-06-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.09 },\n        \"limit\": { \"context\": 8192, \"output\": 1639 }\n      },\n      \"google/gemma-3n-e4b-it\": {\n        \"id\": \"google/gemma-3n-e4b-it\",\n        \"name\": \"Google: Gemma 3n 4B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.04 },\n        \"limit\": { \"context\": 32768, \"output\": 6554 }\n      },\n      \"google/gemini-3.1-pro-preview-customtools\": {\n        \"id\": \"google/gemini-3.1-pro-preview-customtools\",\n        \"name\": \"Google: Gemini 3.1 Pro Preview Custom Tools\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"reasoning\": 12 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/lyria-3-pro-preview\": {\n        \"id\": \"google/lyria-3-pro-preview\",\n        \"name\": \"Google: Lyria 3 Pro Preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\"],\n          \"output\": [\"audio\", \"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-2.0-flash-lite-001\": {\n        \"id\": \"google/gemini-2.0-flash-lite-001\",\n        \"name\": \"Google: Gemini 2.0 Flash Lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"google/gemini-3.1-pro-preview\": {\n        \"id\": \"google/gemini-3.1-pro-preview\",\n        \"name\": \"Google: Gemini 3.1 Pro Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": {\n          \"input\": [\"audio\", \"image\", \"pdf\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"reasoning\": 12 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemma-4-26b-a4b-it\": {\n        \"id\": \"google/gemma-4-26b-a4b-it\",\n        \"name\": \"Google: Gemma 4 26B A4B\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-03\",\n        \"last_updated\": \"2026-04-11\",\n        \"modalities\": {\n          \"input\": [\"image\", \"text\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.12, \"output\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"liquid/lfm-2-24b-a2b\": {\n        \"id\": \"liquid/lfm-2-24b-a2b\",\n        \"name\": \"LiquidAI: LFM2-24B-A2B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.03, \"output\": 0.12 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"undi95/remm-slerp-l2-13b\": {\n        \"id\": \"undi95/remm-slerp-l2-13b\",\n        \"name\": \"ReMM SLERP 13B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2023-07-22\",\n        \"last_updated\": \"2026-03-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 0.65 },\n        \"limit\": { \"context\": 6144, \"output\": 4096 }\n      }\n    }\n  },\n  \"zhipuai\": {\n    \"id\": \"zhipuai\",\n    \"env\": [\"ZHIPU_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://open.bigmodel.cn/api/paas/v4\",\n    \"name\": \"Zhipu AI\",\n    \"doc\": \"https://docs.z.ai/guides/overview/pricing\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3.2,\n          \"cache_read\": 0.2,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 6,\n          \"output\": 24,\n          \"cache_read\": 1.3,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-5v-turbo\": {\n        \"id\": \"glm-5v-turbo\",\n        \"name\": \"glm-5v-turbo\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 22,\n          \"cache_read\": 1.2,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.5\": {\n        \"id\": \"glm-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"glm-4.7-flash\": {\n        \"id\": \"glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.5v\": {\n        \"id\": \"glm-4.5v\",\n        \"name\": \"GLM-4.5V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-11\",\n        \"last_updated\": \"2025-08-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 64000, \"output\": 16384 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"GLM-4.5-Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 1.1,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"glm-4.6v\": {\n        \"id\": \"glm-4.6v\",\n        \"name\": \"GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"glm-4.5-flash\": {\n        \"id\": \"glm-4.5-flash\",\n        \"name\": \"GLM-4.5-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-4.7-flashx\": {\n        \"id\": \"glm-4.7-flashx\",\n        \"name\": \"GLM-4.7-FlashX\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.07,\n          \"output\": 0.4,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"togetherai\": {\n    \"id\": \"togetherai\",\n    \"env\": [\"TOGETHER_API_KEY\"],\n    \"npm\": \"@ai-sdk/togetherai\",\n    \"name\": \"Together AI\",\n    \"doc\": \"https://docs.together.ai/docs/serverless-models\",\n    \"models\": {\n      \"meta-llama/Llama-3.3-70B-Instruct-Turbo\": {\n        \"id\": \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n        \"name\": \"Llama 3.3 70B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.88, \"output\": 0.88 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2.8 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2.6\": {\n        \"id\": \"moonshotai/Kimi-K2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.2, \"output\": 4.5, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 262144, \"output\": 131000 }\n      },\n      \"essentialai/Rnj-1-Instruct\": {\n        \"id\": \"essentialai/Rnj-1-Instruct\",\n        \"name\": \"Rnj-1 Instruct\",\n        \"family\": \"rnj\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12-05\",\n        \"last_updated\": \"2025-12-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8\",\n        \"name\": \"Qwen3 Coder 480B A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Instruct-2507-tput\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Instruct-2507-tput\",\n        \"name\": \"Qwen3 235B A22B Instruct 2507 FP8\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"Qwen/Qwen3.5-397B-A17B\": {\n        \"id\": \"Qwen/Qwen3.5-397B-A17B\",\n        \"name\": \"Qwen3.5 397B A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 130000 }\n      },\n      \"Qwen/Qwen3-Coder-Next-FP8\": {\n        \"id\": \"Qwen/Qwen3-Coder-Next-FP8\",\n        \"name\": \"Qwen3 Coder Next FP8\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02-03\",\n        \"release_date\": \"2026-02-03\",\n        \"last_updated\": \"2026-02-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"deepseek-ai/DeepSeek-V3\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3\",\n        \"name\": \"DeepSeek V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-05-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.25, \"output\": 1.25 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"deepseek-ai/DeepSeek-V3-1\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3-1\",\n        \"name\": \"DeepSeek V3.1\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-21\",\n        \"last_updated\": \"2025-08-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.7 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"deepseek-ai/DeepSeek-V4-Pro\": {\n        \"id\": \"deepseek-ai/DeepSeek-V4-Pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.1, \"output\": 4.4, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 512000, \"output\": 384000 }\n      },\n      \"deepseek-ai/DeepSeek-R1\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1\",\n        \"name\": \"DeepSeek R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2025-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3, \"output\": 7 },\n        \"limit\": { \"context\": 163839, \"output\": 163839 }\n      },\n      \"zai-org/GLM-5.1\": {\n        \"id\": \"zai-org/GLM-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.7\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"openai/gpt-oss-120b\": {\n        \"id\": \"openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"google/gemma-4-31B-it\": {\n        \"id\": \"google/gemma-4-31B-it\",\n        \"name\": \"Gemma 4 31B Instruct\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      }\n    }\n  },\n  \"minimax-coding-plan\": {\n    \"id\": \"minimax-coding-plan\",\n    \"env\": [\"MINIMAX_API_KEY\"],\n    \"npm\": \"@ai-sdk/anthropic\",\n    \"api\": \"https://api.minimax.io/anthropic/v1\",\n    \"name\": \"MiniMax Coding Plan (minimax.io)\",\n    \"doc\": \"https://platform.minimax.io/docs/coding-plan/intro\",\n    \"models\": {\n      \"MiniMax-M2.1\": {\n        \"id\": \"MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7\": {\n        \"id\": \"MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7-highspeed\": {\n        \"id\": \"MiniMax-M2.7-highspeed\",\n        \"name\": \"MiniMax-M2.7-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2\": {\n        \"id\": \"MiniMax-M2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 196608, \"output\": 128000 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.5-highspeed\": {\n        \"id\": \"MiniMax-M2.5-highspeed\",\n        \"name\": \"MiniMax-M2.5-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"kuae-cloud-coding-plan\": {\n    \"id\": \"kuae-cloud-coding-plan\",\n    \"env\": [\"KUAE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://coding-plan-endpoint.kuaecloud.net/v1\",\n    \"name\": \"KUAE Cloud Coding Plan\",\n    \"doc\": \"https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/\",\n    \"models\": {\n      \"GLM-4.7\": {\n        \"id\": \"GLM-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"tencent-coding-plan\": {\n    \"id\": \"tencent-coding-plan\",\n    \"env\": [\"TENCENT_CODING_PLAN_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.lkeap.cloud.tencent.com/coding/v3\",\n    \"name\": \"Tencent Coding Plan (China)\",\n    \"doc\": \"https://cloud.tencent.com/document/product/1772/128947\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 202752, \"output\": 16384 }\n      },\n      \"hunyuan-t1\": {\n        \"id\": \"hunyuan-t1\",\n        \"name\": \"Hunyuan-T1\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-03-08\",\n        \"last_updated\": \"2026-03-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"hunyuan-turbos\": {\n        \"id\": \"hunyuan-turbos\",\n        \"name\": \"Hunyuan-TurboS\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-08\",\n        \"last_updated\": \"2026-03-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"tc-code-latest\": {\n        \"id\": \"tc-code-latest\",\n        \"name\": \"Auto\",\n        \"family\": \"auto\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-08\",\n        \"last_updated\": \"2026-03-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"hunyuan-2.0-instruct\": {\n        \"id\": \"hunyuan-2.0-instruct\",\n        \"name\": \"Tencent HY 2.0 Instruct\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-08\",\n        \"last_updated\": \"2026-03-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi-K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 32768 }\n      },\n      \"hunyuan-2.0-thinking\": {\n        \"id\": \"hunyuan-2.0-thinking\",\n        \"name\": \"Tencent HY 2.0 Think\",\n        \"family\": \"hunyuan\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-03-08\",\n        \"last_updated\": \"2026-03-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      }\n    }\n  },\n  \"requesty\": {\n    \"id\": \"requesty\",\n    \"env\": [\"REQUESTY_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://router.requesty.ai/v1\",\n    \"name\": \"Requesty\",\n    \"doc\": \"https://requesty.ai/solution/llm-routing/models\",\n    \"models\": {\n      \"anthropic/claude-3-7-sonnet\": {\n        \"id\": \"anthropic/claude-3-7-sonnet\",\n        \"name\": \"Claude Sonnet 3.7\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2025-02-19\",\n        \"last_updated\": \"2025-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-sonnet-4-6\": {\n        \"id\": \"anthropic/claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-opus-4-5\": {\n        \"id\": \"anthropic/claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4\": {\n        \"id\": \"anthropic/claude-opus-4\",\n        \"name\": \"Claude Opus 4\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-opus-4-6\": {\n        \"id\": \"anthropic/claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-haiku-4-5\": {\n        \"id\": \"anthropic/claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-01\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 62000 }\n      },\n      \"xai/grok-4\": {\n        \"id\": \"xai/grok-4\",\n        \"name\": \"Grok 4\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-09\",\n        \"last_updated\": \"2025-09-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.75,\n          \"cache_write\": 3\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"xai/grok-4-fast\": {\n        \"id\": \"xai/grok-4-fast\",\n        \"name\": \"Grok 4 Fast\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 0.5,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.2\n        },\n        \"limit\": { \"context\": 2000000, \"output\": 64000 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"GPT-4o Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.4-pro\": {\n        \"id\": \"openai/gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180, \"cache_read\": 30 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"GPT-5.1-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": {\n          \"input\": [\"text\", \"audio\", \"image\", \"video\"],\n          \"output\": [\"text\", \"audio\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"o4 Mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.1-chat\": {\n        \"id\": \"openai/gpt-5.1-chat\",\n        \"name\": \"GPT-5.1 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5-mini\": {\n        \"id\": \"openai/gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 128000, \"output\": 32000 }\n      },\n      \"openai/gpt-5-chat\": {\n        \"id\": \"openai/gpt-5-chat\",\n        \"name\": \"GPT-5 Chat (latest)\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.1-codex-max\": {\n        \"id\": \"openai/gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1-Codex-Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 9, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1-mini\": {\n        \"id\": \"openai/gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5-codex\": {\n        \"id\": \"openai/gpt-5-codex\",\n        \"name\": \"GPT-5 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.3-codex\": {\n        \"id\": \"openai/gpt-5.3-codex\",\n        \"name\": \"GPT-5.3-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-image\": {\n        \"id\": \"openai/gpt-5-image\",\n        \"name\": \"GPT-5 Image\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10-01\",\n        \"release_date\": \"2025-10-14\",\n        \"last_updated\": \"2025-10-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"GPT-5.2-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.2-pro\": {\n        \"id\": \"openai/gpt-5.2-pro\",\n        \"name\": \"GPT-5.2 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5-nano\": {\n        \"id\": \"openai/gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 16000, \"output\": 4000 }\n      },\n      \"openai/gpt-5.1-codex-mini\": {\n        \"id\": \"openai/gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1-Codex-Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.075,\n          \"cache_write\": 0.55\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3-pro-preview\": {\n        \"id\": \"google/gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"cache_write\": 4.5\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"google/gemini-3-flash-preview\": {\n        \"id\": \"google/gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4-1\": {\n        \"id\": \"anthropic/claude-opus-4-1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-sonnet-4-5\": {\n        \"id\": \"anthropic/claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"openai/gpt-5-pro\": {\n        \"id\": \"openai/gpt-5-pro\",\n        \"name\": \"GPT-5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"output\": 272000 }\n      },\n      \"openai/gpt-5.2-chat\": {\n        \"id\": \"openai/gpt-5.2-chat\",\n        \"name\": \"GPT-5.2 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4.1\": {\n        \"id\": \"openai/gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.5,\n          \"output\": 15,\n          \"cache_read\": 0.25,\n          \"context_over_200k\": { \"input\": 5, \"output\": 22.5, \"cache_read\": 0.5 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.31,\n          \"cache_write\": 2.375,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 15,\n            \"cache_read\": 0.25\n          }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      }\n    }\n  },\n  \"zai\": {\n    \"id\": \"zai\",\n    \"env\": [\"ZHIPU_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.z.ai/api/paas/v4\",\n    \"name\": \"Z.AI\",\n    \"doc\": \"https://docs.z.ai/guides/overview/pricing\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 3.2,\n          \"cache_read\": 0.2,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-4.7-flashx\": {\n        \"id\": \"glm-4.7-flashx\",\n        \"name\": \"GLM-4.7-FlashX\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.07,\n          \"output\": 0.4,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-27\",\n        \"last_updated\": \"2026-03-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.4,\n          \"output\": 4.4,\n          \"cache_read\": 0.26,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.5-flash\": {\n        \"id\": \"glm-4.5-flash\",\n        \"name\": \"GLM-4.5-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"glm-4.6v\": {\n        \"id\": \"glm-4.6v\",\n        \"name\": \"GLM-4.6V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"glm-4.5-air\": {\n        \"id\": \"glm-4.5-air\",\n        \"name\": \"GLM-4.5-Air\",\n        \"family\": \"glm-air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 1.1,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      },\n      \"glm-4.5v\": {\n        \"id\": \"glm-4.5v\",\n        \"name\": \"GLM-4.5V\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-11\",\n        \"last_updated\": \"2025-08-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 1.8 },\n        \"limit\": { \"context\": 64000, \"output\": 16384 }\n      },\n      \"glm-4.7-flash\": {\n        \"id\": \"glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-5v-turbo\": {\n        \"id\": \"glm-5v-turbo\",\n        \"name\": \"glm-5v-turbo\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.2,\n          \"output\": 4,\n          \"cache_read\": 0.24,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-5-turbo\": {\n        \"id\": \"glm-5-turbo\",\n        \"name\": \"GLM-5-Turbo\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.2,\n          \"output\": 4,\n          \"cache_read\": 0.24,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"glm-4.5\": {\n        \"id\": \"glm-4.5\",\n        \"name\": \"GLM-4.5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.2,\n          \"cache_read\": 0.11,\n          \"cache_write\": 0\n        },\n        \"limit\": { \"context\": 131072, \"output\": 98304 }\n      }\n    }\n  },\n  \"opencode\": {\n    \"id\": \"opencode\",\n    \"env\": [\"OPENCODE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://opencode.ai/zen/v1\",\n    \"name\": \"OpenCode Zen\",\n    \"doc\": \"https://opencode.ai/docs/zen\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"minimax-m2.1-free\": {\n        \"id\": \"minimax-m2.1-free\",\n        \"name\": \"MiniMax M2.1 Free\",\n        \"family\": \"minimax-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"status\": \"deprecated\",\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"glm-4.7\": {\n        \"id\": \"glm-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"status\": \"deprecated\"\n      },\n      \"qwen3.6-plus\": {\n        \"id\": \"qwen3.6-plus\",\n        \"name\": \"Qwen3.6 Plus\",\n        \"family\": \"qwen3.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.625\n        },\n        \"limit\": { \"context\": 262144, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"claude-sonnet-4\": {\n        \"id\": \"claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"kimi-k2\": {\n        \"id\": \"kimi-k2\",\n        \"name\": \"Kimi K2\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2.5, \"cache_read\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"status\": \"deprecated\"\n      },\n      \"kimi-k2.5-free\": {\n        \"id\": \"kimi-k2.5-free\",\n        \"name\": \"Kimi K2.5 Free\",\n        \"family\": \"kimi-free\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"status\": \"deprecated\"\n      },\n      \"gpt-5.4-pro\": {\n        \"id\": \"gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180, \"cache_read\": 30 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"claude-3-5-haiku\": {\n        \"id\": \"claude-3-5-haiku\",\n        \"name\": \"Claude Haiku 3.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 },\n        \"status\": \"deprecated\",\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"qwen3.5-plus\": {\n        \"id\": \"qwen3.5-plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"family\": \"qwen3.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.2,\n          \"output\": 1.2,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.25\n        },\n        \"limit\": { \"context\": 262144, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"gemini-3-pro\": {\n        \"id\": \"gemini-3-pro\",\n        \"name\": \"Gemini 3 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 },\n        \"status\": \"deprecated\",\n        \"provider\": { \"npm\": \"@ai-sdk/google\" }\n      },\n      \"mimo-v2-flash-free\": {\n        \"id\": \"mimo-v2-flash-free\",\n        \"name\": \"MiMo V2 Flash Free\",\n        \"family\": \"mimo-flash-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 },\n        \"status\": \"deprecated\"\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.07, \"output\": 8.5, \"cache_read\": 0.107 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"gemini-3.1-pro\": {\n        \"id\": \"gemini-3.1-pro\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/google\" }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.07, \"output\": 8.5, \"cache_read\": 0.107 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"mimo-v2-omni-free\": {\n        \"id\": \"mimo-v2-omni-free\",\n        \"name\": \"MiMo V2 Omni Free\",\n        \"family\": \"mimo-omni-free\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 64000 },\n        \"status\": \"deprecated\"\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2.5, \"cache_read\": 0.4 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 },\n        \"status\": \"deprecated\"\n      },\n      \"claude-opus-4-5\": {\n        \"id\": \"claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"big-pickle\": {\n        \"id\": \"big-pickle\",\n        \"name\": \"Big Pickle\",\n        \"family\": \"big-pickle\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-10-17\",\n        \"last_updated\": \"2025-10-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"qwen3.6-plus-free\": {\n        \"id\": \"qwen3.6-plus-free\",\n        \"name\": \"Qwen3.6 Plus Free\",\n        \"family\": \"qwen-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1048576, \"output\": 64000 },\n        \"status\": \"deprecated\"\n      },\n      \"glm-4.6\": {\n        \"id\": \"glm-4.6\",\n        \"name\": \"GLM-4.6\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"status\": \"deprecated\"\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1 Codex Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"claude-opus-4-1\": {\n        \"id\": \"claude-opus-4-1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"gpt-5.3-codex-spark\": {\n        \"id\": \"gpt-5.3-codex-spark\",\n        \"name\": \"GPT-5.3 Codex Spark\",\n        \"family\": \"gpt-codex-spark\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"mimo-v2-pro-free\": {\n        \"id\": \"mimo-v2-pro-free\",\n        \"name\": \"MiMo V2 Pro Free\",\n        \"family\": \"mimo-pro-free\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 1048576, \"output\": 64000 },\n        \"status\": \"deprecated\"\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"trinity-large-preview-free\": {\n        \"id\": \"trinity-large-preview-free\",\n        \"name\": \"Trinity Large Preview\",\n        \"family\": \"trinity\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-01-28\",\n        \"last_updated\": \"2026-01-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 },\n        \"status\": \"deprecated\"\n      },\n      \"minimax-m2.5-free\": {\n        \"id\": \"minimax-m2.5-free\",\n        \"name\": \"MiniMax M2.5 Free\",\n        \"family\": \"minimax-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"glm-5.1\": {\n        \"id\": \"glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-07\",\n        \"last_updated\": \"2026-04-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gemini-3-flash\": {\n        \"id\": \"gemini-3-flash\",\n        \"name\": \"Gemini 3 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/google\" }\n      },\n      \"nemotron-3-super-free\": {\n        \"id\": \"nemotron-3-super-free\",\n        \"name\": \"Nemotron 3 Super Free\",\n        \"family\": \"nemotron-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2026-02\",\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 128000 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"GPT-5 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.07, \"output\": 8.5, \"cache_read\": 0.107 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"qwen3-coder\": {\n        \"id\": \"qwen3-coder\",\n        \"name\": \"Qwen3 Coder\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 1.8 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 },\n        \"status\": \"deprecated\"\n      },\n      \"minimax-m2.5\": {\n        \"id\": \"minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"glm-4.7-free\": {\n        \"id\": \"glm-4.7-free\",\n        \"name\": \"GLM-4.7 Free\",\n        \"family\": \"glm-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"status\": \"deprecated\"\n      },\n      \"grok-code\": {\n        \"id\": \"grok-code\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-20\",\n        \"last_updated\": \"2025-08-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0, \"cache_write\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 },\n        \"status\": \"deprecated\"\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"hy3-preview-free\": {\n        \"id\": \"hy3-preview-free\",\n        \"name\": \"Hy3 preview Free\",\n        \"family\": \"hy3-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"kimi-k2.6\": {\n        \"id\": \"kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"minimax-m2.1\": {\n        \"id\": \"minimax-m2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"status\": \"deprecated\"\n      },\n      \"gpt-5.5-pro\": {\n        \"id\": \"gpt-5.5-pro\",\n        \"name\": \"GPT-5.5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 180, \"cache_read\": 30 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"ling-2.6-flash-free\": {\n        \"id\": \"ling-2.6-flash-free\",\n        \"name\": \"Ling 2.6 Flash Free\",\n        \"family\": \"ling-flash-free\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262100, \"output\": 32800 }\n      },\n      \"glm-5-free\": {\n        \"id\": \"glm-5-free\",\n        \"name\": \"GLM-5 Free\",\n        \"family\": \"glm-free\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"status\": \"deprecated\"\n      },\n      \"minimax-m2.7\": {\n        \"id\": \"minimax-m2.7\",\n        \"name\": \"MiniMax M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0, \"cache_read\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"claude-opus-4-7\": {\n        \"id\": \"claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1 Codex Mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.07, \"output\": 8.5, \"cache_read\": 0.107 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"claude-sonnet-4-5\": {\n        \"id\": \"claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"gpt-5.4-nano\": {\n        \"id\": \"gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"gpt-5.5\": {\n        \"id\": \"gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 30,\n          \"cache_read\": 0.5,\n          \"context_over_200k\": { \"input\": 10, \"output\": 45, \"cache_read\": 1 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.5,\n          \"output\": 15,\n          \"cache_read\": 0.25,\n          \"context_over_200k\": { \"input\": 5, \"output\": 22.5, \"cache_read\": 0.5 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai\" }\n      }\n    }\n  },\n  \"alibaba\": {\n    \"id\": \"alibaba\",\n    \"env\": [\"DASHSCOPE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://dashscope-intl.aliyuncs.com/compatible-mode/v1\",\n    \"name\": \"Alibaba\",\n    \"doc\": \"https://www.alibabacloud.com/help/en/model-studio/models\",\n    \"models\": {\n      \"qwen-turbo\": {\n        \"id\": \"qwen-turbo\",\n        \"name\": \"Qwen Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-04-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.2, \"reasoning\": 0.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 16384 }\n      },\n      \"qwen-omni-turbo-realtime\": {\n        \"id\": \"qwen-omni-turbo-realtime\",\n        \"name\": \"Qwen-Omni Turbo Realtime\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-05-08\",\n        \"last_updated\": \"2025-05-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.27,\n          \"output\": 1.07,\n          \"input_audio\": 4.44,\n          \"output_audio\": 8.89\n        },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"qwen3-livetranslate-flash-realtime\": {\n        \"id\": \"qwen3-livetranslate-flash-realtime\",\n        \"name\": \"Qwen3-LiveTranslate Flash Realtime\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-22\",\n        \"last_updated\": \"2025-09-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 10,\n          \"output\": 10,\n          \"input_audio\": 10,\n          \"output_audio\": 38\n        },\n        \"limit\": { \"context\": 53248, \"output\": 4096 }\n      },\n      \"qwen3.6-plus\": {\n        \"id\": \"qwen3.6-plus\",\n        \"name\": \"Qwen3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.276,\n          \"output\": 1.651,\n          \"cache_read\": 0.028,\n          \"cache_write\": 0.344\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen-max\": {\n        \"id\": \"qwen-max\",\n        \"name\": \"Qwen Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-03\",\n        \"last_updated\": \"2025-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.6, \"output\": 6.4 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"qwen3-vl-235b-a22b\": {\n        \"id\": \"qwen3-vl-235b-a22b\",\n        \"name\": \"Qwen3-VL 235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.8, \"reasoning\": 8.4 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen2-5-32b-instruct\": {\n        \"id\": \"qwen2-5-32b-instruct\",\n        \"name\": \"Qwen2.5 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.8 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3.5-plus\": {\n        \"id\": \"qwen3.5-plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-16\",\n        \"last_updated\": \"2026-02-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2.4, \"reasoning\": 2.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwen3.5-27b\": {\n        \"id\": \"qwen3.5-27b\",\n        \"name\": \"Qwen3.5 27B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-23\",\n        \"last_updated\": \"2026-02-23\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2.4 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3-coder-plus\": {\n        \"id\": \"qwen3-coder-plus\",\n        \"name\": \"Qwen3 Coder Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 5 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"qwen2-5-7b-instruct\": {\n        \"id\": \"qwen2-5-7b-instruct\",\n        \"name\": \"Qwen2.5 7B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.175, \"output\": 0.7 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen-plus\": {\n        \"id\": \"qwen-plus\",\n        \"name\": \"Qwen Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.2, \"reasoning\": 4 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"qwen3-next-80b-a3b-instruct\": {\n        \"id\": \"qwen3-next-80b-a3b-instruct\",\n        \"name\": \"Qwen3-Next 80B-A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen-omni-turbo\": {\n        \"id\": \"qwen-omni-turbo\",\n        \"name\": \"Qwen-Omni Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01-19\",\n        \"last_updated\": \"2025-03-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.07,\n          \"output\": 0.27,\n          \"input_audio\": 4.44,\n          \"output_audio\": 8.89\n        },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"qwen3.6-35b-a3b\": {\n        \"id\": \"qwen3.6-35b-a3b\",\n        \"name\": \"Qwen3.6 35B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-17\",\n        \"last_updated\": \"2026-04-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.248, \"output\": 1.485 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen2-5-vl-7b-instruct\": {\n        \"id\": \"qwen2-5-vl-7b-instruct\",\n        \"name\": \"Qwen2.5-VL 7B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.05 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-14b\": {\n        \"id\": \"qwen3-14b\",\n        \"name\": \"Qwen3 14B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.4, \"reasoning\": 4.2 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen-vl-plus\": {\n        \"id\": \"qwen-vl-plus\",\n        \"name\": \"Qwen-VL Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2025-08-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 0.63 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-max\": {\n        \"id\": \"qwen3-max\",\n        \"name\": \"Qwen3 Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3.5-35b-a3b\": {\n        \"id\": \"qwen3.5-35b-a3b\",\n        \"name\": \"Qwen3.5 35B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-23\",\n        \"last_updated\": \"2026-02-23\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen-flash\": {\n        \"id\": \"qwen-flash\",\n        \"name\": \"Qwen Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4 },\n        \"limit\": { \"context\": 1000000, \"output\": 32768 }\n      },\n      \"qwen2-5-72b-instruct\": {\n        \"id\": \"qwen2-5-72b-instruct\",\n        \"name\": \"Qwen2.5 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 5.6 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-omni-flash\": {\n        \"id\": \"qwen3-omni-flash\",\n        \"name\": \"Qwen3-Omni Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.43,\n          \"output\": 1.66,\n          \"input_audio\": 3.81,\n          \"output_audio\": 15.11\n        },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"qwen3-vl-30b-a3b\": {\n        \"id\": \"qwen3-vl-30b-a3b\",\n        \"name\": \"Qwen3-VL 30B-A3B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.8, \"reasoning\": 2.4 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen3-coder-30b-a3b-instruct\": {\n        \"id\": \"qwen3-coder-30b-a3b-instruct\",\n        \"name\": \"Qwen3-Coder 30B-A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.45, \"output\": 2.25 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3-asr-flash\": {\n        \"id\": \"qwen3-asr-flash\",\n        \"name\": \"Qwen3-ASR Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-08\",\n        \"last_updated\": \"2025-09-08\",\n        \"modalities\": { \"input\": [\"audio\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.035, \"output\": 0.035 },\n        \"limit\": { \"context\": 53248, \"output\": 4096 }\n      },\n      \"qwen3.5-122b-a10b\": {\n        \"id\": \"qwen3.5-122b-a10b\",\n        \"name\": \"Qwen3.5 122B-A10B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-23\",\n        \"last_updated\": \"2026-02-23\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 3.2 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen-mt-turbo\": {\n        \"id\": \"qwen-mt-turbo\",\n        \"name\": \"Qwen-MT Turbo\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.16, \"output\": 0.49 },\n        \"limit\": { \"context\": 16384, \"output\": 8192 }\n      },\n      \"qwen-vl-ocr\": {\n        \"id\": \"qwen-vl-ocr\",\n        \"name\": \"Qwen-VL OCR\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-10-28\",\n        \"last_updated\": \"2025-04-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.72, \"output\": 0.72 },\n        \"limit\": { \"context\": 34096, \"output\": 4096 }\n      },\n      \"qvq-max\": {\n        \"id\": \"qvq-max\",\n        \"name\": \"QVQ Max\",\n        \"family\": \"qvq\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-03-25\",\n        \"last_updated\": \"2025-03-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 4.8 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-next-80b-a3b-thinking\": {\n        \"id\": \"qwen3-next-80b-a3b-thinking\",\n        \"name\": \"Qwen3-Next 80B-A3B (Thinking)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09\",\n        \"last_updated\": \"2025-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen3-coder-flash\": {\n        \"id\": \"qwen3-coder-flash\",\n        \"name\": \"Qwen3 Coder Flash\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-28\",\n        \"last_updated\": \"2025-07-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 65536 }\n      },\n      \"qwq-plus\": {\n        \"id\": \"qwq-plus\",\n        \"name\": \"QwQ Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-03-05\",\n        \"last_updated\": \"2025-03-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 2.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen2-5-omni-7b\": {\n        \"id\": \"qwen2-5-omni-7b\",\n        \"name\": \"Qwen2.5-Omni 7B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-12\",\n        \"last_updated\": \"2024-12\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"input_audio\": 6.76 },\n        \"limit\": { \"context\": 32768, \"output\": 2048 }\n      },\n      \"qwen3-coder-480b-a35b-instruct\": {\n        \"id\": \"qwen3-coder-480b-a35b-instruct\",\n        \"name\": \"Qwen3-Coder 480B-A35B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.5, \"output\": 7.5 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen-vl-max\": {\n        \"id\": \"qwen-vl-max\",\n        \"name\": \"Qwen-VL Max\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-08\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 3.2 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-vl-plus\": {\n        \"id\": \"qwen3-vl-plus\",\n        \"name\": \"Qwen3-VL Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.6, \"reasoning\": 4.8 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"qwen3-235b-a22b\": {\n        \"id\": \"qwen3-235b-a22b\",\n        \"name\": \"Qwen3 235B-A22B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.8, \"reasoning\": 8.4 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"qwen-plus-character-ja\": {\n        \"id\": \"qwen-plus-character-ja\",\n        \"name\": \"Qwen Plus Character (Japanese)\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-01\",\n        \"last_updated\": \"2024-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.4 },\n        \"limit\": { \"context\": 8192, \"output\": 512 }\n      },\n      \"qwen2-5-vl-72b-instruct\": {\n        \"id\": \"qwen2-5-vl-72b-instruct\",\n        \"name\": \"Qwen2.5-VL 72B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.8, \"output\": 8.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-8b\": {\n        \"id\": \"qwen3-8b\",\n        \"name\": \"Qwen3 8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.18, \"output\": 0.7, \"reasoning\": 2.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"qwen3-omni-flash-realtime\": {\n        \"id\": \"qwen3-omni-flash-realtime\",\n        \"name\": \"Qwen3-Omni Flash Realtime\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.52,\n          \"output\": 1.99,\n          \"input_audio\": 4.57,\n          \"output_audio\": 18.13\n        },\n        \"limit\": { \"context\": 65536, \"output\": 16384 }\n      },\n      \"qwen3.5-397b-a17b\": {\n        \"id\": \"qwen3.5-397b-a17b\",\n        \"name\": \"Qwen3.5 397B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-02-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen3.6-27b\": {\n        \"id\": \"qwen3.6-27b\",\n        \"name\": \"Qwen3.6 27B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen-mt-plus\": {\n        \"id\": \"qwen-mt-plus\",\n        \"name\": \"Qwen-MT Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-01\",\n        \"last_updated\": \"2025-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.46, \"output\": 7.37 },\n        \"limit\": { \"context\": 16384, \"output\": 8192 }\n      },\n      \"qwen3-32b\": {\n        \"id\": \"qwen3-32b\",\n        \"name\": \"Qwen3 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-04\",\n        \"last_updated\": \"2025-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 2.8, \"reasoning\": 8.4 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"qwen2-5-14b-instruct\": {\n        \"id\": \"qwen2-5-14b-instruct\",\n        \"name\": \"Qwen2.5 14B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-09\",\n        \"last_updated\": \"2024-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 1.4 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      }\n    }\n  },\n  \"inference\": {\n    \"id\": \"inference\",\n    \"env\": [\"INFERENCE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://inference.net/v1\",\n    \"name\": \"Inference\",\n    \"doc\": \"https://inference.net/models\",\n    \"models\": {\n      \"qwen/qwen-2.5-7b-vision-instruct\": {\n        \"id\": \"qwen/qwen-2.5-7b-vision-instruct\",\n        \"name\": \"Qwen 2.5 7B Vision Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.2 },\n        \"limit\": { \"context\": 125000, \"output\": 4096 }\n      },\n      \"qwen/qwen3-embedding-4b\": {\n        \"id\": \"qwen/qwen3-embedding-4b\",\n        \"name\": \"Qwen 3 Embedding 4B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 32000, \"output\": 2048 }\n      },\n      \"meta/llama-3.1-8b-instruct\": {\n        \"id\": \"meta/llama-3.1-8b-instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.025, \"output\": 0.025 },\n        \"limit\": { \"context\": 16000, \"output\": 4096 }\n      },\n      \"meta/llama-3.2-3b-instruct\": {\n        \"id\": \"meta/llama-3.2-3b-instruct\",\n        \"name\": \"Llama 3.2 3B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.02, \"output\": 0.02 },\n        \"limit\": { \"context\": 16000, \"output\": 4096 }\n      },\n      \"meta/llama-3.2-11b-vision-instruct\": {\n        \"id\": \"meta/llama-3.2-11b-vision-instruct\",\n        \"name\": \"Llama 3.2 11B Vision Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.055, \"output\": 0.055 },\n        \"limit\": { \"context\": 16000, \"output\": 4096 }\n      },\n      \"meta/llama-3.2-1b-instruct\": {\n        \"id\": \"meta/llama-3.2-1b-instruct\",\n        \"name\": \"Llama 3.2 1B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0.01 },\n        \"limit\": { \"context\": 16000, \"output\": 4096 }\n      },\n      \"osmosis/osmosis-structure-0.6b\": {\n        \"id\": \"osmosis/osmosis-structure-0.6b\",\n        \"name\": \"Osmosis Structure 0.6B\",\n        \"family\": \"osmosis\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.5 },\n        \"limit\": { \"context\": 4000, \"output\": 2048 }\n      },\n      \"google/gemma-3\": {\n        \"id\": \"google/gemma-3\",\n        \"name\": \"Google Gemma 3\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.3 },\n        \"limit\": { \"context\": 125000, \"output\": 4096 }\n      },\n      \"mistral/mistral-nemo-12b-instruct\": {\n        \"id\": \"mistral/mistral-nemo-12b-instruct\",\n        \"name\": \"Mistral Nemo 12B Instruct\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.038, \"output\": 0.1 },\n        \"limit\": { \"context\": 16000, \"output\": 4096 }\n      }\n    }\n  },\n  \"huggingface\": {\n    \"id\": \"huggingface\",\n    \"env\": [\"HF_TOKEN\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://router.huggingface.co/v1\",\n    \"name\": \"Hugging Face\",\n    \"doc\": \"https://huggingface.co/docs/inference-providers\",\n    \"models\": {\n      \"moonshotai/Kimi-K2.5\": {\n        \"id\": \"moonshotai/Kimi-K2.5\",\n        \"name\": \"Kimi-K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-01\",\n        \"last_updated\": \"2026-01-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2-Thinking\": {\n        \"id\": \"moonshotai/Kimi-K2-Thinking\",\n        \"name\": \"Kimi-K2-Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2-Instruct-0905\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct-0905\",\n        \"name\": \"Kimi-K2-Instruct-0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-04\",\n        \"last_updated\": \"2025-09-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"moonshotai/Kimi-K2.6\": {\n        \"id\": \"moonshotai/Kimi-K2.6\",\n        \"name\": \"Kimi-K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"moonshotai/Kimi-K2-Instruct\": {\n        \"id\": \"moonshotai/Kimi-K2-Instruct\",\n        \"name\": \"Kimi-K2-Instruct\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-14\",\n        \"last_updated\": \"2025-07-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"Qwen/Qwen3-Embedding-8B\": {\n        \"id\": \"Qwen/Qwen3-Embedding-8B\",\n        \"name\": \"Qwen 3 Embedding 8B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 32000, \"output\": 4096 }\n      },\n      \"Qwen/Qwen3-Coder-Next\": {\n        \"id\": \"Qwen/Qwen3-Coder-Next\",\n        \"name\": \"Qwen3-Coder-Next\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-03\",\n        \"last_updated\": \"2026-02-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"Qwen/Qwen3-235B-A22B-Thinking-2507\": {\n        \"id\": \"Qwen/Qwen3-235B-A22B-Thinking-2507\",\n        \"name\": \"Qwen3-235B-A22B-Thinking-2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 3 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"Qwen/Qwen3.5-397B-A17B\": {\n        \"id\": \"Qwen/Qwen3.5-397B-A17B\",\n        \"name\": \"Qwen3.5-397B-A17B\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-02-01\",\n        \"last_updated\": \"2026-02-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3.6 },\n        \"limit\": { \"context\": 262144, \"output\": 32768 }\n      },\n      \"Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Coder-480B-A35B-Instruct\",\n        \"name\": \"Qwen3-Coder-480B-A35B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Thinking\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Thinking\",\n        \"name\": \"Qwen3-Next-80B-A3B-Thinking\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-11\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"Qwen/Qwen3-Embedding-4B\": {\n        \"id\": \"Qwen/Qwen3-Embedding-4B\",\n        \"name\": \"Qwen 3 Embedding 4B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-01\",\n        \"last_updated\": \"2025-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.01, \"output\": 0 },\n        \"limit\": { \"context\": 32000, \"output\": 2048 }\n      },\n      \"Qwen/Qwen3-Next-80B-A3B-Instruct\": {\n        \"id\": \"Qwen/Qwen3-Next-80B-A3B-Instruct\",\n        \"name\": \"Qwen3-Next-80B-A3B-Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-09-11\",\n        \"last_updated\": \"2025-09-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 1 },\n        \"limit\": { \"context\": 262144, \"output\": 66536 }\n      },\n      \"deepseek-ai/DeepSeek-V3.2\": {\n        \"id\": \"deepseek-ai/DeepSeek-V3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 0.4 },\n        \"limit\": { \"context\": 163840, \"output\": 65536 }\n      },\n      \"deepseek-ai/DeepSeek-R1-0528\": {\n        \"id\": \"deepseek-ai/DeepSeek-R1-0528\",\n        \"name\": \"DeepSeek-R1-0528\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-28\",\n        \"last_updated\": \"2025-05-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3, \"output\": 5 },\n        \"limit\": { \"context\": 163840, \"output\": 163840 }\n      },\n      \"XiaomiMiMo/MiMo-V2-Flash\": {\n        \"id\": \"XiaomiMiMo/MiMo-V2-Flash\",\n        \"name\": \"MiMo-V2-Flash\",\n        \"family\": \"mimo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 262144, \"output\": 4096 }\n      },\n      \"zai-org/GLM-5.1\": {\n        \"id\": \"zai-org/GLM-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-03\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"zai-org/GLM-4.7-Flash\": {\n        \"id\": \"zai-org/GLM-4.7-Flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-08-08\",\n        \"last_updated\": \"2025-08-08\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"zai-org/GLM-4.7\": {\n        \"id\": \"zai-org/GLM-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.2, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"zai-org/GLM-5\": {\n        \"id\": \"zai-org/GLM-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-11\",\n        \"last_updated\": \"2026-02-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.1\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-10\",\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.7\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMaxAI/MiniMax-M2.5\": {\n        \"id\": \"MiniMaxAI/MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"deepseek-ai/DeepSeek-V4-Pro\": {\n        \"id\": \"deepseek-ai/DeepSeek-V4-Pro\",\n        \"name\": \"DeepSeek V4 Pro\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2026-04-24\",\n        \"last_updated\": \"2026-04-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.74, \"output\": 3.48, \"cache_read\": 0.145 },\n        \"limit\": { \"context\": 1048576, \"output\": 393216 }\n      }\n    }\n  },\n  \"cloudflare-workers-ai\": {\n    \"id\": \"cloudflare-workers-ai\",\n    \"env\": [\"CLOUDFLARE_ACCOUNT_ID\", \"CLOUDFLARE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1\",\n    \"name\": \"Cloudflare Workers AI\",\n    \"doc\": \"https://developers.cloudflare.com/workers-ai/models/\",\n    \"models\": {\n      \"@cf/meta/llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"@cf/meta/llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout 17B 16E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.27, \"output\": 0.85 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"@cf/nvidia/nemotron-3-120b-a12b\": {\n        \"id\": \"@cf/nvidia/nemotron-3-120b-a12b\",\n        \"name\": \"Nemotron 3 Super 120B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"@cf/moonshotai/kimi-k2.5\": {\n        \"id\": \"@cf/moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"@cf/moonshotai/kimi-k2.6\": {\n        \"id\": \"@cf/moonshotai/kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"@cf/zai-org/glm-4.7-flash\": {\n        \"id\": \"@cf/zai-org/glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"@cf/openai/gpt-oss-120b\": {\n        \"id\": \"@cf/openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.35, \"output\": 0.75 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"@cf/openai/gpt-oss-20b\": {\n        \"id\": \"@cf/openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"@cf/google/gemma-4-26b-a4b-it\": {\n        \"id\": \"@cf/google/gemma-4-26b-a4b-it\",\n        \"name\": \"Gemma 4 26B A4B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-15\",\n        \"last_updated\": \"2025-12-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 256000, \"output\": 16384 }\n      }\n    }\n  },\n  \"firmware\": {\n    \"id\": \"firmware\",\n    \"env\": [\"FIRMWARE_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://app.frogbot.ai/api/v1\",\n    \"name\": \"Firmware\",\n    \"doc\": \"https://docs.frogbot.ai\",\n    \"models\": {\n      \"claude-sonnet-4-6\": {\n        \"id\": \"claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"gpt-5-4\": {\n        \"id\": \"gpt-5-4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-07-17\",\n        \"last_updated\": \"2025-07-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 2.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"zai-glm-5-1\": {\n        \"id\": \"zai-glm-5-1\",\n        \"name\": \"Z.AI GLM-5.1\",\n        \"family\": \"glm\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-02-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.4, \"output\": 4.4, \"cache_read\": 0.26 },\n        \"limit\": { \"context\": 198000, \"output\": 8192 }\n      },\n      \"grok-4-1-fast-non-reasoning\": {\n        \"id\": \"grok-4-1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Non-Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 128000 }\n      },\n      \"grok-4-1-fast-reasoning\": {\n        \"id\": \"grok-4-1-fast-reasoning\",\n        \"name\": \"Grok 4.1 Fast (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-11\",\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 128000 }\n      },\n      \"claude-opus-4-6\": {\n        \"id\": \"claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"Grok 4.1 Fast (Reasoning)\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-10\",\n        \"release_date\": \"2025-08-28\",\n        \"last_updated\": \"2025-08-28\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"kimi-k2-6\": {\n        \"id\": \"kimi-k2-6\",\n        \"name\": \"Kimi-K2.6\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"1970-01-01\",\n        \"last_updated\": \"1970-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"gpt-oss-120b\": {\n        \"id\": \"gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"1970-01-01\",\n        \"last_updated\": \"1970-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"qwen-3-6-plus\": {\n        \"id\": \"qwen-3-6-plus\",\n        \"name\": \"Qwen 3.6 Plus\",\n        \"family\": \"qwen\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi-K2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"1970-01-01\",\n        \"last_updated\": \"1970-01-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 256000, \"output\": 128000 }\n      },\n      \"gpt-oss-20b\": {\n        \"id\": \"gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"1970-01-01\",\n        \"last_updated\": \"1970-01-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.07, \"output\": 0.2 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"gemini-3-1-pro-preview\": {\n        \"id\": \"gemini-3-1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-02-18\",\n        \"last_updated\": \"2026-02-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 12, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"minimax-m2-5\": {\n        \"id\": \"minimax-m2-5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2025-01-15\",\n        \"last_updated\": \"2025-02-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 192000, \"output\": 8192 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"claude-opus-4-7\": {\n        \"id\": \"claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"claude-haiku-4-5\": {\n        \"id\": \"claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"deepseek-v3-2\": {\n        \"id\": \"deepseek-v3-2\",\n        \"name\": \"DeepSeek v3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.58, \"output\": 1.68, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 128000, \"output\": 8192 }\n      },\n      \"gpt-5-3-codex\": {\n        \"id\": \"gpt-5-3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-02-15\",\n        \"last_updated\": \"2026-02-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      }\n    }\n  },\n  \"moark\": {\n    \"id\": \"moark\",\n    \"env\": [\"MOARK_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://moark.com/v1\",\n    \"name\": \"Moark\",\n    \"doc\": \"https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90\",\n    \"models\": {\n      \"MiniMax-M2.1\": {\n        \"id\": \"MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.1, \"output\": 8.4 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"GLM-4.7\": {\n        \"id\": \"GLM-4.7\",\n        \"name\": \"GLM-4.7\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 3.5, \"output\": 14 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"openai\": {\n    \"id\": \"openai\",\n    \"env\": [\"OPENAI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai\",\n    \"name\": \"OpenAI\",\n    \"doc\": \"https://platform.openai.com/docs/models\",\n    \"models\": {\n      \"o1-preview\": {\n        \"id\": \"o1-preview\",\n        \"name\": \"o1-preview\",\n        \"family\": \"o\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 128000, \"output\": 32768 }\n      },\n      \"o3-mini\": {\n        \"id\": \"o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o-mini\": {\n        \"id\": \"gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o3\": {\n        \"id\": \"o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-5.4-pro\": {\n        \"id\": \"gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 30,\n          \"output\": 180,\n          \"context_over_200k\": { \"input\": 60, \"output\": 270 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      },\n      \"o3-pro\": {\n        \"id\": \"o3-pro\",\n        \"name\": \"o3-pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-06-10\",\n        \"last_updated\": \"2025-06-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 20, \"output\": 80 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o-2024-05-13\": {\n        \"id\": \"gpt-4o-2024-05-13\",\n        \"name\": \"GPT-4o (2024-05-13)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 5, \"output\": 15 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"o4-mini\": {\n        \"id\": \"o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"o1\": {\n        \"id\": \"o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o1-mini\": {\n        \"id\": \"o1-mini\",\n        \"name\": \"o1-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-09-12\",\n        \"last_updated\": \"2024-09-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 128000, \"output\": 65536 }\n      },\n      \"gpt-5.2-chat-latest\": {\n        \"id\": \"gpt-5.2-chat-latest\",\n        \"name\": \"GPT-5.2 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1 Codex Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5-pro\": {\n        \"id\": \"gpt-5-pro\",\n        \"name\": \"GPT-5 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-10-06\",\n        \"last_updated\": \"2025-10-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 120 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 272000 }\n      },\n      \"gpt-4o-2024-11-20\": {\n        \"id\": \"gpt-4o-2024-11-20\",\n        \"name\": \"GPT-4o (2024-11-20)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-11-20\",\n        \"last_updated\": \"2024-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5.3-codex-spark\": {\n        \"id\": \"gpt-5.3-codex-spark\",\n        \"name\": \"GPT-5.3 Codex Spark\",\n        \"family\": \"gpt-codex-spark\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"input\": 100000, \"output\": 32000 }\n      },\n      \"o4-mini-deep-research\": {\n        \"id\": \"o4-mini-deep-research\",\n        \"name\": \"o4-mini-deep-research\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-06-26\",\n        \"last_updated\": \"2024-06-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"experimental\": {\n          \"modes\": {\n            \"fast\": {\n              \"cost\": { \"input\": 1.5, \"output\": 9, \"cache_read\": 0.15 },\n              \"provider\": { \"body\": { \"service_tier\": \"priority\" } }\n            }\n          }\n        }\n      },\n      \"o3-deep-research\": {\n        \"id\": \"o3-deep-research\",\n        \"name\": \"o3-deep-research\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-06-26\",\n        \"last_updated\": \"2024-06-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 40, \"cache_read\": 2.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4.1-mini\": {\n        \"id\": \"gpt-4.1-mini\",\n        \"name\": \"GPT-4.1 mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 1.6, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-3.5-turbo\": {\n        \"id\": \"gpt-3.5-turbo\",\n        \"name\": \"GPT-3.5-turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-09-01\",\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 16385, \"output\": 4096 }\n      },\n      \"chatgpt-image-latest\": {\n        \"id\": \"chatgpt-image-latest\",\n        \"name\": \"chatgpt-image-latest\",\n        \"family\": \"gpt-image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-12-16\",\n        \"last_updated\": \"2025-12-16\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"input\": 0, \"output\": 0 }\n      },\n      \"gpt-image-1.5\": {\n        \"id\": \"gpt-image-1.5\",\n        \"name\": \"gpt-image-1.5\",\n        \"family\": \"gpt-image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-11-25\",\n        \"last_updated\": \"2025-11-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"input\": 0, \"output\": 0 }\n      },\n      \"gpt-image-1-mini\": {\n        \"id\": \"gpt-image-1-mini\",\n        \"name\": \"gpt-image-1-mini\",\n        \"family\": \"gpt-image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-09-26\",\n        \"last_updated\": \"2025-09-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"input\": 0, \"output\": 0 }\n      },\n      \"text-embedding-3-large\": {\n        \"id\": \"text-embedding-3-large\",\n        \"name\": \"text-embedding-3-large\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.13, \"output\": 0 },\n        \"limit\": { \"context\": 8191, \"output\": 3072 }\n      },\n      \"gpt-5-codex\": {\n        \"id\": \"gpt-5-codex\",\n        \"name\": \"GPT-5-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-09-15\",\n        \"last_updated\": \"2025-09-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"text-embedding-ada-002\": {\n        \"id\": \"text-embedding-ada-002\",\n        \"name\": \"text-embedding-ada-002\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2022-12\",\n        \"release_date\": \"2022-12-15\",\n        \"last_updated\": \"2022-12-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 1536 }\n      },\n      \"gpt-4-turbo\": {\n        \"id\": \"gpt-4-turbo\",\n        \"name\": \"GPT-4 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"gpt-5.3-chat-latest\": {\n        \"id\": \"gpt-5.3-chat-latest\",\n        \"name\": \"GPT-5.3 Chat (latest)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5.5\": {\n        \"id\": \"gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 30,\n          \"cache_read\": 0.5,\n          \"context_over_200k\": { \"input\": 10, \"output\": 45, \"cache_read\": 1 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 },\n        \"experimental\": {\n          \"modes\": {\n            \"fast\": {\n              \"cost\": { \"input\": 12.5, \"output\": 75, \"cache_read\": 1.25 },\n              \"provider\": { \"body\": { \"service_tier\": \"priority\" } }\n            }\n          }\n        }\n      },\n      \"gpt-image-1\": {\n        \"id\": \"gpt-image-1\",\n        \"name\": \"gpt-image-1\",\n        \"family\": \"gpt-image\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2025-04-24\",\n        \"last_updated\": \"2025-04-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"image\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 0, \"input\": 0, \"output\": 0 }\n      },\n      \"gpt-4o-2024-08-06\": {\n        \"id\": \"gpt-4o-2024-08-06\",\n        \"name\": \"GPT-4o (2024-08-06)\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-08-06\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"text-embedding-3-small\": {\n        \"id\": \"text-embedding-3-small\",\n        \"name\": \"text-embedding-3-small\",\n        \"family\": \"text-embedding\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2024-01-25\",\n        \"last_updated\": \"2024-01-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 8191, \"output\": 1536 }\n      },\n      \"gpt-5-chat-latest\": {\n        \"id\": \"gpt-5-chat-latest\",\n        \"name\": \"GPT-5 Chat (latest)\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-4.1-nano\": {\n        \"id\": \"gpt-4.1-nano\",\n        \"name\": \"GPT-4.1 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-5.2-pro\": {\n        \"id\": \"gpt-5.2-pro\",\n        \"name\": \"GPT-5.2 Pro\",\n        \"family\": \"gpt-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5-nano\": {\n        \"id\": \"gpt-5-nano\",\n        \"name\": \"GPT-5 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.05, \"output\": 0.4, \"cache_read\": 0.005 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 1047576, \"output\": 32768 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1 Codex mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.1-chat-latest\": {\n        \"id\": \"gpt-5.1-chat-latest\",\n        \"name\": \"GPT-5.1 Chat\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"o1-pro\": {\n        \"id\": \"o1-pro\",\n        \"name\": \"o1-pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2025-03-19\",\n        \"last_updated\": \"2025-03-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 150, \"output\": 600 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"gpt-4\": {\n        \"id\": \"gpt-4\",\n        \"name\": \"GPT-4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 60 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2.5,\n          \"output\": 15,\n          \"cache_read\": 0.25,\n          \"context_over_200k\": { \"input\": 5, \"output\": 22.5, \"cache_read\": 0.5 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 },\n        \"experimental\": {\n          \"modes\": {\n            \"fast\": {\n              \"cost\": { \"input\": 5, \"output\": 30, \"cache_read\": 0.5 },\n              \"provider\": { \"body\": { \"service_tier\": \"priority\" } }\n            }\n          }\n        }\n      },\n      \"gpt-5.4-nano\": {\n        \"id\": \"gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      }\n    }\n  },\n  \"cloudflare-ai-gateway\": {\n    \"id\": \"cloudflare-ai-gateway\",\n    \"env\": [\n      \"CLOUDFLARE_API_TOKEN\",\n      \"CLOUDFLARE_ACCOUNT_ID\",\n      \"CLOUDFLARE_GATEWAY_ID\"\n    ],\n    \"npm\": \"ai-gateway-provider\",\n    \"name\": \"Cloudflare AI Gateway\",\n    \"doc\": \"https://developers.cloudflare.com/ai-gateway/\",\n    \"models\": {\n      \"anthropic/claude-sonnet-4-6\": {\n        \"id\": \"anthropic/claude-sonnet-4-6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75,\n          \"context_over_200k\": {\n            \"input\": 6,\n            \"output\": 22.5,\n            \"cache_read\": 0.6,\n            \"cache_write\": 7.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": { \"npm\": \"ai-gateway-provider\" }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4 (latest)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-3-5-haiku\": {\n        \"id\": \"anthropic/claude-3-5-haiku\",\n        \"name\": \"Claude Haiku 3.5 (latest)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-3.5-haiku\": {\n        \"id\": \"anthropic/claude-3.5-haiku\",\n        \"name\": \"Claude Haiku 3.5 (latest)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07-31\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4-5\": {\n        \"id\": \"anthropic/claude-opus-4-5\",\n        \"name\": \"Claude Opus 4.5 (latest)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-opus-4\": {\n        \"id\": \"anthropic/claude-opus-4\",\n        \"name\": \"Claude Opus 4 (latest)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-3.5-sonnet\": {\n        \"id\": \"anthropic/claude-3.5-sonnet\",\n        \"name\": \"Claude Sonnet 3.5 v2\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04-30\",\n        \"release_date\": \"2024-10-22\",\n        \"last_updated\": \"2024-10-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 8192 }\n      },\n      \"anthropic/claude-opus-4-1\": {\n        \"id\": \"anthropic/claude-opus-4-1\",\n        \"name\": \"Claude Opus 4.1 (latest)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 }\n      },\n      \"anthropic/claude-opus-4-6\": {\n        \"id\": \"anthropic/claude-opus-4-6\",\n        \"name\": \"Claude Opus 4.6 (latest)\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25,\n          \"context_over_200k\": {\n            \"input\": 10,\n            \"output\": 37.5,\n            \"cache_read\": 1,\n            \"cache_write\": 12.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 }\n      },\n      \"anthropic/claude-3-sonnet\": {\n        \"id\": \"anthropic/claude-3-sonnet\",\n        \"name\": \"Claude Sonnet 3\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-03-04\",\n        \"last_updated\": \"2024-03-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"anthropic/claude-opus-4-7\": {\n        \"id\": \"anthropic/claude-opus-4-7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/anthropic\" }\n      },\n      \"anthropic/claude-sonnet-4-5\": {\n        \"id\": \"anthropic/claude-sonnet-4-5\",\n        \"name\": \"Claude Sonnet 4.5 (latest)\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-07-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-haiku-4-5\": {\n        \"id\": \"anthropic/claude-haiku-4-5\",\n        \"name\": \"Claude Haiku 4.5 (latest)\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"anthropic/claude-3-opus\": {\n        \"id\": \"anthropic/claude-3-opus\",\n        \"name\": \"Claude Opus 3\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-02-29\",\n        \"last_updated\": \"2024-02-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"anthropic/claude-3-haiku\": {\n        \"id\": \"anthropic/claude-3-haiku\",\n        \"name\": \"Claude Haiku 3\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-08-31\",\n        \"release_date\": \"2024-03-13\",\n        \"last_updated\": \"2024-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.25,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.3\n        },\n        \"limit\": { \"context\": 200000, \"output\": 4096 }\n      },\n      \"workers-ai/@cf/qwen/qwq-32b\": {\n        \"id\": \"workers-ai/@cf/qwen/qwq-32b\",\n        \"name\": \"QwQ 32B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-11\",\n        \"last_updated\": \"2025-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.66, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct\": {\n        \"id\": \"workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct\",\n        \"name\": \"Qwen 2.5 Coder 32B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-11\",\n        \"last_updated\": \"2025-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.66, \"output\": 1 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/qwen/qwen3-30b-a3b-fp8\": {\n        \"id\": \"workers-ai/@cf/qwen/qwen3-30b-a3b-fp8\",\n        \"name\": \"Qwen3 30B A3B FP8\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.051, \"output\": 0.34 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/qwen/qwen3-embedding-0.6b\": {\n        \"id\": \"workers-ai/@cf/qwen/qwen3-embedding-0.6b\",\n        \"name\": \"Qwen3 Embedding 0.6B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.012, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3.1-8b-instruct\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3.1-8b-instruct\",\n        \"name\": \"Llama 3.1 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 0.8299999999999998 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast\",\n        \"name\": \"Llama 3.3 70B Instruct FP8 Fast\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 2.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3.2-3b-instruct\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3.2-3b-instruct\",\n        \"name\": \"Llama 3.2 3B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.051, \"output\": 0.34 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-guard-3-8b\": {\n        \"id\": \"workers-ai/@cf/meta/llama-guard-3-8b\",\n        \"name\": \"Llama Guard 3 8B\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.48, \"output\": 0.03 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3-8b-instruct\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3-8b-instruct\",\n        \"name\": \"Llama 3 8B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 0.83 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3.1-8b-instruct-awq\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3.1-8b-instruct-awq\",\n        \"name\": \"Llama 3.1 8B Instruct AWQ\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 0.27 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3.2-11b-vision-instruct\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3.2-11b-vision-instruct\",\n        \"name\": \"Llama 3.2 11B Vision Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.049, \"output\": 0.68 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Llama 4 Scout 17B 16E Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.27, \"output\": 0.85 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3-8b-instruct-awq\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3-8b-instruct-awq\",\n        \"name\": \"Llama 3 8B Instruct AWQ\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 0.27 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/m2m100-1.2b\": {\n        \"id\": \"workers-ai/@cf/meta/m2m100-1.2b\",\n        \"name\": \"M2M100 1.2B\",\n        \"family\": \"m2m\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.34, \"output\": 0.34 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8\",\n        \"name\": \"Llama 3.1 8B Instruct FP8\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.29 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-2-7b-chat-fp16\": {\n        \"id\": \"workers-ai/@cf/meta/llama-2-7b-chat-fp16\",\n        \"name\": \"Llama 2 7B Chat FP16\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.56, \"output\": 6.67 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/meta/llama-3.2-1b-instruct\": {\n        \"id\": \"workers-ai/@cf/meta/llama-3.2-1b-instruct\",\n        \"name\": \"Llama 3.2 1B Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.027, \"output\": 0.2 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/pfnet/plamo-embedding-1b\": {\n        \"id\": \"workers-ai/@cf/pfnet/plamo-embedding-1b\",\n        \"name\": \"PLaMo Embedding 1B\",\n        \"family\": \"plamo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.019, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it\": {\n        \"id\": \"workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it\",\n        \"name\": \"Gemma SEA-LION v4 27B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 0.56 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/pipecat-ai/smart-turn-v2\": {\n        \"id\": \"workers-ai/@cf/pipecat-ai/smart-turn-v2\",\n        \"name\": \"Pipecat Smart Turn v2\",\n        \"family\": \"smart-turn\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/baai/bge-m3\": {\n        \"id\": \"workers-ai/@cf/baai/bge-m3\",\n        \"name\": \"BGE M3\",\n        \"family\": \"bge\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.012, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/baai/bge-base-en-v1.5\": {\n        \"id\": \"workers-ai/@cf/baai/bge-base-en-v1.5\",\n        \"name\": \"BGE Base EN v1.5\",\n        \"family\": \"bge\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.067, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/baai/bge-small-en-v1.5\": {\n        \"id\": \"workers-ai/@cf/baai/bge-small-en-v1.5\",\n        \"name\": \"BGE Small EN v1.5\",\n        \"family\": \"bge\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/baai/bge-reranker-base\": {\n        \"id\": \"workers-ai/@cf/baai/bge-reranker-base\",\n        \"name\": \"BGE Reranker Base\",\n        \"family\": \"bge\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-09\",\n        \"last_updated\": \"2025-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0031, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/baai/bge-large-en-v1.5\": {\n        \"id\": \"workers-ai/@cf/baai/bge-large-en-v1.5\",\n        \"name\": \"BGE Large EN v1.5\",\n        \"family\": \"bge\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/nvidia/nemotron-3-120b-a12b\": {\n        \"id\": \"workers-ai/@cf/nvidia/nemotron-3-120b-a12b\",\n        \"name\": \"Nemotron 3 Super 120B\",\n        \"family\": \"nemotron\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-03-11\",\n        \"last_updated\": \"2026-03-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"workers-ai/@cf/moonshotai/kimi-k2.5\": {\n        \"id\": \"workers-ai/@cf/moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"workers-ai/@cf/moonshotai/kimi-k2.6\": {\n        \"id\": \"workers-ai/@cf/moonshotai/kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct\": {\n        \"id\": \"workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct\",\n        \"name\": \"Mistral Small 3.1 24B Instruct\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-11\",\n        \"last_updated\": \"2025-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 0.56 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/ibm-granite/granite-4.0-h-micro\": {\n        \"id\": \"workers-ai/@cf/ibm-granite/granite-4.0-h-micro\",\n        \"name\": \"IBM Granite 4.0 H Micro\",\n        \"family\": \"granite\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.017, \"output\": 0.11 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b\": {\n        \"id\": \"workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b\",\n        \"name\": \"DeepSeek R1 Distill Qwen 32B\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 4.88 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/myshell-ai/melotts\": {\n        \"id\": \"workers-ai/@cf/myshell-ai/melotts\",\n        \"name\": \"MyShell MeloTTS\",\n        \"family\": \"melotts\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/zai-org/glm-4.7-flash\": {\n        \"id\": \"workers-ai/@cf/zai-org/glm-4.7-flash\",\n        \"name\": \"GLM-4.7-Flash\",\n        \"family\": \"glm-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.06, \"output\": 0.4 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"workers-ai/@cf/deepgram/aura-2-en\": {\n        \"id\": \"workers-ai/@cf/deepgram/aura-2-en\",\n        \"name\": \"Deepgram Aura 2 (EN)\",\n        \"family\": \"aura\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/deepgram/aura-2-es\": {\n        \"id\": \"workers-ai/@cf/deepgram/aura-2-es\",\n        \"name\": \"Deepgram Aura 2 (ES)\",\n        \"family\": \"aura\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/deepgram/nova-3\": {\n        \"id\": \"workers-ai/@cf/deepgram/nova-3\",\n        \"name\": \"Deepgram Nova 3\",\n        \"family\": \"nova\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-11-14\",\n        \"last_updated\": \"2025-11-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B\": {\n        \"id\": \"workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B\",\n        \"name\": \"IndicTrans2 EN-Indic 1B\",\n        \"family\": \"indictrans\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.34, \"output\": 0.34 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/huggingface/distilbert-sst-2-int8\": {\n        \"id\": \"workers-ai/@cf/huggingface/distilbert-sst-2-int8\",\n        \"name\": \"DistilBERT SST-2 INT8\",\n        \"family\": \"distilbert\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.026, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/openai/gpt-oss-120b\": {\n        \"id\": \"workers-ai/@cf/openai/gpt-oss-120b\",\n        \"name\": \"GPT OSS 120B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 0.75 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/openai/gpt-oss-20b\": {\n        \"id\": \"workers-ai/@cf/openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/google/gemma-3-12b-it\": {\n        \"id\": \"workers-ai/@cf/google/gemma-3-12b-it\",\n        \"name\": \"Gemma 3 12B IT\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-11\",\n        \"last_updated\": \"2025-04-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 0.56 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/facebook/bart-large-cnn\": {\n        \"id\": \"workers-ai/@cf/facebook/bart-large-cnn\",\n        \"name\": \"BART Large CNN\",\n        \"family\": \"bart\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-09\",\n        \"last_updated\": \"2025-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"workers-ai/@cf/mistral/mistral-7b-instruct-v0.1\": {\n        \"id\": \"workers-ai/@cf/mistral/mistral-7b-instruct-v0.1\",\n        \"name\": \"Mistral 7B Instruct v0.1\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-04-03\",\n        \"last_updated\": \"2025-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.11, \"output\": 0.19 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o3-mini\": {\n        \"id\": \"openai/o3-mini\",\n        \"name\": \"o3-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2024-12-20\",\n        \"last_updated\": \"2025-01-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.55 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o-mini\": {\n        \"id\": \"openai/gpt-4o-mini\",\n        \"name\": \"GPT-4o mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-07-18\",\n        \"last_updated\": \"2024-07-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.08 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/o3\": {\n        \"id\": \"openai/o3\",\n        \"name\": \"o3\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2, \"output\": 8, \"cache_read\": 0.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o3-pro\": {\n        \"id\": \"openai/o3-pro\",\n        \"name\": \"o3-pro\",\n        \"family\": \"o-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-06-10\",\n        \"last_updated\": \"2025-06-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 20, \"output\": 80 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/o4-mini\": {\n        \"id\": \"openai/o4-mini\",\n        \"name\": \"o4-mini\",\n        \"family\": \"o-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05\",\n        \"release_date\": \"2025-04-16\",\n        \"last_updated\": \"2025-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.1, \"output\": 4.4, \"cache_read\": 0.28 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/o1\": {\n        \"id\": \"openai/o1\",\n        \"name\": \"o1\",\n        \"family\": \"o\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-12-05\",\n        \"last_updated\": \"2024-12-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 15, \"output\": 60, \"cache_read\": 7.5 },\n        \"limit\": { \"context\": 200000, \"output\": 100000 }\n      },\n      \"openai/gpt-4o\": {\n        \"id\": \"openai/gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-08-06\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 10, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"openai/gpt-3.5-turbo\": {\n        \"id\": \"openai/gpt-3.5-turbo\",\n        \"name\": \"GPT-3.5-turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2021-09-01\",\n        \"release_date\": \"2023-03-01\",\n        \"last_updated\": \"2023-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5, \"cache_read\": 1.25 },\n        \"limit\": { \"context\": 16385, \"output\": 4096 }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-5.3-codex\": {\n        \"id\": \"openai/gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"ai-gateway-provider\" }\n      },\n      \"openai/gpt-4-turbo\": {\n        \"id\": \"openai/gpt-4-turbo\",\n        \"name\": \"GPT-4 Turbo\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 10, \"output\": 30 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"ai-gateway-provider\" }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.13 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"openai/gpt-4\": {\n        \"id\": \"openai/gpt-4\",\n        \"name\": \"GPT-4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2023-11\",\n        \"release_date\": \"2023-11-06\",\n        \"last_updated\": \"2024-04-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 30, \"output\": 60 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"ai-gateway-provider\" }\n      },\n      \"openai/gpt-5.5\": {\n        \"id\": \"openai/gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-12-01\",\n        \"release_date\": \"2026-04-23\",\n        \"last_updated\": \"2026-04-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 30,\n          \"cache_read\": 0.5,\n          \"context_over_200k\": { \"input\": 10, \"output\": 45, \"cache_read\": 1 }\n        },\n        \"limit\": { \"context\": 1050000, \"input\": 922000, \"output\": 128000 }\n      }\n    }\n  },\n  \"drun\": {\n    \"id\": \"drun\",\n    \"env\": [\"DRUN_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://chat.d.run/v1\",\n    \"name\": \"D.Run (China)\",\n    \"doc\": \"https://www.d.run\",\n    \"models\": {\n      \"public/minimax-m25\": {\n        \"id\": \"public/minimax-m25\",\n        \"name\": \"MiniMax M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_details\" },\n        \"temperature\": true,\n        \"release_date\": \"2025-03-01\",\n        \"last_updated\": \"2025-03-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.29, \"output\": 1.16 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"public/deepseek-v3\": {\n        \"id\": \"public/deepseek-v3\",\n        \"name\": \"DeepSeek V3\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-12-26\",\n        \"last_updated\": \"2024-12-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 1.1 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"public/deepseek-r1\": {\n        \"id\": \"public/deepseek-r1\",\n        \"name\": \"DeepSeek R1\",\n        \"family\": \"deepseek-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-12\",\n        \"release_date\": \"2025-01-20\",\n        \"last_updated\": \"2025-01-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.55, \"output\": 2.2 },\n        \"limit\": { \"context\": 131072, \"output\": 32000 }\n      }\n    }\n  },\n  \"minimax-cn\": {\n    \"id\": \"minimax-cn\",\n    \"env\": [\"MINIMAX_API_KEY\"],\n    \"npm\": \"@ai-sdk/anthropic\",\n    \"api\": \"https://api.minimaxi.com/anthropic/v1\",\n    \"name\": \"MiniMax (minimaxi.com)\",\n    \"doc\": \"https://platform.minimaxi.com/docs/guides/quickstart\",\n    \"models\": {\n      \"MiniMax-M2.1\": {\n        \"id\": \"MiniMax-M2.1\",\n        \"name\": \"MiniMax-M2.1\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7\": {\n        \"id\": \"MiniMax-M2.7\",\n        \"name\": \"MiniMax-M2.7\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.7-highspeed\": {\n        \"id\": \"MiniMax-M2.7-highspeed\",\n        \"name\": \"MiniMax-M2.7-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-18\",\n        \"last_updated\": \"2026-03-18\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2\": {\n        \"id\": \"MiniMax-M2\",\n        \"name\": \"MiniMax-M2\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 196608, \"output\": 128000 }\n      },\n      \"MiniMax-M2.5\": {\n        \"id\": \"MiniMax-M2.5\",\n        \"name\": \"MiniMax-M2.5\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"MiniMax-M2.5-highspeed\": {\n        \"id\": \"MiniMax-M2.5-highspeed\",\n        \"name\": \"MiniMax-M2.5-highspeed\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 2.4,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      }\n    }\n  },\n  \"google\": {\n    \"id\": \"google\",\n    \"env\": [\"GOOGLE_GENERATIVE_AI_API_KEY\", \"GEMINI_API_KEY\"],\n    \"npm\": \"@ai-sdk/google\",\n    \"name\": \"Google\",\n    \"doc\": \"https://ai.google.dev/gemini-api/docs/pricing\",\n    \"models\": {\n      \"gemini-2.5-flash-lite\": {\n        \"id\": \"gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-1.5-flash-8b\": {\n        \"id\": \"gemini-1.5-flash-8b\",\n        \"name\": \"Gemini 1.5 Flash-8B\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-10-03\",\n        \"last_updated\": \"2024-10-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.0375, \"output\": 0.15, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 1000000, \"output\": 8192 }\n      },\n      \"gemma-4-31b-it\": {\n        \"id\": \"gemma-4-31b-it\",\n        \"name\": \"Gemma 4 31B\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"gemini-2.5-flash-image\": {\n        \"id\": \"gemini-2.5-flash-image\",\n        \"name\": \"Gemini 2.5 Flash Image\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 30, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"gemini-embedding-001\": {\n        \"id\": \"gemini-embedding-001\",\n        \"name\": \"Gemini Embedding 001\",\n        \"family\": \"gemini\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0 },\n        \"limit\": { \"context\": 2048, \"output\": 3072 }\n      },\n      \"gemini-live-2.5-flash-preview-native-audio\": {\n        \"id\": \"gemini-live-2.5-flash-preview-native-audio\",\n        \"name\": \"Gemini Live 2.5 Flash Preview Native Audio\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-09-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 2,\n          \"input_audio\": 3,\n          \"output_audio\": 12\n        },\n        \"limit\": { \"context\": 131072, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash\": {\n        \"id\": \"gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.03,\n          \"input_audio\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3.1-flash-lite-preview\": {\n        \"id\": \"gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.5,\n          \"cache_read\": 0.025,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro-preview-06-05\": {\n        \"id\": \"gemini-2.5-pro-preview-06-05\",\n        \"name\": \"Gemini 2.5 Pro Preview 06-05\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-05\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.0-flash\": {\n        \"id\": \"gemini-2.0-flash\",\n        \"name\": \"Gemini 2.0 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"gemini-2.5-flash-lite-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview 09-25\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-flash-latest\": {\n        \"id\": \"gemini-flash-latest\",\n        \"name\": \"Gemini Flash Latest\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.075,\n          \"input_audio\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-flash-lite-latest\": {\n        \"id\": \"gemini-flash-lite-latest\",\n        \"name\": \"Gemini Flash-Lite Latest\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4, \"cache_read\": 0.025 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"gemini-2.5-flash-preview-09-2025\": {\n        \"id\": \"gemini-2.5-flash-preview-09-2025\",\n        \"name\": \"Gemini 2.5 Flash Preview 09-25\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-25\",\n        \"last_updated\": \"2025-09-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.075,\n          \"input_audio\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemma-3-12b-it\": {\n        \"id\": \"gemma-3-12b-it\",\n        \"name\": \"Gemma 3 12B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"gemini-1.5-flash\": {\n        \"id\": \"gemini-1.5-flash\",\n        \"name\": \"Gemini 1.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-05-14\",\n        \"last_updated\": \"2024-05-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3, \"cache_read\": 0.01875 },\n        \"limit\": { \"context\": 1000000, \"output\": 8192 }\n      },\n      \"gemma-3-4b-it\": {\n        \"id\": \"gemma-3-4b-it\",\n        \"name\": \"Gemma 3 4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-13\",\n        \"last_updated\": \"2025-03-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 32768, \"output\": 8192 }\n      },\n      \"gemini-2.5-flash-preview-05-20\": {\n        \"id\": \"gemini-2.5-flash-preview-05-20\",\n        \"name\": \"Gemini 2.5 Flash Preview 05-20\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.0375 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-3.1-flash-image-preview\": {\n        \"id\": \"gemini-3.1-flash-image-preview\",\n        \"name\": \"Gemini 3.1 Flash Image (Preview)\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 60 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"context_over_200k\": { \"input\": 0.5, \"output\": 3, \"cache_read\": 0.05 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.125,\n          \"context_over_200k\": {\n            \"input\": 2.5,\n            \"output\": 15,\n            \"cache_read\": 0.25\n          }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.0-flash-lite\": {\n        \"id\": \"gemini-2.0-flash-lite\",\n        \"name\": \"Gemini 2.0 Flash Lite\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2024-12-11\",\n        \"last_updated\": \"2024-12-11\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.075, \"output\": 0.3 },\n        \"limit\": { \"context\": 1048576, \"output\": 8192 }\n      },\n      \"gemma-3n-e2b-it\": {\n        \"id\": \"gemma-3n-e2b-it\",\n        \"name\": \"Gemma 3n 2B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2000 }\n      },\n      \"gemini-2.5-pro-preview-tts\": {\n        \"id\": \"gemini-2.5-pro-preview-tts\",\n        \"name\": \"Gemini 2.5 Pro Preview TTS\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-05-01\",\n        \"last_updated\": \"2025-05-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1, \"output\": 20 },\n        \"limit\": { \"context\": 8000, \"output\": 16000 }\n      },\n      \"gemma-3-27b-it\": {\n        \"id\": \"gemma-3-27b-it\",\n        \"name\": \"Gemma 3 27B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-03-12\",\n        \"last_updated\": \"2025-03-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 8192 }\n      },\n      \"gemini-2.5-pro-preview-05-06\": {\n        \"id\": \"gemini-2.5-pro-preview-05-06\",\n        \"name\": \"Gemini 2.5 Pro Preview 05-06\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-05-06\",\n        \"last_updated\": \"2025-05-06\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.31 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-live-2.5-flash\": {\n        \"id\": \"gemini-live-2.5-flash\",\n        \"name\": \"Gemini Live 2.5 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-09-01\",\n        \"last_updated\": \"2025-09-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\", \"audio\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 2,\n          \"input_audio\": 3,\n          \"output_audio\": 12\n        },\n        \"limit\": { \"context\": 128000, \"output\": 8000 }\n      },\n      \"gemma-3n-e4b-it\": {\n        \"id\": \"gemma-3n-e4b-it\",\n        \"name\": \"Gemma 3n 4B\",\n        \"family\": \"gemma\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-05-20\",\n        \"last_updated\": \"2025-05-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 8192, \"output\": 2000 }\n      },\n      \"gemini-2.5-flash-lite-preview-06-17\": {\n        \"id\": \"gemini-2.5-flash-lite-preview-06-17\",\n        \"name\": \"Gemini 2.5 Flash Lite Preview 06-17\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.4,\n          \"cache_read\": 0.025,\n          \"input_audio\": 0.3\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash-image-preview\": {\n        \"id\": \"gemini-2.5-flash-image-preview\",\n        \"name\": \"Gemini 2.5 Flash Image (Preview)\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\"],\n          \"output\": [\"text\", \"image\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 30, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 32768, \"output\": 32768 }\n      },\n      \"gemini-3.1-pro-preview-customtools\": {\n        \"id\": \"gemini-3.1-pro-preview-customtools\",\n        \"name\": \"Gemini 3.1 Pro Preview Custom Tools\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-2.5-flash-preview-tts\": {\n        \"id\": \"gemini-2.5-flash-preview-tts\",\n        \"name\": \"Gemini 2.5 Flash Preview TTS\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-05-01\",\n        \"last_updated\": \"2025-05-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"audio\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.5, \"output\": 10 },\n        \"limit\": { \"context\": 8000, \"output\": 16000 }\n      },\n      \"gemini-3.1-pro-preview\": {\n        \"id\": \"gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemma-4-26b-a4b-it\": {\n        \"id\": \"gemma-4-26b-a4b-it\",\n        \"name\": \"Gemma 4 26B\",\n        \"family\": \"gemma\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-02\",\n        \"last_updated\": \"2026-04-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"limit\": { \"context\": 256000, \"output\": 8192 }\n      },\n      \"gemini-2.5-flash-preview-04-17\": {\n        \"id\": \"gemini-2.5-flash-preview-04-17\",\n        \"name\": \"Gemini 2.5 Flash Preview 04-17\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-04-17\",\n        \"last_updated\": \"2025-04-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6, \"cache_read\": 0.0375 },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 }\n      },\n      \"gemini-1.5-pro\": {\n        \"id\": \"gemini-1.5-pro\",\n        \"name\": \"Gemini 1.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-02-15\",\n        \"last_updated\": \"2024-02-15\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 5, \"cache_read\": 0.3125 },\n        \"limit\": { \"context\": 1000000, \"output\": 8192 }\n      }\n    }\n  },\n  \"llama\": {\n    \"id\": \"llama\",\n    \"env\": [\"LLAMA_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.llama.com/compat/v1/\",\n    \"name\": \"Llama\",\n    \"doc\": \"https://llama.developer.meta.com/docs/models\",\n    \"models\": {\n      \"cerebras-llama-4-scout-17b-16e-instruct\": {\n        \"id\": \"cerebras-llama-4-scout-17b-16e-instruct\",\n        \"name\": \"Cerebras-Llama-4-Scout-17B-16E-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"cerebras-llama-4-maverick-17b-128e-instruct\": {\n        \"id\": \"cerebras-llama-4-maverick-17b-128e-instruct\",\n        \"name\": \"Cerebras-Llama-4-Maverick-17B-128E-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"llama-4-maverick-17b-128e-instruct-fp8\": {\n        \"id\": \"llama-4-maverick-17b-128e-instruct-fp8\",\n        \"name\": \"Llama-4-Maverick-17B-128E-Instruct-FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"groq-llama-4-maverick-17b-128e-instruct\": {\n        \"id\": \"groq-llama-4-maverick-17b-128e-instruct\",\n        \"name\": \"Groq-Llama-4-Maverick-17B-128E-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"llama-3.3-70b-instruct\": {\n        \"id\": \"llama-3.3-70b-instruct\",\n        \"name\": \"Llama-3.3-70B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"llama-4-scout-17b-16e-instruct-fp8\": {\n        \"id\": \"llama-4-scout-17b-16e-instruct-fp8\",\n        \"name\": \"Llama-4-Scout-17B-16E-Instruct-FP8\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-04-05\",\n        \"last_updated\": \"2025-04-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      },\n      \"llama-3.3-8b-instruct\": {\n        \"id\": \"llama-3.3-8b-instruct\",\n        \"name\": \"Llama-3.3-8B-Instruct\",\n        \"family\": \"llama\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2024-12-06\",\n        \"last_updated\": \"2024-12-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 4096 }\n      }\n    }\n  },\n  \"vivgrid\": {\n    \"id\": \"vivgrid\",\n    \"env\": [\"VIVGRID_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai\",\n    \"api\": \"https://api.vivgrid.com/v1\",\n    \"name\": \"Vivgrid\",\n    \"doc\": \"https://docs.vivgrid.com/models\",\n    \"models\": {\n      \"glm-5\": {\n        \"id\": \"glm-5\",\n        \"name\": \"GLM-5\",\n        \"family\": \"glm\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1, \"output\": 3.2, \"cache_read\": 0.2 },\n        \"limit\": { \"context\": 202752, \"output\": 131000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      },\n      \"deepseek-v3.2\": {\n        \"id\": \"deepseek-v3.2\",\n        \"name\": \"DeepSeek-V3.2\",\n        \"family\": \"deepseek\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.28, \"output\": 0.42 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      },\n      \"gemini-3.1-flash-lite-preview\": {\n        \"id\": \"gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"family\": \"gemini-flash-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-03-03\",\n        \"last_updated\": \"2026-03-03\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.25,\n          \"output\": 1.5,\n          \"cache_read\": 0.025,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-05-30\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1 Codex Max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.125 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5, \"cache_read\": 0.075 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2 Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-01-14\",\n        \"last_updated\": \"2026-01-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.175 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 }\n      },\n      \"gemini-3.1-pro-preview\": {\n        \"id\": \"gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"audio\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"context_over_200k\": { \"input\": 4, \"output\": 18, \"cache_read\": 0.4 }\n        },\n        \"limit\": { \"context\": 1048576, \"output\": 65536 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 2.5, \"output\": 15, \"cache_read\": 0.25 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      },\n      \"gpt-5.4-nano\": {\n        \"id\": \"gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 Nano\",\n        \"family\": \"gpt-nano\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 },\n        \"provider\": { \"npm\": \"@ai-sdk/openai-compatible\" }\n      }\n    }\n  },\n  \"zenmux\": {\n    \"id\": \"zenmux\",\n    \"env\": [\"ZENMUX_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://zenmux.ai/api/v1\",\n    \"name\": \"ZenMux\",\n    \"doc\": \"https://docs.zenmux.ai\",\n    \"models\": {\n      \"qwen/qwen3.6-plus\": {\n        \"id\": \"qwen/qwen3.6-plus\",\n        \"name\": \"Qwen3.6-Plus\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"cache_write\": 0.625,\n          \"context_over_200k\": {\n            \"input\": 2,\n            \"output\": 6,\n            \"cache_read\": 0.2,\n            \"cache_write\": 2.5\n          }\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"qwen/qwen3.5-plus\": {\n        \"id\": \"qwen/qwen3.5-plus\",\n        \"name\": \"Qwen3.5 Plus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8, \"output\": 4.8 },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"qwen/qwen3-coder-plus\": {\n        \"id\": \"qwen/qwen3-coder-plus\",\n        \"name\": \"Qwen3-Coder-Plus\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 }\n      },\n      \"qwen/qwen3.5-flash\": {\n        \"id\": \"qwen/qwen3.5-flash\",\n        \"name\": \"Qwen3.5 Flash\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.4 },\n        \"limit\": { \"context\": 1020000, \"output\": 1020000 }\n      },\n      \"qwen/qwen3-max\": {\n        \"id\": \"qwen/qwen3-max\",\n        \"name\": \"Qwen3-Max-Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-01-23\",\n        \"last_updated\": \"2026-01-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.2, \"output\": 6 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"volcengine/doubao-seed-2.0-pro\": {\n        \"id\": \"volcengine/doubao-seed-2.0-pro\",\n        \"name\": \"Doubao-Seed-2.0-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02-14\",\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.45,\n          \"output\": 2.24,\n          \"cache_read\": 0.09,\n          \"cache_write\": 0.0024\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"volcengine/doubao-seed-code\": {\n        \"id\": \"volcengine/doubao-seed-code\",\n        \"name\": \"Doubao-Seed-Code\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-11\",\n        \"last_updated\": \"2025-11-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.17, \"output\": 1.12, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"volcengine/doubao-seed-2.0-code\": {\n        \"id\": \"volcengine/doubao-seed-2.0-code\",\n        \"name\": \"Doubao Seed 2.0 Code\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.9, \"output\": 4.48 },\n        \"limit\": { \"context\": 256000, \"output\": 32000 }\n      },\n      \"volcengine/doubao-seed-2.0-mini\": {\n        \"id\": \"volcengine/doubao-seed-2.0-mini\",\n        \"name\": \"Doubao-Seed-2.0-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02-14\",\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.03,\n          \"output\": 0.28,\n          \"cache_read\": 0.01,\n          \"cache_write\": 0.0024\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"volcengine/doubao-seed-1.8\": {\n        \"id\": \"volcengine/doubao-seed-1.8\",\n        \"name\": \"Doubao-Seed-1.8\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-18\",\n        \"last_updated\": \"2025-12-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.11,\n          \"output\": 0.28,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.0024\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"volcengine/doubao-seed-2.0-lite\": {\n        \"id\": \"volcengine/doubao-seed-2.0-lite\",\n        \"name\": \"Doubao-Seed-2.0-lite\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02-14\",\n        \"release_date\": \"2026-02-14\",\n        \"last_updated\": \"2026-02-14\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.09,\n          \"output\": 0.51,\n          \"cache_read\": 0.02,\n          \"cache_write\": 0.0024\n        },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"moonshotai/kimi-k2-thinking-turbo\": {\n        \"id\": \"moonshotai/kimi-k2-thinking-turbo\",\n        \"name\": \"Kimi K2 Thinking Turbo\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.15, \"output\": 8, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262000, \"output\": 64000 }\n      },\n      \"moonshotai/kimi-k2-thinking\": {\n        \"id\": \"moonshotai/kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262000, \"output\": 64000 }\n      },\n      \"moonshotai/kimi-k2-0905\": {\n        \"id\": \"moonshotai/kimi-k2-0905\",\n        \"name\": \"Kimi K2 0905\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-09-04\",\n        \"last_updated\": \"2025-09-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262000, \"output\": 64000 }\n      },\n      \"moonshotai/kimi-k2.5\": {\n        \"id\": \"moonshotai/kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": false,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-01-27\",\n        \"last_updated\": \"2026-01-27\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.58, \"output\": 3.02, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262000, \"output\": 64000 }\n      },\n      \"moonshotai/kimi-k2.6\": {\n        \"id\": \"moonshotai/kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": false,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-04-20\",\n        \"last_updated\": \"2026-04-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262140, \"output\": 262140 }\n      },\n      \"anthropic/claude-sonnet-4\": {\n        \"id\": \"anthropic/claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"image\", \"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-3.5-haiku\": {\n        \"id\": \"anthropic/claude-3.5-haiku\",\n        \"name\": \"Claude 3.5 Haiku\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2024-11-04\",\n        \"last_updated\": \"2024-11-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.8,\n          \"output\": 4,\n          \"cache_read\": 0.08,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-opus-4.1\": {\n        \"id\": \"anthropic/claude-opus-4.1\",\n        \"name\": \"Claude Opus 4.1\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"image\", \"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-opus-4.6\": {\n        \"id\": \"anthropic/claude-opus-4.6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-06\",\n        \"last_updated\": \"2026-02-06\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-haiku-4.5\": {\n        \"id\": \"anthropic/claude-haiku-4.5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1,\n          \"output\": 5,\n          \"cache_read\": 0.1,\n          \"cache_write\": 1.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-opus-4\": {\n        \"id\": \"anthropic/claude-opus-4\",\n        \"name\": \"Claude Opus 4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"image\", \"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 15,\n          \"output\": 75,\n          \"cache_read\": 1.5,\n          \"cache_write\": 18.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 32000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-opus-4.5\": {\n        \"id\": \"anthropic/claude-opus-4.5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-11-24\",\n        \"modalities\": { \"input\": [\"pdf\", \"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-opus-4.7\": {\n        \"id\": \"anthropic/claude-opus-4.7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 5,\n          \"output\": 25,\n          \"cache_read\": 0.5,\n          \"cache_write\": 6.25\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-3.7-sonnet\": {\n        \"id\": \"anthropic/claude-3.7-sonnet\",\n        \"name\": \"Claude 3.7 Sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-02-24\",\n        \"last_updated\": \"2025-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 200000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-sonnet-4.6\": {\n        \"id\": \"anthropic/claude-sonnet-4.6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-18\",\n        \"last_updated\": \"2026-02-18\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"anthropic/claude-sonnet-4.5\": {\n        \"id\": \"anthropic/claude-sonnet-4.5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 3,\n          \"output\": 15,\n          \"cache_read\": 0.3,\n          \"cache_write\": 3.75\n        },\n        \"limit\": { \"context\": 1000000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"stepfun/step-3.5-flash\": {\n        \"id\": \"stepfun/step-3.5-flash\",\n        \"name\": \"Step 3.5 Flash\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-02-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"stepfun/step-3.5-flash-free\": {\n        \"id\": \"stepfun/step-3.5-flash-free\",\n        \"name\": \"Step 3.5 Flash (Free)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-02-02\",\n        \"last_updated\": \"2026-02-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"stepfun/step-3\": {\n        \"id\": \"stepfun/step-3\",\n        \"name\": \"Step-3\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2025-07-31\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.21, \"output\": 0.57 },\n        \"limit\": { \"context\": 65536, \"output\": 64000 }\n      },\n      \"kuaishou/kat-coder-pro-v2\": {\n        \"id\": \"kuaishou/kat-coder-pro-v2\",\n        \"name\": \"KAT-Coder-Pro-V2\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-30\",\n        \"last_updated\": \"2026-03-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 256000, \"output\": 80000 }\n      },\n      \"deepseek/deepseek-v3.2\": {\n        \"id\": \"deepseek/deepseek-v3.2\",\n        \"name\": \"DeepSeek V3.2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-05\",\n        \"last_updated\": \"2025-12-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 0.43 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"deepseek/deepseek-v3.2-exp\": {\n        \"id\": \"deepseek/deepseek-v3.2-exp\",\n        \"name\": \"DeepSeek-V3.2-Exp\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.22, \"output\": 0.33 },\n        \"limit\": { \"context\": 163000, \"output\": 64000 }\n      },\n      \"deepseek/deepseek-chat\": {\n        \"id\": \"deepseek/deepseek-chat\",\n        \"name\": \"DeepSeek-V3.2 (Non-thinking Mode)\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 0.42, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"xiaomi/mimo-v2-flash\": {\n        \"id\": \"xiaomi/mimo-v2-flash\",\n        \"name\": \"MiMo-V2-Flash\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 262000, \"output\": 64000 }\n      },\n      \"xiaomi/mimo-v2-omni\": {\n        \"id\": \"xiaomi/mimo-v2-omni\",\n        \"name\": \"MiMo V2 Omni\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 265000, \"output\": 265000 }\n      },\n      \"xiaomi/mimo-v2-pro\": {\n        \"id\": \"xiaomi/mimo-v2-pro\",\n        \"name\": \"MiMo V2 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.5, \"output\": 4.5 },\n        \"limit\": { \"context\": 1000000, \"output\": 256000 }\n      },\n      \"inclusionai/ring-1t\": {\n        \"id\": \"inclusionai/ring-1t\",\n        \"name\": \"Ring-1T\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-10-12\",\n        \"last_updated\": \"2025-10-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.56, \"output\": 2.24, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"inclusionai/ling-1t\": {\n        \"id\": \"inclusionai/ling-1t\",\n        \"name\": \"Ling-1T\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-10-09\",\n        \"last_updated\": \"2025-10-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.56, \"output\": 2.24, \"cache_read\": 0.11 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"x-ai/grok-4.1-fast-non-reasoning\": {\n        \"id\": \"x-ai/grok-4.1-fast-non-reasoning\",\n        \"name\": \"Grok 4.1 Fast Non Reasoning\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 64000 }\n      },\n      \"x-ai/grok-4.1-fast\": {\n        \"id\": \"x-ai/grok-4.1-fast\",\n        \"name\": \"Grok 4.1 Fast\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-20\",\n        \"last_updated\": \"2025-11-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 64000 }\n      },\n      \"x-ai/grok-code-fast-1\": {\n        \"id\": \"x-ai/grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-08-26\",\n        \"last_updated\": \"2025-08-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.5, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"x-ai/grok-4\": {\n        \"id\": \"x-ai/grok-4\",\n        \"name\": \"Grok 4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-07-09\",\n        \"last_updated\": \"2025-07-09\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 15, \"cache_read\": 0.75 },\n        \"limit\": { \"context\": 256000, \"output\": 64000 }\n      },\n      \"x-ai/grok-4-fast\": {\n        \"id\": \"x-ai/grok-4-fast\",\n        \"name\": \"Grok 4 Fast\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-09-19\",\n        \"last_updated\": \"2025-09-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 0.5, \"cache_read\": 0.05 },\n        \"limit\": { \"context\": 2000000, \"output\": 64000 }\n      },\n      \"x-ai/grok-4.2-fast-non-reasoning\": {\n        \"id\": \"x-ai/grok-4.2-fast-non-reasoning\",\n        \"name\": \"Grok 4.2 Fast Non Reasoning\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 9 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"x-ai/grok-4.2-fast\": {\n        \"id\": \"x-ai/grok-4.2-fast\",\n        \"name\": \"Grok 4.2 Fast\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3, \"output\": 9 },\n        \"limit\": { \"context\": 2000000, \"output\": 30000 }\n      },\n      \"minimax/minimax-m2\": {\n        \"id\": \"minimax/minimax-m2\",\n        \"name\": \"MiniMax M2\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-10-27\",\n        \"last_updated\": \"2025-10-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.38\n        },\n        \"limit\": { \"context\": 204000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"minimax/minimax-m2.7-highspeed\": {\n        \"id\": \"minimax/minimax-m2.7-highspeed\",\n        \"name\": \"MiniMax M2.7 highspeed\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.611, \"output\": 2.4439 },\n        \"limit\": { \"context\": 204800, \"output\": 131070 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"minimax/minimax-m2.5-lightning\": {\n        \"id\": \"minimax/minimax-m2.5-lightning\",\n        \"name\": \"MiniMax M2.5 highspeed\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.6,\n          \"output\": 4.8,\n          \"cache_read\": 0.06,\n          \"cache_write\": 0.75\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"minimax/minimax-m2.5\": {\n        \"id\": \"minimax/minimax-m2.5\",\n        \"name\": \"MiniMax M2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-02-13\",\n        \"last_updated\": \"2026-02-13\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.375\n        },\n        \"limit\": { \"context\": 204800, \"output\": 131072 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"minimax/minimax-m2.1\": {\n        \"id\": \"minimax/minimax-m2.1\",\n        \"name\": \"MiniMax M2.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-22\",\n        \"last_updated\": \"2025-12-22\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 1.2,\n          \"cache_read\": 0.03,\n          \"cache_write\": 0.38\n        },\n        \"limit\": { \"context\": 204000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"minimax/minimax-m2.7\": {\n        \"id\": \"minimax/minimax-m2.7\",\n        \"name\": \"MiniMax M2.7\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.3055, \"output\": 1.2219 },\n        \"limit\": { \"context\": 204800, \"output\": 131070 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/anthropic\",\n          \"api\": \"https://zenmux.ai/api/anthropic/v1\"\n        }\n      },\n      \"baidu/ernie-5.0-thinking-preview\": {\n        \"id\": \"baidu/ernie-5.0-thinking-preview\",\n        \"name\": \"ERNIE 5.0\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-01-22\",\n        \"last_updated\": \"2026-01-22\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.84, \"output\": 3.37 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"z-ai/glm-5\": {\n        \"id\": \"z-ai/glm-5\",\n        \"name\": \"GLM 5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.58, \"output\": 2.6, \"cache_read\": 0.14 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"z-ai/glm-4.7-flash-free\": {\n        \"id\": \"z-ai/glm-4.7-flash-free\",\n        \"name\": \"GLM 4.7 Flash (Free)\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"z-ai/glm-4.7\": {\n        \"id\": \"z-ai/glm-4.7\",\n        \"name\": \"GLM 4.7\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-23\",\n        \"last_updated\": \"2025-12-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.28, \"output\": 1.14, \"cache_read\": 0.06 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"z-ai/glm-4.7-flashx\": {\n        \"id\": \"z-ai/glm-4.7-flashx\",\n        \"name\": \"GLM 4.7 FlashX\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-01-19\",\n        \"last_updated\": \"2026-01-19\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.07, \"output\": 0.42, \"cache_read\": 0.01 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"z-ai/glm-4.6\": {\n        \"id\": \"z-ai/glm-4.6\",\n        \"name\": \"GLM 4.6\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-09-30\",\n        \"last_updated\": \"2025-09-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 1.54, \"cache_read\": 0.07 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"z-ai/glm-5.1\": {\n        \"id\": \"z-ai/glm-5.1\",\n        \"name\": \"GLM-5.1\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-04-03\",\n        \"last_updated\": \"2026-04-03\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.8781, \"output\": 3.5126, \"cache_read\": 0.1903 },\n        \"limit\": { \"context\": 200000, \"output\": 131072 }\n      },\n      \"z-ai/glm-4.6v-flash-free\": {\n        \"id\": \"z-ai/glm-4.6v-flash-free\",\n        \"name\": \"GLM 4.6V Flash (Free)\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"z-ai/glm-4.6v-flash\": {\n        \"id\": \"z-ai/glm-4.6v-flash\",\n        \"name\": \"GLM 4.6V FlashX\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.02, \"output\": 0.21, \"cache_read\": 0.0043 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"z-ai/glm-4.6v\": {\n        \"id\": \"z-ai/glm-4.6v\",\n        \"name\": \"GLM 4.6V\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-08\",\n        \"last_updated\": \"2025-12-08\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.14, \"output\": 0.42, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 200000, \"output\": 64000 }\n      },\n      \"z-ai/glm-4.5-air\": {\n        \"id\": \"z-ai/glm-4.5-air\",\n        \"name\": \"GLM 4.5 Air\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.11, \"output\": 0.56, \"cache_read\": 0.02 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"z-ai/glm-5v-turbo\": {\n        \"id\": \"z-ai/glm-5v-turbo\",\n        \"name\": \"GLM 5V Turbo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"release_date\": \"2026-04-01\",\n        \"last_updated\": \"2026-04-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\", \"pdf\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.726, \"output\": 3.1946, \"cache_read\": 0.1743 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"z-ai/glm-5-turbo\": {\n        \"id\": \"z-ai/glm-5-turbo\",\n        \"name\": \"GLM 5 Turbo\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.88, \"output\": 3.48 },\n        \"limit\": { \"context\": 200000, \"output\": 128000 }\n      },\n      \"z-ai/glm-4.5\": {\n        \"id\": \"z-ai/glm-4.5\",\n        \"name\": \"GLM 4.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-07-25\",\n        \"last_updated\": \"2025-07-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.35, \"output\": 1.54, \"cache_read\": 0.07 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 }\n      },\n      \"openai/gpt-5.4-pro\": {\n        \"id\": \"openai/gpt-5.4-pro\",\n        \"name\": \"GPT-5.4 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 45, \"output\": 225 },\n        \"limit\": { \"context\": 1050000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.1-codex\": {\n        \"id\": \"openai/gpt-5.1-codex\",\n        \"name\": \"GPT-5.1-Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.12 },\n        \"limit\": { \"context\": 400000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5\": {\n        \"id\": \"openai/gpt-5\",\n        \"name\": \"GPT-5\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.12 },\n        \"limit\": { \"context\": 400000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.1-chat\": {\n        \"id\": \"openai/gpt-5.1-chat\",\n        \"name\": \"GPT-5.1 Chat\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"pdf\", \"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.12 },\n        \"limit\": { \"context\": 128000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.4-mini\": {\n        \"id\": \"openai/gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.75, \"output\": 4.5 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.3-chat\": {\n        \"id\": \"openai/gpt-5.3-chat\",\n        \"name\": \"GPT-5.3 Chat\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 128000, \"output\": 16380 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5-codex\": {\n        \"id\": \"openai/gpt-5-codex\",\n        \"name\": \"GPT-5 Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-09-23\",\n        \"last_updated\": \"2025-09-23\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.12 },\n        \"limit\": { \"context\": 400000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.2\": {\n        \"id\": \"openai/gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"image\", \"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.17 },\n        \"limit\": { \"context\": 400000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.3-codex\": {\n        \"id\": \"openai/gpt-5.3-codex\",\n        \"name\": \"GPT-5.3 Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.2-codex\": {\n        \"id\": \"openai/gpt-5.2-codex\",\n        \"name\": \"GPT-5.2-Codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2026-01-15\",\n        \"last_updated\": \"2026-01-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.75, \"output\": 14, \"cache_read\": 0.17 },\n        \"limit\": { \"context\": 400000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.2-pro\": {\n        \"id\": \"openai/gpt-5.2-pro\",\n        \"name\": \"GPT-5.2-Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 21, \"output\": 168 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.1-codex-mini\": {\n        \"id\": \"openai/gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1-Codex-Mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"image\", \"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 2, \"cache_read\": 0.03 },\n        \"limit\": { \"context\": 400000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.1\": {\n        \"id\": \"openai/gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"image\", \"text\", \"pdf\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 1.25, \"output\": 10, \"cache_read\": 0.12 },\n        \"limit\": { \"context\": 400000, \"output\": 64000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.4\": {\n        \"id\": \"openai/gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 3.75, \"output\": 18.75 },\n        \"limit\": { \"context\": 1050000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"openai/gpt-5.4-nano\": {\n        \"id\": \"openai/gpt-5.4-nano\",\n        \"name\": \"GPT-5.4 Nano\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-20\",\n        \"last_updated\": \"2026-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.2, \"output\": 1.25 },\n        \"limit\": { \"context\": 400000, \"output\": 128000 },\n        \"provider\": {\n          \"npm\": \"@ai-sdk/openai\",\n          \"api\": \"https://zenmux.ai/api/v1\"\n        }\n      },\n      \"google/gemini-2.5-flash-lite\": {\n        \"id\": \"google/gemini-2.5-flash-lite\",\n        \"name\": \"Gemini 2.5 Flash Lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-07-22\",\n        \"last_updated\": \"2025-07-22\",\n        \"modalities\": {\n          \"input\": [\"pdf\", \"image\", \"text\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.1,\n          \"output\": 0.4,\n          \"cache_read\": 0.03,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048000, \"output\": 64000 }\n      },\n      \"google/gemini-2.5-flash\": {\n        \"id\": \"google/gemini-2.5-flash\",\n        \"name\": \"Gemini 2.5 Flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"pdf\", \"image\", \"text\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.3,\n          \"output\": 2.5,\n          \"cache_read\": 0.07,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048000, \"output\": 64000 }\n      },\n      \"google/gemini-3.1-flash-lite-preview\": {\n        \"id\": \"google/gemini-3.1-flash-lite-preview\",\n        \"name\": \"Gemini 3.1 Flash Lite Preview\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-03-20\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.25, \"output\": 1.5 },\n        \"limit\": { \"context\": 1050000, \"output\": 65530 }\n      },\n      \"google/gemini-3-flash-preview\": {\n        \"id\": \"google/gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\", \"audio\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 0.5,\n          \"output\": 3,\n          \"cache_read\": 0.05,\n          \"cache_write\": 1\n        },\n        \"limit\": { \"context\": 1048000, \"output\": 64000 }\n      },\n      \"google/gemini-2.5-pro\": {\n        \"id\": \"google/gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01-01\",\n        \"release_date\": \"2025-06-17\",\n        \"last_updated\": \"2025-06-17\",\n        \"modalities\": {\n          \"input\": [\"pdf\", \"image\", \"text\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 1.25,\n          \"output\": 10,\n          \"cache_read\": 0.31,\n          \"cache_write\": 4.5\n        },\n        \"limit\": { \"context\": 1048000, \"output\": 64000 }\n      },\n      \"google/gemini-3.1-pro-preview\": {\n        \"id\": \"google/gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2026-02-19\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"pdf\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": {\n          \"input\": 2,\n          \"output\": 12,\n          \"cache_read\": 0.2,\n          \"cache_write\": 4.5\n        },\n        \"limit\": { \"context\": 1048000, \"output\": 64000 }\n      },\n      \"sapiens-ai/agnes-1.5-lite\": {\n        \"id\": \"sapiens-ai/agnes-1.5-lite\",\n        \"name\": \"Agnes 1.5 Lite\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-26\",\n        \"last_updated\": \"2026-03-26\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.12, \"output\": 0.6 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"sapiens-ai/agnes-1.5-pro\": {\n        \"id\": \"sapiens-ai/agnes-1.5-pro\",\n        \"name\": \"Agnes 1.5 Pro\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-21\",\n        \"last_updated\": \"2026-03-21\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.16, \"output\": 0.8 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      }\n    }\n  },\n  \"clarifai\": {\n    \"id\": \"clarifai\",\n    \"env\": [\"CLARIFAI_PAT\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.clarifai.com/v2/ext/openai/v1\",\n    \"name\": \"Clarifai\",\n    \"doc\": \"https://docs.clarifai.com/compute/inference/\",\n    \"models\": {\n      \"qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct\": {\n        \"id\": \"qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct\",\n        \"name\": \"Qwen3 Coder 30B A3B Instruct\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2026-02-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.11458, \"output\": 0.74812 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507\": {\n        \"id\": \"qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507\",\n        \"name\": \"Qwen3 30B A3B Instruct 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507\": {\n        \"id\": \"qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507\",\n        \"name\": \"Qwen3 30B A3B Thinking 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-07-31\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.36, \"output\": 1.3 },\n        \"limit\": { \"context\": 262144, \"output\": 131072 }\n      },\n      \"arcee_ai/AFM/models/trinity-mini\": {\n        \"id\": \"arcee_ai/AFM/models/trinity-mini\",\n        \"name\": \"Trinity Mini\",\n        \"family\": \"trinity-mini\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-12\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.045, \"output\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"mistralai/completion/models/Ministral-3-3B-Reasoning-2512\": {\n        \"id\": \"mistralai/completion/models/Ministral-3-3B-Reasoning-2512\",\n        \"name\": \"Ministral 3 3B Reasoning 2512\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-12\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.039, \"output\": 0.54825 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistralai/completion/models/Ministral-3-14B-Reasoning-2512\": {\n        \"id\": \"mistralai/completion/models/Ministral-3-14B-Reasoning-2512\",\n        \"name\": \"Ministral 3 14B Reasoning 2512\",\n        \"family\": \"ministral\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-01\",\n        \"last_updated\": \"2025-12-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.5, \"output\": 1.7 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput\": {\n        \"id\": \"minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput\",\n        \"name\": \"MiniMax-M2.5 High Throughput\",\n        \"family\": \"minimax\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-12\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 1.2 },\n        \"limit\": { \"context\": 204800, \"output\": 131072 }\n      },\n      \"deepseek-ai/deepseek-ocr/models/DeepSeek-OCR\": {\n        \"id\": \"deepseek-ai/deepseek-ocr/models/DeepSeek-OCR\",\n        \"name\": \"DeepSeek OCR\",\n        \"family\": \"deepseek\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-10-20\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.2, \"output\": 0.7 },\n        \"limit\": { \"context\": 8192, \"output\": 8192 }\n      },\n      \"openai/chat-completion/models/gpt-oss-120b-high-throughput\": {\n        \"id\": \"openai/chat-completion/models/gpt-oss-120b-high-throughput\",\n        \"name\": \"GPT OSS 120B High Throughput\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.09, \"output\": 0.36 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"openai/chat-completion/models/gpt-oss-20b\": {\n        \"id\": \"openai/chat-completion/models/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-12-12\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.045, \"output\": 0.18 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"clarifai/main/models/mm-poly-8b\": {\n        \"id\": \"clarifai/main/models/mm-poly-8b\",\n        \"name\": \"MM Poly 8B\",\n        \"family\": \"mm-poly\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"release_date\": \"2025-06\",\n        \"last_updated\": \"2026-02-25\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.658, \"output\": 1.11 },\n        \"limit\": { \"context\": 32768, \"output\": 4096 }\n      }\n    }\n  },\n  \"the-grid-ai\": {\n    \"id\": \"the-grid-ai\",\n    \"env\": [\"THEGRIDAI_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.thegrid.ai/v1\",\n    \"name\": \"The Grid AI\",\n    \"doc\": \"https://thegrid.ai/docs\",\n    \"models\": {\n      \"text-standard\": {\n        \"id\": \"text-standard\",\n        \"name\": \"Text Standard\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 16000 },\n        \"status\": \"beta\"\n      },\n      \"text-max\": {\n        \"id\": \"text-max\",\n        \"name\": \"Text Max\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-03-24\",\n        \"last_updated\": \"2026-03-24\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 1000000, \"output\": 128000 },\n        \"status\": \"beta\"\n      },\n      \"text-prime\": {\n        \"id\": \"text-prime\",\n        \"name\": \"Text Prime\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"release_date\": \"2026-02-26\",\n        \"last_updated\": \"2026-02-26\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"limit\": { \"context\": 128000, \"output\": 30000 },\n        \"status\": \"beta\"\n      }\n    }\n  },\n  \"lmstudio\": {\n    \"id\": \"lmstudio\",\n    \"env\": [\"LMSTUDIO_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"http://127.0.0.1:1234/v1\",\n    \"name\": \"LMStudio\",\n    \"doc\": \"https://lmstudio.ai/models\",\n    \"models\": {\n      \"qwen/qwen3-coder-30b\": {\n        \"id\": \"qwen/qwen3-coder-30b\",\n        \"name\": \"Qwen3 Coder 30B\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-23\",\n        \"last_updated\": \"2025-07-23\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 65536 }\n      },\n      \"qwen/qwen3-30b-a3b-2507\": {\n        \"id\": \"qwen/qwen3-30b-a3b-2507\",\n        \"name\": \"Qwen3 30B A3B 2507\",\n        \"family\": \"qwen\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-04\",\n        \"release_date\": \"2025-07-30\",\n        \"last_updated\": \"2025-07-30\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 262144, \"output\": 16384 }\n      },\n      \"openai/gpt-oss-20b\": {\n        \"id\": \"openai/gpt-oss-20b\",\n        \"name\": \"GPT OSS 20B\",\n        \"family\": \"gpt-oss\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 131072, \"output\": 32768 }\n      }\n    }\n  },\n  \"moonshotai-cn\": {\n    \"id\": \"moonshotai-cn\",\n    \"env\": [\"MOONSHOT_API_KEY\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.moonshot.cn/v1\",\n    \"name\": \"Moonshot AI (China)\",\n    \"doc\": \"https://platform.moonshot.cn/docs/api/chat\",\n    \"models\": {\n      \"kimi-k2.6\": {\n        \"id\": \"kimi-k2.6\",\n        \"name\": \"Kimi K2.6\",\n        \"family\": \"kimi-k2.6\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-04-21\",\n        \"last_updated\": \"2026-04-21\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.95, \"output\": 4, \"cache_read\": 0.16 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-turbo-preview\": {\n        \"id\": \"kimi-k2-turbo-preview\",\n        \"name\": \"Kimi K2 Turbo\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2.4, \"output\": 10, \"cache_read\": 0.6 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-0905-preview\": {\n        \"id\": \"kimi-k2-0905-preview\",\n        \"name\": \"Kimi K2 0905\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-09-05\",\n        \"last_updated\": \"2025-09-05\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2.5\": {\n        \"id\": \"kimi-k2.5\",\n        \"name\": \"Kimi K2.5\",\n        \"family\": \"kimi-k2.5\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-01\",\n        \"last_updated\": \"2026-01\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 3, \"cache_read\": 0.1 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-0711-preview\": {\n        \"id\": \"kimi-k2-0711-preview\",\n        \"name\": \"Kimi K2 0711\",\n        \"family\": \"kimi\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-07-14\",\n        \"last_updated\": \"2025-07-14\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"kimi-k2-thinking\": {\n        \"id\": \"kimi-k2-thinking\",\n        \"name\": \"Kimi K2 Thinking\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.6, \"output\": 2.5, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"kimi-k2-thinking-turbo\": {\n        \"id\": \"kimi-k2-thinking-turbo\",\n        \"name\": \"Kimi K2 Thinking Turbo\",\n        \"family\": \"kimi-thinking\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"interleaved\": { \"field\": \"reasoning_content\" },\n        \"temperature\": true,\n        \"knowledge\": \"2024-08\",\n        \"release_date\": \"2025-11-06\",\n        \"last_updated\": \"2025-11-06\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 1.15, \"output\": 8, \"cache_read\": 0.15 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      }\n    }\n  },\n  \"github-copilot\": {\n    \"id\": \"github-copilot\",\n    \"env\": [\"GITHUB_TOKEN\"],\n    \"npm\": \"@ai-sdk/openai-compatible\",\n    \"api\": \"https://api.githubcopilot.com\",\n    \"name\": \"GitHub Copilot\",\n    \"doc\": \"https://docs.github.com/en/copilot\",\n    \"models\": {\n      \"claude-sonnet-4\": {\n        \"id\": \"claude-sonnet-4\",\n        \"name\": \"Claude Sonnet 4\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-05-22\",\n        \"last_updated\": \"2025-05-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 216000, \"input\": 128000, \"output\": 16000 }\n      },\n      \"gpt-5.1-codex\": {\n        \"id\": \"gpt-5.1-codex\",\n        \"name\": \"GPT-5.1-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 128000, \"output\": 128000 }\n      },\n      \"gpt-5\": {\n        \"id\": \"gpt-5\",\n        \"name\": \"GPT-5\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2025-08-07\",\n        \"last_updated\": \"2025-08-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"claude-opus-4.6\": {\n        \"id\": \"claude-opus-4.6\",\n        \"name\": \"Claude Opus 4.6\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05-31\",\n        \"release_date\": \"2026-02-05\",\n        \"last_updated\": \"2026-02-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 144000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gpt-4o\": {\n        \"id\": \"gpt-4o\",\n        \"name\": \"GPT-4o\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-09\",\n        \"release_date\": \"2024-05-13\",\n        \"last_updated\": \"2024-05-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"input\": 64000, \"output\": 4096 }\n      },\n      \"claude-haiku-4.5\": {\n        \"id\": \"claude-haiku-4.5\",\n        \"name\": \"Claude Haiku 4.5\",\n        \"family\": \"claude-haiku\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-02-28\",\n        \"release_date\": \"2025-10-15\",\n        \"last_updated\": \"2025-10-15\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 144000, \"input\": 128000, \"output\": 32000 }\n      },\n      \"claude-opus-4.5\": {\n        \"id\": \"claude-opus-4.5\",\n        \"name\": \"Claude Opus 4.5\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-11-24\",\n        \"last_updated\": \"2025-08-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 160000, \"input\": 128000, \"output\": 32000 }\n      },\n      \"claude-opus-4.7\": {\n        \"id\": \"claude-opus-4.7\",\n        \"name\": \"Claude Opus 4.7\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2026-01-31\",\n        \"release_date\": \"2026-04-16\",\n        \"last_updated\": \"2026-04-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 144000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gpt-5-mini\": {\n        \"id\": \"gpt-5-mini\",\n        \"name\": \"GPT-5-mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-06\",\n        \"release_date\": \"2025-08-13\",\n        \"last_updated\": \"2025-08-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 264000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gpt-5.1-codex-max\": {\n        \"id\": \"gpt-5.1-codex-max\",\n        \"name\": \"GPT-5.1-Codex-max\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-12-04\",\n        \"last_updated\": \"2025-12-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 128000, \"output\": 128000 }\n      },\n      \"gemini-3-pro-preview\": {\n        \"id\": \"gemini-3-pro-preview\",\n        \"name\": \"Gemini 3 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-11-18\",\n        \"last_updated\": \"2025-11-18\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"claude-sonnet-4.6\": {\n        \"id\": \"claude-sonnet-4.6\",\n        \"name\": \"Claude Sonnet 4.6\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-17\",\n        \"last_updated\": \"2026-02-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 200000, \"input\": 128000, \"output\": 32000 }\n      },\n      \"gpt-5.4-mini\": {\n        \"id\": \"gpt-5.4-mini\",\n        \"name\": \"GPT-5.4 Mini\",\n        \"family\": \"gpt-mini\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-17\",\n        \"last_updated\": \"2026-03-17\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"grok-code-fast-1\": {\n        \"id\": \"grok-code-fast-1\",\n        \"name\": \"Grok Code Fast 1\",\n        \"family\": \"grok\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-08\",\n        \"release_date\": \"2025-08-27\",\n        \"last_updated\": \"2025-08-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gemini-3-flash-preview\": {\n        \"id\": \"gemini-3-flash-preview\",\n        \"name\": \"Gemini 3 Flash\",\n        \"family\": \"gemini-flash\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-12-17\",\n        \"last_updated\": \"2025-12-17\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gemini-2.5-pro\": {\n        \"id\": \"gemini-2.5-pro\",\n        \"name\": \"Gemini 2.5 Pro\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2025-03-20\",\n        \"last_updated\": \"2025-06-05\",\n        \"modalities\": {\n          \"input\": [\"text\", \"image\", \"audio\", \"video\"],\n          \"output\": [\"text\"]\n        },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gpt-5.2\": {\n        \"id\": \"gpt-5.2\",\n        \"name\": \"GPT-5.2\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 264000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gpt-5.3-codex\": {\n        \"id\": \"gpt-5.3-codex\",\n        \"name\": \"GPT-5.3-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-02-24\",\n        \"last_updated\": \"2026-02-24\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-opus-41\": {\n        \"id\": \"claude-opus-41\",\n        \"name\": \"Claude Opus 4.1\",\n        \"family\": \"claude-opus\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": false,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-08-05\",\n        \"last_updated\": \"2025-08-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 80000, \"output\": 16000 }\n      },\n      \"gpt-5.5\": {\n        \"id\": \"gpt-5.5\",\n        \"name\": \"GPT-5.5\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-04-22\",\n        \"last_updated\": \"2026-04-22\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"gpt-5.2-codex\": {\n        \"id\": \"gpt-5.2-codex\",\n        \"name\": \"GPT-5.2-Codex\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2025-12-11\",\n        \"last_updated\": \"2025-12-11\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      },\n      \"claude-sonnet-4.5\": {\n        \"id\": \"claude-sonnet-4.5\",\n        \"name\": \"Claude Sonnet 4.5\",\n        \"family\": \"claude-sonnet\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03-31\",\n        \"release_date\": \"2025-09-29\",\n        \"last_updated\": \"2025-09-29\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 144000, \"input\": 128000, \"output\": 32000 }\n      },\n      \"gpt-4.1\": {\n        \"id\": \"gpt-4.1\",\n        \"name\": \"GPT-4.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2025-04-14\",\n        \"last_updated\": \"2025-04-14\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"input\": 64000, \"output\": 16384 }\n      },\n      \"gpt-5.1-codex-mini\": {\n        \"id\": \"gpt-5.1-codex-mini\",\n        \"name\": \"GPT-5.1-Codex-mini\",\n        \"family\": \"gpt-codex\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 128000, \"output\": 128000 }\n      },\n      \"gemini-3.1-pro-preview\": {\n        \"id\": \"gemini-3.1-pro-preview\",\n        \"name\": \"Gemini 3.1 Pro Preview\",\n        \"family\": \"gemini-pro\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"structured_output\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-01\",\n        \"release_date\": \"2026-02-19\",\n        \"last_updated\": \"2026-02-19\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 128000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gpt-5.1\": {\n        \"id\": \"gpt-5.1\",\n        \"name\": \"GPT-5.1\",\n        \"family\": \"gpt\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2024-09-30\",\n        \"release_date\": \"2025-11-13\",\n        \"last_updated\": \"2025-11-13\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 264000, \"input\": 128000, \"output\": 64000 }\n      },\n      \"gpt-5.4\": {\n        \"id\": \"gpt-5.4\",\n        \"name\": \"GPT-5.4\",\n        \"family\": \"gpt\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": false,\n        \"knowledge\": \"2025-08-31\",\n        \"release_date\": \"2026-03-05\",\n        \"last_updated\": \"2026-03-05\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 400000, \"input\": 272000, \"output\": 128000 }\n      }\n    }\n  },\n  \"mistral\": {\n    \"id\": \"mistral\",\n    \"env\": [\"MISTRAL_API_KEY\"],\n    \"npm\": \"@ai-sdk/mistral\",\n    \"name\": \"Mistral\",\n    \"doc\": \"https://docs.mistral.ai/getting-started/models/\",\n    \"models\": {\n      \"ministral-8b-latest\": {\n        \"id\": \"ministral-8b-latest\",\n        \"name\": \"Ministral 8B (latest)\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.1 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral-large-2512\": {\n        \"id\": \"mistral-large-2512\",\n        \"name\": \"Mistral Large 3\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistral-embed\": {\n        \"id\": \"mistral-embed\",\n        \"name\": \"Mistral Embed\",\n        \"family\": \"mistral-embed\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": false,\n        \"temperature\": false,\n        \"release_date\": \"2023-12-11\",\n        \"last_updated\": \"2023-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.1, \"output\": 0 },\n        \"limit\": { \"context\": 8000, \"output\": 3072 }\n      },\n      \"devstral-medium-latest\": {\n        \"id\": \"devstral-medium-latest\",\n        \"name\": \"Devstral 2 (latest)\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-02\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"ministral-3b-latest\": {\n        \"id\": \"ministral-3b-latest\",\n        \"name\": \"Ministral 3B (latest)\",\n        \"family\": \"ministral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-10-01\",\n        \"last_updated\": \"2024-10-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.04, \"output\": 0.04 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"open-mixtral-8x7b\": {\n        \"id\": \"open-mixtral-8x7b\",\n        \"name\": \"Mixtral 8x7B\",\n        \"family\": \"mixtral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-01\",\n        \"release_date\": \"2023-12-11\",\n        \"last_updated\": \"2023-12-11\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.7, \"output\": 0.7 },\n        \"limit\": { \"context\": 32000, \"output\": 32000 }\n      },\n      \"mistral-nemo\": {\n        \"id\": \"mistral-nemo\",\n        \"name\": \"Mistral Nemo\",\n        \"family\": \"mistral-nemo\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-07\",\n        \"release_date\": \"2024-07-01\",\n        \"last_updated\": \"2024-07-01\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral-small-latest\": {\n        \"id\": \"mistral-small-latest\",\n        \"name\": \"Mistral Small (latest)\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"magistral-medium-latest\": {\n        \"id\": \"magistral-medium-latest\",\n        \"name\": \"Magistral Medium (latest)\",\n        \"family\": \"magistral-medium\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-03-17\",\n        \"last_updated\": \"2025-03-20\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 5 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"pixtral-12b\": {\n        \"id\": \"pixtral-12b\",\n        \"name\": \"Pixtral 12B\",\n        \"family\": \"pixtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-09\",\n        \"release_date\": \"2024-09-01\",\n        \"last_updated\": \"2024-09-01\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.15 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"pixtral-large-latest\": {\n        \"id\": \"pixtral-large-latest\",\n        \"name\": \"Pixtral Large (latest)\",\n        \"family\": \"pixtral\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-04\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"magistral-small\": {\n        \"id\": \"magistral-small\",\n        \"name\": \"Magistral Small\",\n        \"family\": \"magistral-small\",\n        \"attachment\": false,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2025-03-17\",\n        \"last_updated\": \"2025-03-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"mistral-small-2506\": {\n        \"id\": \"mistral-small-2506\",\n        \"name\": \"Mistral Small 3.2\",\n        \"family\": \"mistral-small\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-03\",\n        \"release_date\": \"2025-06-20\",\n        \"last_updated\": \"2025-06-20\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"devstral-medium-2507\": {\n        \"id\": \"devstral-medium-2507\",\n        \"name\": \"Devstral Medium\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-07-10\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"open-mixtral-8x22b\": {\n        \"id\": \"open-mixtral-8x22b\",\n        \"name\": \"Mixtral 8x22B\",\n        \"family\": \"mixtral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-04\",\n        \"release_date\": \"2024-04-17\",\n        \"last_updated\": \"2024-04-17\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 64000, \"output\": 64000 }\n      },\n      \"mistral-medium-2508\": {\n        \"id\": \"mistral-medium-2508\",\n        \"name\": \"Mistral Medium 3.1\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-08-12\",\n        \"last_updated\": \"2025-08-12\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"mistral-large-2411\": {\n        \"id\": \"mistral-large-2411\",\n        \"name\": \"Mistral Large 2.1\",\n        \"family\": \"mistral-large\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2024-11-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 2, \"output\": 6 },\n        \"limit\": { \"context\": 131072, \"output\": 16384 }\n      },\n      \"mistral-small-2603\": {\n        \"id\": \"mistral-small-2603\",\n        \"name\": \"Mistral Small 4\",\n        \"family\": \"mistral-small\",\n        \"attachment\": true,\n        \"reasoning\": true,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-06\",\n        \"release_date\": \"2026-03-16\",\n        \"last_updated\": \"2026-03-16\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.15, \"output\": 0.6 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"devstral-2512\": {\n        \"id\": \"devstral-2512\",\n        \"name\": \"Devstral 2\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"codestral-latest\": {\n        \"id\": \"codestral-latest\",\n        \"name\": \"Codestral (latest)\",\n        \"family\": \"codestral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-10\",\n        \"release_date\": \"2024-05-29\",\n        \"last_updated\": \"2025-01-04\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.3, \"output\": 0.9 },\n        \"limit\": { \"context\": 256000, \"output\": 4096 }\n      },\n      \"mistral-medium-2505\": {\n        \"id\": \"mistral-medium-2505\",\n        \"name\": \"Mistral Medium 3\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": false,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 131072, \"output\": 131072 }\n      },\n      \"devstral-small-2507\": {\n        \"id\": \"devstral-small-2507\",\n        \"name\": \"Devstral Small\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-07-10\",\n        \"last_updated\": \"2025-07-10\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      },\n      \"labs-devstral-small-2512\": {\n        \"id\": \"labs-devstral-small-2512\",\n        \"name\": \"Devstral Small 2\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-12\",\n        \"release_date\": \"2025-12-09\",\n        \"last_updated\": \"2025-12-09\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0, \"output\": 0 },\n        \"limit\": { \"context\": 256000, \"output\": 256000 }\n      },\n      \"open-mistral-7b\": {\n        \"id\": \"open-mistral-7b\",\n        \"name\": \"Mistral 7B\",\n        \"family\": \"mistral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2023-12\",\n        \"release_date\": \"2023-09-27\",\n        \"last_updated\": \"2023-09-27\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.25, \"output\": 0.25 },\n        \"limit\": { \"context\": 8000, \"output\": 8000 }\n      },\n      \"mistral-medium-latest\": {\n        \"id\": \"mistral-medium-latest\",\n        \"name\": \"Mistral Medium (latest)\",\n        \"family\": \"mistral-medium\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-10\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.4, \"output\": 2 },\n        \"limit\": { \"context\": 128000, \"output\": 16384 }\n      },\n      \"mistral-large-latest\": {\n        \"id\": \"mistral-large-latest\",\n        \"name\": \"Mistral Large (latest)\",\n        \"family\": \"mistral-large\",\n        \"attachment\": true,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2024-11\",\n        \"release_date\": \"2024-11-01\",\n        \"last_updated\": \"2025-12-02\",\n        \"modalities\": { \"input\": [\"text\", \"image\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.5, \"output\": 1.5 },\n        \"limit\": { \"context\": 262144, \"output\": 262144 }\n      },\n      \"devstral-small-2505\": {\n        \"id\": \"devstral-small-2505\",\n        \"name\": \"Devstral Small 2505\",\n        \"family\": \"devstral\",\n        \"attachment\": false,\n        \"reasoning\": false,\n        \"tool_call\": true,\n        \"temperature\": true,\n        \"knowledge\": \"2025-05\",\n        \"release_date\": \"2025-05-07\",\n        \"last_updated\": \"2025-05-07\",\n        \"modalities\": { \"input\": [\"text\"], \"output\": [\"text\"] },\n        \"open_weights\": true,\n        \"cost\": { \"input\": 0.1, \"output\": 0.3 },\n        \"limit\": { \"context\": 128000, \"output\": 128000 }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/ai/permission-guard.test.ts",
    "content": "import { beforeEach, describe, expect, it, vi } from 'vitest'\nimport { createPermissionGuard } from './permission-guard'\n\nconst { modalOpenMock, modalCtorMock } = vi.hoisted(() => ({\n\tmodalOpenMock: vi.fn(),\n\tmodalCtorMock: vi.fn(),\n}))\n\nvi.mock('~/components/AIPermissionModal', () => ({\n\tdefault: vi.fn().mockImplementation((app, request) => {\n\t\tmodalCtorMock({ app, request })\n\t\treturn {\n\t\t\topen: modalOpenMock,\n\t\t}\n\t}),\n}))\n\nfunction getRuntimeStore(\n\tsessionId: string,\n\tautoApproveBySession: Map<string, Set<string>>,\n) {\n\treturn {\n\t\thas(signature: string) {\n\t\t\treturn autoApproveBySession.get(sessionId)?.has(signature) ?? false\n\t\t},\n\t\tadd(signature: string) {\n\t\t\tconst requests = autoApproveBySession.get(sessionId) ?? new Set()\n\t\t\trequests.add(signature)\n\t\t\tautoApproveBySession.set(sessionId, requests)\n\t\t},\n\t}\n}\n\nfunction createGuard(\n\tsessionId: string,\n\toptions?: {\n\t\tyolo?: boolean\n\t\tautoApproveBySession?: Map<string, Set<string>>\n\t},\n) {\n\tconst settings = {\n\t\tai: {\n\t\t\tyolo: options?.yolo ?? false,\n\t\t},\n\t} as never\n\n\tconst autoApproveBySession =\n\t\toptions?.autoApproveBySession ?? new Map<string, Set<string>>()\n\tconst runtimeStore = getRuntimeStore(sessionId, autoApproveBySession)\n\tconst guard = createPermissionGuard({} as never, () => settings, runtimeStore)\n\treturn { guard, autoApproveBySession }\n}\n\ndescribe('createPermissionGuard', () => {\n\tbeforeEach(() => {\n\t\tmodalOpenMock.mockReset()\n\t\tmodalCtorMock.mockReset()\n\t})\n\n\tit('bypasses modal when yolo is enabled', async () => {\n\t\tconst { guard } = createGuard('session-1', { yolo: true })\n\n\t\tawait guard({ type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } })\n\n\t\texpect(modalOpenMock).not.toHaveBeenCalled()\n\t})\n\n\tit('approve only affects the current request', async () => {\n\t\tconst { guard } = createGuard('session-1')\n\t\tmodalOpenMock\n\t\t\t.mockResolvedValueOnce('approve')\n\t\t\t.mockResolvedValueOnce('approve')\n\n\t\tawait guard({ type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } })\n\t\tawait guard({ type: 'fs', fs: { kind: 'write', path: 'notes/b.md' } })\n\n\t\texpect(modalOpenMock).toHaveBeenCalledTimes(2)\n\t})\n\n\tit('auto-approve skips future prompts for same kind in same session', async () => {\n\t\tconst { guard } = createGuard('session-1')\n\t\tmodalOpenMock.mockResolvedValueOnce('auto-approve-operation')\n\n\t\tawait guard({ type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } })\n\t\tawait guard({ type: 'fs', fs: { kind: 'write', path: 'notes/b.md' } })\n\n\t\texpect(modalOpenMock).toHaveBeenCalledTimes(1)\n\t})\n\n\tit('different kinds in same session still prompt after auto-approve', async () => {\n\t\tconst { guard } = createGuard('session-1')\n\t\tmodalOpenMock\n\t\t\t.mockResolvedValueOnce('auto-approve-operation')\n\t\t\t.mockResolvedValueOnce('approve')\n\n\t\tawait guard({ type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } })\n\t\tawait guard({ type: 'fs', fs: { kind: 'delete', path: 'notes/a.md' } })\n\n\t\texpect(modalOpenMock).toHaveBeenCalledTimes(2)\n\t\texpect(modalCtorMock).toHaveBeenNthCalledWith(1, {\n\t\t\tapp: {},\n\t\t\trequest: { type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } },\n\t\t})\n\t\texpect(modalCtorMock).toHaveBeenNthCalledWith(2, {\n\t\t\tapp: {},\n\t\t\trequest: { type: 'fs', fs: { kind: 'delete', path: 'notes/a.md' } },\n\t\t})\n\t})\n\n\tit('same kind in different sessions still prompts', async () => {\n\t\tconst autoApproveBySession = new Map<string, Set<string>>()\n\t\tconst guardA = createGuard('session-a', { autoApproveBySession }).guard\n\t\tconst guardB = createGuard('session-b', { autoApproveBySession }).guard\n\t\tmodalOpenMock\n\t\t\t.mockResolvedValueOnce('auto-approve-operation')\n\t\t\t.mockResolvedValueOnce('approve')\n\n\t\tawait guardA({ type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } })\n\t\tawait guardB({ type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } })\n\n\t\texpect(modalOpenMock).toHaveBeenCalledTimes(2)\n\t})\n\n\tit('passes copy requests through to the modal', async () => {\n\t\tconst { guard } = createGuard('session-1')\n\t\tmodalOpenMock.mockResolvedValueOnce('approve')\n\n\t\tawait guard({\n\t\t\ttype: 'fs',\n\t\t\tfs: {\n\t\t\t\tkind: 'copy',\n\t\t\t\tsrc: 'notes/a.md',\n\t\t\t\tdest: 'notes/b.md',\n\t\t\t},\n\t\t})\n\n\t\texpect(modalCtorMock).toHaveBeenCalledWith({\n\t\t\tapp: {},\n\t\t\trequest: {\n\t\t\t\ttype: 'fs',\n\t\t\t\tfs: {\n\t\t\t\t\tkind: 'copy',\n\t\t\t\t\tsrc: 'notes/a.md',\n\t\t\t\t\tdest: 'notes/b.md',\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t})\n\n\tit('throws an error when user denies a single-path request', async () => {\n\t\tconst { guard } = createGuard('session-1')\n\t\tmodalOpenMock.mockResolvedValueOnce('deny')\n\n\t\tawait expect(\n\t\t\tguard({ type: 'fs', fs: { kind: 'write', path: 'notes/a.md' } }),\n\t\t).rejects.toThrow('write on notes/a.md')\n\t})\n\n\tit('throws an error when user denies a dual-path request', async () => {\n\t\tconst { guard } = createGuard('session-1')\n\t\tmodalOpenMock.mockResolvedValueOnce('deny')\n\n\t\tawait expect(\n\t\t\tguard({\n\t\t\t\ttype: 'fs',\n\t\t\t\tfs: {\n\t\t\t\t\tkind: 'move',\n\t\t\t\t\tsrc: 'notes/a.md',\n\t\t\t\t\tdest: 'notes/b.md',\n\t\t\t\t},\n\t\t\t}),\n\t\t).rejects.toThrow('move from notes/a.md to notes/b.md')\n\t})\n})\n"
  },
  {
    "path": "src/ai/permission-guard.ts",
    "content": "import type { App } from 'obsidian'\nimport AIPermissionModal from '~/components/AIPermissionModal'\nimport i18n from '~/i18n'\nimport type { NutstoreSettings } from '~/settings'\nimport type {\n\tAIDualPathFileOperation,\n\tAISinglePathFileOperation,\n} from './file-operation'\n\nexport interface FSSinglePathPermissionRequest {\n\ttype: 'fs'\n\tfs: {\n\t\tkind: AISinglePathFileOperation\n\t\tpath: string\n\t}\n}\n\nexport interface FSDualPathPermissionRequest {\n\ttype: 'fs'\n\tfs: {\n\t\tkind: AIDualPathFileOperation\n\t\tsrc: string\n\t\tdest: string\n\t}\n}\n\nexport type FSPermissionRequest =\n\t| FSSinglePathPermissionRequest\n\t| FSDualPathPermissionRequest\n\nexport type PermissionRequest = FSPermissionRequest\nexport type PermissionGuard = (request: PermissionRequest) => Promise<void>\n\ninterface RuntimeAutoApproveOperationStore {\n\thas(signature: string): boolean\n\tadd(signature: string): void\n}\n\nfunction isDualPathRequest(\n\trequest: FSPermissionRequest,\n): request is FSDualPathPermissionRequest {\n\treturn request.fs.kind === 'copy' || request.fs.kind === 'move'\n}\n\nexport function getPermissionRequestOperationSignature(\n\trequest: FSPermissionRequest,\n) {\n\treturn request.fs.kind\n}\n\nfunction formatDeniedSummary(request: FSPermissionRequest) {\n\tconst { kind } = request.fs\n\tif (isDualPathRequest(request)) {\n\t\treturn `${kind} from ${request.fs.src} to ${request.fs.dest}`\n\t}\n\treturn `${kind} on ${request.fs.path}`\n}\n\nexport function createPermissionGuard(\n\tapp: App,\n\tgetSettings: () => NutstoreSettings,\n\truntimeAutoApproveOperationStore?: RuntimeAutoApproveOperationStore,\n): PermissionGuard {\n\treturn async (request: PermissionRequest) => {\n\t\tconst settings = getSettings()\n\n\t\tif (settings.ai.yolo) {\n\t\t\treturn\n\t\t}\n\n\t\tconst signature = getPermissionRequestOperationSignature(request)\n\t\tif (runtimeAutoApproveOperationStore?.has(signature)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst result = await new AIPermissionModal(app, request).open()\n\n\t\tif (result === 'deny') {\n\t\t\tthrow new Error(\n\t\t\t\ti18n.t('aiPermission.denied', {\n\t\t\t\t\tsummary: formatDeniedSummary(request),\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\tif (result === 'auto-approve-operation') {\n\t\t\truntimeAutoApproveOperationStore?.add(signature)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/ai/providers/openai.ts",
    "content": "import { createOpenAI } from '@ai-sdk/openai'\nimport { simulateStreamingMiddleware, wrapLanguageModel } from 'ai'\nimport { obsidianFetch } from '~/ai/transport/obsidian-fetch'\nimport type { AIProviderConfig } from '~/ai/types'\nimport i18n from '~/i18n'\nimport type { AIProviderResolver } from './types'\n\nfunction assertProviderUsable(provider: AIProviderConfig) {\n\tif (!provider.apiKey.trim()) {\n\t\tthrow new Error(i18n.t('chatbox.errors.apiKeyRequired'))\n\t}\n}\n\nexport const openAIProviderResolver: AIProviderResolver = {\n\tassertUsable: assertProviderUsable,\n\tcreateLanguageModel(provider, modelId) {\n\t\tassertProviderUsable(provider)\n\t\tconst factory = createOpenAI({\n\t\t\tname: provider.name || 'openai',\n\t\t\tbaseURL: provider.api,\n\t\t\tapiKey: provider.apiKey,\n\t\t\tfetch: obsidianFetch,\n\t\t})\n\n\t\treturn {\n\t\t\tmodel: wrapLanguageModel({\n\t\t\t\tmodel: factory.chat(modelId),\n\t\t\t\tmiddleware: [simulateStreamingMiddleware()],\n\t\t\t}),\n\t\t\tproviderName: provider.name || 'OpenAI',\n\t\t}\n\t},\n}\n"
  },
  {
    "path": "src/ai/providers/registry.ts",
    "content": "import type { AIProviderConfig } from '~/ai/types'\nimport { openAIProviderResolver } from './openai'\n\nexport function getProviderResolver(_provider: AIProviderConfig) {\n\treturn openAIProviderResolver\n}\n"
  },
  {
    "path": "src/ai/providers/types.ts",
    "content": "import type { LanguageModel } from 'ai'\nimport type { AIProviderConfig } from '~/ai/types'\n\nexport interface ResolvedLanguageModel {\n\tmodel: LanguageModel\n\tproviderName: string\n}\n\nexport interface AIProviderResolver {\n\tassertUsable: (provider: AIProviderConfig) => void\n\tcreateLanguageModel: (\n\t\tprovider: AIProviderConfig,\n\t\tmodelId: string,\n\t) => ResolvedLanguageModel\n}\n"
  },
  {
    "path": "src/ai/runtime.ts",
    "content": "import type { ModelMessage } from 'ai'\nimport { tool as aiTool, generateText, stepCountIs } from 'ai'\nimport { getProviderResolver } from './providers/registry'\nimport {\n\tAIMessage,\n\tAIMessageContentPart,\n\tAIMessageMeta,\n\tAIProviderConfig,\n\tAIToolDefinition,\n} from './types'\n\nexport interface GenerateAssistantTurnRequest {\n\tprovider: AIProviderConfig\n\tmodel: string\n\tmessages: AIMessage[]\n\ttools: AIToolDefinition[]\n\ttemperature?: number\n\tmaxTokens?: number\n}\n\nexport interface GenerateAssistantTurnResult {\n\tmessage: AIMessage\n\tmeta: AIMessageMeta\n}\n\nfunction toTextParts(text?: string | null): AIMessageContentPart[] | null {\n\tif (!text) {\n\t\treturn null\n\t}\n\treturn [{ type: 'text', text }]\n}\n\nfunction toModelMessages(messages: AIMessage[]): ModelMessage[] {\n\treturn messages.map((message) => {\n\t\tswitch (message.role) {\n\t\t\tcase 'system':\n\t\t\t\treturn {\n\t\t\t\t\trole: 'system',\n\t\t\t\t\tcontent: message.content\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(part): part is Extract<AIMessageContentPart, { type: 'text' }> =>\n\t\t\t\t\t\t\t\tpart.type === 'text',\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((part) => part.text)\n\t\t\t\t\t\t.join('\\n'),\n\t\t\t\t}\n\t\t\tcase 'user': {\n\t\t\t\tconst content = message.content.map((part) => {\n\t\t\t\t\tif (part.type === 'image_url') {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: 'image' as const,\n\t\t\t\t\t\t\timage: new URL(part.image_url.url),\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: 'text' as const,\n\t\t\t\t\t\ttext: part.type === 'text' ? part.text : JSON.stringify(part.value),\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn {\n\t\t\t\t\trole: 'user',\n\t\t\t\t\tcontent,\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase 'assistant': {\n\t\t\t\tconst content = [\n\t\t\t\t\t...(message.content || []).map((part) => ({\n\t\t\t\t\t\ttype: 'text' as const,\n\t\t\t\t\t\ttext: part.type === 'text' ? part.text : JSON.stringify(part),\n\t\t\t\t\t})),\n\t\t\t\t\t...(message.tool_calls || []).map((toolCall) => ({\n\t\t\t\t\t\ttype: 'tool-call' as const,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.function.name,\n\t\t\t\t\t\tinput: JSON.parse(toolCall.function.arguments || '{}'),\n\t\t\t\t\t})),\n\t\t\t\t]\n\t\t\t\treturn {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent,\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase 'tool':\n\t\t\t\treturn {\n\t\t\t\t\trole: 'tool',\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'tool-result' as const,\n\t\t\t\t\t\t\ttoolCallId: message.tool_call_id,\n\t\t\t\t\t\t\ttoolName: message.name,\n\t\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\t\ttype: 'text' as const,\n\t\t\t\t\t\t\t\tvalue: message.content\n\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\tpart,\n\t\t\t\t\t\t\t\t\t\t): part is Extract<\n\t\t\t\t\t\t\t\t\t\t\tAIMessageContentPart,\n\t\t\t\t\t\t\t\t\t\t\t{ type: 'text' }\n\t\t\t\t\t\t\t\t\t\t> => part.type === 'text',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.map((part) => part.text)\n\t\t\t\t\t\t\t\t\t.join('\\n'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\t\t}\n\t})\n}\n\nfunction toAISDKTools(tools: AIToolDefinition[]) {\n\treturn Object.fromEntries(\n\t\ttools.map((toolDefinition) => [\n\t\t\ttoolDefinition.name,\n\t\t\taiTool({\n\t\t\t\tdescription: toolDefinition.description,\n\t\t\t\tinputSchema: toolDefinition.inputSchema,\n\t\t\t}),\n\t\t]),\n\t)\n}\n\nfunction toAssistantMessage(result: any) {\n\tconst toolCalls = result.toolCalls.map((toolCall: any) => ({\n\t\tid: toolCall.toolCallId,\n\t\ttype: 'function' as const,\n\t\tfunction: {\n\t\t\tname: toolCall.toolName,\n\t\t\targuments: JSON.stringify(toolCall.input ?? {}),\n\t\t},\n\t}))\n\n\tif (toolCalls.length > 0) {\n\t\treturn {\n\t\t\trole: 'assistant' as const,\n\t\t\tcontent: toTextParts(result.text),\n\t\t\ttool_calls: toolCalls,\n\t\t}\n\t}\n\n\treturn {\n\t\trole: 'assistant' as const,\n\t\tcontent: toTextParts(result.text) || [],\n\t}\n}\n\nexport function assertProviderUsable(provider: AIProviderConfig) {\n\tgetProviderResolver(provider).assertUsable(provider)\n}\n\nexport async function generateAssistantTurn(\n\trequest: GenerateAssistantTurnRequest,\n): Promise<GenerateAssistantTurnResult> {\n\tconst resolver = getProviderResolver(request.provider)\n\tconst modelName =\n\t\trequest.provider.models[request.model]?.name?.trim() || request.model\n\tconst { model, providerName } = resolver.createLanguageModel(\n\t\trequest.provider as never,\n\t\trequest.model,\n\t)\n\tconst result = await generateText({\n\t\tmodel,\n\t\tmessages: toModelMessages(request.messages),\n\t\ttools: toAISDKTools(request.tools),\n\t\tstopWhen: stepCountIs(1),\n\t\ttemperature: request.temperature,\n\t\tmaxOutputTokens: request.maxTokens,\n\t})\n\n\treturn {\n\t\tmessage: toAssistantMessage(result),\n\t\tmeta: {\n\t\t\tproviderId: request.provider.id,\n\t\t\tproviderName: request.provider.name || providerName,\n\t\t\tmodelName,\n\t\t\tusage: {\n\t\t\t\tinputTokens: result.usage.inputTokens,\n\t\t\t\toutputTokens: result.usage.outputTokens,\n\t\t\t\ttotalTokens: result.usage.totalTokens,\n\t\t\t},\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "src/ai/search-path-filter.ts",
    "content": "import GlobMatch from '../utils/glob-match'\nimport { isMarkdownPath } from '../utils/mime/is_markdown_path'\n\nexport interface SearchPathEntry {\n\tpath: string\n\ttype: 'file' | 'folder'\n}\n\nfunction createGlobRules(patterns: string[]) {\n\treturn patterns.map(\n\t\t(pattern) =>\n\t\t\tnew GlobMatch(pattern, {\n\t\t\t\tcaseSensitive: false,\n\t\t\t}),\n\t)\n}\n\nfunction matchesIncludedSearchGlob(path: string, inclusionRules: GlobMatch[]) {\n\tif (inclusionRules.length === 0) {\n\t\treturn true\n\t}\n\treturn inclusionRules.some((rule) => rule.test(path))\n}\n\nfunction matchesExcludedSearchGlob(path: string, exclusionRules: GlobMatch[]) {\n\tif (exclusionRules.some((rule) => rule.test(path))) {\n\t\treturn true\n\t}\n\n\tconst segments = path.replace(/\\/+$/, '').split('/').filter(Boolean)\n\tconst parentCount = Math.max(segments.length - 1, 0)\n\tfor (let i = 1; i <= parentCount; i += 1) {\n\t\tconst parentPath = `${segments.slice(0, i).join('/')}/`\n\t\tif (exclusionRules.some((rule) => rule.test(parentPath))) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunction normalizeExtension(extension: string) {\n\tconst trimmed = extension.trim().toLowerCase()\n\tif (!trimmed) {\n\t\treturn ''\n\t}\n\treturn trimmed.startsWith('.') ? trimmed : `.${trimmed}`\n}\n\nfunction shouldIncludeByExtension(path: string, extensions: string[]) {\n\tif (extensions.length === 0) {\n\t\treturn isMarkdownPath(path)\n\t}\n\tconst normalized = path.toLowerCase()\n\treturn extensions.some((extension) => normalized.endsWith(extension))\n}\n\nfunction isFilePathInScope(filePath: string, basePath: string) {\n\tif (!basePath) {\n\t\treturn true\n\t}\n\treturn filePath === basePath || filePath.startsWith(`${basePath}/`)\n}\n\nexport function filterVaultEntries<TEntry extends SearchPathEntry>(\n\tentries: TEntry[],\n\toptions: {\n\t\tbasePath: string\n\t\tinclude: string[]\n\t\texclude: string[]\n\t\ttype: 'file' | 'folder' | 'all'\n\t\textensions?: string[]\n\t\tdefaultMarkdownOnly?: boolean\n\t},\n) {\n\tconst inclusionRules = createGlobRules(options.include)\n\tconst exclusionRules = createGlobRules(options.exclude)\n\tconst normalizedExtensions = (options.extensions ?? [])\n\t\t.map(normalizeExtension)\n\t\t.filter(Boolean)\n\n\treturn entries.filter((entry) => {\n\t\tif (!isFilePathInScope(entry.path, options.basePath)) {\n\t\t\treturn false\n\t\t}\n\t\tif (options.type !== 'all' && entry.type !== options.type) {\n\t\t\treturn false\n\t\t}\n\t\tconst candidatePath =\n\t\t\tentry.type === 'folder' ? `${entry.path}/` : entry.path\n\t\tif (!matchesIncludedSearchGlob(candidatePath, inclusionRules)) {\n\t\t\treturn false\n\t\t}\n\t\tif (matchesExcludedSearchGlob(candidatePath, exclusionRules)) {\n\t\t\treturn false\n\t\t}\n\t\tif (entry.type === 'file') {\n\t\t\tif (\n\t\t\t\tnormalizedExtensions.length === 0 &&\n\t\t\t\toptions.defaultMarkdownOnly === false\n\t\t\t) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn shouldIncludeByExtension(entry.path, normalizedExtensions)\n\t\t}\n\t\treturn true\n\t})\n}\n"
  },
  {
    "path": "src/ai/tool-call-repeat.ts",
    "content": "import type { AIToolCall } from './types'\n\nexport const REPEATED_TOOL_CALL_THRESHOLD = 5\n\nexport interface ToolCallRepeatState {\n\tlastSignature?: string\n\tconsecutiveCount: number\n\tisRepeatedTooManyTimes: boolean\n}\n\nfunction sortJsonValue(value: unknown): unknown {\n\tif (Array.isArray(value)) {\n\t\treturn value.map((item) => sortJsonValue(item))\n\t}\n\n\tif (value && typeof value === 'object') {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value as Record<string, unknown>)\n\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t.map(([key, nestedValue]) => [key, sortJsonValue(nestedValue)]),\n\t\t)\n\t}\n\n\treturn value\n}\n\nfunction normalizeToolArguments(argumentsText: string) {\n\ttry {\n\t\treturn JSON.stringify(sortJsonValue(JSON.parse(argumentsText)))\n\t} catch {\n\t\treturn argumentsText.trim()\n\t}\n}\n\nexport function createToolCallRoundSignature(toolCalls: AIToolCall[]) {\n\treturn JSON.stringify(\n\t\ttoolCalls.map((toolCall) => ({\n\t\t\tname: toolCall.function.name,\n\t\t\targuments: normalizeToolArguments(toolCall.function.arguments || '{}'),\n\t\t})),\n\t)\n}\n\nexport function updateToolCallRepeatState(\n\tstate: ToolCallRepeatState,\n\ttoolCalls: AIToolCall[],\n): ToolCallRepeatState {\n\tconst signature = createToolCallRoundSignature(toolCalls)\n\tconst consecutiveCount =\n\t\tstate.lastSignature === signature ? state.consecutiveCount + 1 : 1\n\n\treturn {\n\t\tlastSignature: signature,\n\t\tconsecutiveCount,\n\t\tisRepeatedTooManyTimes: consecutiveCount >= REPEATED_TOOL_CALL_THRESHOLD,\n\t}\n}\n"
  },
  {
    "path": "src/ai/tools.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\nimport type { App } from 'obsidian'\nimport { createAITools } from './tools'\nimport { VAULT_MOUNT_POINT } from './bash/runtime'\nimport { filterVaultEntries, type SearchPathEntry } from './search-path-filter'\n\nfunction makeEntries(\n\tpaths: Array<{ path: string; type: SearchPathEntry['type'] }>,\n): SearchPathEntry[] {\n\treturn paths\n}\n\nfunction createToolApp() {\n\tconst files = new Map<string, string>([['notes/existing.md', 'old']])\n\tconst folders = new Set<string>(['', 'notes'])\n\tconst normalize = (path: string) => path.replace(/^\\/+|\\/+$/g, '')\n\tconst dirname = (path: string) =>\n\t\t!path || !path.includes('/') ? '' : path.slice(0, path.lastIndexOf('/'))\n\tconst basename = (path: string) => {\n\t\tconst normalized = normalize(path)\n\t\treturn normalized.slice(normalized.lastIndexOf('/') + 1)\n\t}\n\tconst ensureFolder = (path: string) => {\n\t\tconst normalized = normalize(path)\n\t\tif (!normalized) {\n\t\t\treturn\n\t\t}\n\t\tconst parent = dirname(normalized)\n\t\tif (parent && parent !== normalized) {\n\t\t\tensureFolder(parent)\n\t\t}\n\t\tfolders.add(normalized)\n\t}\n\tconst listChildren = (path: string) => {\n\t\tconst normalized = normalize(path)\n\t\tconst prefix = normalized ? `${normalized}/` : ''\n\t\treturn [...new Set([...folders, ...files.keys()])]\n\t\t\t.filter(\n\t\t\t\t(item) =>\n\t\t\t\t\titem.startsWith(prefix) &&\n\t\t\t\t\titem !== normalized &&\n\t\t\t\t\t!item.slice(prefix.length).includes('/'),\n\t\t\t)\n\t\t\t.sort()\n\t}\n\tconst buildFolder = (path: string, parent: any): any => {\n\t\tconst normalized = normalize(path)\n\t\tconst folder: any = {\n\t\t\tpath: normalized,\n\t\t\tname: normalized ? basename(normalized) : '',\n\t\t\tparent,\n\t\t\tchildren: [],\n\t\t}\n\t\tfolder.children = listChildren(normalized).map((childPath) => {\n\t\t\tif (folders.has(childPath)) {\n\t\t\t\treturn buildFolder(childPath, folder)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tpath: childPath,\n\t\t\t\tname: basename(childPath),\n\t\t\t\tparent: folder,\n\t\t\t\tstat: {\n\t\t\t\t\tsize: files.get(childPath)?.length ?? 0,\n\t\t\t\t\tmtime: 0,\n\t\t\t\t},\n\t\t\t}\n\t\t})\n\t\treturn folder\n\t}\n\tconst getAbstractFileByPath = (path: string): any => {\n\t\tconst normalized = normalize(path)\n\t\tif (!normalized) {\n\t\t\treturn buildFolder('', null)\n\t\t}\n\t\tif (folders.has(normalized)) {\n\t\t\treturn buildFolder(normalized, buildFolder(dirname(normalized), null))\n\t\t}\n\t\tif (files.has(normalized)) {\n\t\t\treturn {\n\t\t\t\tpath: normalized,\n\t\t\t\tname: basename(normalized),\n\t\t\t\tparent: buildFolder(dirname(normalized), null),\n\t\t\t\tstat: {\n\t\t\t\t\tsize: files.get(normalized)?.length ?? 0,\n\t\t\t\t\tmtime: 0,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\treturn {\n\t\tvault: {\n\t\t\tgetRoot() {\n\t\t\t\treturn buildFolder('', null)\n\t\t\t},\n\t\t\tgetAbstractFileByPath,\n\t\t\tasync readBinary(file: any) {\n\t\t\t\treturn new TextEncoder().encode(files.get(normalize(file.path)) ?? '')\n\t\t\t\t\t.buffer as ArrayBuffer\n\t\t\t},\n\t\t\tasync cachedRead(file: any) {\n\t\t\t\treturn files.get(normalize(file.path)) ?? ''\n\t\t\t},\n\t\t\tasync createBinary(path: string, data: ArrayBuffer) {\n\t\t\t\tconst normalized = normalize(path)\n\t\t\t\tensureFolder(dirname(normalized))\n\t\t\t\tfiles.set(normalized, new TextDecoder().decode(data))\n\t\t\t\treturn getAbstractFileByPath(normalized)\n\t\t\t},\n\t\t\tasync modifyBinary(file: any, data: ArrayBuffer) {\n\t\t\t\tfiles.set(normalize(file.path), new TextDecoder().decode(data))\n\t\t\t},\n\t\t\tasync modify(file: any, content: string) {\n\t\t\t\tfiles.set(normalize(file.path), content)\n\t\t\t},\n\t\t\tasync createFolder(path: string) {\n\t\t\t\tensureFolder(path)\n\t\t\t\treturn getAbstractFileByPath(path)\n\t\t\t},\n\t\t\tasync delete(file: any) {\n\t\t\t\tconst normalized = normalize(file.path)\n\t\t\t\tfiles.delete(normalized)\n\t\t\t\tfor (const folder of [...folders]) {\n\t\t\t\t\tif (folder === normalized || folder.startsWith(`${normalized}/`)) {\n\t\t\t\t\t\tfolders.delete(folder)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tasync rename(file: any, newPath: string) {\n\t\t\t\tconst from = normalize(file.path)\n\t\t\t\tconst to = normalize(newPath)\n\t\t\t\tensureFolder(dirname(to))\n\t\t\t\tconst value = files.get(from)\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tfiles.delete(from)\n\t\t\t\t\tfiles.set(to, value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfor (const folder of [...folders]) {\n\t\t\t\t\tif (folder === from || folder.startsWith(`${from}/`)) {\n\t\t\t\t\t\tfolders.delete(folder)\n\t\t\t\t\t\tfolders.add(`${to}${folder.slice(from.length)}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} as unknown as App\n}\n\ndescribe('filterVaultEntries', () => {\n\tit('treats include patterns as strict filters', () => {\n\t\tconst entries = makeEntries([\n\t\t\t{ path: '2026-03-30.md', type: 'file' },\n\t\t\t{ path: 'NS_Memo/工作任务.md', type: 'file' },\n\t\t\t{ path: 'NS_Memo/人员列表.md', type: 'file' },\n\t\t\t{ path: 'Excel表格.xlsx', type: 'file' },\n\t\t])\n\n\t\tconst results = filterVaultEntries(entries, {\n\t\t\tbasePath: '',\n\t\t\tinclude: ['*任务*', '*人员*'],\n\t\t\texclude: [],\n\t\t\ttype: 'file',\n\t\t\tdefaultMarkdownOnly: false,\n\t\t})\n\n\t\texpect(results.map((entry) => entry.path)).toEqual([\n\t\t\t'NS_Memo/工作任务.md',\n\t\t\t'NS_Memo/人员列表.md',\n\t\t])\n\t})\n\n\tit('still excludes files under excluded parent folders', () => {\n\t\tconst entries = makeEntries([\n\t\t\t{ path: 'NS_Memo/private/任务.md', type: 'file' },\n\t\t\t{ path: 'NS_Memo/public/任务.md', type: 'file' },\n\t\t])\n\n\t\tconst results = filterVaultEntries(entries, {\n\t\t\tbasePath: '',\n\t\t\tinclude: ['*任务*'],\n\t\t\texclude: ['NS_Memo/private/'],\n\t\t\ttype: 'file',\n\t\t\tdefaultMarkdownOnly: false,\n\t\t})\n\n\t\texpect(results.map((entry) => entry.path)).toEqual([\n\t\t\t'NS_Memo/public/任务.md',\n\t\t])\n\t})\n\n\tit('matches folder paths against include patterns when searching folders', () => {\n\t\tconst entries = makeEntries([\n\t\t\t{ path: '项目', type: 'folder' },\n\t\t\t{ path: '工作台', type: 'folder' },\n\t\t\t{ path: '归档', type: 'folder' },\n\t\t])\n\n\t\tconst results = filterVaultEntries(entries, {\n\t\t\tbasePath: '',\n\t\t\tinclude: ['*工作*'],\n\t\t\texclude: [],\n\t\t\ttype: 'folder',\n\t\t\tdefaultMarkdownOnly: false,\n\t\t})\n\n\t\texpect(results.map((entry) => entry.path)).toEqual(['工作台'])\n\t})\n\n\tit('parses string boolean values without JS truthiness coercion', () => {\n\t\tconst tools = createAITools({} as never)\n\t\tconst bashTool = tools.find((tool) => tool.name === 'bash')\n\n\t\texpect(\n\t\t\tbashTool?.inputSchema.parse({\n\t\t\t\tscript: 'pwd',\n\t\t\t\trawScript: 'false',\n\t\t\t}),\n\t\t).toEqual({\n\t\t\tscript: 'pwd',\n\t\t\tcwd: VAULT_MOUNT_POINT,\n\t\t\trawScript: false,\n\t\t})\n\t})\n\n\tit('registers bash and executes against /vault', async () => {\n\t\tconst tools = createAITools(createToolApp())\n\t\tconst bashTool = tools.find((tool) => tool.name === 'bash')\n\n\t\texpect(bashTool).toBeDefined()\n\n\t\tconst result = await bashTool!.execute(\n\t\t\t{\n\t\t\t\tscript: 'printf \"new note\" > new.md && cat new.md',\n\t\t\t\tcwd: VAULT_MOUNT_POINT,\n\t\t\t\trawScript: false,\n\t\t\t},\n\t\t\t{} as never,\n\t\t)\n\n\t\texpect(result).toEqual({\n\t\t\tresult: 'new note',\n\t\t\treversibleOps: [\n\t\t\t\t{\n\t\t\t\t\tvaultPath: 'new.md',\n\t\t\t\t\toperation: 'create',\n\t\t\t\t\tbefore: { kind: 'file' },\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t})\n\n\tit('accepts absolute virtual cwd paths for bash', async () => {\n\t\tconst tools = createAITools(createToolApp())\n\t\tconst bashTool = tools.find((tool) => tool.name === 'bash')\n\n\t\tawait expect(\n\t\t\tbashTool!.execute(\n\t\t\t\t{\n\t\t\t\t\tscript: 'pwd',\n\t\t\t\t\tcwd: '/vault',\n\t\t\t\t\trawScript: false,\n\t\t\t\t},\n\t\t\t\t{} as never,\n\t\t\t),\n\t\t).resolves.toEqual({\n\t\t\tresult: '/vault\\n',\n\t\t\treversibleOps: [],\n\t\t})\n\t})\n\n\tit('records reversible ops for edit_file replacements', async () => {\n\t\tconst tools = createAITools(createToolApp())\n\t\tconst editTool = tools.find((tool) => tool.name === 'edit_file')\n\n\t\tconst result = await editTool!.execute(\n\t\t\t{\n\t\t\t\tpath: 'notes/existing.md',\n\t\t\t\toldText: 'old',\n\t\t\t\tnewText: 'new',\n\t\t\t},\n\t\t\t{} as never,\n\t\t)\n\n\t\texpect(result).toEqual({\n\t\t\tresult: {\n\t\t\t\tpath: 'notes/existing.md',\n\t\t\t\treplaced: true,\n\t\t\t\tmatchCount: 1,\n\t\t\t},\n\t\t\treversibleOps: [\n\t\t\t\t{\n\t\t\t\t\tvaultPath: 'notes/existing.md',\n\t\t\t\t\toperation: 'update',\n\t\t\t\t\tbefore: {\n\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\tcontentBase64: Buffer.from('old').toString('base64'),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "src/ai/tools.ts",
    "content": "import { App, normalizePath, TFile } from 'obsidian'\nimport { posix as pathPosix } from 'path-browserify'\nimport { z } from 'zod'\nimport { execVaultBash, VAULT_MOUNT_POINT } from '~/ai/bash/runtime'\nimport i18n from '~/i18n'\nimport type { PermissionGuard } from './permission-guard'\nimport { AIToolDefinition, ToolExecutionResult } from './types'\n\ninterface ReplaceResult {\n\tcontent: string\n\tmatchCount: number\n}\n\nfunction encodeTextBase64(content: string) {\n\tif (typeof Buffer !== 'undefined') {\n\t\treturn Buffer.from(content).toString('base64')\n\t}\n\treturn btoa(String.fromCharCode(...new TextEncoder().encode(content)))\n}\n\nconst textValue = (field: string) =>\n\tz.string({\n\t\terror: () => i18n.t('chatbox.errors.toolFieldRequired', { field }),\n\t})\n\nconst booleanValue = (field: string) =>\n\tz.preprocess(\n\t\t(value) => {\n\t\t\tif (typeof value === 'boolean') {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tif (typeof value === 'string') {\n\t\t\t\tconst normalized = value.trim().toLowerCase()\n\t\t\t\tif (normalized === 'true') {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tif (normalized === 'false') {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value\n\t\t},\n\t\tz.boolean(i18n.t('chatbox.errors.toolFieldRequired', { field })),\n\t)\n\nfunction isAllowedBashCwd(pathValue: string) {\n\tconst normalized = pathPosix.normalize(\n\t\tpathPosix.resolve('/', pathValue || '/'),\n\t)\n\treturn (\n\t\tnormalized === '/' ||\n\t\tnormalized === VAULT_MOUNT_POINT ||\n\t\tnormalized.startsWith(`${VAULT_MOUNT_POINT}/`)\n\t)\n}\n\ninterface SpawnToolHandler {\n\t(params: {\n\t\tprompt: string\n\t\ttitle?: string\n\t\tparentTaskId?: string\n\t\tdepth: number\n\t\tmaxDepth: number\n\t\tsessionId: string\n\t}): Promise<Record<string, unknown>>\n}\n\ninterface CreateAIToolsOptions {\n\tspawnTask?: SpawnToolHandler\n\tallowSpawn?: boolean\n\tpermissionGuard?: PermissionGuard\n}\n\nfunction replaceUniqueOccurrence(\n\tcontent: string,\n\toldText: string,\n\tnewText: string,\n) {\n\tlet matchIndex = content.indexOf(oldText)\n\tlet matchCount = 0\n\n\twhile (matchIndex !== -1) {\n\t\tmatchCount += 1\n\t\tif (matchCount > 1) {\n\t\t\tbreak\n\t\t}\n\t\tmatchIndex = content.indexOf(oldText, matchIndex + oldText.length)\n\t}\n\n\tif (matchCount === 0) {\n\t\tthrow new Error(i18n.t('chatbox.errors.editMatchNotFound'))\n\t}\n\tif (matchCount > 1) {\n\t\tthrow new Error(i18n.t('chatbox.errors.editMatchNotUnique'))\n\t}\n\n\treturn {\n\t\tcontent: content.replace(oldText, newText),\n\t\tmatchCount,\n\t} satisfies ReplaceResult\n}\n\nexport function createAITools(\n\tapp: App,\n\toptions: CreateAIToolsOptions = {},\n): AIToolDefinition[] {\n\tconst { permissionGuard } = options\n\tconst tools: AIToolDefinition[] = [\n\t\t{\n\t\t\tname: 'edit_file',\n\t\t\tdescription:\n\t\t\t\t'Edit a vault text file by replacing one exact, uniquely matched text block with new text. The path can be a vault-relative path (e.g. notes/file.md) or an absolute virtual path (e.g. /vault/notes/file.md).',\n\t\t\tinputSchema: z.object({\n\t\t\t\tpath: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.trim()\n\t\t\t\t\t.min(\n\t\t\t\t\t\t1,\n\t\t\t\t\t\ti18n.t('chatbox.errors.toolFieldRequired', { field: 'path' }),\n\t\t\t\t\t),\n\t\t\t\toldText: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.min(\n\t\t\t\t\t\t1,\n\t\t\t\t\t\ti18n.t('chatbox.errors.toolFieldRequired', { field: 'oldText' }),\n\t\t\t\t\t),\n\t\t\t\tnewText: textValue('newText'),\n\t\t\t}),\n\t\t\texecute: async (params): Promise<ToolExecutionResult> => {\n\t\t\t\tconst path = params.path\n\t\t\t\tconst oldText = params.oldText\n\t\t\t\tconst newText = params.newText\n\t\t\t\tif (path.startsWith('/') && !path.startsWith(`${VAULT_MOUNT_POINT}/`)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`edit_file can only access files inside the vault. Use a vault-relative path (e.g. notes/file.md) or an absolute virtual path under ${VAULT_MOUNT_POINT}/ (e.g. ${VAULT_MOUNT_POINT}/notes/file.md).`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconst strippedPath = path.startsWith(`${VAULT_MOUNT_POINT}/`)\n\t\t\t\t\t? path.slice(VAULT_MOUNT_POINT.length)\n\t\t\t\t\t: path\n\t\t\t\tconst normalizedPath = normalizePath(strippedPath)\n\n\t\t\t\tawait permissionGuard?.({\n\t\t\t\t\ttype: 'fs',\n\t\t\t\t\tfs: {\n\t\t\t\t\t\tkind: 'edit',\n\t\t\t\t\t\tpath: `${VAULT_MOUNT_POINT}/${normalizedPath}`,\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tconst target = app.vault.getAbstractFileByPath(normalizedPath)\n\n\t\t\t\tif (!target) {\n\t\t\t\t\tthrow new Error(i18n.t('chatbox.errors.fileNotFound', { path }))\n\t\t\t\t}\n\t\t\t\tif (!(target instanceof TFile)) {\n\t\t\t\t\tthrow new Error(i18n.t('chatbox.errors.notFile', { path }))\n\t\t\t\t}\n\n\t\t\t\tconst content = await app.vault.cachedRead(target)\n\t\t\t\tconst replaced = replaceUniqueOccurrence(content, oldText, newText)\n\t\t\t\tawait app.vault.modify(target, replaced.content)\n\n\t\t\t\treturn {\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tpath: normalizedPath,\n\t\t\t\t\t\treplaced: true,\n\t\t\t\t\t\tmatchCount: replaced.matchCount,\n\t\t\t\t\t},\n\t\t\t\t\treversibleOps: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvaultPath: normalizedPath,\n\t\t\t\t\t\t\toperation: 'update',\n\t\t\t\t\t\t\tbefore: {\n\t\t\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\t\t\tcontentBase64: encodeTextBase64(content),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: 'bash',\n\t\t\tdescription:\n\t\t\t\t\"Execute bash against a virtual filesystem where the Obsidian vault is mounted at /vault. Use standard shell commands like ls, cat, rg, mkdir, mv, cp, and rm. Treat /vault as the user's personal knowledge base — only write there for content the user intends to keep; use /tmp for intermediate or scratch work.\",\n\t\t\tinputSchema: z.object({\n\t\t\t\tscript: textValue('script'),\n\t\t\t\tcwd: z.string().default(VAULT_MOUNT_POINT),\n\t\t\t\tstdin: z.string().optional(),\n\t\t\t\trawScript: booleanValue('rawScript').default(false),\n\t\t\t}),\n\t\t\texecute: async (params): Promise<ToolExecutionResult> => {\n\t\t\t\tconst cwd = params.cwd || VAULT_MOUNT_POINT\n\t\t\t\tif (!isAllowedBashCwd(cwd)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid bash cwd: ${cwd}. Allowed roots are / and ${VAULT_MOUNT_POINT}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tconst result = await execVaultBash(app, params.script, {\n\t\t\t\t\tcwd,\n\t\t\t\t\tstdin: params.stdin,\n\t\t\t\t\trawScript: params.rawScript,\n\t\t\t\t\tpermissionGuard,\n\t\t\t\t})\n\n\t\t\t\tconst truncateLine = (line: string) =>\n\t\t\t\t\tline.length > 2000\n\t\t\t\t\t\t? `${line.slice(0, 2000)}...[line truncated: ${line.length} chars total]`\n\t\t\t\t\t\t: line\n\n\t\t\t\tconst processOutput = (text: string) =>\n\t\t\t\t\ttext.split('\\n').map(truncateLine).join('\\n')\n\n\t\t\t\treturn {\n\t\t\t\t\tresult: `${processOutput(result.stdout)}${processOutput(result.stderr)}`,\n\t\t\t\t\treversibleOps: result.reversibleOps,\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t]\n\n\tif (options.spawnTask && options.allowSpawn !== false) {\n\t\ttools.push({\n\t\t\tname: 'spawn',\n\t\t\tdescription:\n\t\t\t\t'Run a large independent background task and return its task result when finished.',\n\t\t\tinputSchema: z.object({\n\t\t\t\ttask: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.trim()\n\t\t\t\t\t.min(\n\t\t\t\t\t\t1,\n\t\t\t\t\t\ti18n.t('chatbox.errors.toolFieldRequired', { field: 'task' }),\n\t\t\t\t\t),\n\t\t\t\tlabel: z.string().trim().optional(),\n\t\t\t}),\n\t\t\texecute: async (params, context): Promise<ToolExecutionResult> => {\n\t\t\t\treturn {\n\t\t\t\t\tresult: await options.spawnTask!({\n\t\t\t\t\t\tprompt: params.task,\n\t\t\t\t\t\ttitle: params.label,\n\t\t\t\t\t\tparentTaskId: context.parentTaskId,\n\t\t\t\t\t\tdepth: context.depth + 1,\n\t\t\t\t\t\tmaxDepth: context.maxDepth,\n\t\t\t\t\t\tsessionId: context.session.id,\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t}\n\n\treturn tools\n}\n"
  },
  {
    "path": "src/ai/transport/obsidian-fetch.test.ts",
    "content": "import { describe, expect, it, vi } from 'vitest'\nimport { obsidianFetch } from './obsidian-fetch'\n\nconst { requestUrl } = vi.hoisted(() => ({\n\trequestUrl: vi.fn(),\n}))\n\nvi.mock('~/utils/request-url', () => ({\n\tdefault: requestUrl,\n}))\n\ndescribe('obsidianFetch', () => {\n\tit('routes requests through requestUrl and returns a Response', async () => {\n\t\trequestUrl.mockResolvedValueOnce({\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t'content-type': 'application/json',\n\t\t\t},\n\t\t\tarrayBuffer: new TextEncoder().encode('{\"ok\":true}').buffer,\n\t\t\ttext: '{\"ok\":true}',\n\t\t\tjson: { ok: true },\n\t\t})\n\n\t\tconst response = await obsidianFetch(\n\t\t\t'https://example.com/v1/chat/completions',\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: 'Bearer key',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ hello: 'world' }),\n\t\t\t},\n\t\t)\n\n\t\texpect(requestUrl).toHaveBeenCalledWith({\n\t\t\turl: 'https://example.com/v1/chat/completions',\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\tauthorization: 'Bearer key',\n\t\t\t},\n\t\t\tbody: expect.any(ArrayBuffer),\n\t\t\tthrow: false,\n\t\t})\n\t\texpect(response.status).toBe(200)\n\t\tawait expect(response.json()).resolves.toEqual({ ok: true })\n\t})\n})\n"
  },
  {
    "path": "src/ai/transport/obsidian-fetch.ts",
    "content": "import { getReasonPhrase } from 'http-status-codes'\nimport requestUrl from '~/utils/request-url'\n\ntype FetchFunction = (\n\tinput: RequestInfo | URL,\n\tinit?: RequestInit,\n) => Promise<Response>\n\nfunction toHeadersRecord(headers?: HeadersInit) {\n\tif (!headers) {\n\t\treturn undefined\n\t}\n\n\tif (headers instanceof Headers) {\n\t\tconst entries: Array<[string, string]> = []\n\t\theaders.forEach((value, key) => {\n\t\t\tentries.push([key, value])\n\t\t})\n\t\treturn Object.fromEntries(entries)\n\t}\n\tif (Array.isArray(headers)) {\n\t\treturn Object.fromEntries(headers)\n\t}\n\treturn { ...headers }\n}\n\nasync function toRequestParts(input: RequestInfo | URL, init?: RequestInit) {\n\tif (input instanceof Request) {\n\t\treturn {\n\t\t\turl: input.url,\n\t\t\tmethod: init?.method || input.method,\n\t\t\theaders: toHeadersRecord(init?.headers || input.headers),\n\t\t\tbody: init?.body\n\t\t\t\t? await new Response(init.body).arrayBuffer()\n\t\t\t\t: input.method === 'GET' || input.method === 'HEAD'\n\t\t\t\t\t? undefined\n\t\t\t\t\t: await input.arrayBuffer(),\n\t\t}\n\t}\n\n\treturn {\n\t\turl: input instanceof URL ? input.toString() : String(input),\n\t\tmethod: init?.method || 'GET',\n\t\theaders: toHeadersRecord(init?.headers),\n\t\tbody: init?.body ? await new Response(init.body).arrayBuffer() : undefined,\n\t}\n}\n\nexport const obsidianFetch: FetchFunction = async (\n\tinput: RequestInfo | URL,\n\tinit?: RequestInit,\n) => {\n\tconst request = await toRequestParts(input, init)\n\tconst response = await requestUrl({\n\t\turl: request.url,\n\t\tmethod: request.method,\n\t\theaders: request.headers,\n\t\tbody: request.body,\n\t\tthrow: false,\n\t})\n\tconst statusText = getReasonPhrase(response.status)\n\n\treturn new Response(\n\t\t[101, 103, 204, 205, 304].includes(response.status)\n\t\t\t? null\n\t\t\t: response.arrayBuffer,\n\t\t{\n\t\t\tstatus: response.status,\n\t\t\tstatusText,\n\t\t\theaders: response.headers,\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "src/ai/tree.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\nimport { flattenTreeNodes, type TreeNode } from './tree'\n\nconst sampleTree: TreeNode[] = [\n\t{\n\t\tname: 'Projects',\n\t\tpath: 'Projects',\n\t\ttype: 'folder',\n\t\tchildren: [\n\t\t\t{\n\t\t\t\tname: 'Alpha.md',\n\t\t\t\tpath: 'Projects/Alpha.md',\n\t\t\t\ttype: 'file',\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Nested',\n\t\t\t\tpath: 'Projects/Nested',\n\t\t\t\ttype: 'folder',\n\t\t\t\tchildren: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Deep.md',\n\t\t\t\t\t\tpath: 'Projects/Nested/Deep.md',\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: 'Inbox.md',\n\t\tpath: 'Inbox.md',\n\t\ttype: 'file',\n\t},\n]\n\ndescribe('flattenTreeNodes', () => {\n\tit('returns only direct children at depth 1', () => {\n\t\texpect(flattenTreeNodes(sampleTree, 1).map((item) => item.path)).toEqual([\n\t\t\t'Projects',\n\t\t\t'Inbox.md',\n\t\t])\n\t})\n\n\tit('returns descendants up to the requested depth', () => {\n\t\texpect(flattenTreeNodes(sampleTree, 2).map((item) => item.path)).toEqual([\n\t\t\t'Projects',\n\t\t\t'Projects/Alpha.md',\n\t\t\t'Projects/Nested',\n\t\t\t'Inbox.md',\n\t\t])\n\t\texpect(flattenTreeNodes(sampleTree, 3).map((item) => item.path)).toEqual([\n\t\t\t'Projects',\n\t\t\t'Projects/Alpha.md',\n\t\t\t'Projects/Nested',\n\t\t\t'Projects/Nested/Deep.md',\n\t\t\t'Inbox.md',\n\t\t])\n\t})\n\n\tit('returns no items for depth below 1', () => {\n\t\texpect(flattenTreeNodes(sampleTree, 0)).toEqual([])\n\t})\n})\n"
  },
  {
    "path": "src/ai/tree.ts",
    "content": "export interface TreeNode {\n\tname: string\n\tpath: string\n\ttype: 'folder' | 'file'\n\tchildren?: TreeNode[]\n}\n\nexport function flattenTreeNodes(nodes: TreeNode[], depth: number) {\n\tif (depth < 1) {\n\t\treturn []\n\t}\n\n\tconst items: Array<{\n\t\tname: string\n\t\tpath: string\n\t\ttype: 'folder' | 'file'\n\t}> = []\n\n\tfor (const node of nodes) {\n\t\titems.push({\n\t\t\tname: node.name,\n\t\t\tpath: node.path,\n\t\t\ttype: node.type,\n\t\t})\n\n\t\tif (node.type === 'folder' && depth > 1 && node.children?.length) {\n\t\t\titems.push(...flattenTreeNodes(node.children, depth - 1))\n\t\t}\n\t}\n\n\treturn items\n}\n"
  },
  {
    "path": "src/ai/types.ts",
    "content": "import type {\n\tChatMessage as DomainChatMessage,\n\tChatMessageContentPart as DomainChatMessageContentPart,\n\tChatMessageMeta as DomainChatMessageMeta,\n\tChatMessageRecord as DomainChatMessageRecord,\n\tChatSession as DomainChatSession,\n\tChatTaskRecord as DomainChatTaskRecord,\n\tChatToolCall as DomainChatToolCall,\n\tChatUsage as DomainChatUsage,\n} from '~/chat/domain'\nimport { z } from 'zod'\n\nexport const aiModelModalitySchema = z.enum([\n\t'text',\n\t'image',\n\t'audio',\n\t'video',\n\t'pdf',\n])\nexport const aiModelCostSchema = z.object({\n\tinput: z.number(),\n\toutput: z.number(),\n\tcache_read: z.number().optional(),\n\tcache_write: z.number().optional(),\n\tcontext_over_200k: z\n\t\t.object({\n\t\t\tinput: z.number(),\n\t\t\toutput: z.number(),\n\t\t\tcache_read: z.number().optional(),\n\t\t\tcache_write: z.number().optional(),\n\t\t})\n\t\t.optional(),\n\tinput_audio: z.number().optional(),\n\toutput_audio: z.number().optional(),\n\treasoning: z.number().optional(),\n})\nexport const aiModelLimitSchema = z.object({\n\tcontext: z.number(),\n\tinput: z.number().optional(),\n\toutput: z.number(),\n})\nexport const aiModelProviderOverrideSchema = z.object({\n\tnpm: z.string().optional(),\n\tapi: z.string().optional(),\n\tshape: z.enum(['completions']).optional(),\n})\nexport const aiModelConfigSchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\tfamily: z.string().optional(),\n\tattachment: z.boolean(),\n\treasoning: z.boolean(),\n\ttool_call: z.boolean(),\n\tstructured_output: z.boolean().optional(),\n\ttemperature: z.boolean().optional(),\n\tknowledge: z.string().optional(),\n\trelease_date: z.string(),\n\tlast_updated: z.string(),\n\tmodalities: z.object({\n\t\tinput: z.array(aiModelModalitySchema),\n\t\toutput: z.array(aiModelModalitySchema),\n\t}),\n\topen_weights: z.boolean(),\n\tcost: aiModelCostSchema.optional(),\n\tlimit: aiModelLimitSchema,\n\tinterleaved: z\n\t\t.union([\n\t\t\tz.boolean(),\n\t\t\tz.object({\n\t\t\t\tfield: z.string(),\n\t\t\t}),\n\t\t])\n\t\t.optional(),\n\tprovider: aiModelProviderOverrideSchema.optional(),\n\tstatus: z.enum(['alpha', 'beta', 'deprecated']).optional(),\n\texperimental: z.record(z.string(), z.unknown()).optional(),\n})\nexport const aiModelInputSchema = aiModelConfigSchema.partial()\nexport type AIModelConfig = z.infer<typeof aiModelConfigSchema>\nexport type AIModelInput = z.infer<typeof aiModelInputSchema>\nexport const aiModelConfigsSchema = z.record(z.string(), aiModelConfigSchema)\nexport const aiModelInputsSchema = z.record(z.string(), aiModelInputSchema)\nexport type AIModelConfigs = z.infer<typeof aiModelConfigsSchema>\nexport type AIModelInputs = z.infer<typeof aiModelInputsSchema>\n\nexport const aiProviderDefinitionSchema = z.object({\n\tid: z.string(),\n\tenv: z.array(z.string()),\n\tnpm: z.string(),\n\tapi: z.string().optional(),\n\tname: z.string(),\n\tdoc: z.string(),\n\tmodels: aiModelConfigsSchema,\n})\nexport const aiProviderDefinitionsSchema = z.record(\n\tz.string(),\n\taiProviderDefinitionSchema,\n)\nexport type AIProviderDefinition = z.infer<typeof aiProviderDefinitionSchema>\nexport type AIProviderDefinitions = z.infer<typeof aiProviderDefinitionsSchema>\n\nexport const aiProviderConfigSchema = aiProviderDefinitionSchema.extend({\n\tapiKey: z.string(),\n})\nexport const aiProviderInputSchema = aiProviderConfigSchema\n\t.partial()\n\t.extend({\n\t\tmodels: aiModelInputsSchema.optional(),\n\t})\nexport const aiProviderConfigsSchema = z.record(\n\tz.string(),\n\taiProviderConfigSchema,\n)\nexport const aiProviderInputsSchema = z.record(\n\tz.string(),\n\taiProviderInputSchema,\n)\nexport type AIProviderConfig = z.infer<typeof aiProviderConfigSchema>\nexport type AIProviderInput = z.infer<typeof aiProviderInputSchema>\nexport type AIProviderConfigs = z.infer<typeof aiProviderConfigsSchema>\nexport type AIProviderInputs = z.infer<typeof aiProviderInputsSchema>\n\nexport type AIUsage = DomainChatUsage\nexport type AITextPart = Extract<DomainChatMessageContentPart, { type: 'text' }>\nexport type AIImageUrlPart = Extract<\n\tDomainChatMessageContentPart,\n\t{ type: 'image_url' }\n>\nexport type AIMessageContentPart = DomainChatMessageContentPart\nexport type AIToolCall = DomainChatToolCall\nexport type AIMessage = DomainChatMessage\nexport type AITaskStatus = DomainChatTaskRecord['status']\nexport type AIMessageMeta = DomainChatMessageMeta\nexport type AIMessageRecord = DomainChatMessageRecord\nexport type AISession = DomainChatSession\nexport type AITaskRecord = DomainChatTaskRecord\n\nexport interface AIToolExecutionContext {\n\tsession: AISession\n\tdepth: number\n\tmaxDepth: number\n\tparentTaskId?: string\n}\n\nexport interface ToolExecutionResult {\n\tresult: string | Record<string, unknown>\n\treversibleOps?: DomainChatMessageRecord['reversibleOps']\n}\n\nexport interface AIToolDefinition {\n\tname: string\n\tdescription: string\n\tinputSchema: z.ZodTypeAny\n\texecute: (\n\t\tparams: any,\n\t\tcontext: AIToolExecutionContext,\n\t) => Promise<ToolExecutionResult>\n}\n"
  },
  {
    "path": "src/api/delta.ts",
    "content": "import { XMLParser } from 'fast-xml-parser'\nimport { decode as decodeHtmlEntities } from 'html-entities'\nimport { isNil } from 'lodash-es'\nimport { apiLimiter } from '~/utils/api-limiter'\nimport { NSAPI } from '~/utils/ns-api'\nimport requestUrl from '~/utils/request-url'\n\nexport interface DeltaEntry {\n\tpath: string\n\tsize: number\n\tisDeleted: boolean\n\tisDir: boolean\n\tmodified: string\n\trevision: number\n}\n\nexport interface DeltaResponse {\n\treset: boolean\n\tcursor: string\n\thasMore: boolean\n\tdelta: {\n\t\tentry: DeltaEntry[]\n\t}\n}\n\ninterface GetDeltaInput {\n\tfolderName: string\n\tcursor?: string\n\ttoken: string\n}\n\nexport const getDelta = apiLimiter.wrap(\n\tasync ({ folderName, cursor, token }: GetDeltaInput) => {\n\t\tconst body = `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n              <s:delta xmlns:s=\"http://ns.jianguoyun.com\">\n                  <s:folderName>${folderName}</s:folderName>\n                  <s:cursor>${cursor ?? ''}</s:cursor>\n              </s:delta>`\n\t\tconst response = await requestUrl({\n\t\t\turl: NSAPI('delta'),\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Basic ${token}`,\n\t\t\t\t'Content-Type': 'application/xml',\n\t\t\t},\n\t\t\tbody,\n\t\t})\n\n\t\tconst parseXml = new XMLParser({\n\t\t\tattributeNamePrefix: '',\n\t\t\tremoveNSPrefix: true,\n\t\t\tnumberParseOptions: {\n\t\t\t\teNotation: false,\n\t\t\t\thex: true,\n\t\t\t\tleadingZeros: true,\n\t\t\t},\n\t\t\tprocessEntities: false,\n\t\t})\n\t\tconst result: { response: DeltaResponse } = parseXml.parse(response.text)\n\n\t\tif (!isNil(result?.response?.cursor)) {\n\t\t\tresult.response.cursor = result.response.cursor.toString()\n\t\t}\n\t\tif (result.response.delta) {\n\t\t\tconst entry = result.response.delta.entry\n\t\t\tif (!Array.isArray(entry)) {\n\t\t\t\tresult.response.delta.entry = [entry]\n\t\t\t}\n\t\t} else {\n\t\t\tresult.response.delta = {\n\t\t\t\tentry: [],\n\t\t\t}\n\t\t}\n\t\tfor (const entry of result.response.delta.entry) {\n\t\t\tentry.path = decodeHtmlEntities(entry.path)\n\t\t}\n\t\treturn result\n\t},\n)\n"
  },
  {
    "path": "src/api/latestDeltaCursor.ts",
    "content": "import { XMLParser } from 'fast-xml-parser'\nimport { apiLimiter } from '~/utils/api-limiter'\nimport { NSAPI } from '~/utils/ns-api'\nimport requestUrl from '~/utils/request-url'\n\ninterface GetLatestDeltaCursorInput {\n\tfolderName: string\n\ttoken: string\n}\n\nexport const getLatestDeltaCursor = apiLimiter.wrap(\n\tasync ({ folderName, token }: GetLatestDeltaCursorInput) => {\n\t\tconst body = `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n              <s:delta xmlns:s=\"http://ns.jianguoyun.com\">\n                  <s:folderName>${folderName}</s:folderName>\n              </s:delta>`\n\t\tconst headers = {\n\t\t\tAuthorization: `Basic ${token}`,\n\t\t\t'Content-Type': 'application/xml',\n\t\t}\n\t\tconst response = await requestUrl({\n\t\t\turl: NSAPI('latestDeltaCursor'),\n\t\t\tmethod: 'POST',\n\t\t\theaders,\n\t\t\tbody,\n\t\t})\n\t\tconst parseXml = new XMLParser({\n\t\t\tattributeNamePrefix: '',\n\t\t\tremoveNSPrefix: true,\n\t\t\tparseTagValue: false,\n\t\t\tnumberParseOptions: {\n\t\t\t\teNotation: false,\n\t\t\t\thex: true,\n\t\t\t\tleadingZeros: true,\n\t\t\t},\n\t\t\tprocessEntities: false,\n\t\t})\n\t\tconst result: {\n\t\t\tresponse: {\n\t\t\t\tcursor: string\n\t\t\t}\n\t\t} = parseXml.parse(response.text)\n\t\treturn result\n\t},\n)\n"
  },
  {
    "path": "src/api/webdav.ts",
    "content": "import { XMLParser } from 'fast-xml-parser'\nimport { isNil, partial } from 'lodash-es'\nimport { basename, join } from 'path-browserify'\nimport { FileStat } from 'webdav'\nimport { NS_DAV_ENDPOINT } from '~/consts'\nimport { is503Error } from '~/utils/is-503-error'\nimport logger from '~/utils/logger'\nimport requestUrl from '~/utils/request-url'\n\ninterface WebDAVResponse {\n\tmultistatus: {\n\t\tresponse: Array<{\n\t\t\thref: string\n\t\t\tpropstat: {\n\t\t\t\tprop: {\n\t\t\t\t\tdisplayname: string\n\t\t\t\t\tresourcetype: { collection?: any }\n\t\t\t\t\tgetlastmodified?: string\n\t\t\t\t\tgetcontentlength?: string\n\t\t\t\t\tgetcontenttype?: string\n\t\t\t\t}\n\t\t\t\tstatus: string\n\t\t\t}\n\t\t}>\n\t}\n}\n\nfunction extractNextLink(linkHeader: string): string | null {\n\tconst matches = linkHeader.match(/<([^>]+)>;\\s*rel=\"next\"/)\n\treturn matches ? matches[1] : null\n}\n\nfunction convertToFileStat(\n\tserverBase: string,\n\titem: WebDAVResponse['multistatus']['response'][number],\n): FileStat {\n\tconst props = item.propstat.prop\n\tconst isDir = !isNil(props.resourcetype?.collection)\n\tconst href = decodeURIComponent(item.href)\n\tconst filename =\n\t\tserverBase === '/' ? href : join('/', href.replace(serverBase, ''))\n\n\treturn {\n\t\tfilename,\n\t\tbasename: basename(filename),\n\t\tlastmod: props.getlastmodified || '',\n\t\tsize: props.getcontentlength ? parseInt(props.getcontentlength, 10) : 0,\n\t\ttype: isDir ? 'directory' : 'file',\n\t\tetag: null,\n\t\tmime: props.getcontenttype,\n\t}\n}\n\nexport async function getDirectoryContents(\n\ttoken: string,\n\tpath: string,\n): Promise<FileStat[]> {\n\tconst contents: FileStat[] = []\n\tpath = path.split('/').map(encodeURIComponent).join('/')\n\tif (!path.startsWith('/')) {\n\t\tpath = '/' + path\n\t}\n\tlet currentUrl = `${NS_DAV_ENDPOINT}${path}`\n\n\twhile (true) {\n\t\ttry {\n\t\t\tconst response = await requestUrl({\n\t\t\t\turl: currentUrl,\n\t\t\t\tmethod: 'PROPFIND',\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Basic ${token}`,\n\t\t\t\t\t'Content-Type': 'application/xml',\n\t\t\t\t\tDepth: '1',\n\t\t\t\t},\n\t\t\t\tbody: `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n        <propfind xmlns=\"DAV:\">\n          <prop>\n            <displayname/>\n            <resourcetype/>\n            <getlastmodified/>\n            <getcontentlength/>\n            <getcontenttype/>\n          </prop>\n        </propfind>`,\n\t\t\t})\n\t\t\tconst parseXml = new XMLParser({\n\t\t\t\tattributeNamePrefix: '',\n\t\t\t\tremoveNSPrefix: true,\n\t\t\t\tparseTagValue: false,\n\t\t\t\tnumberParseOptions: {\n\t\t\t\t\teNotation: false,\n\t\t\t\t\thex: true,\n\t\t\t\t\tleadingZeros: true,\n\t\t\t\t},\n\t\t\t\tprocessEntities: false,\n\t\t\t})\n\t\t\tconst result: WebDAVResponse = parseXml.parse(response.text)\n\t\t\tconst items = Array.isArray(result.multistatus.response)\n\t\t\t\t? result.multistatus.response\n\t\t\t\t: [result.multistatus.response]\n\n\t\t\t// 跳过第一个条目（当前目录）\n\t\t\tcontents.push(...items.slice(1).map(partial(convertToFileStat, '/dav')))\n\n\t\t\tconst linkHeader = response.headers['link'] || response.headers['Link']\n\t\t\tif (!linkHeader) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst nextLink = extractNextLink(linkHeader)\n\t\t\tif (!nextLink) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst nextUrl = new URL(nextLink)\n\t\t\tnextUrl.pathname = decodeURI(nextUrl.pathname)\n\t\t\tcurrentUrl = nextUrl.toString()\n\t\t} catch (e) {\n\t\t\tif (is503Error(e as Error)) {\n\t\t\t\tlogger.error('503 error, retrying...')\n\t\t\t\tawait sleep(60_000)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\t}\n\n\treturn contents\n}\n"
  },
  {
    "path": "src/assets/styles/global.css",
    "content": "@unocss;\n\n.view-action[aria-disabled='true'] {\n\topacity: 0.5;\n\tcursor: not-allowed;\n}\n\n@keyframes nutstore-sync-spin {\n\tfrom {\n\t\ttransform: rotate(0deg);\n\t}\n\tto {\n\t\ttransform: rotate(-360deg);\n\t}\n}\n\n.nutstore-sync-spinning {\n\tanimation: nutstore-sync-spin 2s linear infinite;\n}\n\n.conflict.ours,\n.conflict.theirs {\n\tposition: relative;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n\n.conflict.ours {\n\tbackground-color: rgb(0, 255, 208);\n}\n\n.conflict.theirs {\n\tbackground-color: rgb(0, 132, 255);\n}\n\n.connection-status {\n\tpadding: 6px 12px;\n\tborder-radius: 4px;\n\tmargin-top: 8px;\n\ttransition: all 0.3s ease;\n\topacity: 0;\n}\n\n.connection-status.success {\n\tbackground-color: var(--background-modifier-success);\n\tcolor: var(--text-success);\n\topacity: 1;\n}\n\n.connection-status.error {\n\tbackground-color: var(--background-modifier-error);\n\tcolor: var(--text-error);\n\topacity: 1;\n}\n\n.connection-button.loading {\n\topacity: 0.5;\n\tpointer-events: none;\n}\n\n.connection-button.success {\n\tbackground-color: var(--background-modifier-success);\n\tcolor: var(--background-primary);\n\tborder-color: var(--background-modifier-success);\n}\n\n.connection-button.error {\n\tbackground-color: var(--background-modifier-error);\n\tcolor: var(--background-primary);\n\tborder-color: var(--background-modifier-error);\n}\n\ninput.error {\n\tborder-color: var(--background-modifier-error) !important;\n\tbox-shadow: none !important;\n}\n\ninput.success {\n\tborder-color: var(--background-modifier-success) !important;\n\tbox-shadow: none !important;\n}\n\n.task-list-table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tmargin: 1em 0;\n}\n\n.task-list-table th,\n.task-list-table td {\n\tpadding: 8px;\n\tword-break: keep-all;\n\tborder: 1px solid var(--background-modifier-border);\n\ttext-align: left;\n}\n\n.task-list-table th {\n\tbackground-color: var(--background-secondary);\n\tfont-weight: bold;\n}\n\n.task-list-table tr:hover {\n\tbackground-color: var(--background-modifier-hover);\n}\n\n.setting-required .setting-item-name::after {\n\tcontent: ' *';\n\tcolor: var(--text-error);\n}\n\n.setting-optional .setting-item-name::after {\n\tcontent: ' (optional)';\n\tcolor: var(--text-muted);\n\tfont-size: 0.85em;\n\tfont-weight: normal;\n}\n"
  },
  {
    "path": "src/chat/domain.ts",
    "content": "export type {\n\tChatUsage,\n\tChatRunState,\n\tChatTextPart,\n\tChatImageUrlPart,\n\tChatUnknownPart,\n\tChatMessageContentPart,\n\tChatToolCall,\n\tChatMessageMeta,\n\tChatSystemMessage,\n\tChatUserMessage,\n\tChatAssistantMessageWithContent,\n\tChatAssistantMessageWithToolCalls,\n\tChatAssistantMessage,\n\tChatToolMessage,\n\tChatMessage,\n\tChatMessageRecord,\n\tChatTaskBase,\n\tQueuedChatTask,\n\tRunningChatTask,\n\tCompletedChatTask,\n\tFailedChatTask,\n\tCancelledChatTask,\n\tChatTaskRecord,\n\tChatPendingMessage,\n\tReversibleToolOp,\n} from 'chatbox'\n\nimport type {\n\tChatUsage,\n\tChatImageUrlPart,\n\tChatTextPart,\n\tChatUnknownPart,\n\tChatMessage,\n\tChatMessageRecord,\n\tChatMessageMeta,\n\tChatTaskRecord,\n\tChatTaskBase,\n\tQueuedChatTask,\n\tRunningChatTask,\n\tCompletedChatTask,\n\tFailedChatTask,\n\tCancelledChatTask,\n\tReversibleToolOp,\n} from 'chatbox'\n\nexport interface ChatFragment {\n\tid: string\n\tcreatedAt: number\n\tupdatedAt: number\n\tsummary?: string\n\tmessages: ChatMessageRecord[]\n}\n\nexport interface ChatSessionPermissions {\n\tallow: { operation: string; path: string }[]\n}\n\nexport interface ChatSession {\n\tid: string\n\tcreatedAt: number\n\tupdatedAt: number\n\tmodel?: { providerId: string; modelId: string }\n\tsystemPrompt?: string\n\tinferenceParams?: { temperature?: number; maxTokens?: number }\n\tfragments: ChatFragment[]\n\tactiveFragmentId: string\n\ttasks: ChatTaskRecord[]\n\tpermissions?: ChatSessionPermissions\n}\n\nexport interface ChatSessionIndexItem {\n\tid: string\n\ttitle: string\n\tcreatedAt: number\n\tupdatedAt: number\n}\n\nexport function cloneUsage(usage?: ChatUsage) {\n\treturn usage\n\t\t? {\n\t\t\t\t...usage,\n\t\t\t}\n\t\t: undefined\n}\n\nexport function cloneMessage(message: ChatMessage): ChatMessage {\n\treturn {\n\t\t...message,\n\t\tcontent: message.content?.map((part) => {\n\t\t\tif (part.type === 'image_url') {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'image_url',\n\t\t\t\t\timage_url: {\n\t\t\t\t\t\t...part.image_url,\n\t\t\t\t\t},\n\t\t\t\t} satisfies ChatImageUrlPart\n\t\t\t}\n\t\t\tif (part.type === 'unknown') {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'unknown',\n\t\t\t\t\tvalue: part.value,\n\t\t\t\t} satisfies ChatUnknownPart\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: 'text',\n\t\t\t\ttext: part.text,\n\t\t\t} satisfies ChatTextPart\n\t\t}) as ChatMessage['content'],\n\t\ttool_calls:\n\t\t\t'tool_calls' in message && message.tool_calls\n\t\t\t\t? message.tool_calls.map((toolCall) => ({\n\t\t\t\t\t\t...toolCall,\n\t\t\t\t\t\tfunction: {\n\t\t\t\t\t\t\t...toolCall.function,\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t: undefined,\n\t} as ChatMessage\n}\n\nexport function cloneReversibleToolOp(op: ReversibleToolOp): ReversibleToolOp {\n\tswitch (op.operation) {\n\t\tcase 'create':\n\t\t\treturn {\n\t\t\t\tvaultPath: op.vaultPath,\n\t\t\t\toperation: 'create',\n\t\t\t\tbefore: { kind: op.before.kind },\n\t\t\t}\n\t\tcase 'update':\n\t\t\treturn {\n\t\t\t\tvaultPath: op.vaultPath,\n\t\t\t\toperation: 'update',\n\t\t\t\tbefore: {\n\t\t\t\t\tkind: 'file',\n\t\t\t\t\tcontentBase64: op.before.contentBase64,\n\t\t\t\t},\n\t\t\t}\n\t\tcase 'delete':\n\t\t\treturn {\n\t\t\t\tvaultPath: op.vaultPath,\n\t\t\t\toperation: 'delete',\n\t\t\t\tbefore:\n\t\t\t\t\top.before.kind === 'dir'\n\t\t\t\t\t\t? { kind: 'dir' }\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\t\t\tcontentBase64: op.before.contentBase64,\n\t\t\t\t\t\t\t},\n\t\t\t}\n\t}\n}\n\nexport function cloneMessageRecord(\n\trecord: ChatMessageRecord,\n): ChatMessageRecord {\n\treturn {\n\t\t...record,\n\t\treversibleOps: record.reversibleOps?.map(cloneReversibleToolOp),\n\t\tmessage: cloneMessage(record.message),\n\t\tmeta: record.meta\n\t\t\t? {\n\t\t\t\t\t...record.meta,\n\t\t\t\t\tusage: cloneUsage(record.meta.usage),\n\t\t\t\t}\n\t\t\t: undefined,\n\t}\n}\n\nexport function cloneTask(task: ChatTaskRecord): ChatTaskRecord {\n\treturn {\n\t\t...task,\n\t}\n}\n\nexport function cloneSession(session: ChatSession): ChatSession {\n\treturn {\n\t\t...session,\n\t\tmodel: session.model ? { ...session.model } : undefined,\n\t\tinferenceParams: session.inferenceParams\n\t\t\t? { ...session.inferenceParams }\n\t\t\t: undefined,\n\t\tfragments: session.fragments.map((fragment) => ({\n\t\t\t...fragment,\n\t\t\tmessages: fragment.messages.map(cloneMessageRecord),\n\t\t})),\n\t\ttasks: session.tasks.map(cloneTask),\n\t}\n}\n\nexport function isTerminalTask(task: ChatTaskRecord) {\n\treturn (\n\t\ttask.status === 'completed' ||\n\t\ttask.status === 'failed' ||\n\t\ttask.status === 'cancelled'\n\t)\n}\n\nexport function createQueuedTask(task: ChatTaskBase): QueuedChatTask {\n\treturn {\n\t\t...task,\n\t\tstatus: 'queued',\n\t}\n}\n\nexport function createRunningTask(\n\ttask: ChatTaskBase,\n\tstartedAt: number,\n): RunningChatTask {\n\treturn {\n\t\t...task,\n\t\tstatus: 'running',\n\t\tstartedAt,\n\t}\n}\n\nexport function toRunningTask(\n\ttask: QueuedChatTask,\n\tstartedAt: number,\n): RunningChatTask {\n\treturn {\n\t\t...task,\n\t\tstatus: 'running',\n\t\tstartedAt,\n\t}\n}\n\nexport function toCompletedTask(\n\ttask: RunningChatTask,\n\tsummary: string,\n\tsourceCount: number,\n\tfinishedAt: number,\n): CompletedChatTask {\n\treturn {\n\t\t...task,\n\t\tstatus: 'completed',\n\t\tsummary,\n\t\tsourceCount,\n\t\tfinishedAt,\n\t}\n}\n\nexport function toFailedTask(\n\ttask: QueuedChatTask | RunningChatTask,\n\terror: string,\n\tfinishedAt: number,\n\tfailureStage?: string,\n\tsourceCount?: number,\n): FailedChatTask {\n\treturn {\n\t\t...task,\n\t\tstatus: 'failed',\n\t\terror,\n\t\tfinishedAt,\n\t\tfailureStage,\n\t\t...(task.status === 'running' ? { startedAt: task.startedAt } : {}),\n\t\t...(typeof sourceCount === 'number' ? { sourceCount } : {}),\n\t}\n}\n\nexport function toCancelledTask(\n\ttask: QueuedChatTask | RunningChatTask,\n\tcancelReason: string,\n\tfinishedAt: number,\n\tsummary?: string,\n): CancelledChatTask {\n\treturn {\n\t\t...task,\n\t\tstatus: 'cancelled',\n\t\tcancelReason,\n\t\tfinishedAt,\n\t\tsummary,\n\t\t...(task.status === 'running' ? { startedAt: task.startedAt } : {}),\n\t}\n}\n\nexport function mutateTaskRecord(target: ChatTaskRecord, next: ChatTaskRecord) {\n\tfor (const key of [\n\t\t'status',\n\t\t'startedAt',\n\t\t'finishedAt',\n\t\t'summary',\n\t\t'error',\n\t\t'failureStage',\n\t\t'cancelReason',\n\t\t'sourceCount',\n\t] as const) {\n\t\tdelete (target as unknown as Record<string, unknown>)[key]\n\t}\n\tObject.assign(target, next)\n\treturn target\n}\n"
  },
  {
    "path": "src/chatbox/types.ts",
    "content": "import type {\n\tChatMessageRecord,\n\tChatPendingMessage,\n\tChatRunState,\n\tChatTaskRecord,\n\tChatToolCall,\n} from '~/chat/domain'\n\nexport type {\n\tChatMessageRecord,\n\tChatPendingMessage,\n\tChatRunState,\n\tChatTaskRecord,\n\tChatToolCall,\n\tReversibleToolOp,\n} from '~/chat/domain'\n\nexport interface ChatModelOption {\n\tid: string\n\tname: string\n}\n\nexport interface ChatProviderOption {\n\tid: string\n\tname: string\n\tmodels: ChatModelOption[]\n}\n\nexport interface ChatSessionHistoryItem {\n\tid: string\n\ttitle: string\n\tcreatedAt: number\n\tupdatedAt: number\n}\n\nexport interface ChatTimelineFragmentItem {\n\tid: string\n\tkind: 'fragment'\n\tcreatedAt: number\n}\n\nexport interface ChatTimelineMessageItem {\n\tid: string\n\tkind: 'message'\n\tcreatedAt: number\n\tmessage: ChatMessageRecord\n\ttoolCall?: ChatToolCall\n}\n\nexport type ChatTimelineItem =\n\t| ChatTimelineFragmentItem\n\t| ChatTimelineMessageItem\n\nexport interface ChatboxViewModel {\n\ttitle: string\n\tsessionHistory: ChatSessionHistoryItem[]\n\tactiveSessionId?: string\n\ttimeline: ChatTimelineItem[]\n\tcurrentSessionTasks: ChatTaskRecord[]\n\totherSessionTasks: ChatTaskRecord[]\n\tproviders: ChatProviderOption[]\n\tselectedProviderId?: string\n\tselectedModelId?: string\n\trunState: ChatRunState\n\tpendingMessages: ChatPendingMessage[]\n\tcanSend: boolean\n\tcanCreateFragment: boolean\n\tcanCompress: boolean\n}\n\nexport interface ChatboxProps extends ChatboxViewModel {\n\tonNewSession: () => void\n\tonNewFragment: () => void\n\tonCompressContext: () => Promise<void>\n\tonSwitchSession: (sessionId: string) => void\n\tonDeleteSession: (sessionId: string) => Promise<void>\n\tonSelectProvider: (providerId: string) => void\n\tonSelectModel: (modelId: string) => void\n\tonSendMessage: (text: string) => Promise<void>\n\tonStopActiveRun?: () => void\n\tonCancelTask?: (taskId: string) => void\n\tonDeleteMessage?: (messageId: string) => void\n\tonRegenerateMessage?: (messageId: string) => void\n\tonRecallMessage?: (\n\t\tmessageId: string,\n\t\toptions?: { restoreFiles?: boolean },\n\t) => Promise<void>\n\trenderMarkdown?: (\n\t\tel: HTMLElement,\n\t\tmarkdown: string,\n\t) => void | (() => void) | Promise<void | (() => void)>\n}\n\nexport interface ChatboxController {\n\tupdate: (props: ChatboxProps) => void\n\tdestroy: () => void\n}\n"
  },
  {
    "path": "src/components/AIPermissionModal.ts",
    "content": "import { App, Modal, Setting } from 'obsidian'\nimport type { AIFileOperation } from '~/ai/file-operation'\nimport type { PermissionRequest } from '~/ai/permission-guard'\nimport i18n from '~/i18n'\n\nexport type AIPermissionResult = 'approve' | 'auto-approve-operation' | 'deny'\n\nfunction getOperationLabel(operation: AIFileOperation): string {\n\tswitch (operation) {\n\t\tcase 'copy':\n\t\t\treturn i18n.t('aiPermission.operations.copy')\n\t\tcase 'delete':\n\t\t\treturn i18n.t('aiPermission.operations.delete')\n\t\tcase 'edit':\n\t\t\treturn i18n.t('aiPermission.operations.edit')\n\t\tcase 'mkdir':\n\t\t\treturn i18n.t('aiPermission.operations.mkdir')\n\t\tcase 'move':\n\t\t\treturn i18n.t('aiPermission.operations.move')\n\t\tcase 'read':\n\t\t\treturn i18n.t('aiPermission.operations.read')\n\t\tcase 'write':\n\t\t\treturn i18n.t('aiPermission.operations.write')\n\t}\n}\n\nexport default class AIPermissionModal extends Modal {\n\tprivate result: AIPermissionResult = 'deny'\n\tprivate resolved = false\n\tprivate resolve!: (result: AIPermissionResult) => void\n\n\tconstructor(\n\t\tapp: App,\n\t\tprivate readonly request: PermissionRequest,\n\t) {\n\t\tsuper(app)\n\t}\n\n\tprivate renderSinglePathRequest() {\n\t\tif (!('path' in this.request.fs)) {\n\t\t\treturn\n\t\t}\n\t\tconst rowEl = this.contentEl.createEl('div')\n\t\trowEl.style.marginBottom = '0.5rem'\n\n\t\trowEl.createEl('strong', {\n\t\t\ttext: getOperationLabel(this.request.fs.kind),\n\t\t})\n\t\trowEl.createEl('code', { text: this.request.fs.path })\n\t\tconst pathEl = rowEl.lastChild as HTMLElement | null\n\t\tif (pathEl) {\n\t\t\tpathEl.style.display = 'block'\n\t\t\tpathEl.style.marginTop = '0.25rem'\n\t\t\tpathEl.style.wordBreak = 'break-all'\n\t\t}\n\t}\n\n\tprivate renderDualPathRequest() {\n\t\tif (!('src' in this.request.fs) || !('dest' in this.request.fs)) {\n\t\t\treturn\n\t\t}\n\t\tconst rowEl = this.contentEl.createEl('div')\n\t\trowEl.style.marginBottom = '0.5rem'\n\n\t\trowEl.createEl('strong', {\n\t\t\ttext: getOperationLabel(this.request.fs.kind),\n\t\t})\n\n\t\tconst sourceLabel = rowEl.createEl('div', {\n\t\t\ttext: i18n.t('aiPermission.source'),\n\t\t})\n\t\tsourceLabel.style.marginTop = '0.25rem'\n\t\tsourceLabel.style.fontWeight = '600'\n\n\t\tconst sourcePathEl = rowEl.createEl('code', {\n\t\t\ttext: this.request.fs.src,\n\t\t})\n\t\tsourcePathEl.style.display = 'block'\n\t\tsourcePathEl.style.wordBreak = 'break-all'\n\n\t\tconst destLabel = rowEl.createEl('div', {\n\t\t\ttext: i18n.t('aiPermission.destination'),\n\t\t})\n\t\tdestLabel.style.marginTop = '0.5rem'\n\t\tdestLabel.style.fontWeight = '600'\n\n\t\tconst destPathEl = rowEl.createEl('code', {\n\t\t\ttext: this.request.fs.dest,\n\t\t})\n\t\tdestPathEl.style.display = 'block'\n\t\tdestPathEl.style.wordBreak = 'break-all'\n\t}\n\n\tonOpen() {\n\t\tthis.setTitle(i18n.t('aiPermission.title'))\n\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\n\t\tcontentEl.createEl('p', {\n\t\t\ttext: i18n.t('aiPermission.message'),\n\t\t})\n\t\tcontentEl.createEl('p', {\n\t\t\ttext: i18n.t('aiPermission.sessionScopeHint'),\n\t\t})\n\n\t\tif (this.request.fs.kind === 'copy' || this.request.fs.kind === 'move') {\n\t\t\tthis.renderDualPathRequest()\n\t\t} else {\n\t\t\tthis.renderSinglePathRequest()\n\t\t}\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('aiPermission.deny'))\n\t\t\t\t\t.setWarning()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.result = 'deny'\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton.setButtonText(i18n.t('aiPermission.allowOnce')).onClick(() => {\n\t\t\t\t\tthis.result = 'approve'\n\t\t\t\t\tthis.close()\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('aiPermission.alwaysAllow'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.result = 'auto-approve-operation'\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t}),\n\t\t\t)\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t\tif (!this.resolved) {\n\t\t\tthis.resolved = true\n\t\t\tthis.resolve(this.result)\n\t\t}\n\t}\n\n\topen(): Promise<AIPermissionResult> {\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.resolve = resolve\n\t\t\tsuper.open()\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "src/components/CacheClearModal.ts",
    "content": "import { Modal, Setting } from 'obsidian'\nimport i18n from '~/i18n'\nimport { blobKV, syncRecordKV, traverseWebDAVKV } from '~/storage/kv'\nimport logger from '~/utils/logger'\nimport type NutstorePlugin from '..'\n\nexport interface CacheClearOptions {\n\tsyncRecordEnabled: boolean\n\tblobEnabled: boolean\n\ttraverseWebDAVEnabled: boolean\n}\n\nexport default class CacheClearModal extends Modal {\n\tprivate options: CacheClearOptions = {\n\t\tsyncRecordEnabled: false,\n\t\tblobEnabled: false,\n\t\ttraverseWebDAVEnabled: false,\n\t}\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate onSuccess?: (options: CacheClearOptions) => void,\n\t) {\n\t\tsuper(plugin.app)\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\n\t\tnew Setting(contentEl)\n\t\t\t.setName(i18n.t('settings.cache.clearModal.title'))\n\t\t\t.setDesc(i18n.t('settings.cache.clearModal.description'))\n\n\t\tconst optionsContainer = contentEl.createDiv({\n\t\t\tcls: 'py-2',\n\t\t})\n\n\t\t// Sync Record Cache Option\n\t\tnew Setting(optionsContainer)\n\t\t\t.setName(i18n.t('settings.cache.clearModal.syncRecordCache.name'))\n\t\t\t.setDesc(i18n.t('settings.cache.clearModal.syncRecordCache.desc'))\n\t\t\t.addToggle((toggle) => {\n\t\t\t\ttoggle.setValue(this.options.syncRecordEnabled).onChange((value) => {\n\t\t\t\t\tthis.options.syncRecordEnabled = value\n\t\t\t\t})\n\t\t\t})\n\n\t\t// Blob Cache Option\n\t\tnew Setting(optionsContainer)\n\t\t\t.setName(i18n.t('settings.cache.clearModal.blobCache.name'))\n\t\t\t.setDesc(i18n.t('settings.cache.clearModal.blobCache.desc'))\n\t\t\t.addToggle((toggle) => {\n\t\t\t\ttoggle.setValue(this.options.blobEnabled).onChange((value) => {\n\t\t\t\t\tthis.options.blobEnabled = value\n\t\t\t\t})\n\t\t\t})\n\n\t\t// TraverseWebDAV Cache Option\n\t\tnew Setting(optionsContainer)\n\t\t\t.setName(i18n.t('settings.cache.clearModal.traverseWebDAVCache.name'))\n\t\t\t.setDesc(i18n.t('settings.cache.clearModal.traverseWebDAVCache.desc'))\n\t\t\t.addToggle((toggle) => {\n\t\t\t\ttoggle\n\t\t\t\t\t.setValue(this.options.traverseWebDAVEnabled)\n\t\t\t\t\t.onChange((value) => {\n\t\t\t\t\t\tthis.options.traverseWebDAVEnabled = value\n\t\t\t\t\t})\n\t\t\t})\n\n\t\t// Action buttons\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.cache.clearModal.cancel'))\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tlet confirmed = false\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.cache.clear'))\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\tif (confirmed) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (this.onSuccess) {\n\t\t\t\t\t\t\t\t\tthis.onSuccess(this.options)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tlogger.error('Error clearing cache:', error)\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tbutton.setButtonText(\n\t\t\t\t\t\t\t\t\ti18n.t('settings.cache.clearModal.confirm'),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tbutton.buttonEl.classList.remove('mod-warning')\n\t\t\t\t\t\t\t\tconfirmed = false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconfirmed = true\n\t\t\t\t\t\t\tbutton\n\t\t\t\t\t\t\t\t.setButtonText(i18n.t('settings.cache.confirm'))\n\t\t\t\t\t\t\t\t.setWarning()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\tbutton.buttonEl.addEventListener('blur', () => {\n\t\t\t\t\tif (confirmed) {\n\t\t\t\t\t\tconfirmed = false\n\t\t\t\t\t\tbutton.setButtonText(i18n.t('settings.cache.clear'))\n\t\t\t\t\t\tbutton.buttonEl.classList.remove('mod-warning')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n\n\t/**\n\t * Static method to clear selected caches\n\t */\n\tstatic async clearSelectedCaches(options: CacheClearOptions) {\n\t\tconst { syncRecordEnabled, blobEnabled, traverseWebDAVEnabled } = options\n\t\tconst cleared = []\n\n\t\ttry {\n\t\t\tif (syncRecordEnabled) {\n\t\t\t\tawait syncRecordKV.clear()\n\t\t\t\tcleared.push(i18n.t('settings.cache.clearModal.syncRecordCache.name'))\n\t\t\t}\n\n\t\t\tif (blobEnabled) {\n\t\t\t\tawait blobKV.clear()\n\t\t\t\tcleared.push(i18n.t('settings.cache.clearModal.blobCache.name'))\n\t\t\t}\n\n\t\t\tif (traverseWebDAVEnabled) {\n\t\t\t\tawait traverseWebDAVKV.clear()\n\t\t\t\tcleared.push(\n\t\t\t\t\ti18n.t('settings.cache.clearModal.traverseWebDAVCache.name'),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn cleared\n\t\t} catch (error) {\n\t\t\tlogger.error('Error clearing caches:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/components/CacheRestoreModal.ts",
    "content": "import { Modal, Setting } from 'obsidian'\nimport i18n from '~/i18n'\nimport { StatModel } from '~/model/stat.model'\nimport CacheService from '~/services/cache.service.v1'\nimport logger from '~/utils/logger'\nimport type NutstorePlugin from '..'\n\nexport default class CacheRestoreModal extends Modal {\n\tprivate fileList: HTMLElement\n\tprivate files: StatModel[] = []\n\tprivate cacheService: CacheService\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate remoteCacheDir: string,\n\t\tprivate onSuccess?: () => void,\n\t) {\n\t\tsuper(plugin.app)\n\t\tthis.cacheService = new CacheService(plugin, remoteCacheDir)\n\t}\n\n\tasync onOpen() {\n\t\tconst { contentEl } = this\n\n\t\tnew Setting(contentEl)\n\t\t\t.setName(i18n.t('settings.cache.restoreModal.title'))\n\t\t\t.setDesc(i18n.t('settings.cache.restoreModal.description'))\n\n\t\tthis.fileList = contentEl.createDiv({\n\t\t\tcls: 'max-h-50vh overflow-y-auto pb-2 flex flex-col',\n\t\t})\n\n\t\tawait this.loadFileList()\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.cache.restoreModal.refresh'))\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\tawait this.loadFileList()\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.cache.restoreModal.close'))\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t})\n\t\t\t})\n\t}\n\n\tprivate async loadFileList() {\n\t\ttry {\n\t\t\tthis.files = await this.cacheService.loadCacheFileList()\n\n\t\t\tif (this.files.length === 0) {\n\t\t\t\tthis.renderEmptyList()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Render file list\n\t\t\tthis.fileList.empty()\n\t\t\tthis.files.forEach(({ basename }) => {\n\t\t\t\tconst fileItem = this.fileList.createDiv({\n\t\t\t\t\tcls: 'flex justify-between items-center py-2',\n\t\t\t\t})\n\n\t\t\t\tfileItem.createSpan({\n\t\t\t\t\ttext: basename,\n\t\t\t\t\tcls: 'flex-1 break-all mr-2',\n\t\t\t\t})\n\n\t\t\t\tconst actionContainer = fileItem.createDiv({\n\t\t\t\t\tcls: 'flex gap-2',\n\t\t\t\t})\n\n\t\t\t\tconst restoreBtn = actionContainer.createEl('button', {\n\t\t\t\t\ttext: i18n.t('settings.cache.restoreModal.restore'),\n\t\t\t\t\tcls: 'mod-cta',\n\t\t\t\t})\n\t\t\t\trestoreBtn.addEventListener('click', async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.cacheService.restoreCache(basename)\n\t\t\t\t\t\tthis.onSuccess?.()\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// Error is already handled in the service\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\tlet confirmedDelete = false\n\t\t\t\tconst deleteBtn = actionContainer.createEl('button', {\n\t\t\t\t\ttext: i18n.t('settings.cache.restoreModal.delete'),\n\t\t\t\t\tcls: 'transition',\n\t\t\t\t})\n\t\t\t\tdeleteBtn.addEventListener('click', async () => {\n\t\t\t\t\tif (confirmedDelete) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.cacheService.deleteCache(basename)\n\t\t\t\t\t\t\tawait this.loadFileList()\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t// Error is already handled in the service\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfirmedDelete = true\n\t\t\t\t\t\tdeleteBtn.setText(\n\t\t\t\t\t\t\ti18n.t('settings.cache.restoreModal.deleteConfirm'),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tdeleteBtn.classList.add('mod-warning')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tdeleteBtn.addEventListener('blur', () => {\n\t\t\t\t\tconfirmedDelete = false\n\t\t\t\t\tdeleteBtn.setText(i18n.t('settings.cache.restoreModal.delete'))\n\t\t\t\t\tdeleteBtn.classList.remove('mod-warning')\n\t\t\t\t})\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tlogger.error('Error loading cache file list:', error)\n\t\t\tthis.fileList.empty()\n\t\t\tthis.fileList.createEl('p', {\n\t\t\t\ttext: i18n.t('settings.cache.restoreModal.loadError', {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t}),\n\t\t\t\tcls: 'p-12px text-center text-[var(--text-error)]',\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate renderEmptyList() {\n\t\tthis.fileList.empty()\n\t\tthis.fileList.createEl('p', {\n\t\t\ttext: i18n.t('settings.cache.restoreModal.noFiles'),\n\t\t\tcls: 'p-12px text-center',\n\t\t})\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/CacheSaveModal.ts",
    "content": "import { Modal, Setting, moment } from 'obsidian'\nimport i18n from '~/i18n'\nimport CacheService from '~/services/cache.service.v1'\nimport NutstorePlugin from '..'\n\nexport default class CacheSaveModal extends Modal {\n\tprivate cacheService: CacheService\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate remoteCacheDir: string,\n\t\tprivate onSuccess?: () => void,\n\t) {\n\t\tsuper(plugin.app)\n\t\tthis.cacheService = new CacheService(plugin, remoteCacheDir)\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\n\t\tcontentEl.createEl('h2', {\n\t\t\ttext: i18n.t('settings.cache.saveModal.title'),\n\t\t})\n\t\tcontentEl.createEl('p', {\n\t\t\ttext: i18n.t('settings.cache.saveModal.description'),\n\t\t\tcls: 'setting-item-description',\n\t\t})\n\n\t\tconst defaultFilename = `${this.plugin.app.vault.getName()}.${moment().format('YYYY-MM-DD HH_mm_ss')}.SyncCache`\n\n\t\tconst inputContainer = contentEl.createDiv()\n\t\tconst filenameInput = inputContainer.createEl('input', {\n\t\t\tcls: 'w-full',\n\t\t\ttype: 'text',\n\t\t\tvalue: defaultFilename,\n\t\t})\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.cache.saveModal.save'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet filename = filenameInput.value\n\t\t\t\t\t\t\tif (!filename.endsWith('.v1')) {\n\t\t\t\t\t\t\t\tfilename += '.v1'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait this.cacheService.saveCache(filename)\n\t\t\t\t\t\t\tthis.onSuccess?.()\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t// Error is already handled in the service\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.cache.saveModal.cancel'))\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t})\n\t\t\t})\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/DeleteConfirmModal.ts",
    "content": "import { App, Modal, Setting } from 'obsidian'\nimport i18n from '~/i18n'\nimport RemoveLocalTask from '../sync/tasks/remove-local.task'\n\nexport default class DeleteConfirmModal extends Modal {\n\tprivate confirmed: boolean = false\n\tprivate selectedTasks: boolean[] = []\n\n\tconstructor(\n\t\tapp: App,\n\t\tprivate tasks: RemoveLocalTask[],\n\t) {\n\t\tsuper(app)\n\t\tthis.selectedTasks = new Array(tasks.length).fill(true)\n\t}\n\n\tonOpen() {\n\t\tthis.setTitle(i18n.t('deleteConfirm.title'))\n\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\n\t\tconst instruction = contentEl.createEl('p', {\n\t\t\tcls: 'delete-confirm-instruction',\n\t\t})\n\t\tinstruction.style.whiteSpace = 'pre-wrap'\n\t\tinstruction.setText(i18n.t('deleteConfirm.instruction'))\n\n\t\tconst tableContainer = contentEl.createDiv({\n\t\t\tcls: 'max-h-50vh overflow-y-auto',\n\t\t})\n\t\tconst table = tableContainer.createEl('table', { cls: 'task-list-table' })\n\n\t\tconst thead = table.createEl('thead')\n\t\tconst headerRow = thead.createEl('tr')\n\t\tconst selectHeader = headerRow.createEl('th', {\n\t\t\ttext: i18n.t('deleteConfirm.select'),\n\t\t})\n\t\tselectHeader.style.textAlign = 'center'\n\t\theaderRow.createEl('th', { text: i18n.t('deleteConfirm.filePath') })\n\n\t\tconst tbody = table.createEl('tbody')\n\t\tthis.tasks.forEach((task, index) => {\n\t\t\tconst row = tbody.createEl('tr')\n\t\t\tconst checkboxCell = row.createEl('td')\n\t\t\tcheckboxCell.style.textAlign = 'center'\n\t\t\tconst checkbox = checkboxCell.createEl('input')\n\t\t\tcheckbox.type = 'checkbox'\n\t\t\tcheckbox.checked = this.selectedTasks[index]\n\t\t\tcheckbox.addEventListener('change', (e) => {\n\t\t\t\tthis.selectedTasks[index] = checkbox.checked\n\t\t\t\te.stopPropagation()\n\t\t\t})\n\t\t\trow.addEventListener('click', (e) => {\n\t\t\t\tif (e.target === checkbox) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcheckbox.checked = !checkbox.checked\n\t\t\t\tthis.selectedTasks[index] = checkbox.checked\n\t\t\t\te.stopPropagation()\n\t\t\t})\n\t\t\trow.createEl('td', { text: task.localPath })\n\t\t})\n\n\t\tconst settingDiv = contentEl.createDiv()\n\t\tsettingDiv.style.marginTop = '1rem'\n\t\tnew Setting(settingDiv)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('deleteConfirm.deleteAndReupload'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.confirmed = true\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('deleteConfirm.skipForNow')).onClick(() => {\n\t\t\t\t\tthis.confirmed = false\n\t\t\t\t\tthis.close()\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\tasync open(): Promise<{\n\t\ttasksToDelete: RemoveLocalTask[]\n\t\ttasksToReupload: RemoveLocalTask[]\n\t}> {\n\t\tsuper.open()\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.onClose = () => {\n\t\t\t\tif (!this.confirmed) {\n\t\t\t\t\t// User cancelled, no changes\n\t\t\t\t\tresolve({\n\t\t\t\t\t\ttasksToDelete: [],\n\t\t\t\t\t\ttasksToReupload: [],\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst tasksToDelete = this.tasks.filter(\n\t\t\t\t\t(_, index) => this.selectedTasks[index],\n\t\t\t\t)\n\t\t\t\tconst tasksToReupload = this.tasks.filter(\n\t\t\t\t\t(_, index) => !this.selectedTasks[index],\n\t\t\t\t)\n\t\t\t\tresolve({\n\t\t\t\t\ttasksToDelete,\n\t\t\t\t\ttasksToReupload,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "src/components/FailedTasksModal.ts",
    "content": "import { App, Modal, Setting } from 'obsidian'\nimport i18n from '~/i18n'\n\ninterface FailedTaskInfo {\n\ttaskName: string\n\tlocalPath: string\n\terrorMessage: string\n}\n\nexport default class FailedTasksModal extends Modal {\n\tconstructor(\n\t\tapp: App,\n\t\tprivate failedTasks: FailedTaskInfo[],\n\t) {\n\t\tsuper(app)\n\t}\n\n\tonOpen() {\n\t\tthis.setTitle(i18n.t('failedTasks.title'))\n\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\n\t\tconst instruction = contentEl.createEl('p', {\n\t\t\tcls: 'failed-tasks-instruction',\n\t\t})\n\t\tinstruction.setText(i18n.t('failedTasks.instruction'))\n\n\t\tconst tableContainer = contentEl.createDiv({\n\t\t\tcls: 'max-h-50vh overflow-y-auto',\n\t\t})\n\t\tconst table = tableContainer.createEl('table', {\n\t\t\tcls: 'task-list-table',\n\t\t})\n\n\t\tconst thead = table.createEl('thead')\n\t\tconst headerRow = thead.createEl('tr')\n\t\theaderRow.createEl('th', { text: i18n.t('failedTasks.taskName') })\n\t\theaderRow.createEl('th', { text: i18n.t('failedTasks.localPath') })\n\t\theaderRow.createEl('th', { text: i18n.t('failedTasks.errorMessage') })\n\n\t\tconst tbody = table.createEl('tbody')\n\t\tthis.failedTasks.forEach((task) => {\n\t\t\tconst row = tbody.createEl('tr')\n\t\t\trow.createEl('td', { text: task.taskName })\n\t\t\trow.createEl('td', { text: task.localPath })\n\t\t\trow.createEl('td', { text: task.errorMessage })\n\t\t})\n\n\t\tconst settingDiv = contentEl.createDiv()\n\t\tsettingDiv.style.marginTop = '1rem'\n\t\tnew Setting(settingDiv).addButton((button) => {\n\t\t\tbutton\n\t\t\t\t.setButtonText(i18n.t('failedTasks.close'))\n\t\t\t\t.setCta()\n\t\t\t\t.onClick(() => this.close())\n\t\t})\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n\nexport type { FailedTaskInfo }\n"
  },
  {
    "path": "src/components/FilterEditorModal.ts",
    "content": "import { cloneDeep } from 'lodash-es'\nimport { Modal, Setting } from 'obsidian'\nimport i18n from '~/i18n'\nimport { getUserOptions, GlobMatchOptions } from '~/utils/glob-match'\nimport NutstorePlugin from '..'\n\nenum FilterType {\n\tInclude = 'include',\n\tExclude = 'exclude',\n}\n\nexport default class FilterEditorModal extends Modal {\n\tstatic readonly FilterType = FilterType\n\n\tfilters: GlobMatchOptions[]\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tfilters: GlobMatchOptions[] = [],\n\t\tprivate onSave: (filters: GlobMatchOptions[]) => void,\n\t\tprivate filterType: FilterType = FilterType.Exclude,\n\t) {\n\t\tsuper(plugin.app)\n\t\tthis.filters = cloneDeep(filters)\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\n\t\tconst titleKey =\n\t\t\tthis.filterType === FilterType.Include\n\t\t\t\t? 'settings.filters.include.name'\n\t\t\t\t: 'settings.filters.exclude.name'\n\t\tconst descKey =\n\t\t\tthis.filterType === FilterType.Include\n\t\t\t\t? 'settings.filters.include.desc'\n\t\t\t\t: 'settings.filters.exclude.desc'\n\n\t\tcontentEl.createEl('h2', { text: i18n.t(titleKey) })\n\t\tcontentEl.createEl('p', {\n\t\t\ttext: i18n.t(descKey),\n\t\t\tcls: 'setting-item-description',\n\t\t})\n\n\t\tconst listContainer = contentEl.createDiv({\n\t\t\tcls: 'flex flex-col gap-2 pb-2',\n\t\t})\n\n\t\tconst updateList = () => {\n\t\t\tlistContainer.empty()\n\t\t\tthis.filters.forEach((filter, index) => {\n\t\t\t\tconst itemContainer = listContainer.createDiv({\n\t\t\t\t\tcls: 'flex gap-2',\n\t\t\t\t})\n\t\t\t\tconst input = listContainer.createEl('input', {\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tcls: 'flex-1',\n\t\t\t\t\tplaceholder: i18n.t('settings.filters.placeholder'),\n\t\t\t\t\tvalue: filter.expr,\n\t\t\t\t})\n\t\t\t\tinput.spellcheck = false\n\t\t\t\tinput.addEventListener('input', () => {\n\t\t\t\t\tfilter.expr = input.value\n\t\t\t\t\tthis.filters[index] = filter\n\t\t\t\t})\n\t\t\t\tconst forceCaseBtn = listContainer.createEl('button', {\n\t\t\t\t\ttext: 'Aa',\n\t\t\t\t\tcls: 'shadow-none!',\n\t\t\t\t})\n\t\t\t\tfunction updateButtonStatus() {\n\t\t\t\t\tconst opt = getUserOptions(filter)\n\t\t\t\t\tconst activeCls = ['bg-[var(--interactive-accent)]!']\n\t\t\t\t\tconst inactiveCls = [\n\t\t\t\t\t\t'background-none!',\n\t\t\t\t\t\t'hover:bg-[--interactive-normal]!',\n\t\t\t\t\t]\n\t\t\t\t\tif (opt.caseSensitive) {\n\t\t\t\t\t\tforceCaseBtn.classList.add(...activeCls)\n\t\t\t\t\t\tforceCaseBtn.classList.remove(...inactiveCls)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tforceCaseBtn.classList.remove(...activeCls)\n\t\t\t\t\t\tforceCaseBtn.classList.add(...inactiveCls)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tupdateButtonStatus()\n\t\t\t\tforceCaseBtn.addEventListener('click', () => {\n\t\t\t\t\tfilter.options.caseSensitive = !filter.options.caseSensitive\n\t\t\t\t\tupdateButtonStatus()\n\t\t\t\t})\n\t\t\t\tconst trash = listContainer.createEl('button', {\n\t\t\t\t\ttext: i18n.t('settings.filters.remove'),\n\t\t\t\t})\n\t\t\t\tlet confirmDelete = false\n\t\t\t\ttrash.addEventListener('click', () => {\n\t\t\t\t\tif (!confirmDelete) {\n\t\t\t\t\t\tconfirmDelete = true\n\t\t\t\t\t\ttrash.setText(i18n.t('settings.filters.confirmRemove'))\n\t\t\t\t\t\ttrash.addClass('mod-warning')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.filters.splice(index, 1)\n\t\t\t\t\t\tupdateList()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\ttrash.addEventListener('blur', () => {\n\t\t\t\t\tconfirmDelete = false\n\t\t\t\t\ttrash.setText(i18n.t('settings.filters.remove'))\n\t\t\t\t\ttrash.removeClass('mod-warning')\n\t\t\t\t})\n\t\t\t\titemContainer.appendChild(input)\n\t\t\t\titemContainer.appendChild(forceCaseBtn)\n\t\t\t\titemContainer.appendChild(trash)\n\t\t\t})\n\t\t}\n\n\t\tupdateList()\n\n\t\tnew Setting(contentEl).addButton((button) => {\n\t\t\tbutton.setButtonText(i18n.t('settings.filters.add')).onClick(() => {\n\t\t\t\tthis.filters.push({\n\t\t\t\t\texpr: '',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tcaseSensitive: false,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tupdateList()\n\t\t\t})\n\t\t})\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.filters.save'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.onSave(this.filters)\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('settings.filters.cancel')).onClick(() => {\n\t\t\t\t\tthis.close()\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/LogoutConfirmModal.ts",
    "content": "import { App, Modal, Setting } from 'obsidian'\nimport i18n from '../i18n'\n\nexport default class LogoutConfirmModal extends Modal {\n\tprivate onConfirm: () => void\n\n\tconstructor(app: App, onConfirm: () => void) {\n\t\tsuper(app)\n\t\tthis.onConfirm = onConfirm\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\n\t\tcontentEl.createEl('h2', { text: i18n.t('settings.logout.confirmTitle') })\n\t\tcontentEl.createEl('p', { text: i18n.t('settings.logout.confirmMessage') })\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.logout.cancel'))\n\t\t\t\t\t.onClick(() => this.close()),\n\t\t\t)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.logout.confirm'))\n\t\t\t\t\t.setWarning()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\tthis.onConfirm()\n\t\t\t\t\t}),\n\t\t\t)\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/ModelEditorModal.ts",
    "content": "import { cloneDeep } from 'lodash-es'\nimport { Modal, Notice, Setting } from 'obsidian'\nimport { findPresetModelById } from '~/ai/config'\nimport { AIModelConfig } from '~/ai/types'\nimport i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport type NutstorePlugin from '..'\n\ninterface ModelEditorOptions {\n\tfindPresetOnSave?: boolean\n}\n\nexport default class ModelEditorModal extends Modal {\n\tprivate draft: AIModelConfig\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tmodel: AIModelConfig,\n\t\tprivate onSave: (model: AIModelConfig) => Promise<boolean> | boolean,\n\t\tprivate isNew: boolean,\n\t\tprivate options: ModelEditorOptions = {},\n\t) {\n\t\tsuper(plugin.app)\n\t\tthis.draft = cloneDeep(model)\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t\tcontentEl.createEl('h2', {\n\t\t\ttext: this.isNew\n\t\t\t\t? i18n.t('settings.ai.modals.model.createTitle')\n\t\t\t\t: i18n.t('settings.ai.modals.model.editTitle'),\n\t\t})\n\n\t\tnew Setting(contentEl)\n\t\t\t.setName(i18n.t('settings.ai.model.id'))\n\t\t\t.setDesc(i18n.t('settings.ai.model.idDesc'))\n\t\t\t.then((s) => s.settingEl.addClass('setting-required'))\n\t\t\t.addText((text) =>\n\t\t\t\ttext.setValue(this.draft.id).onChange((value) => {\n\t\t\t\t\tthis.draft.id = value\n\t\t\t\t\tthis.draft.name = value\n\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.filters.save'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\tif (!this.draft.id.trim()) {\n\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ai.errors.emptyModelId'))\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst toSave = cloneDeep(this.draft)\n\t\t\t\t\t\t\ttoSave.id = toSave.id.trim()\n\t\t\t\t\t\t\tconst presetModel = this.options.findPresetOnSave\n\t\t\t\t\t\t\t\t? findPresetModelById(toSave.id)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\tconst model = presetModel\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t...presetModel,\n\t\t\t\t\t\t\t\t\t\tid: toSave.id,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: toSave\n\t\t\t\t\t\t\tconst ok = await this.onSave(model)\n\t\t\t\t\t\t\tif (!ok) return\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.error(error)\n\t\t\t\t\t\t\tnew Notice(\n\t\t\t\t\t\t\t\t`${i18n.t('settings.ai.errors.saveFailed')}: ${(error as Error)?.message}`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.filters.cancel'))\n\t\t\t\t\t.onClick(() => this.close()),\n\t\t\t)\n\t}\n\n\tonClose() {\n\t\tthis.contentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/ProviderEditorModal.ts",
    "content": "import { cloneDeep } from 'lodash-es'\nimport { Modal, Notice, Setting, setIcon } from 'obsidian'\nimport { createModelConfig, listModels, slugifyProviderId } from '~/ai/config'\nimport { AIModelConfig, AIProviderConfig } from '~/ai/types'\nimport i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport type NutstorePlugin from '..'\nimport ModelEditorModal from './ModelEditorModal'\n\nexport default class ProviderEditorModal extends Modal {\n\tprivate draft: AIProviderConfig\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprovider: AIProviderConfig,\n\t\tprivate onSave: (provider: AIProviderConfig) => Promise<boolean> | boolean,\n\t\tprivate isNew: boolean,\n\t) {\n\t\tsuper(plugin.app)\n\t\tthis.draft = cloneDeep(provider)\n\t}\n\n\tonOpen() {\n\t\tthis.render()\n\t}\n\n\tprivate render() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t\tcontentEl.createEl('h2', {\n\t\t\ttext: this.isNew\n\t\t\t\t? i18n.t('settings.ai.modals.provider.createTitle')\n\t\t\t\t: i18n.t('settings.ai.modals.provider.editTitle'),\n\t\t})\n\n\t\tnew Setting(contentEl)\n\t\t\t.setName(i18n.t('settings.ai.provider.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.provider.desc'))\n\t\t\t.then((s) => s.settingEl.addClass('setting-required'))\n\t\t\t.addText((text) =>\n\t\t\t\ttext.setValue(this.draft.name).onChange((value) => {\n\t\t\t\t\tthis.draft.name = value\n\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(contentEl)\n\t\t\t.setName(i18n.t('settings.ai.provider.baseUrl.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.provider.baseUrl.desc'))\n\t\t\t.then((s) => s.settingEl.addClass('setting-required'))\n\t\t\t.addText((text) =>\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder('https://api.openai.com/v1')\n\t\t\t\t\t.setValue(this.draft.api || '')\n\t\t\t\t\t.onChange((value) => {\n\t\t\t\t\t\tthis.draft.api = value.trim() || undefined\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(contentEl)\n\t\t\t.setName(i18n.t('settings.ai.provider.apiKey.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.provider.apiKey.desc'))\n\t\t\t.then((s) => s.settingEl.addClass('setting-required'))\n\t\t\t.addText((text) => {\n\t\t\t\ttext.setValue(this.draft.apiKey).onChange((value) => {\n\t\t\t\t\tthis.draft.apiKey = value\n\t\t\t\t})\n\t\t\t\ttext.inputEl.type = 'password'\n\t\t\t})\n\n\t\tconst modelContainer = contentEl.createDiv()\n\t\tnew Setting(modelContainer)\n\t\t\t.setName(i18n.t('settings.ai.models.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.models.desc'))\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton.setButtonText(i18n.t('settings.ai.models.add')).onClick(() => {\n\t\t\t\t\tnew ModelEditorModal(\n\t\t\t\t\t\tthis.plugin,\n\t\t\t\t\t\tcreateModelConfig(),\n\t\t\t\t\t\tasync (model) => {\n\t\t\t\t\t\t\tif (this.draft.models[model.id]) {\n\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ai.errors.duplicateModelId'))\n\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.draft.models = {\n\t\t\t\t\t\t\t\t...this.draft.models,\n\t\t\t\t\t\t\t\t[model.id]: model,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.render()\n\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{ findPresetOnSave: true },\n\t\t\t\t\t).open()\n\t\t\t\t}),\n\t\t\t)\n\n\t\tconst models = listModels(this.draft)\n\t\tif (models.length === 0) {\n\t\t\tmodelContainer.createDiv({\n\t\t\t\tcls: 'setting-item-description',\n\t\t\t\ttext: i18n.t('settings.ai.models.empty'),\n\t\t\t})\n\t\t}\n\n\t\tfor (const model of models) {\n\t\t\tnew Setting(modelContainer)\n\t\t\t\t.setName(model.name || i18n.t('settings.ai.unnamedModel'))\n\t\t\t\t.addButton((button) =>\n\t\t\t\t\tbutton\n\t\t\t\t\t\t.setButtonText(i18n.t('settings.ai.modals.model.edit'))\n\t\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\t\tnew ModelEditorModal(\n\t\t\t\t\t\t\t\tthis.plugin,\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\tasync (savedModel) => {\n\t\t\t\t\t\t\t\t\tconst isRename = savedModel.id !== model.id\n\t\t\t\t\t\t\t\t\tif (isRename && this.draft.models[savedModel.id]) {\n\t\t\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ai.errors.duplicateModelId'))\n\t\t\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst { [model.id]: _old, ...rest } = this.draft.models\n\t\t\t\t\t\t\t\t\tthis.draft.models = { ...rest, [savedModel.id]: savedModel }\n\t\t\t\t\t\t\t\t\tthis.render()\n\t\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t).open()\n\t\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.addButton((button) => {\n\t\t\t\t\tlet confirmDelete = false\n\n\t\t\t\t\tconst resetButton = () => {\n\t\t\t\t\t\tconfirmDelete = false\n\t\t\t\t\t\tbutton.buttonEl.empty()\n\t\t\t\t\t\tsetIcon(button.buttonEl, 'trash')\n\t\t\t\t\t\tbutton.buttonEl.removeClass('mod-warning')\n\t\t\t\t\t}\n\n\t\t\t\t\tbutton\n\t\t\t\t\t\t.setIcon('trash')\n\t\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\t\tif (!confirmDelete) {\n\t\t\t\t\t\t\t\tconfirmDelete = true\n\t\t\t\t\t\t\t\tbutton.buttonEl.empty()\n\t\t\t\t\t\t\t\tbutton.buttonEl.createSpan({\n\t\t\t\t\t\t\t\t\ttext: i18n.t('settings.ai.modals.confirmDeleteLabel'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tbutton.buttonEl.addClass('mod-warning')\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.deleteModel(model)\n\t\t\t\t\t\t})\n\t\t\t\t\tbutton.buttonEl.addEventListener('blur', resetButton)\n\t\t\t\t})\n\t\t}\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.filters.save'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst toSave = cloneDeep(this.draft)\n\t\t\t\t\t\t\tif (this.isNew) {\n\t\t\t\t\t\t\t\ttoSave.id = slugifyProviderId(toSave.name)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst ok = await this.onSave(toSave)\n\t\t\t\t\t\t\tif (!ok) return\n\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ai.modals.provider.saved'))\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.error(error)\n\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ai.errors.saveFailed'))\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.filters.cancel'))\n\t\t\t\t\t.onClick(() => this.close()),\n\t\t\t)\n\t}\n\n\tprivate deleteModel(model: AIModelConfig) {\n\t\tconst { [model.id]: _deleted, ...models } = this.draft.models\n\t\tthis.draft.models = models\n\t\tnew Notice(i18n.t('settings.ai.modals.model.deleted'))\n\t\tthis.render()\n\t}\n\n\tonClose() {\n\t\tthis.contentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/ProvidersManagerModal.ts",
    "content": "import { Modal, Notice, Setting, setIcon } from 'obsidian'\nimport {\n\tcreateProviderConfig,\n\tcreateProviderFromPreset,\n\tlistPresetProviders,\n\tlistProviders,\n} from '~/ai/config'\nimport { AIProviderConfig } from '~/ai/types'\nimport i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport type NutstorePlugin from '..'\nimport ProviderEditorModal from './ProviderEditorModal'\n\nconst CUSTOM_OPTION = '__custom__'\n\nexport default class ProvidersManagerModal extends Modal {\n\tprivate selectedPresetId = CUSTOM_OPTION\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate onChanged: () => Promise<void> | void,\n\t) {\n\t\tsuper(plugin.app)\n\t}\n\n\tonOpen() {\n\t\tthis.render()\n\t}\n\n\tprivate render() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t\tcontentEl.createEl('h2', {\n\t\t\ttext: i18n.t('settings.ai.modals.providers.title'),\n\t\t})\n\n\t\tconst presets = listPresetProviders()\n\n\t\tnew Setting(contentEl)\n\t\t\t.setName(i18n.t('settings.ai.providers.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.providers.desc'))\n\t\t\t.addDropdown((dropdown) => {\n\t\t\t\tdropdown.addOption(\n\t\t\t\t\tCUSTOM_OPTION,\n\t\t\t\t\ti18n.t('settings.ai.providers.presetCustom'),\n\t\t\t\t)\n\t\t\t\tfor (const preset of presets) {\n\t\t\t\t\tdropdown.addOption(preset.id, preset.name)\n\t\t\t\t}\n\t\t\t\tdropdown.setValue(this.selectedPresetId)\n\t\t\t\tdropdown.onChange((value) => {\n\t\t\t\t\tthis.selectedPresetId = value\n\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.ai.providers.add'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tconst preset =\n\t\t\t\t\t\t\tthis.selectedPresetId !== CUSTOM_OPTION\n\t\t\t\t\t\t\t\t? presets.find((p) => p.id === this.selectedPresetId)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\tconst draft = preset\n\t\t\t\t\t\t\t? createProviderFromPreset(preset, '')\n\t\t\t\t\t\t\t: createProviderConfig()\n\t\t\t\t\t\tnew ProviderEditorModal(\n\t\t\t\t\t\t\tthis.plugin,\n\t\t\t\t\t\t\tdraft,\n\t\t\t\t\t\t\tasync (provider) => {\n\t\t\t\t\t\t\t\tif (!provider.id) {\n\t\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ai.errors.emptyProviderId'))\n\t\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (this.plugin.settings.ai.providers[provider.id]) {\n\t\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ai.errors.duplicateProviderId'))\n\t\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis.plugin.settings.ai.providers = {\n\t\t\t\t\t\t\t\t\t...this.plugin.settings.ai.providers,\n\t\t\t\t\t\t\t\t\t[provider.id]: provider,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tawait this.onChanged()\n\t\t\t\t\t\t\t\tthis.render()\n\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t).open()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tconst providers = listProviders(this.plugin.settings.ai.providers)\n\t\tif (providers.length === 0) {\n\t\t\tcontentEl.createDiv({\n\t\t\t\tcls: 'setting-item-description',\n\t\t\t\ttext: i18n.t('settings.ai.providers.empty'),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tfor (const provider of providers) {\n\t\t\tnew Setting(contentEl)\n\t\t\t\t.setName(provider.name || i18n.t('settings.ai.unnamedProvider'))\n\t\t\t\t.setDesc(\n\t\t\t\t\tprovider.api || i18n.t('settings.ai.providers.openaiDefault'),\n\t\t\t\t)\n\t\t\t\t.addButton((button) =>\n\t\t\t\t\tbutton\n\t\t\t\t\t\t.setButtonText(i18n.t('settings.ai.modals.provider.edit'))\n\t\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\t\tnew ProviderEditorModal(\n\t\t\t\t\t\t\t\tthis.plugin,\n\t\t\t\t\t\t\t\tprovider,\n\t\t\t\t\t\t\t\tasync (savedProvider) => {\n\t\t\t\t\t\t\t\t\tthis.plugin.settings.ai.providers = {\n\t\t\t\t\t\t\t\t\t\t...this.plugin.settings.ai.providers,\n\t\t\t\t\t\t\t\t\t\t[savedProvider.id]: savedProvider,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tawait this.onChanged()\n\t\t\t\t\t\t\t\t\tthis.render()\n\t\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t).open()\n\t\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.addButton((button) => {\n\t\t\t\t\tlet confirmDelete = false\n\n\t\t\t\t\tconst resetButton = () => {\n\t\t\t\t\t\tconfirmDelete = false\n\t\t\t\t\t\tbutton.buttonEl.empty()\n\t\t\t\t\t\tsetIcon(button.buttonEl, 'trash')\n\t\t\t\t\t\tbutton.buttonEl.removeClass('mod-warning')\n\t\t\t\t\t}\n\n\t\t\t\t\tbutton\n\t\t\t\t\t\t.setIcon('trash')\n\t\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\t\tif (!confirmDelete) {\n\t\t\t\t\t\t\t\tconfirmDelete = true\n\t\t\t\t\t\t\t\tbutton.buttonEl.empty()\n\t\t\t\t\t\t\t\tbutton.buttonEl.createSpan({\n\t\t\t\t\t\t\t\t\ttext: i18n.t('settings.ai.modals.confirmDeleteLabel'),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tbutton.buttonEl.addClass('mod-warning')\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tawait this.deleteProvider(provider)\n\t\t\t\t\t\t})\n\t\t\t\t\tbutton.buttonEl.addEventListener('blur', resetButton)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tprivate async deleteProvider(provider: AIProviderConfig) {\n\t\ttry {\n\t\t\tconst { [provider.id]: _deleted, ...providers } =\n\t\t\t\tthis.plugin.settings.ai.providers\n\t\t\tthis.plugin.settings.ai.providers = providers\n\t\t\tawait this.onChanged()\n\t\t\tnew Notice(i18n.t('settings.ai.modals.provider.deleted'))\n\t\t\tthis.render()\n\t\t} catch (error) {\n\t\t\tlogger.error(error)\n\t\t\tnew Notice(i18n.t('settings.ai.errors.saveFailed'))\n\t\t}\n\t}\n\n\tonClose() {\n\t\tthis.contentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/SelectRemoteBaseDirModal.ts",
    "content": "import { App, Modal } from 'obsidian'\nimport NutstorePlugin from '..'\n\nimport { mount as mountWebDAVExplorer } from 'webdav-explorer'\nimport { getDirectoryContents } from '~/api/webdav'\nimport { fileStatToStatModel } from '~/utils/file-stat-to-stat-model'\nimport { mkdirsWebDAV } from '~/utils/mkdirs-webdav'\nimport { stdRemotePath } from '~/utils/std-remote-path'\n\nexport default class SelectRemoteBaseDirModal extends Modal {\n\tconstructor(\n\t\tapp: App,\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate onConfirm: (path: string) => void,\n\t) {\n\t\tsuper(app)\n\t}\n\n\tasync onOpen() {\n\t\tconst { contentEl } = this\n\n\t\tconst explorer = document.createElement('div')\n\t\tcontentEl.appendChild(explorer)\n\n\t\tconst webdav = await this.plugin.webDAVService.createWebDAVClient()\n\n\t\tmountWebDAVExplorer(explorer, {\n\t\t\tfs: {\n\t\t\t\tls: async (target) => {\n\t\t\t\t\tconst token = await this.plugin.getToken()\n\t\t\t\t\tconst items = await getDirectoryContents(token, target)\n\t\t\t\t\treturn items.map(fileStatToStatModel)\n\t\t\t\t},\n\t\t\t\tmkdirs: async (path) => {\n\t\t\t\t\tawait mkdirsWebDAV(webdav, path)\n\t\t\t\t},\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\texplorer.remove()\n\t\t\t\tthis.close()\n\t\t\t},\n\t\t\tonConfirm: async (path) => {\n\t\t\t\tawait Promise.resolve(this.onConfirm(stdRemotePath(path)))\n\t\t\t\texplorer.remove()\n\t\t\t\tthis.close()\n\t\t\t},\n\t\t})\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/SyncConfirmModal.ts",
    "content": "import { App, Modal, Setting } from 'obsidian'\nimport i18n from '../i18n'\nimport { useSettings } from '../settings'\n\nexport default class SyncConfirmModal extends Modal {\n\tprivate onConfirm: () => void\n\n\tconstructor(app: App, onConfirm: () => void) {\n\t\tsuper(app)\n\t\tthis.onConfirm = onConfirm\n\t}\n\n\tasync onOpen() {\n\t\tconst { contentEl } = this\n\t\tconst settings = await useSettings()\n\n\t\tcontentEl.createEl('h2', { text: i18n.t('sync.confirmModal.title') })\n\t\tconst infoDiv = contentEl.createDiv({ cls: 'sync-info' })\n\t\tinfoDiv.createEl('p', {\n\t\t\ttext: i18n.t('sync.confirmModal.remoteDir', { dir: settings.remoteDir }),\n\t\t})\n\t\tinfoDiv.createEl('p', {\n\t\t\ttext: i18n.t('sync.confirmModal.strategy', {\n\t\t\t\tstrategy: i18n.t(\n\t\t\t\t\t`settings.conflictStrategy.${settings.conflictStrategy === 'diff-match-patch' ? 'diffMatchPatch' : 'latestTimestamp'}`,\n\t\t\t\t),\n\t\t\t}),\n\t\t})\n\t\tcontentEl.createEl('pre', { text: i18n.t('sync.confirmModal.message') })\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('sync.confirmModal.cancel'))\n\t\t\t\t\t.onClick(() => this.close()),\n\t\t\t)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('sync.confirmModal.confirm'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\tthis.onConfirm()\n\t\t\t\t\t}),\n\t\t\t)\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/components/SyncProgressModal.ts",
    "content": "import { ButtonComponent, Modal, setIcon, Setting } from 'obsidian'\nimport { Subscription } from 'rxjs'\nimport CleanRecordTask from '~/sync/tasks/clean-record.task'\nimport FilenameErrorTask from '~/sync/tasks/filename-error.task'\nimport MkdirsRemoteTask from '~/sync/tasks/mkdirs-remote.task'\nimport RemoveRemoteRecursivelyTask from '~/sync/tasks/remove-remote-recursively.task'\nimport SkippedTask from '~/sync/tasks/skipped.task'\nimport getTaskName from '~/utils/get-task-name'\nimport NutstorePlugin from '..'\nimport {\n\temitCancelSync,\n\tonCancelSync,\n\tonSyncUpdateMtimeProgress,\n} from '../events'\nimport i18n from '../i18n'\nimport ConflictResolveTask from '../sync/tasks/conflict-resolve.task'\nimport MkdirLocalTask from '../sync/tasks/mkdir-local.task'\nimport MkdirRemoteTask from '../sync/tasks/mkdir-remote.task'\nimport PullTask from '../sync/tasks/pull.task'\nimport PushTask from '../sync/tasks/push.task'\nimport RemoveLocalTask from '../sync/tasks/remove-local.task'\nimport RemoveRemoteTask from '../sync/tasks/remove-remote.task'\n\nexport default class SyncProgressModal extends Modal {\n\tprivate progressBar: HTMLDivElement\n\tprivate progressText: HTMLDivElement\n\tprivate progressStats: HTMLDivElement\n\tprivate currentFile: HTMLDivElement\n\tprivate filesList: HTMLDivElement\n\tprivate syncCancelled = false\n\tprivate cancelSubscription: Subscription\n\tprivate updateMtimeSubscription: Subscription\n\tprivate stopButtonComponent: ButtonComponent\n\tprivate hideButtonComponent: ButtonComponent\n\n\tprivate cacheProgressBar: HTMLDivElement\n\tprivate cacheProgressText: HTMLDivElement\n\tprivate cacheProgressStats: HTMLDivElement\n\tprivate cacheCurrentOperation: HTMLDivElement\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate closeCallback?: () => void,\n\t) {\n\t\tsuper(plugin.app)\n\t\tthis.cancelSubscription = onCancelSync().subscribe(() => {\n\t\t\tthis.syncCancelled = true\n\t\t\tthis.update()\n\t\t})\n\t\tthis.updateMtimeSubscription = onSyncUpdateMtimeProgress().subscribe(\n\t\t\t(progress) => {\n\t\t\t\tthis.updateCacheProgress(progress.total, progress.completed)\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic update(): void {\n\t\tif (\n\t\t\t!this.progressBar ||\n\t\t\t!this.progressText ||\n\t\t\t!this.progressStats ||\n\t\t\t!this.currentFile ||\n\t\t\t!this.filesList\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tconst progress = this.plugin.progressService.syncProgress\n\n\t\tconst percent =\n\t\t\tMath.round((progress.completed.length / progress.total) * 100) || 0\n\n\t\tthis.progressBar.style.width = `${percent}%`\n\t\tthis.progressText.setText(\n\t\t\ti18n.t('sync.percentComplete', {\n\t\t\t\tpercent,\n\t\t\t}),\n\t\t)\n\n\t\tthis.progressStats.setText(\n\t\t\ti18n.t('sync.progressStats', {\n\t\t\t\tcompleted: progress.completed.length,\n\t\t\t\ttotal: progress.total,\n\t\t\t}),\n\t\t)\n\n\t\tif (progress.completed.length > 0) {\n\t\t\tif (this.plugin.progressService.syncEnd) {\n\t\t\t\tthis.stopButtonComponent.buttonEl.addClass('hidden')\n\t\t\t\tthis.hideButtonComponent.setButtonText(i18n.t('sync.closeButton'))\n\t\t\t\tthis.currentFile.setText(i18n.t('sync.complete'))\n\t\t\t} else if (this.syncCancelled) {\n\t\t\t\tthis.stopButtonComponent.buttonEl.addClass('hidden')\n\t\t\t\tthis.hideButtonComponent.setButtonText(i18n.t('sync.closeButton'))\n\t\t\t\tthis.currentFile.setText(i18n.t('sync.cancelled'))\n\t\t\t} else {\n\t\t\t\tconst lastFile = progress.completed.at(-1)\n\t\t\t\tif (lastFile) {\n\t\t\t\t\tthis.currentFile.setText(\n\t\t\t\t\t\ti18n.t('sync.currentFile', {\n\t\t\t\t\t\t\tpath: lastFile.localPath,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.filesList.empty()\n\n\t\tconst recentFiles = progress.completed.slice().reverse()\n\n\t\trecentFiles.forEach((file) => {\n\t\t\tconst item = this.filesList.createDiv({\n\t\t\t\tcls: 'flex items-center p-1 rounded text-2.5 gap-2 hover:bg-[var(--background-secondary)]',\n\t\t\t})\n\n\t\t\tconst icon = item.createSpan({ cls: 'text-[var(--text-muted)]' })\n\n\t\t\tif (file instanceof CleanRecordTask) {\n\t\t\t\tsetIcon(icon, 'archive-x')\n\t\t\t} else if (file instanceof ConflictResolveTask) {\n\t\t\t\tsetIcon(icon, 'git-merge')\n\t\t\t} else if (file instanceof FilenameErrorTask) {\n\t\t\t\tsetIcon(icon, 'refresh-cw-off')\n\t\t\t} else if (\n\t\t\t\tfile instanceof MkdirLocalTask ||\n\t\t\t\tfile instanceof MkdirRemoteTask ||\n\t\t\t\tfile instanceof MkdirsRemoteTask\n\t\t\t) {\n\t\t\t\tsetIcon(icon, 'folder-plus')\n\t\t\t} else if (file instanceof PullTask) {\n\t\t\t\tsetIcon(icon, 'arrow-down-narrow-wide')\n\t\t\t} else if (file instanceof PushTask) {\n\t\t\t\tsetIcon(icon, 'arrow-up-narrow-wide')\n\t\t\t} else if (\n\t\t\t\tfile instanceof RemoveLocalTask ||\n\t\t\t\tfile instanceof RemoveRemoteTask ||\n\t\t\t\tfile instanceof RemoveRemoteRecursivelyTask\n\t\t\t) {\n\t\t\t\tsetIcon(icon, 'trash')\n\t\t\t} else if (file instanceof SkippedTask) {\n\t\t\t\tsetIcon(icon, 'chevron-last')\n\t\t\t} else {\n\t\t\t\tsetIcon(icon, 'arrow-left-right')\n\t\t\t}\n\n\t\t\tconst typeLabel = item.createSpan({\n\t\t\t\tcls: 'flex-none w-17 md:w-24 text-[var(--text-normal)] font-500',\n\t\t\t})\n\n\t\t\ttypeLabel.setText(getTaskName(file))\n\n\t\t\tconst filePath = item.createSpan({\n\t\t\t\tcls: 'flex-1 break-all',\n\t\t\t})\n\t\t\tfilePath.setText(\n\t\t\t\ti18n.t('sync.filePath', {\n\t\t\t\t\tpath: file.localPath,\n\t\t\t\t}),\n\t\t\t)\n\t\t})\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\n\t\tconst container = contentEl.createDiv({\n\t\t\tcls: 'flex flex-col gap-4 min-h-[40vh] max-h-[75vh]',\n\t\t})\n\n\t\tconst header = container.createDiv({\n\t\t\tcls: 'border-b border-[var(--background-modifier-border)]',\n\t\t})\n\n\t\tconst title = header.createEl('h2', {\n\t\t\tcls: 'm-0',\n\t\t})\n\t\ttitle.setText(i18n.t('sync.progressTitle'))\n\n\t\tconst statusSection = container.createDiv({\n\t\t\tcls: 'flex flex-col gap-1',\n\t\t})\n\n\t\tconst currentOperation = statusSection.createDiv()\n\t\tcurrentOperation.setText(i18n.t('sync.syncingFiles'))\n\n\t\tconst currentFile = statusSection.createDiv({\n\t\t\tcls: 'text-3 text-[var(--text-muted)] truncate overflow-hidden whitespace-nowrap',\n\t\t})\n\n\t\tconst progressSection = container.createDiv({\n\t\t\tcls: 'flex flex-col gap-2',\n\t\t})\n\n\t\tconst progressStats = progressSection.createDiv({\n\t\t\tcls: 'text-3.25',\n\t\t})\n\n\t\tconst progressBarContainer = progressSection.createDiv({\n\t\t\tcls: 'relative h-5 bg-[var(--background-secondary)] rounded overflow-hidden',\n\t\t})\n\n\t\tconst progressBar = progressBarContainer.createDiv({\n\t\t\tcls: 'absolute h-full bg-[var(--interactive-accent)] w-0 transition-width',\n\t\t})\n\n\t\tconst progressText = progressBarContainer.createDiv({\n\t\t\tcls: 'absolute w-full text-center text-3 leading-5 text-[var(--text-on-accent)] mix-blend-difference',\n\t\t})\n\n\t\t// Cache progress section\n\t\tconst cacheProgressSection = container.createDiv({\n\t\t\tcls: 'flex flex-col gap-1',\n\t\t})\n\t\tthis.cacheCurrentOperation = cacheProgressSection.createDiv()\n\t\tthis.cacheCurrentOperation.setText(i18n.t('sync.updatingCache'))\n\t\tthis.cacheCurrentOperation.hide()\n\n\t\tconst cacheProgressStats = cacheProgressSection.createDiv({\n\t\t\tcls: 'text-3.25',\n\t\t})\n\t\tthis.cacheProgressStats = cacheProgressStats\n\t\tthis.cacheProgressStats.hide()\n\n\t\tconst cacheProgressBarContainer = cacheProgressSection.createDiv({\n\t\t\tcls: 'relative h-5 bg-[var(--background-secondary)] rounded overflow-hidden',\n\t\t})\n\t\tcacheProgressBarContainer.hide()\n\n\t\tthis.cacheProgressBar = cacheProgressBarContainer.createDiv({\n\t\t\tcls: 'absolute h-full bg-[var(--interactive-accent)] w-0 transition-width',\n\t\t})\n\t\tthis.cacheProgressText = cacheProgressBarContainer.createDiv({\n\t\t\tcls: 'absolute w-full text-center text-3 leading-5 text-[var(--text-on-accent)] mix-blend-difference',\n\t\t})\n\n\t\tconst filesSection = container.createDiv({\n\t\t\tcls: 'flex flex-col flex-1 gap-2 mt-2 overflow-y-auto',\n\t\t})\n\n\t\tconst filesHeader = filesSection.createDiv({\n\t\t\tcls: 'font-500 text-3.5 pb-1 border-b border-[var(--background-modifier-border)]',\n\t\t})\n\t\tfilesHeader.setText(i18n.t('sync.completedFilesTitle'))\n\n\t\tconst filesList = filesSection.createDiv({\n\t\t\tcls: 'flex-1 overflow-y-auto border border-[var(--background-modifier-border)] border-solid rounded p-1',\n\t\t})\n\n\t\tthis.progressBar = progressBar\n\t\tthis.progressText = progressText\n\t\tthis.progressStats = progressStats\n\t\tthis.currentFile = currentFile\n\t\tthis.filesList = filesList\n\n\t\tconst footerButtons = container.createDiv({\n\t\t\tcls: 'border-t border-[var(--background-modifier-border)]',\n\t\t})\n\n\t\tnew Setting(footerButtons)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('sync.hideButton'))\n\t\t\t\t\t.onClick(() => this.close())\n\t\t\t\tthis.hideButtonComponent = button\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('sync.stopButton'))\n\t\t\t\t\t.setWarning()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\temitCancelSync()\n\t\t\t\t\t})\n\t\t\t\tthis.stopButtonComponent = button\n\t\t\t})\n\n\t\tthis.update()\n\t}\n\n\tonClose(): void {\n\t\tthis.cancelSubscription.unsubscribe()\n\t\tthis.updateMtimeSubscription.unsubscribe()\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t\tif (this.closeCallback) {\n\t\t\tthis.closeCallback()\n\t\t}\n\t}\n\n\tprivate updateCacheProgress(total: number, completed: number): void {\n\t\tif (\n\t\t\t!this.cacheProgressBar ||\n\t\t\t!this.cacheProgressText ||\n\t\t\t!this.cacheProgressStats\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.cacheCurrentOperation.show()\n\t\tthis.cacheProgressStats.show()\n\t\tthis.cacheProgressBar.parentElement?.show()\n\n\t\tconst percent = Math.round((completed / total) * 100) || 0\n\n\t\tthis.cacheProgressBar.style.width = `${percent}%`\n\t\tthis.cacheProgressText.setText(\n\t\t\ti18n.t('sync.percentComplete', {\n\t\t\t\tpercent,\n\t\t\t}),\n\t\t)\n\n\t\tthis.cacheProgressStats.setText(\n\t\t\ti18n.t('sync.progressStats', {\n\t\t\t\tcompleted,\n\t\t\t\ttotal,\n\t\t\t}),\n\t\t)\n\n\t\tif (completed === total) {\n\t\t\tthis.cacheCurrentOperation.setText(i18n.t('sync.cacheUpdated'))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/components/SyncRibbonManager.ts",
    "content": "import { Notice } from 'obsidian'\nimport logger from '~/utils/logger'\nimport { emitCancelSync } from '../events'\nimport i18n from '../i18n'\nimport type NutstorePlugin from '../index'\nimport { NutstoreSync, SyncStartMode } from '../sync'\nimport { CHATBOX_VIEW_TYPE } from '../views/chatbox.view'\nimport SyncConfirmModal from './SyncConfirmModal'\n\nexport class SyncRibbonManager {\n\tprivate startRibbonEl: HTMLElement\n\tprivate stopRibbonEl: HTMLElement\n\n\tconstructor(private plugin: NutstorePlugin) {\n\t\tthis.startRibbonEl = this.plugin.addRibbonIcon(\n\t\t\t'refresh-ccw',\n\t\t\ti18n.t('sync.startButton'),\n\t\t\tasync () => {\n\t\t\t\tif (this.plugin.isSyncing) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// 检查账号配置\n\t\t\t\tif (!this.plugin.isAccountConfigured()) {\n\t\t\t\t\tnew Notice(i18n.t('sync.error.accountNotConfigured'))\n\t\t\t\t\t// 打开设置页面，引导用户配置账号\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst setting = this.plugin.app.setting\n\t\t\t\t\t\tif (setting) {\n\t\t\t\t\t\t\tsetting.open()\n\t\t\t\t\t\t\tsetting.openTabById(this.plugin.manifest.id)\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger.error('Failed to open settings:', error)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst startSync = async () => {\n\t\t\t\t\tconst sync = new NutstoreSync(this.plugin, {\n\t\t\t\t\t\twebdav: await this.plugin.webDAVService.createWebDAVClient(),\n\t\t\t\t\t\tvault: this.plugin.app.vault,\n\t\t\t\t\t\ttoken: await this.plugin.getToken(),\n\t\t\t\t\t\tremoteBaseDir: this.plugin.remoteBaseDir,\n\t\t\t\t\t})\n\t\t\t\t\tawait sync.start({\n\t\t\t\t\t\tmode: SyncStartMode.MANUAL_SYNC,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (plugin.settings.confirmBeforeSync) {\n\t\t\t\t\tnew SyncConfirmModal(this.plugin.app, startSync).open()\n\t\t\t\t} else {\n\t\t\t\t\tstartSync()\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\n\t\tthis.stopRibbonEl = this.plugin.addRibbonIcon(\n\t\t\t'square',\n\t\t\ti18n.t('sync.stopButton'),\n\t\t\t() => emitCancelSync(),\n\t\t)\n\t\tthis.stopRibbonEl.classList.add('hidden')\n\n\t\tthis.plugin.addRibbonIcon(\n\t\t\t'bot',\n\t\t\ti18n.t('chatbox.openCommand'),\n\t\t\tasync () => {\n\t\t\t\tconst existingLeaf =\n\t\t\t\t\tthis.plugin.app.workspace.getLeavesOfType(CHATBOX_VIEW_TYPE)[0]\n\t\t\t\tconst leaf =\n\t\t\t\t\texistingLeaf || this.plugin.app.workspace.getRightLeaf(false)\n\t\t\t\tif (!leaf) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait leaf.setViewState({ type: CHATBOX_VIEW_TYPE, active: true })\n\t\t\t\tthis.plugin.app.workspace.revealLeaf(leaf)\n\t\t\t},\n\t\t)\n\t}\n\n\tpublic update() {\n\t\tif (this.plugin.isSyncing) {\n\t\t\tthis.startRibbonEl.setAttr('aria-disabled', 'true')\n\t\t\tthis.startRibbonEl.addClass('nutstore-sync-spinning')\n\t\t\tthis.stopRibbonEl.classList.remove('hidden')\n\t\t} else {\n\t\t\tthis.startRibbonEl.removeAttribute('aria-disabled')\n\t\t\tthis.startRibbonEl.removeClass('nutstore-sync-spinning')\n\t\t\tthis.stopRibbonEl.classList.add('hidden')\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/components/TaskListConfirmModal.ts",
    "content": "import { App, Modal, Setting } from 'obsidian'\nimport i18n from '~/i18n'\nimport getTaskName from '~/utils/get-task-name'\nimport { BaseTask } from '../sync/tasks/task.interface'\n\nexport default class TaskListConfirmModal extends Modal {\n\tprivate result: boolean = false\n\tprivate selectedTasks: boolean[] = []\n\n\tconstructor(\n\t\tapp: App,\n\t\tprivate tasks: BaseTask[],\n\t) {\n\t\tsuper(app)\n\t\tthis.selectedTasks = new Array(tasks.length).fill(true)\n\t}\n\n\tonOpen() {\n\t\tthis.setTitle(i18n.t('taskList.title'))\n\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\n\t\tconst instruction = contentEl.createEl('p')\n\t\tinstruction.setText(i18n.t('taskList.instruction'))\n\n\t\tconst tableContainer = contentEl.createDiv({\n\t\t\tcls: 'max-h-50vh overflow-y-auto',\n\t\t})\n\t\tconst table = tableContainer.createEl('table', { cls: 'task-list-table' })\n\n\t\tconst thead = table.createEl('thead')\n\t\tconst headerRow = thead.createEl('tr')\n\t\theaderRow.createEl('th', { text: i18n.t('taskList.execute') })\n\t\theaderRow.createEl('th', { text: i18n.t('taskList.action') })\n\t\theaderRow.createEl('th', { text: i18n.t('taskList.localPath') })\n\t\theaderRow.createEl('th', { text: i18n.t('taskList.remotePath') })\n\n\t\tconst tbody = table.createEl('tbody')\n\t\tthis.tasks.forEach((task, index) => {\n\t\t\tconst row = tbody.createEl('tr')\n\t\t\tconst checkboxCell = row.createEl('td')\n\t\t\tconst checkbox = checkboxCell.createEl('input')\n\t\t\tcheckbox.type = 'checkbox'\n\t\t\tcheckbox.checked = this.selectedTasks[index]\n\t\t\tcheckbox.addEventListener('change', (e) => {\n\t\t\t\tthis.selectedTasks[index] = checkbox.checked\n\t\t\t\te.stopPropagation()\n\t\t\t})\n\t\t\trow.addEventListener('click', (e) => {\n\t\t\t\tif (e.target === checkbox) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcheckbox.checked = !checkbox.checked\n\t\t\t\tthis.selectedTasks[index] = checkbox.checked\n\t\t\t\te.stopPropagation()\n\t\t\t})\n\t\t\trow.createEl('td', { text: getTaskName(task) })\n\t\t\trow.createEl('td', { text: task.localPath })\n\t\t\trow.createEl('td', { text: task.remotePath })\n\t\t})\n\n\t\tconst settingDiv = contentEl.createDiv()\n\t\tsettingDiv.style.marginTop = '1rem'\n\t\tnew Setting(settingDiv)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('taskList.continue'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.result = true\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('taskList.cancel')).onClick(() => {\n\t\t\t\t\tthis.result = false\n\t\t\t\t\tthis.close()\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\tasync open(): Promise<{ confirm: boolean; tasks: BaseTask[] }> {\n\t\tsuper.open()\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.onClose = () => {\n\t\t\t\tconst selectedTasks = this.tasks.filter(\n\t\t\t\t\t(_, index) => this.selectedTasks[index],\n\t\t\t\t)\n\t\t\t\tresolve({\n\t\t\t\t\tconfirm: this.result,\n\t\t\t\t\ttasks: selectedTasks,\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "src/components/TextAreaModal.ts",
    "content": "import { App, Modal, Notice, Setting } from 'obsidian'\nimport i18n from '~/i18n'\n\nexport default class TextAreaModal extends Modal {\n\tconstructor(\n\t\tapp: App,\n\t\tprivate text: string,\n\t) {\n\t\tsuper(app)\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\n\t\tconst textarea = contentEl.createEl('textarea', {\n\t\t\tcls: 'w-full h-50vh',\n\t\t\ttext: this.text,\n\t\t})\n\t\ttextarea.disabled = true\n\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.setButtonText(i18n.t('textAreaModal.copy'))\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tnavigator.clipboard.writeText(this.text).then(() => {\n\t\t\t\t\t\t\tnew Notice(i18n.t('textAreaModal.copied'))\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('textAreaModal.close')).onClick(() => {\n\t\t\t\t\tthis.close()\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\tonClose() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/consts.ts",
    "content": "import { Platform, requireApiVersion } from 'obsidian'\n\nexport const NS_NSDAV_ENDPOINT = process.env.NS_NSDAV_ENDPOINT!\nexport const NS_DAV_ENDPOINT = process.env.NS_DAV_ENDPOINT!\nexport const PLUGIN_VERSION = process.env.PLUGIN_VERSION!\n\nexport const API_VER_STAT_FOLDER = '0.13.27'\nexport const API_VER_REQURL = '0.13.26' // desktop ver 0.13.26, iOS ver 1.1.1\nexport const API_VER_REQURL_ANDROID = '0.14.6' // Android ver 1.2.1\nexport const API_VER_ENSURE_REQURL_OK = '1.0.0' // always bypass CORS here\n\nexport const VALID_REQURL =\n\t(!Platform.isAndroidApp && requireApiVersion(API_VER_REQURL)) ||\n\t(Platform.isAndroidApp && requireApiVersion(API_VER_REQURL_ANDROID))\n\nexport const IN_DEV = process.env.NODE_ENV === 'development'\n"
  },
  {
    "path": "src/events/index.ts",
    "content": "export * from './sync-cancel'\nexport * from './sync-end'\nexport * from './sync-error'\nexport * from './sync-preparing'\nexport * from './sync-progress'\nexport * from './sync-start'\nexport * from './sync-update-mtime-progress'\nexport * from './vault'\n"
  },
  {
    "path": "src/events/sso-receive.ts",
    "content": "import { Subject } from 'rxjs'\n\ninterface SsoRxProps {\n\ttoken: string\n}\n\nconst ssoReceive = new Subject<SsoRxProps>()\n\nexport const onSsoReceive = () => ssoReceive.asObservable()\nexport const emitSsoReceive = (props: SsoRxProps) => ssoReceive.next(props)\n"
  },
  {
    "path": "src/events/sync-cancel.ts",
    "content": "import { Subject } from 'rxjs'\n\nconst cancelSync = new Subject<void>()\n\nexport const onCancelSync = () => cancelSync.asObservable()\nexport const emitCancelSync = () => cancelSync.next()\n"
  },
  {
    "path": "src/events/sync-end.ts",
    "content": "import { Subject } from 'rxjs'\n\ninterface SyncEndProps {\n\tshowNotice: boolean\n\tfailedCount: number\n}\n\nconst endSync = new Subject<SyncEndProps>()\n\nexport const onEndSync = () => endSync.asObservable()\nexport const emitEndSync = (props: SyncEndProps) => endSync.next(props)\n"
  },
  {
    "path": "src/events/sync-error.ts",
    "content": "import { Subject } from 'rxjs'\n\nconst syncError = new Subject<Error>()\n\nexport const onSyncError = () => syncError.asObservable()\nexport const emitSyncError = (error: Error) => syncError.next(error)\n"
  },
  {
    "path": "src/events/sync-preparing.ts",
    "content": "import { Subject } from 'rxjs'\n\ninterface SyncPreparingProps {\n\tshowNotice: boolean\n}\n\nconst preparingSync = new Subject<SyncPreparingProps>()\n\nexport const onPreparingSync = () => preparingSync.asObservable()\nexport const emitPreparingSync = (props: SyncPreparingProps) =>\n\tpreparingSync.next(props)\n"
  },
  {
    "path": "src/events/sync-progress.ts",
    "content": "import { Subject } from 'rxjs'\nimport { BaseTask } from '~/sync/tasks/task.interface'\n\nexport interface UpdateSyncProgress {\n\ttotal: number\n\tcompleted: BaseTask[]\n}\n\nconst syncProgress = new Subject<UpdateSyncProgress>()\n\nexport const onSyncProgress = () => syncProgress.asObservable()\n\nexport const emitSyncProgress = (total: number, completed: BaseTask[]) =>\n\tsyncProgress.next({\n\t\ttotal,\n\t\tcompleted,\n\t})\n"
  },
  {
    "path": "src/events/sync-start.ts",
    "content": "import { Subject } from 'rxjs'\n\ninterface SyncStartProps {\n\tshowNotice: boolean\n}\n\nconst startSync = new Subject<SyncStartProps>()\n\nexport const onStartSync = () => startSync.asObservable()\nexport const emitStartSync = (props: SyncStartProps) => startSync.next(props)\n"
  },
  {
    "path": "src/events/sync-update-mtime-progress.ts",
    "content": "import { Subject } from 'rxjs'\n\nexport interface UpdateSyncUpdateMtimeProgress {\n\ttotal: number\n\tcompleted: number\n}\n\nconst syncUpdateMtimeProgress = new Subject<UpdateSyncUpdateMtimeProgress>()\n\nexport const onSyncUpdateMtimeProgress = () =>\n\tsyncUpdateMtimeProgress.asObservable()\n\nexport const emitSyncUpdateMtimeProgress = (total: number, completed: number) =>\n\tsyncUpdateMtimeProgress.next({\n\t\ttotal,\n\t\tcompleted,\n\t})\n"
  },
  {
    "path": "src/events/vault.ts",
    "content": "import { Subject } from 'rxjs'\n\ninterface VaultEventProps {\n\ttype: string\n}\n\nconst vaultEvent = new Subject<VaultEventProps>()\n\nexport const onVaultEvent = () => vaultEvent.asObservable()\nexport const emitVaultEvent = (props: VaultEventProps) => vaultEvent.next(props)\n"
  },
  {
    "path": "src/fs/fs.interface.ts",
    "content": "import { StatModel } from '~/model/stat.model'\nimport { MaybePromise } from '~/utils/types'\n\nexport interface FsWalkResult {\n\tstat: StatModel\n\tignored: boolean\n}\n\nexport default abstract class AbstractFileSystem {\n\tabstract walk(): MaybePromise<FsWalkResult[]>\n}\n"
  },
  {
    "path": "src/fs/local-vault.ts",
    "content": "import { Vault } from 'obsidian'\nimport { useSettings } from '~/settings'\nimport { SyncRecord } from '~/storage/sync-record'\nimport {\n\tConfigDirSyncMode,\n\tcomputeEffectiveFilterRulesFromParts,\n} from '~/utils/config-dir-rules'\nimport GlobMatch, {\n\tGlobMatchOptions,\n\tisVoidGlobMatchOptions,\n\tneedIncludeFromGlobRules,\n} from '~/utils/glob-match'\nimport { traverseLocalVault } from '~/utils/traverse-local-vault'\nimport AbstractFileSystem from './fs.interface'\nimport completeLossDir from './utils/complete-loss-dir'\n\nexport class LocalVaultFileSystem implements AbstractFileSystem {\n\tconstructor(\n\t\tprivate readonly options: {\n\t\t\tvault: Vault\n\t\t\tsyncRecord: SyncRecord\n\t\t\tfilterRules?: {\n\t\t\t\texclusionRules: GlobMatchOptions[]\n\t\t\t\tinclusionRules: GlobMatchOptions[]\n\t\t\t\tconfigDir?: string\n\t\t\t\tconfigDirSyncMode?: ConfigDirSyncMode\n\t\t\t}\n\t\t},\n\t) {}\n\n\tasync walk() {\n\t\tconst settings = this.options.filterRules ? undefined : await useSettings()\n\t\tconst filterRules =\n\t\t\tthis.options.filterRules ??\n\t\t\t(settings\n\t\t\t\t? computeEffectiveFilterRulesFromParts(\n\t\t\t\t\t\tthis.options.vault.configDir,\n\t\t\t\t\t\tsettings.configDirSyncMode ?? 'none',\n\t\t\t\t\t\tsettings.filterRules,\n\t\t\t\t\t)\n\t\t\t\t: undefined)\n\t\tconst exclusions = this.buildRules(filterRules?.exclusionRules)\n\t\tconst inclusions = this.buildRules(filterRules?.inclusionRules)\n\n\t\tconst stats = await traverseLocalVault(\n\t\t\tthis.options.vault,\n\t\t\tthis.options.vault.getRoot().path,\n\t\t)\n\t\tconst includedStats = stats.filter((stat) =>\n\t\t\tneedIncludeFromGlobRules(stat.path, inclusions, exclusions),\n\t\t)\n\t\tconst completeStats = completeLossDir(stats, includedStats)\n\t\tconst completeStatPaths = new Set(completeStats.map((s) => s.path))\n\t\treturn stats.map((stat) => ({\n\t\t\tstat,\n\t\t\tignored: !completeStatPaths.has(stat.path),\n\t\t}))\n\t}\n\n\tprivate buildRules(rules: GlobMatchOptions[] = []): GlobMatch[] {\n\t\treturn rules\n\t\t\t.filter((opt) => !isVoidGlobMatchOptions(opt))\n\t\t\t.map(({ expr, options }) => new GlobMatch(expr, options))\n\t}\n}\n"
  },
  {
    "path": "src/fs/nutstore.ts",
    "content": "import { Vault } from 'obsidian'\nimport { isAbsolute } from 'path-browserify'\nimport { isNotNil } from 'ramda'\nimport { createClient, WebDAVClient } from 'webdav'\nimport { NS_DAV_ENDPOINT } from '~/consts'\nimport { useSettings } from '~/settings'\nimport {\n\tConfigDirSyncMode,\n\tcomputeEffectiveFilterRulesFromParts,\n} from '~/utils/config-dir-rules'\nimport { getTraversalWebDAVDBKey } from '~/utils/get-db-key'\nimport GlobMatch, {\n\tGlobMatchOptions,\n\tisVoidGlobMatchOptions,\n\tneedIncludeFromGlobRules,\n} from '~/utils/glob-match'\nimport { isSub } from '~/utils/is-sub'\nimport { stdRemotePath } from '~/utils/std-remote-path'\nimport { ResumableWebDAVTraversal } from '~/utils/traverse-webdav'\nimport AbstractFileSystem from './fs.interface'\nimport completeLossDir from './utils/complete-loss-dir'\n\nexport class NutstoreFileSystem implements AbstractFileSystem {\n\tprivate webdav: WebDAVClient\n\n\tconstructor(\n\t\tprivate options: {\n\t\t\tvault: Vault\n\t\t\ttoken: string\n\t\t\tremoteBaseDir: string\n\t\t\tfilterRules?: {\n\t\t\t\texclusionRules: GlobMatchOptions[]\n\t\t\t\tinclusionRules: GlobMatchOptions[]\n\t\t\t\tconfigDir?: string\n\t\t\t\tconfigDirSyncMode?: ConfigDirSyncMode\n\t\t\t}\n\t\t},\n\t) {\n\t\tthis.webdav = createClient(NS_DAV_ENDPOINT, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Basic ${this.options.token}`,\n\t\t\t},\n\t\t})\n\t}\n\n\tasync walk() {\n\t\tconst traversal = new ResumableWebDAVTraversal({\n\t\t\ttoken: this.options.token,\n\t\t\tremoteBaseDir: this.options.remoteBaseDir,\n\t\t\tkvKey: await getTraversalWebDAVDBKey(\n\t\t\t\tthis.options.token,\n\t\t\t\tthis.options.remoteBaseDir,\n\t\t\t),\n\t\t\tsaveInterval: 1,\n\t\t})\n\t\tlet stats = await traversal.traverse()\n\n\t\tif (stats.length === 0) {\n\t\t\treturn []\n\t\t}\n\n\t\tconst base = stdRemotePath(this.options.remoteBaseDir)\n\t\tconst subPath = new Set<string>()\n\t\tfor (let { path } of stats) {\n\t\t\tif (path.endsWith('/')) {\n\t\t\t\tpath = path.slice(0, path.length - 1)\n\t\t\t}\n\t\t\tif (!path.startsWith('/')) {\n\t\t\t\tpath = `/${path}`\n\t\t\t}\n\t\t\tif (isSub(base, path)) {\n\t\t\t\tsubPath.add(path)\n\t\t\t}\n\t\t}\n\n\t\tconst statsMap = new Map(stats.map((s) => [s.path, s]))\n\t\tstats = [...subPath].map((path) => statsMap.get(path)).filter(isNotNil)\n\t\tfor (const item of stats) {\n\t\t\tif (isAbsolute(item.path)) {\n\t\t\t\titem.path = item.path.replace(this.options.remoteBaseDir, '')\n\t\t\t\tif (item.path.startsWith('/')) {\n\t\t\t\t\titem.path = item.path.slice(1)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst settings = this.options.filterRules ? undefined : await useSettings()\n\t\tconst filterRules =\n\t\t\tthis.options.filterRules ??\n\t\t\t(settings\n\t\t\t\t? computeEffectiveFilterRulesFromParts(\n\t\t\t\t\t\tthis.options.vault.configDir,\n\t\t\t\t\t\tsettings.configDirSyncMode ?? 'none',\n\t\t\t\t\t\tsettings.filterRules,\n\t\t\t\t\t)\n\t\t\t\t: undefined)\n\t\tconst exclusions = this.buildRules(filterRules?.exclusionRules)\n\t\tconst inclusions = this.buildRules(filterRules?.inclusionRules)\n\n\t\tconst includedStats = stats.filter((stat) =>\n\t\t\tneedIncludeFromGlobRules(stat.path, inclusions, exclusions),\n\t\t)\n\t\tconst completeStats = completeLossDir(stats, includedStats)\n\t\tconst completeStatPaths = new Set(completeStats.map((s) => s.path))\n\t\tconst results = stats.map((stat) => ({\n\t\t\tstat,\n\t\t\tignored: !completeStatPaths.has(stat.path),\n\t\t}))\n\t\treturn results\n\t}\n\n\tprivate buildRules(rules: GlobMatchOptions[] = []): GlobMatch[] {\n\t\treturn rules\n\t\t\t.filter((opt) => !isVoidGlobMatchOptions(opt))\n\t\t\t.map(({ expr, options }) => new GlobMatch(expr, options))\n\t}\n}\n"
  },
  {
    "path": "src/fs/utils/complete-loss-dir.ts",
    "content": "import { dirname } from 'path-browserify'\nimport { StatModel } from '~/model/stat.model'\nimport isRoot from './is-root'\n\n/**\n * 经过 inclusion 和 exclusion 之后，\n * 有些符合规则的文件保留了下来，\n * 但是他们的父文件夹可能丢失了，需要补全\n */\nexport default function completeLossDir(\n\tstats: StatModel[],\n\t_filteredStats: StatModel[],\n) {\n\tconst filteredStats = new Set(_filteredStats)\n\tconst statsMap = new Map(stats.map((d) => [d.path, d]))\n\tconst filteredFolderMap = new Map(\n\t\t[...filteredStats].filter((d) => d.isDir).map((d) => [d.path, d]),\n\t)\n\tfor (let { path } of _filteredStats) {\n\t\twhile (true) {\n\t\t\tpath = dirname(path)\n\t\t\tif (isRoot(path)) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (filteredFolderMap.has(path)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst dirStat = statsMap.get(path)\n\t\t\tif (!dirStat || !dirStat.isDir) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfilteredFolderMap.set(path, dirStat)\n\t\t\tfilteredStats.add(dirStat)\n\t\t}\n\t}\n\treturn [...filteredStats]\n}\n"
  },
  {
    "path": "src/fs/utils/is-root.ts",
    "content": "export default function isRoot(path: string) {\n\treturn path === '/' || path === '.' || path === ''\n}\n"
  },
  {
    "path": "src/i18n/index.ts",
    "content": "import i18n from 'i18next'\nimport en from './locales/en'\nimport zh from './locales/zh'\n\nconst defaultNS = 'translation'\nconst resources = {\n\tzh: {\n\t\ttranslation: zh,\n\t},\n\ten: {\n\t\ttranslation: en,\n\t},\n} as const\n\ndeclare module 'i18next' {\n\tinterface CustomTypeOptions {\n\t\tdefaultNS: 'translation'\n\t\tresources: (typeof resources)['en']\n\t}\n}\n\ni18n.init({\n\tns: ['translation'],\n\tdefaultNS,\n\tresources,\n\tfallbackLng: 'en',\n\tinterpolation: {\n\t\tescapeValue: false,\n\t},\n})\n\nexport default i18n\n"
  },
  {
    "path": "src/i18n/locales/en.ts",
    "content": "export default {\n\terrors: {\n\t\tfilenameUnsupportedChars:\n\t\t\t'File {{path}} contains unsupported characters: {{chars}}',\n\t},\n\tsettings: {\n\t\tlanguage: {\n\t\t\tname: 'Language',\n\t\t\tdesc: 'Select interface language',\n\t\t\tauto: 'Auto detect',\n\t\t},\n\t\taccount: {\n\t\t\tname: 'Account',\n\t\t\tdesc: 'Enter your WebDAV account',\n\t\t\tplaceholder: 'Enter your account',\n\t\t},\n\t\tcredential: {\n\t\t\tname: 'Credential',\n\t\t\tdesc: 'Enter your WebDAV credential',\n\t\t\tplaceholder: 'Enter your credential',\n\t\t},\n\t\tcheckConnection: {\n\t\t\tname: 'Check connection',\n\t\t\tdesc: 'Click to check WebDAV connection',\n\t\t\tsuccess: 'WebDAV connection successful',\n\t\t\tfailure: 'WebDAV connection failed',\n\t\t\tsuccessButton: 'Connected ✓',\n\t\t\tfailureButton: 'Failed ×',\n\t\t},\n\t\tremoteDir: {\n\t\t\tname: 'Remote directory',\n\t\t\tdesc: 'Enter the remote directory',\n\t\t\tplaceholder: 'Enter the remote directory',\n\t\t\tedit: 'Edit',\n\t\t},\n\t\tlogin: {\n\t\t\tname: 'Login',\n\t\t\tdesc: 'Click to login',\n\t\t\tsuccess: 'Login successful',\n\t\t\tfailure: 'Login failed, please try again',\n\t\t},\n\t\tloginMode: {\n\t\t\tname: 'Login mode',\n\t\t\tmanual: 'Manual input',\n\t\t\tsso: 'Single sign-on',\n\t\t},\n\t\tssoStatus: {\n\t\t\tloggedIn: 'Logged in',\n\t\t\tnotLoggedIn: 'Not logged in',\n\t\t\tlogout: 'Logout',\n\t\t\tlogoutSuccess: 'Logged out successfully',\n\t\t},\n\t\tuseGitStyle: {\n\t\t\tname: 'Use git-style conflict markers',\n\t\t\tdesc: 'Use <<<<<<< and >>>>>>> markers for conflicts instead of HTML tags',\n\t\t},\n\t\tbackupWarning: {\n\t\t\tname: 'Backup warning',\n\t\t\tdesc: '⚠️ Note: Sync process will modify or delete local files. Please backup important files before syncing.',\n\t\t},\n\t\tconflictStrategy: {\n\t\t\tname: 'Conflict resolution strategy',\n\t\t\tdesc: 'Choose how to resolve file conflicts. \\nNote: We recommend backing up important files before using auto-merge to prevent data loss.',\n\t\t\tdiffMatchPatch: 'Smart merge (recommended)',\n\t\t\tlatestTimestamp: 'Use latest version',\n\t\t\tskip: 'Skip conflicts',\n\t\t\tdiffMatchPatchOrSkip: 'Smart merge, skip if unresolvable',\n\t\t},\n\t\tconfirmBeforeSync: {\n\t\t\tname: 'Confirm before sync',\n\t\t\tdesc: 'Show pending tasks and execute after confirmation',\n\t\t},\n\t\tconfirmBeforeDeleteInAutoSync: {\n\t\t\tname: 'Confirm before deleting files during auto-sync',\n\t\t\tdesc: 'Show a confirmation dialog when local files are about to be deleted during auto-sync, allowing you to choose to delete or re-upload them',\n\t\t},\n\t\trealtimeSync: {\n\t\t\tname: 'Real-time sync',\n\t\t\tdesc: 'Automatically sync changes as soon as files are modified',\n\t\t},\n\t\tsyncMode: {\n\t\t\tname: 'Sync mode',\n\t\t\tdesc: 'Choose between strict or loose sync mode. Loose mode is recommended for users with many files for faster syncing. In loose mode, files with the same name and equal size that have no sync record will be ignored.',\n\t\t\tstrict: 'Strict',\n\t\t\tloose: 'Loose',\n\t\t},\n\t\tstartupSyncDelay: {\n\t\t\tname: 'Auto-sync on startup',\n\t\t\tdesc: 'Set the number of seconds after startup to automatically perform a sync. Set to 0 to disable auto-sync on startup.',\n\t\t\tplaceholder: 'Enter seconds (e.g., 5, 0 to disable)',\n\t\t\tinvalidValue: 'Invalid value, reset to 0',\n\t\t\texceedsMax:\n\t\t\t\t'Value exceeds maximum limit of {{max}} seconds (1 day), automatically adjusted',\n\t\t},\n\t\tautoSyncInterval: {\n\t\t\tname: 'Auto-sync interval',\n\t\t\tdesc: 'Set the interval for automatic background synchronization (in minutes). Set to 0 to disable automatic sync.',\n\t\t\tplaceholder: 'Enter minutes (e.g., 5, 0 to disable)',\n\t\t\tinvalidValue: 'Invalid value, reset to 0',\n\t\t\texceedsMax:\n\t\t\t\t'Value exceeds maximum limit of {{max}} minutes (1 day), automatically adjusted',\n\t\t},\n\t\tsections: {\n\t\t\taccount: 'Account',\n\t\t\tcommon: 'General',\n\t\t\tfilters: 'Filter rules',\n\t\t\tai: 'AI',\n\t\t},\n\t\tai: {\n\t\t\tsaved: 'AI settings saved',\n\t\t\tnone: 'Not set',\n\t\t\tunnamedProvider: 'Unnamed provider',\n\t\t\tunnamedModel: 'Unnamed model',\n\t\t\tdefaultProvider: {\n\t\t\t\tname: 'Default provider',\n\t\t\t\tdesc: 'Optional provider selected for new chat sessions',\n\t\t\t},\n\t\t\tdefaultModel: {\n\t\t\t\tname: 'Default model',\n\t\t\t\tdesc: 'Optional model selected for new chat sessions',\n\t\t\t},\n\t\t\tproviders: {\n\t\t\t\tname: 'Providers',\n\t\t\t\tdesc: 'Manage available AI providers',\n\t\t\t\tsummary: '{{count}} provider(s) configured',\n\t\t\t\tmanage: 'Manage providers',\n\t\t\t\tadd: 'Add provider',\n\t\t\t\tdelete: 'Delete provider',\n\t\t\t\tempty: 'No provider configured yet.',\n\t\t\t\tnoBaseUrl: 'Base URL not set',\n\t\t\t\topenaiDefault: 'OpenAI default endpoint',\n\t\t\t\tpresetCustom: 'Custom (OpenAI Compatible)',\n\t\t\t},\n\t\t\tprovider: {\n\t\t\t\ttype: {\n\t\t\t\t\tname: 'Provider type',\n\t\t\t\t\tdesc: 'Runtime provider implementation',\n\t\t\t\t\topenai: 'OpenAI',\n\t\t\t\t\tinvalid: 'Unknown type: {{value}} (select a valid type)',\n\t\t\t\t},\n\t\t\t\tname: 'Provider name',\n\t\t\t\tdesc: 'Label shown in the chatbox',\n\t\t\t\tbaseUrl: {\n\t\t\t\t\tname: 'Base URL',\n\t\t\t\t\tdesc: 'Optional override, for example https://api.openai.com/v1',\n\t\t\t\t},\n\t\t\t\tapiKey: {\n\t\t\t\t\tname: 'API key',\n\t\t\t\t\tdesc: 'Secret used for requests',\n\t\t\t\t},\n\t\t\t\torganization: {\n\t\t\t\t\tname: 'Organization',\n\t\t\t\t\tdesc: 'Optional OpenAI organization ID',\n\t\t\t\t},\n\t\t\t\tproject: {\n\t\t\t\t\tname: 'Project',\n\t\t\t\t\tdesc: 'Optional OpenAI project ID',\n\t\t\t\t},\n\t\t\t},\n\t\t\tmodels: {\n\t\t\t\tname: 'Models',\n\t\t\t\tdesc: 'Models available under this provider',\n\t\t\t\tadd: 'Add model',\n\t\t\t\tdelete: 'Delete model',\n\t\t\t\tempty: 'No model configured yet.',\n\t\t\t},\n\t\t\tmodel: {\n\t\t\t\tid: 'Model ID',\n\t\t\t\tidDesc: 'Model identifier sent to the API (e.g. gpt-4o)',\n\t\t\t},\n\t\t\tmodals: {\n\t\t\t\tconfirmDelete: 'Click again to delete',\n\t\t\t\tconfirmDeleteLabel: 'Confirm',\n\t\t\t\tproviders: {\n\t\t\t\t\ttitle: 'Providers',\n\t\t\t\t},\n\t\t\t\tprovider: {\n\t\t\t\t\tcreateTitle: 'Create provider',\n\t\t\t\t\teditTitle: 'Edit provider',\n\t\t\t\t\tedit: 'Edit',\n\t\t\t\t\tsaved: 'Provider saved',\n\t\t\t\t\tdeleted: 'Provider deleted',\n\t\t\t\t},\n\t\t\t\tmodel: {\n\t\t\t\t\tcreateTitle: 'Create model',\n\t\t\t\t\teditTitle: 'Edit model',\n\t\t\t\t\tedit: 'Edit',\n\t\t\t\t\tsaved: 'Model saved',\n\t\t\t\t\tdeleted: 'Model deleted',\n\t\t\t\t},\n\t\t\t},\n\t\t\tyolo: {\n\t\t\t\tname: 'Full access',\n\t\t\t\tdesc: '⚠️ When enabled, AI can read and write vault files directly without user confirmation',\n\t\t\t},\n\t\t\terrors: {\n\t\t\t\tsaveFailed: 'Failed to save AI settings',\n\t\t\t\tsaveFailedWithReason: 'Failed to save AI settings: {{reason}}',\n\t\t\t\tinvalidProvidersConfig:\n\t\t\t\t\t'AI provider configuration is invalid. Please fix it in settings. Details: {{reason}}',\n\t\t\t\temptyModelId: 'Model ID cannot be empty',\n\t\t\t\tduplicateModelId: 'A model with this ID already exists',\n\t\t\t\temptyProviderId: 'Provider name cannot be empty',\n\t\t\t\tduplicateProviderId: 'A provider with this name already exists',\n\t\t\t},\n\t\t},\n\t\tlogout: {\n\t\t\tconfirmTitle: 'Confirm logout',\n\t\t\tconfirmMessage:\n\t\t\t\t'Are you sure you want to log out? You will need to log in again to continue syncing.',\n\t\t\tconfirm: 'Confirm logout',\n\t\t\tcancel: 'Cancel',\n\t\t},\n\t\thelp: {\n\t\t\tname: 'How to get WebDAV account and credential?',\n\t\t\tdesc: 'Click to view help documentation',\n\t\t},\n\t\tfilters: {\n\t\t\tname: 'Sync filters',\n\t\t\tdesc: 'Add paths to filter files or folders, e.g.: .DS_Store, .git',\n\t\t\tadd: 'Add rule',\n\t\t\tremove: 'Remove',\n\t\t\tconfirmRemove: 'Confirm remove',\n\t\t\tedit: 'Edit rules',\n\t\t\tsave: 'Save',\n\t\t\tcancel: 'Cancel',\n\t\t\tplaceholder: 'e.g.: .DS_Store, *.pdf',\n\t\t\tdescription:\n\t\t\t\t'Files or folders matching these patterns will be ignored during sync. Use * for wildcard matching.',\n\t\t\texclude: {\n\t\t\t\tname: 'Exclusion rules',\n\t\t\t\tdesc: 'Files/folders matching these patterns will NOT be synced.',\n\t\t\t},\n\t\t\tinclude: {\n\t\t\t\tname: 'Inclusion rules',\n\t\t\t\tdesc: 'Files/folders matching these patterns WILL be synced (if defined).',\n\t\t\t},\n\t\t},\n\t\tconfigDirSync: {\n\t\t\tname: 'Config directory sync',\n\t\t\tdesc: 'Control whether {{configDir}} is included in sync.',\n\t\t\tnone: 'Do not sync',\n\t\t\tbookmarks: 'Sync bookmarks only',\n\t\t\tall: 'Sync all (experimental)',\n\t\t\tbookmarksTitle: 'Enable bookmark sync',\n\t\t\tbookmarksDesc:\n\t\t\t\t'Only {{configDir}}/bookmarks.json will be synced. Other config files are not affected.',\n\t\t\twarnTitle: 'Enable full config directory sync?',\n\t\t\twarnSyncs:\n\t\t\t\t'What syncs: plugin settings (data.json), plugin binaries (main.js), themes, snippets, and all other config files.',\n\t\t\twarnExcludes:\n\t\t\t\t'Auto-excluded: {{configDir}}/plugins/**/node_modules, {{configDir}}/plugins/**/.git, and {{configDir}}/plugins/**/.pnpm-store.',\n\t\t\twarnConflict:\n\t\t\t\t'Conflict resolution: when both sides have changes, the more recently modified version wins and the other side is overwritten.',\n\t\t\twarnRisk:\n\t\t\t\t'Risks: running Obsidian on multiple devices simultaneously increases conflict risk; config changes may require restarting Obsidian to take effect.',\n\t\t\tconfirm: 'Enable',\n\t\t\tcancel: 'Cancel',\n\t\t},\n\t\tskipLargeFiles: {\n\t\t\tname: 'Skip large files',\n\t\t\tdesc: 'Files exceeding this size will be skipped during synchronization. If sync issues occur, try lowering this value.',\n\t\t\tplaceholder: 'e.g., 10 MiB or 500 KiB',\n\t\t\tinvalidFormat:\n\t\t\t\t'Invalid file size format. Please use formats like \"10MB\" or \"500KB\"',\n\t\t\texceedsMaxSize: 'File size exceeds maximum limit of 500MB',\n\t\t},\n\t\tlog: {\n\t\t\ttitle: 'Debug logs',\n\t\t\tname: 'Console logs',\n\t\t\tdesc: 'View console output and debug information',\n\t\t\tbutton: 'View logs',\n\t\t\tsaveToNote: 'Save to note',\n\t\t\tsavedToNote: 'Logs saved to note: {{fileName}}',\n\t\t\tsaveError: 'Failed to save logs',\n\t\t\tclear: 'Clear',\n\t\t\tcleared: 'Console logs cleared',\n\t\t\tclearName: 'Clear logs',\n\t\t\tclearDesc: 'Delete all console output records',\n\t\t},\n\t\tcache: {\n\t\t\ttitle: 'Cache management',\n\t\t\tdump: 'Export',\n\t\t\tdumpName: 'Cache management',\n\t\t\tdumpDesc:\n\t\t\t\t'The plugin stores remote folder information locally. When switching devices, this data is lost and must be rebuilt before syncing. With many files, rebuilding can be slow due to rate limits. Export saves this data to Nutstore; Import retrieves it, allowing immediate syncing on new devices.',\n\t\t\trestoreName: 'Import cache',\n\t\t\trestoreDesc:\n\t\t\t\t'Import previously exported cache data from Nutstore to your device. This lets you sync immediately on a new device without the long waiting time normally needed to scan all your files.',\n\t\t\trestore: 'Import',\n\t\t\tclearName: 'Clear local cache',\n\t\t\tclearDesc:\n\t\t\t\t'Delete local cache data stored on this device only. This action cannot be undone and will require rebuilding the cache before the next sync. Your Nutstore data remains intact.',\n\t\t\tclear: 'Clear',\n\t\t\tconfirm: 'Confirm clear',\n\t\t\tcleared: 'Cache cleared successfully',\n\t\t\tclearModal: {\n\t\t\t\ttitle: 'Clear cache',\n\t\t\t\tdescription:\n\t\t\t\t\t'Select which cache types to clear. This action cannot be undone.',\n\t\t\t\tcancel: 'Cancel',\n\t\t\t\tconfirm: 'Confirm clear',\n\t\t\t\tdeltaCache: {\n\t\t\t\t\tname: 'Delta cache',\n\t\t\t\t\tdesc: 'Stores information about incremental file changes.',\n\t\t\t\t},\n\t\t\t\tsyncRecordCache: {\n\t\t\t\t\tname: 'Sync record cache',\n\t\t\t\t\tdesc: 'Tracks synchronization status for each file.',\n\t\t\t\t},\n\t\t\t\tblobCache: {\n\t\t\t\t\tname: 'File snapshot cache',\n\t\t\t\t\tdesc: 'Stores file snapshots needed for comparing changes during sync.',\n\t\t\t\t},\n\t\t\t\ttraverseWebDAVCache: {\n\t\t\t\t\tname: 'File scan cache',\n\t\t\t\t\tdesc: 'Stores remote folder structure to enable faster sync by fetching only changes. If you encounter file list anomalies or data inconsistencies after a plugin update, try clearing this cache. After clearing, the next sync will need to re-scan all remote files, which may take a while.',\n\t\t\t\t},\n\t\t\t\tclearedType: 'Cleared: {{types}}',\n\t\t\t\tnothingSelected: 'Please select at least one cache type to clear.',\n\t\t\t},\n\t\t\texportSuccess: 'Cache saved to plugin data file successfully',\n\t\t\texportError: 'Error saving cache: {{message}}',\n\t\t\tnoDataToRestore: 'No saved cache data found',\n\t\t\trestoreSuccess: 'Cache restored successfully',\n\t\t\trestoreError: 'Error restoring cache: {{message}}',\n\t\t\tremoteCacheDir: {\n\t\t\t\tname: 'Remote cache directory',\n\t\t\t\tdesc: 'Enter the remote directory for cache storage',\n\t\t\t\tplaceholder: 'Enter the remote cache directory',\n\t\t\t\tedit: 'Edit',\n\t\t\t},\n\t\t\tsaveModal: {\n\t\t\t\ttitle: 'Save cache',\n\t\t\t\tdescription:\n\t\t\t\t\t'Enter a filename to save the current cache state. The file will be saved in the remote cache directory.',\n\t\t\t\tfilename: 'Filename',\n\t\t\t\tsave: 'Save',\n\t\t\t\tcancel: 'Cancel',\n\t\t\t\tsuccess: 'Cache saved successfully',\n\t\t\t\terror: 'Error saving cache: {{message}}',\n\t\t\t},\n\t\t\trestoreModal: {\n\t\t\t\ttitle: 'Restore cache',\n\t\t\t\tdescription: 'Select a cache file to restore from or delete.',\n\t\t\t\trestore: 'Restore',\n\t\t\t\tdelete: 'Delete',\n\t\t\t\tdeleteConfirm: 'Confirm delete',\n\t\t\t\tclose: 'Close',\n\t\t\t\trefresh: 'Refresh',\n\t\t\t\tnoFiles: 'No cache files found',\n\t\t\t\tfileNotFound: 'Cache file not found',\n\t\t\t\tsuccess: 'Cache restored successfully',\n\t\t\t\terror: 'Error restoring cache: {{message}}',\n\t\t\t\tloadError: 'Error loading file list: {{message}}',\n\t\t\t\tdeleteSuccess: 'Cache file deleted successfully',\n\t\t\t\tdeleteError: 'Error deleting cache file: {{message}}',\n\t\t\t},\n\t\t},\n\t},\n\taiPermission: {\n\t\ttitle: 'AI Permission Request',\n\t\tmessage: 'AI is requesting to perform the following file operations:',\n\t\tsessionScopeHint:\n\t\t\t'\"Auto-approve this operation\" only applies to this chat session and resets after restarting Obsidian.',\n\t\tallowOnce: 'Approve',\n\t\talwaysAllow: 'Auto-approve this operation',\n\t\tdeny: 'Deny',\n\t\tdenied: 'Permission denied: {{summary}}',\n\t\tsource: 'Source',\n\t\tdestination: 'Destination',\n\t\toperations: {\n\t\t\tread: 'read',\n\t\t\twrite: 'write',\n\t\t\tedit: 'edit',\n\t\t\tdelete: 'delete',\n\t\t\tmkdir: 'create directory',\n\t\t\tcopy: 'copy',\n\t\t\tmove: 'move',\n\t\t},\n\t},\n\tsync: {\n\t\tfailed: 'Sync failed!',\n\t\terror: {\n\t\t\tfolderButFile: 'Expected folder but found file: {{path}}',\n\t\t\tnotFound: 'Not found: {{path}}',\n\t\t\tlocalPathNotFound: 'Local path not found: {{path}}',\n\t\t\tmergeNotSupported:\n\t\t\t\t'This file type is currently not supported for merging',\n\t\t\tfailedToAutoMerge: 'Failed to auto merge',\n\t\t\tfailedToUploadMerged: 'Failed to upload merged content',\n\t\t\tconflictsMarkedInFile: 'Conflicts found and marked in file',\n\t\t\trequestsTooFrequent:\n\t\t\t\t'Requests too frequent, please wait a few minutes and try again',\n\t\t\taccountNotConfigured:\n\t\t\t\t'Nutstore account not configured. Please configure your account in settings first.',\n\t\t},\n\t\trequestsTooFrequent:\n\t\t\t'Requests too frequent, plugin will resume sync at {{time}}',\n\t\tpreparing: '📋 Preparing sync',\n\t\tstart: '⌛️ Starting sync',\n\t\tcomplete: '✅ Sync completed',\n\t\tcompleteWithFailed: '❌ Sync completed with {{failedCount}} failed tasks',\n\t\tfailedWithError: 'Sync failed with error: {{error}}',\n\t\tprogress: 'Sync progress: {{percent}}%',\n\t\tstartButton: 'Start sync',\n\t\tstopButton: 'Stop sync',\n\t\thideButton: 'Hide',\n\t\tcloseButton: 'Close',\n\t\tshowProgressButton: 'Show sync progress',\n\t\tnotSyncing: 'No sync currently in progress',\n\t\tpercentComplete: '{{percent}}%',\n\t\tcurrentFile: '{{path}}',\n\t\tfilePath: '{{path}}',\n\t\tprogressTitle: 'Sync progress',\n\t\tprogressStats: 'Completed: {{completed}} / {{total}} tasks',\n\t\tcompletedFilesTitle: 'Completed tasks',\n\t\tsyncingFiles: 'Syncing files...',\n\t\tupdatingCache: 'Updating local cache...',\n\t\tcacheUpdated: 'Local cache updated.',\n\t\tfailedStatus: 'Sync failed',\n\t\tcancelled: 'Sync cancelled',\n\t\tsuggestUseClientForManyTasks:\n\t\t\t'Tip: When there are many sync tasks, we recommend using the Nutstore client for better performance and stability. The plugin is more suitable for mobile use!',\n\t\tmodalTitle: 'Syncing',\n\t\tcancelButton: 'Cancel sync',\n\t\tprogressText: 'Syncing files',\n\t\tfileOp: {\n\t\t\tcreateLocalDir: 'Create local directory',\n\t\t\tcreateRemoteDir: 'Create remote directory',\n\t\t\tcreateRemoteDirs: 'Create multi-level directories',\n\t\t\tdownload: 'Download',\n\t\t\tfilenameError: 'Invalid path characters',\n\t\t\tmerge: 'Merge',\n\t\t\tremoveLocal: 'Remove local',\n\t\t\tremoveRemote: 'Remove remote',\n\t\t\tremoveRemoteRecursively: 'Remove remote recursively',\n\t\t\trename: 'Rename',\n\t\t\tsync: 'Sync',\n\t\t\tupload: 'Upload',\n\t\t\tnoop: 'Skip',\n\t\t\tcleanRecord: 'Clean record',\n\t\t\tskip: 'Skip',\n\t\t},\n\t\tskipReason: {\n\t\t\t'file-too-large': 'File too large',\n\t\t\t'folder-contains-ignored-items': 'Folder contains ignored items',\n\t\t},\n\t\tconfirmModal: {\n\t\t\ttitle: 'Sync confirmation',\n\t\t\tmessage:\n\t\t\t\t'⚠️ Please note:\\n\\n1. Sync operation may modify or delete local files\\n2. We recommend backing up important files before syncing\\n3. In case of file conflicts, manual resolution may be required\\n4. Initial sync will process all files and may take longer, please be patient\\n\\nAre you sure you want to start syncing?',\n\t\t\tconfirm: 'Confirm sync',\n\t\t\tcancel: 'Cancel',\n\t\t\tremoteDir: 'Remote directory: {{dir}}',\n\t\t\tstrategy: 'Sync strategy: {{strategy}}',\n\t\t},\n\t},\n\ttaskList: {\n\t\ttitle: 'Sync task list',\n\t\tinstruction:\n\t\t\t'Please review the tasks below. Click \"Continue\" to execute the selected tasks, or \"Cancel\" to skip this sync.',\n\t\texecute: 'Execute',\n\t\taction: 'Action',\n\t\tlocalPath: 'Local path',\n\t\tremotePath: 'Remote path',\n\t\tcontinue: 'Continue',\n\t\tcancel: 'Cancel',\n\t},\n\tdeleteConfirm: {\n\t\ttitle: 'Confirm local file deletion',\n\t\tinstruction:\n\t\t\t'⚠️ The following local files will be deleted during auto-sync (because they were deleted remotely).\\n\\nCheck files to delete; unchecked files will be re-uploaded:',\n\t\twarningNotice: 'Local files will be deleted, please confirm',\n\t\tselect: 'Select',\n\t\tfilePath: 'File path',\n\t\tdeleteAndReupload: 'Delete selected, re-upload unchecked',\n\t\tskipForNow: 'Skip for now',\n\t},\n\tfailedTasks: {\n\t\ttitle: 'Failed sync tasks',\n\t\tinstruction: 'The following tasks failed during sync:',\n\t\ttaskName: 'Task',\n\t\tlocalPath: 'Local path',\n\t\terrorMessage: 'Error',\n\t\tclose: 'Close',\n\t},\n\ttextAreaModal: {\n\t\tcopy: 'Copy',\n\t\tclose: 'Close',\n\t\tcopied: 'Text copied to clipboard',\n\t},\n\ttime: {\n\t\tjustNow: 'just now',\n\t\tminutesAgo: '{{count}}min ago',\n\t\thoursAgo: '{{count}}h ago',\n\t\tdaysAgo: '{{count}}d ago',\n\t\tlongAgo: 'long ago',\n\t},\n\tchatbox: {\n\t\ttitle: 'Chatbox',\n\t\topenCommand: 'Open chatbox',\n\t\tnewChat: 'New chat',\n\t\tsessionDeleted: 'Session deleted',\n\t\trepeatedToolCallsStopped:\n\t\t\t'The agent repeated the same tool call with the same arguments {{count}} times in a row and was stopped.',\n\t\ttask: {\n\t\t\tcancelledSummary: 'Task {{task}} was cancelled.',\n\t\t\temptyResult: 'Task completed but returned no summary.',\n\t\t},\n\t\trequestFailed: 'Request failed',\n\t\terrors: {\n\t\t\tnoProvider: 'Select a provider before sending',\n\t\t\tbaseUrlRequired: 'The selected provider is missing a base URL',\n\t\t\tapiKeyRequired: 'The selected provider is missing an API key',\n\t\t\tnoModel: 'Select a model before sending',\n\t\t\tnoChoices: 'Provider returned no choices',\n\t\t\tunknownTool: 'Unknown tool: {{name}}',\n\t\t\ttoolFieldRequired: '{{field}} is required',\n\t\t\tinvalidPositiveInteger:\n\t\t\t\t'{{field}} must be an integer greater than or equal to 1',\n\t\t\tfolderNotFound: 'Folder not found: {{path}}',\n\t\t\tnotFolder: 'Path is not a folder: {{path}}',\n\t\t\tfileNotFound: 'File not found: {{path}}',\n\t\t\tnotFile: 'Path is not a file: {{path}}',\n\t\t\tfileExists:\n\t\t\t\t'File already exists: {{path}}. Set overwrite to true to replace it.',\n\t\t\tparentPathNotFolder: 'Parent path is not a folder: {{path}}',\n\t\t\teditMatchNotFound: 'Exact text to replace was not found in the file.',\n\t\t\teditMatchNotUnique:\n\t\t\t\t'Exact text to replace must match exactly once in the file.',\n\t\t\tinvalidRegex: 'Invalid regex in pattern {{index}}: {{pattern}}',\n\t\t\tsessionNotFound: 'The target session no longer exists',\n\t\t\ttaskDepthExceeded: 'The task depth limit has been reached',\n\t\t\ttaskConcurrencyLimit:\n\t\t\t\t'Too many background tasks are already running in this session. Limit: {{limit}}',\n\t\t\ttaskSessionUnavailable:\n\t\t\t\t'The task session or model configuration is no longer available',\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "src/i18n/locales/zh.ts",
    "content": "export default {\n\terrors: {\n\t\tfilenameUnsupportedChars: '文件 {{path}} 包含不支持的字符：{{chars}}',\n\t},\n\tsettings: {\n\t\ttitle: 'WebDAV 设置',\n\t\tlanguage: {\n\t\t\tname: '语言',\n\t\t\tdesc: '选择界面语言',\n\t\t\tauto: '自动检测',\n\t\t},\n\t\taccount: {\n\t\t\tname: '账号',\n\t\t\tdesc: '输入你的 WebDAV 账号',\n\t\t\tplaceholder: '输入你的账号',\n\t\t},\n\t\tcredential: {\n\t\t\tname: '凭证',\n\t\t\tdesc: '输入你的 WebDAV 凭证',\n\t\t\tplaceholder: '输入你的凭证',\n\t\t},\n\t\tremoteDir: {\n\t\t\tname: '远程目录',\n\t\t\tdesc: '输入远程目录',\n\t\t\tplaceholder: '输入远程目录',\n\t\t\tedit: '编辑',\n\t\t},\n\t\tcheckConnection: {\n\t\t\tname: '检查连接',\n\t\t\tdesc: '点击检查 WebDAV 连接',\n\t\t\tsuccess: 'WebDAV 连接成功',\n\t\t\tfailure: 'WebDAV 连接失败',\n\t\t\tsuccessButton: '连接成功 ✓',\n\t\t\tfailureButton: '连接失败 ×',\n\t\t},\n\t\tlogin: {\n\t\t\tname: '登录',\n\t\t\tdesc: '点击登录',\n\t\t\tsuccess: '登录成功',\n\t\t\tfailure: '登录失败，请重试',\n\t\t},\n\t\tuseGitStyle: {\n\t\t\tname: '使用 Git 样式的冲突标记',\n\t\t\tdesc: '启用后将使用 <<<<<<< 和 >>>>>>> 等标记来显示冲突，而不是 HTML 标记',\n\t\t},\n\t\tbackupWarning: {\n\t\t\tname: '备份提醒',\n\t\t\tdesc: '⚠️ 请注意：同步过程会修改或删除本地文件，建议在同步前备份重要文件。',\n\t\t},\n\t\tconflictStrategy: {\n\t\t\tname: '冲突解决策略',\n\t\t\tdesc: '选择解决文件冲突的方式。\\n注意：建议在使用自动合并功能前，先手动备份重要文件，以防数据丢失。',\n\t\t\tdiffMatchPatch: '智能合并（推荐）',\n\t\t\tlatestTimestamp: '使用最新版本',\n\t\t\tskip: '跳过冲突',\n\t\t\tdiffMatchPatchOrSkip: '智能合并，无法合并时跳过',\n\t\t},\n\t\tloginMode: {\n\t\t\tname: '登录方式',\n\t\t\tmanual: '手动输入',\n\t\t\tsso: '单点登录',\n\t\t},\n\t\tssoStatus: {\n\t\t\tloggedIn: '已登录',\n\t\t\tnotLoggedIn: '未登录',\n\t\t\tlogout: '退出登录',\n\t\t\tlogoutSuccess: '已退出登录',\n\t\t},\n\t\tlogout: {\n\t\t\tconfirmTitle: '确认退出',\n\t\t\tconfirmMessage: '确定要退出登录吗？退出后需要重新登录才能继续同步。',\n\t\t\tconfirm: '确认退出',\n\t\t\tcancel: '取消',\n\t\t},\n\t\thelp: {\n\t\t\tname: '如何获取 WebDAV 账号和凭证？',\n\t\t\tdesc: '点击查看帮助文档',\n\t\t},\n\t\tsections: {\n\t\t\taccount: '账号设置',\n\t\t\tcommon: '通用设置',\n\t\t\tfilters: '过滤规则',\n\t\t\tai: 'AI 设置',\n\t\t},\n\t\tai: {\n\t\t\tsaved: 'AI 设置已保存',\n\t\t\tnone: '未设置',\n\t\t\tunnamedProvider: '未命名 Provider',\n\t\t\tunnamedModel: '未命名 Model',\n\t\t\tdefaultProvider: {\n\t\t\t\tname: '默认 Provider',\n\t\t\t\tdesc: '新建对话时可选的默认 Provider',\n\t\t\t},\n\t\t\tdefaultModel: {\n\t\t\t\tname: '默认 Model',\n\t\t\t\tdesc: '新建对话时可选的默认 Model',\n\t\t\t},\n\t\t\tproviders: {\n\t\t\t\tname: 'Providers',\n\t\t\t\tdesc: '管理可用的 AI Provider',\n\t\t\t\tsummary: '已配置 {{count}} 个 Provider',\n\t\t\t\tmanage: '管理 Providers',\n\t\t\t\tadd: '新增 Provider',\n\t\t\t\tdelete: '删除 Provider',\n\t\t\t\tempty: '当前还没有配置 Provider。',\n\t\t\t\tnoBaseUrl: '尚未设置 Base URL',\n\t\t\t\topenaiDefault: '使用 OpenAI 默认端点',\n\t\t\t\tpresetCustom: '自定义（OpenAI Compatible）',\n\t\t\t},\n\t\t\tprovider: {\n\t\t\t\ttype: {\n\t\t\t\t\tname: 'Provider 类型',\n\t\t\t\t\tdesc: '底层运行时 Provider',\n\t\t\t\t\topenai: 'OpenAI',\n\t\t\t\t\tinvalid: '未知类型：{{value}}（请选择合法类型）',\n\t\t\t\t},\n\t\t\t\tname: 'Provider 名称',\n\t\t\t\tdesc: '用于在 Chatbox 中显示的名称',\n\t\t\t\tbaseUrl: {\n\t\t\t\t\tname: 'Base URL',\n\t\t\t\t\tdesc: '可选覆盖，例如 https://api.openai.com/v1',\n\t\t\t\t},\n\t\t\t\tapiKey: {\n\t\t\t\t\tname: 'API Key',\n\t\t\t\t\tdesc: '发送请求时使用的密钥',\n\t\t\t\t},\n\t\t\t\torganization: {\n\t\t\t\t\tname: 'Organization',\n\t\t\t\t\tdesc: '可选的 OpenAI organization ID',\n\t\t\t\t},\n\t\t\t\tproject: {\n\t\t\t\t\tname: 'Project',\n\t\t\t\t\tdesc: '可选的 OpenAI project ID',\n\t\t\t\t},\n\t\t\t},\n\t\t\tmodels: {\n\t\t\t\tname: 'Models',\n\t\t\t\tdesc: '在当前 Provider 下可用的模型',\n\t\t\t\tadd: '新增 Model',\n\t\t\t\tdelete: '删除 Model',\n\t\t\t\tempty: '当前 Provider 下还没有 Model。',\n\t\t\t},\n\t\t\tmodel: {\n\t\t\t\tid: 'Model ID',\n\t\t\t\tidDesc: '请求 API 时使用的模型标识（如 gpt-4o）',\n\t\t\t},\n\t\t\tmodals: {\n\t\t\t\tconfirmDelete: '再次点击以删除',\n\t\t\t\tconfirmDeleteLabel: '确认',\n\t\t\t\tproviders: {\n\t\t\t\t\ttitle: 'Providers 管理',\n\t\t\t\t},\n\t\t\t\tprovider: {\n\t\t\t\t\tcreateTitle: '新建 Provider',\n\t\t\t\t\teditTitle: '编辑 Provider',\n\t\t\t\t\tedit: '编辑',\n\t\t\t\t\tsaved: 'Provider 已保存',\n\t\t\t\t\tdeleted: 'Provider 已删除',\n\t\t\t\t},\n\t\t\t\tmodel: {\n\t\t\t\t\tcreateTitle: '新建 Model',\n\t\t\t\t\teditTitle: '编辑 Model',\n\t\t\t\t\tedit: '编辑',\n\t\t\t\t\tsaved: 'Model 已保存',\n\t\t\t\t\tdeleted: 'Model 已删除',\n\t\t\t\t},\n\t\t\t},\n\t\t\tyolo: {\n\t\t\t\tname: '完全访问权限',\n\t\t\t\tdesc: '⚠️ 开启后，AI 可直接读写笔记库中的文件，无需用户确认',\n\t\t\t},\n\t\t\terrors: {\n\t\t\t\tsaveFailed: 'AI 设置保存失败',\n\t\t\t\tsaveFailedWithReason: 'AI 设置保存失败：{{reason}}',\n\t\t\t\tinvalidProvidersConfig:\n\t\t\t\t\t'AI Provider 配置无效，请在设置中修正。详情：{{reason}}',\n\t\t\t\temptyModelId: 'Model ID 不能为空',\n\t\t\t\tduplicateModelId: '已存在相同 ID 的 Model',\n\t\t\t\temptyProviderId: 'Provider 名称不能为空',\n\t\t\t\tduplicateProviderId: '已存在相同名称的 Provider',\n\t\t\t},\n\t\t},\n\t\tconfirmBeforeSync: {\n\t\t\tname: '同步前确认',\n\t\t\tdesc: '同步前显示待执行的任务列表，确认后再执行',\n\t\t},\n\t\tconfirmBeforeDeleteInAutoSync: {\n\t\t\tname: '自动同步时删除文件前确认',\n\t\t\tdesc: '自动同步过程中检测到本地文件将被删除时，弹出确认对话框让你选择删除或重新上传',\n\t\t},\n\t\trealtimeSync: {\n\t\t\tname: '实时同步',\n\t\t\tdesc: '文件修改后自动进行同步',\n\t\t},\n\t\tsyncMode: {\n\t\t\tname: '同步模式',\n\t\t\tdesc: '建议在文件较多的情况下选择宽松模式，同步速度更快。宽松模式会忽略同名且大小相等但没有同步记录的文件。',\n\t\t\tstrict: '严格',\n\t\t\tloose: '宽松',\n\t\t},\n\t\tstartupSyncDelay: {\n\t\t\tname: '启动后自动同步',\n\t\t\tdesc: '设置启动后第几秒自动执行一次同步。设置为 0 则禁用启动时自动同步。',\n\t\t\tplaceholder: '输入秒数 (例如 5, 0 则禁用)',\n\t\t\tinvalidValue: '无效的数值，已重置为 0',\n\t\t\texceedsMax: '数值超过最大限制 {{max}} 秒（1天），已自动调整',\n\t\t},\n\t\tautoSyncInterval: {\n\t\t\tname: '定时自动同步',\n\t\t\tdesc: '设置每隔多长时间在后台自动执行一次同步（分钟）。设置为 0 则禁用定时自动同步。',\n\t\t\tplaceholder: '输入分钟数 (例如 5, 0 则禁用)',\n\t\t\tinvalidValue: '无效的数值，已重置为 0',\n\t\t\texceedsMax: '数值超过最大限制 {{max}} 分钟（1天），已自动调整',\n\t\t},\n\t\tfilters: {\n\t\t\tname: '过滤器',\n\t\t\tdesc: '添加同步时需要忽略文件或文件夹路径，例如: .DS_Store, .git',\n\t\t\tadd: '添加规则',\n\t\t\tremove: '删除',\n\t\t\tconfirmRemove: '确认删除',\n\t\t\tedit: '编辑规则',\n\t\t\tsave: '保存',\n\t\t\tcancel: '取消',\n\t\t\tplaceholder: '例如: .DS_Store, *.pdf',\n\t\t\tdescription:\n\t\t\t\t'符合这些规则的文件或文件夹在同步时会被忽略。使用 * 作为通配符。',\n\t\t\texclude: {\n\t\t\t\tname: '排除规则',\n\t\t\t\tdesc: '符合规则的文件/文件夹将不会被同步',\n\t\t\t},\n\t\t\tinclude: {\n\t\t\t\tname: '包含规则',\n\t\t\t\tdesc: '符合规则的文件/文件夹会被同步，如果和排除规则有冲突，会优先选择包含规则。',\n\t\t\t},\n\t\t},\n\t\tconfigDirSync: {\n\t\t\tname: '配置目录同步',\n\t\t\tdesc: '控制 {{configDir}} 目录是否参与同步。',\n\t\t\tnone: '不同步',\n\t\t\tbookmarks: '仅同步书签',\n\t\t\tall: '同步全部（实验性）',\n\t\t\tbookmarksTitle: '启用书签同步',\n\t\t\tbookmarksDesc:\n\t\t\t\t'仅同步 {{configDir}}/bookmarks.json，其他配置文件不受影响。',\n\t\t\twarnTitle: '启用完整配置目录同步？',\n\t\t\twarnSyncs:\n\t\t\t\t'同步内容：插件设置（data.json）、插件二进制（main.js）、主题、代码片段等所有配置文件。',\n\t\t\twarnExcludes:\n\t\t\t\t'自动排除：{{configDir}}/plugins/**/node_modules、{{configDir}}/plugins/**/.git 和 {{configDir}}/plugins/**/.pnpm-store。',\n\t\t\twarnConflict:\n\t\t\t\t'冲突处理：两端同一文件均有修改时，保留修改时间较新的版本，另一端的修改将被覆盖。',\n\t\t\twarnRisk:\n\t\t\t\t'风险：多台设备同时运行 Obsidian 容易引发冲突；插件设置变更后可能需要重启 Obsidian 才能生效。',\n\t\t\tconfirm: '启用',\n\t\t\tcancel: '取消',\n\t\t},\n\t\tskipLargeFiles: {\n\t\t\tname: '跳过大文件',\n\t\t\tdesc: '同步时将跳过超过此大小的文件。如遇同步崩溃，可尝试降低此值。',\n\t\t\tplaceholder: '例如：10 MiB 或 500 KiB',\n\t\t\tinvalidFormat: '无效的文件大小格式，请使用如 \"10MB\" 或 \"500KB\" 的格式',\n\t\t\texceedsMaxSize: '文件大小超过最大限制 500MB',\n\t\t},\n\t\tlog: {\n\t\t\ttitle: '调试日志',\n\t\t\tname: '控制台日志',\n\t\t\tdesc: '查看控制台输出和调试信息',\n\t\t\tbutton: '查看',\n\t\t\tsaveToNote: '保存到笔记',\n\t\t\tsavedToNote: '日志已保存到笔记: {{fileName}}',\n\t\t\tsaveError: '保存日志失败',\n\t\t\tclear: '清除',\n\t\t\tcleared: '控制台日志已清除',\n\t\t\tclearName: '清除日志',\n\t\t\tclearDesc: '删除所有控制台输出记录',\n\t\t},\n\t\tcache: {\n\t\t\ttitle: '缓存管理',\n\t\t\tdumpName: '缓存管理',\n\t\t\tdumpDesc:\n\t\t\t\t'插件会在您的设备上保存远程文件夹的目录信息。当您更换设备时，这些信息会丢失，需要在首次同步前重新获取。如果您的文件数量较多，可能会触发坚果云的访问频率限制，导致获取过程变慢。导出功能可将这些信息保存到坚果云，导入功能则可将数据恢复到新设备，使您无需等待即可直接同步。',\n\t\t\tdump: '导出',\n\t\t\trestoreName: '导入缓存',\n\t\t\trestoreDesc:\n\t\t\t\t'从坚果云导入之前导出的缓存数据到当前设备。这样可以避免在新设备上等待漫长的文件扫描过程，让您直接进行同步。',\n\t\t\trestore: '导入',\n\t\t\tclearName: '清除本地缓存',\n\t\t\tclearDesc:\n\t\t\t\t'删除当前设备上的本地缓存数据。此操作无法撤销，会导致下次同步前需要重新建立缓存。仅影响当前设备，不会影响您在坚果云中的数据。',\n\t\t\tclear: '清除',\n\t\t\tconfirm: '确认清除',\n\t\t\tcleared: '缓存已成功清除',\n\t\t\tclearModal: {\n\t\t\t\ttitle: '清除缓存',\n\t\t\t\tdescription: '选择需要清除的缓存类型。此操作无法撤销。',\n\t\t\t\tcancel: '取消',\n\t\t\t\tconfirm: '确认清除',\n\t\t\t\tdeltaCache: {\n\t\t\t\t\tname: '增量同步缓存',\n\t\t\t\t\tdesc: '存储文件增量变化的相关信息。',\n\t\t\t\t},\n\t\t\t\tsyncRecordCache: {\n\t\t\t\t\tname: '同步记录缓存',\n\t\t\t\t\tdesc: '跟踪每个文件的同步状态。',\n\t\t\t\t},\n\t\t\t\tblobCache: {\n\t\t\t\t\tname: '文件快照缓存',\n\t\t\t\t\tdesc: '存储用于同步时对比变化的文件快照。',\n\t\t\t\t},\n\t\t\t\ttraverseWebDAVCache: {\n\t\t\t\t\tname: '文件扫描缓存',\n\t\t\t\t\tdesc: '存储远程文件夹结构，下次同步时只需获取变化的部分，加快同步速度。如果插件更新后同步出现文件列表异常或数据不一致，可尝试清除此缓存。清除后下次同步需要重新扫描所有远程文件，可能需要较长时间。',\n\t\t\t\t},\n\t\t\t\tclearedType: '已清除: {{types}}',\n\t\t\t\tnothingSelected: '请至少选择一种缓存类型进行清除。',\n\t\t\t},\n\t\t\texportSuccess: '缓存已成功保存到插件数据文件',\n\t\t\texportError: '保存缓存出错: {{message}}',\n\t\t\tnoDataToRestore: '未找到已保存的缓存数据',\n\t\t\trestoreSuccess: '缓存恢复成功',\n\t\t\trestoreError: '恢复缓存出错: {{message}}',\n\t\t\tremoteCacheDir: {\n\t\t\t\tname: '远程缓存目录',\n\t\t\t\tdesc: '输入用于存储缓存的远程目录',\n\t\t\t\tplaceholder: '输入远程缓存目录',\n\t\t\t\tedit: '编辑',\n\t\t\t},\n\t\t\tsaveModal: {\n\t\t\t\ttitle: '保存缓存',\n\t\t\t\tdescription:\n\t\t\t\t\t'输入文件名以保存当前缓存状态。文件将保存在远程缓存目录中。',\n\t\t\t\tfilename: '文件名',\n\t\t\t\tsave: '保存',\n\t\t\t\tcancel: '取消',\n\t\t\t\tsuccess: '缓存保存成功',\n\t\t\t\terror: '保存缓存出错: {{message}}',\n\t\t\t},\n\t\t\trestoreModal: {\n\t\t\t\ttitle: '恢复缓存',\n\t\t\t\tdescription: '选择要恢复或删除的缓存文件。',\n\t\t\t\trestore: '恢复',\n\t\t\t\tdelete: '删除',\n\t\t\t\tdeleteConfirm: '确认删除',\n\t\t\t\tclose: '关闭',\n\t\t\t\trefresh: '刷新',\n\t\t\t\tnoFiles: '未找到缓存文件',\n\t\t\t\tfileNotFound: '未找到缓存文件',\n\t\t\t\tsuccess: '缓存恢复成功',\n\t\t\t\terror: '恢复缓存出错: {{message}}',\n\t\t\t\tloadError: '加载文件列表出错: {{message}}',\n\t\t\t\tdeleteSuccess: '缓存文件删除成功',\n\t\t\t\tdeleteError: '删除缓存文件出错: {{message}}',\n\t\t\t},\n\t\t},\n\t},\n\taiPermission: {\n\t\ttitle: 'AI 权限请求',\n\t\tmessage: 'AI 正在请求执行以下文件操作：',\n\t\tsessionScopeHint:\n\t\t\t'“自动同意该操作”仅在当前会话生效，重启 Obsidian 后将恢复询问。',\n\t\tallowOnce: '同意',\n\t\talwaysAllow: '自动同意该操作',\n\t\tdeny: '拒绝',\n\t\tdenied: '操作已拒绝：{{summary}}',\n\t\tsource: '源路径',\n\t\tdestination: '目标路径',\n\t\toperations: {\n\t\t\tread: '读取',\n\t\t\twrite: '写入',\n\t\t\tedit: '编辑',\n\t\t\tdelete: '删除',\n\t\t\tmkdir: '创建目录',\n\t\t\tcopy: '复制',\n\t\t\tmove: '移动',\n\t\t},\n\t},\n\tsync: {\n\t\tfailed: '同步失败!',\n\t\terror: {\n\t\t\tfolderButFile: '期望是文件夹，却发现是文件: {{path}}',\n\t\t\tnotFound: '未找到: {{path}}',\n\t\t\tlocalPathNotFound: '本地路径未找到: {{path}}',\n\t\t\tmergeNotSupported: '该文件类型暂不支持合并',\n\t\t\tfailedToAutoMerge: '自动合并失败',\n\t\t\tfailedToUploadMerged: '上传合并内容失败',\n\t\t\tconflictsMarkedInFile: '发现冲突，已在文件中标记',\n\t\t\trequestsTooFrequent: '请求过于频繁，请等待几分钟后再试',\n\t\t\taccountNotConfigured: '尚未配置坚果云账号，请先在设置中配置账号信息',\n\t\t},\n\t\trequestsTooFrequent: '请求过于频繁，插件将在 {{time}} 后自动继续同步任务',\n\t\tpreparing: '📋 准备同步',\n\t\tstart: '⌛️ 开始同步',\n\t\tcomplete: '✅ 同步完成',\n\t\tcompleteWithFailed: '❌ 同步完成，但有 {{failedCount}} 个任务失败',\n\t\tfailedWithError: '同步失败，错误信息: {{error}}',\n\t\tprogress: '同步进度: {{percent}}%',\n\t\tstartButton: '开始同步',\n\t\tstopButton: '停止同步',\n\t\thideButton: '隐藏',\n\t\tcloseButton: '关闭',\n\t\tshowProgressButton: '显示同步进度',\n\t\tnotSyncing: '尚未开始同步',\n\t\tpercentComplete: '{{percent}}%',\n\t\tcurrentFile: '{{path}}',\n\t\tfilePath: '{{path}}',\n\t\tprogressTitle: '同步进度',\n\t\tprogressStats: '已完成: {{completed}} / {{total}} 个任务',\n\t\tcompletedFilesTitle: '已完成的任务',\n\t\tsyncingFiles: '正在同步文件...',\n\t\tupdatingCache: '正在更新本地缓存...',\n\t\tcacheUpdated: '本地缓存已更新。',\n\t\tfailedStatus: '同步失败',\n\t\tcancelled: '同步已取消',\n\t\tsuggestUseClientForManyTasks:\n\t\t\t'提示：当同步任务较多时，建议使用坚果云客户端同步，可获得更好的性能和稳定性，插件更适合在移动端使用！',\n\t\tmodalTitle: '同步进行中',\n\t\tcancelButton: '取消同步',\n\t\tprogressText: '正在同步文件',\n\t\tfileOp: {\n\t\t\tcreateLocalDir: '创建本地目录',\n\t\t\tcreateRemoteDir: '创建远程目录',\n\t\t\tcreateRemoteDirs: '创建多级目录',\n\t\t\tdownload: '下载',\n\t\t\tfilenameError: '路径含无效字符',\n\t\t\tmerge: '合并',\n\t\t\tremoveLocal: '删除本地',\n\t\t\tremoveRemote: '删除远程',\n\t\t\tremoveRemoteRecursively: '递归删除远程',\n\t\t\trename: '重命名',\n\t\t\tsync: '同步',\n\t\t\tupload: '上传',\n\t\t\tnoop: '跳过',\n\t\t\tcleanRecord: '清理记录',\n\t\t\tskip: '跳过',\n\t\t},\n\t\tskipReason: {\n\t\t\t'file-too-large': '文件过大',\n\t\t\t'folder-contains-ignored-items': '文件夹包含被忽略的文件',\n\t\t},\n\t\tconfirmModal: {\n\t\t\ttitle: '同步确认',\n\t\t\tmessage:\n\t\t\t\t'⚠️ 请注意：\\n\\n1. 同步操作可能会修改或删除本地文件\\n2. 建议在同步前手动备份重要文件\\n3. 如果出现文件冲突，可能需要手动解决\\n4. 首次同步需要处理所有文件，可能会比较慢，请耐心等待\\n\\n确定要开始同步吗？',\n\t\t\tconfirm: '确认同步',\n\t\t\tcancel: '取消',\n\t\t\tremoteDir: '远程目录：{{dir}}',\n\t\t\tstrategy: '同步策略：{{strategy}}',\n\t\t},\n\t},\n\ttaskList: {\n\t\ttitle: '同步任务列表',\n\t\tinstruction:\n\t\t\t'请检查以下待执行的任务。点击\"继续\"将执行选中的任务，点击\"取消\"则跳过本次同步。',\n\t\texecute: '执行',\n\t\taction: '行为',\n\t\tlocalPath: '本地路径',\n\t\tremotePath: '远程路径',\n\t\tcontinue: '继续',\n\t\tcancel: '取消',\n\t},\n\tdeleteConfirm: {\n\t\ttitle: '确认删除本地文件',\n\t\tinstruction:\n\t\t\t'⚠️ 在自动同步过程中检测到以下本地文件将被删除（因远程已删除）。\\n\\n勾选要删除的文件，未勾选的文件将重新上传到远程：',\n\t\twarningNotice: '检测到本地文件将被删除，请确认',\n\t\tselect: '选择',\n\t\tfilePath: '文件路径',\n\t\tdeleteAndReupload: '删除选中的，重新上传未选中的',\n\t\tskipForNow: '暂时忽略',\n\t},\n\tfailedTasks: {\n\t\ttitle: '同步失败任务',\n\t\tinstruction: '以下任务在同步时失败：',\n\t\ttaskName: '任务',\n\t\tlocalPath: '本地路径',\n\t\terrorMessage: '失败原因',\n\t\tclose: '关闭',\n\t},\n\ttextAreaModal: {\n\t\tcopy: '复制',\n\t\tclose: '关闭',\n\t\tcopied: '文本已复制到剪贴板',\n\t},\n\ttime: {\n\t\tjustNow: '刚刚',\n\t\tminutesAgo: '{{count}}分钟前',\n\t\thoursAgo: '{{count}}小时前',\n\t\tdaysAgo: '{{count}}天前',\n\t\tlongAgo: '很久前',\n\t},\n\tchatbox: {\n\t\ttitle: 'Chatbox',\n\t\topenCommand: '打开 Chatbox',\n\t\tnewChat: '新对话',\n\t\tsessionDeleted: '会话已删除',\n\t\trepeatedToolCallsStopped:\n\t\t\t'Agent 连续 {{count}} 次调用了完全相同的工具与参数，已停止继续调用。',\n\t\ttask: {\n\t\t\tcancelledSummary: '任务 {{task}} 已取消。',\n\t\t\temptyResult: '任务已完成，但没有返回摘要。',\n\t\t},\n\t\trequestFailed: '请求失败',\n\t\terrors: {\n\t\t\tnoProvider: '发送前请先选择 Provider',\n\t\t\tbaseUrlRequired: '当前 Provider 缺少 Base URL',\n\t\t\tapiKeyRequired: '当前 Provider 缺少 API Key',\n\t\t\tnoModel: '发送前请先选择 Model',\n\t\t\tnoChoices: 'Provider 未返回可用结果',\n\t\t\tunknownTool: '未知工具：{{name}}',\n\t\t\ttoolFieldRequired: '{{field}} 为必填项',\n\t\t\tinvalidPositiveInteger: '{{field}} 必须是大于等于 1 的整数',\n\t\t\tfolderNotFound: '未找到文件夹：{{path}}',\n\t\t\tnotFolder: '该路径不是文件夹：{{path}}',\n\t\t\tfileNotFound: '未找到文件：{{path}}',\n\t\t\tnotFile: '该路径不是文件：{{path}}',\n\t\t\tfileExists: '文件已存在：{{path}}。如需覆盖请将 overwrite 设为 true。',\n\t\t\tparentPathNotFolder: '父路径不是文件夹：{{path}}',\n\t\t\teditMatchNotFound: '文件中未找到要替换的精确文本。',\n\t\t\teditMatchNotUnique: '要替换的精确文本必须且只能匹配一次。',\n\t\t\tinvalidRegex: '第 {{index}} 个 pattern 的正则无效：{{pattern}}',\n\t\t\tsessionNotFound: '目标会话已不存在',\n\t\t\ttaskDepthExceeded: '任务拆分深度已达到上限',\n\t\t\ttaskConcurrencyLimit:\n\t\t\t\t'当前会话已有过多后台任务在运行，限制为 {{limit}} 个',\n\t\t\ttaskSessionUnavailable: '任务对应的会话或模型配置已不可用',\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "src/index.ts",
    "content": "import 'blob-polyfill'\nimport 'core-js/stable'\n\nimport './polyfill'\nimport './webdav-patch'\n\nimport './assets/styles/global.css'\n\nimport { toBase64 } from 'js-base64'\nimport { normalizePath, Notice, Plugin } from 'obsidian'\nimport { sanitizeDefaultSelections, sanitizeProviders } from './ai/config'\nimport { SyncRibbonManager } from './components/SyncRibbonManager'\nimport { emitCancelSync } from './events'\nimport { emitSsoReceive } from './events/sso-receive'\nimport i18n from './i18n'\nimport ChatService from './services/chat.service'\nimport CommandService from './services/command.service'\nimport EventsService from './services/events.service'\nimport I18nService from './services/i18n.service'\nimport LoggerService from './services/logger.service'\nimport { ProgressService } from './services/progress.service'\nimport RealtimeSyncService from './services/realtime-sync.service'\nimport ScheduledSyncService from './services/scheduled-sync.service'\nimport { StatusService } from './services/status.service'\nimport SyncExecutorService from './services/sync-executor.service'\nimport { WebDAVService } from './services/webdav.service'\nimport {\n\tNutstoreSettings,\n\tNutstoreSettingTab,\n\tsetPluginInstance,\n\tSyncMode,\n} from './settings'\nimport { ConflictStrategy } from './sync/tasks/conflict-resolve.task'\nimport { decryptOAuthResponse } from './utils/decrypt-ticket-response'\nimport { GlobMatchOptions } from './utils/glob-match'\nimport logger from './utils/logger'\nimport { stdRemotePath } from './utils/std-remote-path'\nimport ChatboxView, { CHATBOX_VIEW_TYPE } from './views/chatbox.view'\n\nexport default class NutstorePlugin extends Plugin {\n\tpublic isSyncing: boolean = false\n\tpublic settings!: NutstoreSettings\n\n\tpublic commandService = new CommandService(this)\n\tpublic eventsService = new EventsService(this)\n\tpublic i18nService = new I18nService(this)\n\tpublic loggerService = new LoggerService(this)\n\tpublic progressService = new ProgressService(this)\n\tpublic ribbonManager = new SyncRibbonManager(this)\n\tpublic statusService = new StatusService(this)\n\tpublic webDAVService = new WebDAVService(this)\n\tpublic syncExecutorService = new SyncExecutorService(this)\n\tpublic chatService = new ChatService(this)\n\tpublic realtimeSyncService = new RealtimeSyncService(\n\t\tthis,\n\t\tthis.syncExecutorService,\n\t)\n\tpublic scheduledSyncService = new ScheduledSyncService(\n\t\tthis,\n\t\tthis.syncExecutorService,\n\t)\n\n\tasync onload() {\n\t\tawait this.loadSettings()\n\t\tawait this.chatService.initialize()\n\t\tthis.addSettingTab(new NutstoreSettingTab(this.app, this))\n\t\tthis.registerView(CHATBOX_VIEW_TYPE, (leaf) => new ChatboxView(leaf, this))\n\n\t\tthis.registerObsidianProtocolHandler('nutstore-sync/sso', async (data) => {\n\t\t\tif (data?.s) {\n\t\t\t\tthis.settings.oauthResponseText = data.s\n\t\t\t\tawait this.saveSettings()\n\t\t\t\tnew Notice(i18n.t('settings.login.success'), 5000)\n\t\t\t}\n\t\t\temitSsoReceive({\n\t\t\t\ttoken: data?.s,\n\t\t\t})\n\t\t})\n\t\tsetPluginInstance(this)\n\t\tawait this.chatService.handleSettingsChanged()\n\n\t\tawait this.scheduledSyncService.start()\n\t}\n\n\tasync onunload() {\n\t\tthis.app.workspace.detachLeavesOfType(CHATBOX_VIEW_TYPE)\n\t\tsetPluginInstance(null)\n\t\temitCancelSync()\n\t\tthis.scheduledSyncService.unload()\n\t\tthis.progressService.unload()\n\t\tthis.eventsService.unload()\n\t\tthis.realtimeSyncService.unload()\n\t\tthis.statusService.unload()\n\t}\n\n\tasync loadSettings() {\n\t\tfunction createGlobMathOptions(expr: string) {\n\t\t\treturn {\n\t\t\t\texpr,\n\t\t\t\toptions: {\n\t\t\t\t\tcaseSensitive: false,\n\t\t\t\t},\n\t\t\t} satisfies GlobMatchOptions\n\t\t}\n\t\tconst exclusionRules = [\n\t\t\t'**/.git',\n\t\t\t'**/.github',\n\t\t\t'**/.gitlab',\n\t\t\t'**/.svn',\n\t\t\t'**/node_modules',\n\t\t\t'**/.DS_Store',\n\t\t\t'**/__MACOSX',\n\t\t\t'**/desktop.ini',\n\t\t\t'**/Thumbs.db',\n\t\t\t'**/.trash',\n\t\t\t'**/~$*.doc',\n\t\t\t'**/~$*.docx',\n\t\t\t'**/~$*.ppt',\n\t\t\t'**/~$*.pptx',\n\t\t\t'**/~$*.xls',\n\t\t\t'**/~$*.xlsx',\n\t\t].map(createGlobMathOptions)\n\t\tconst DEFAULT_SETTINGS: NutstoreSettings = {\n\t\t\taccount: '',\n\t\t\tcredential: '',\n\t\t\tremoteDir: '',\n\t\t\tremoteCacheDir: '',\n\t\t\tuseGitStyle: false,\n\t\t\tconflictStrategy: ConflictStrategy.DiffMatchPatch,\n\t\t\toauthResponseText: '',\n\t\t\tloginMode: 'sso',\n\t\t\tconfirmBeforeSync: true,\n\t\t\tconfirmBeforeDeleteInAutoSync: true,\n\t\t\tsyncMode: SyncMode.LOOSE,\n\t\t\tfilterRules: {\n\t\t\t\texclusionRules,\n\t\t\t\tinclusionRules: [],\n\t\t\t},\n\t\t\tskipLargeFiles: {\n\t\t\t\tmaxSize: '30 MB',\n\t\t\t},\n\t\t\trealtimeSync: false,\n\t\t\tstartupSyncDelaySeconds: 0,\n\t\t\tautoSyncIntervalSeconds: 300,\n\t\t\tlanguage: undefined,\n\t\t\tai: {\n\t\t\t\tproviders: {},\n\t\t\t\tdefaultModel: undefined,\n\t\t\t\tyolo: false,\n\t\t\t},\n\t\t\tconfigDirSyncMode: 'none',\n\t\t}\n\n\t\tthis.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData())\n\t\tthis.settings.ai ??= { providers: {}, defaultModel: undefined, yolo: false }\n\t\tif (Array.isArray(this.settings.ai.providers)) {\n\t\t\tthis.settings.ai.providers = {}\n\t\t}\n\t\tlet providersValid = true\n\t\ttry {\n\t\t\tthis.settings.ai.providers = sanitizeProviders(\n\t\t\t\tthis.settings.ai.providers ?? {},\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tlogger.error(error)\n\t\t\tconst detail =\n\t\t\t\terror instanceof Error ? error.message : 'Unknown validation error'\n\t\t\tnew Notice(\n\t\t\t\ti18n.t('settings.ai.errors.invalidProvidersConfig', {\n\t\t\t\t\treason: detail,\n\t\t\t\t}),\n\t\t\t\t10000,\n\t\t\t)\n\t\t\tprovidersValid = false\n\t\t}\n\t\tthis.settings.ai.defaultModel = providersValid\n\t\t\t? sanitizeDefaultSelections(\n\t\t\t\t\tthis.settings.ai.providers,\n\t\t\t\t\tthis.settings.ai.defaultModel,\n\t\t\t\t)\n\t\t\t: undefined\n\t}\n\n\tasync saveSettings() {\n\t\tawait this.saveData(this.settings)\n\t\tawait this.chatService.handleSettingsChanged()\n\t}\n\n\ttoggleSyncUI(isSyncing: boolean) {\n\t\tthis.isSyncing = isSyncing\n\t\tthis.ribbonManager.update()\n\t}\n\n\tasync getDecryptedOAuthInfo() {\n\t\treturn decryptOAuthResponse(this.settings.oauthResponseText)\n\t}\n\n\tasync getToken() {\n\t\tlet token\n\t\tif (this.settings.loginMode === 'sso') {\n\t\t\tconst oauth = await this.getDecryptedOAuthInfo()\n\t\t\ttoken = `${oauth.username}:${oauth.access_token}`\n\t\t} else {\n\t\t\ttoken = `${this.settings.account}:${this.settings.credential}`\n\t\t}\n\t\treturn toBase64(token)\n\t}\n\n\t/**\n\t * 检查账号配置是否完整\n\t * @returns true 表示配置完整，false 表示未配置或配置不完整\n\t */\n\tisAccountConfigured(): boolean {\n\t\tif (this.settings.loginMode === 'sso') {\n\t\t\t// SSO 模式：检查是否有 OAuth 响应数据\n\t\t\treturn (\n\t\t\t\t!!this.settings.oauthResponseText &&\n\t\t\t\tthis.settings.oauthResponseText.trim() !== ''\n\t\t\t)\n\t\t} else {\n\t\t\t// 手动模式：检查账号和凭证是否都已填写\n\t\t\treturn (\n\t\t\t\t!!this.settings.account &&\n\t\t\t\tthis.settings.account.trim() !== '' &&\n\t\t\t\t!!this.settings.credential &&\n\t\t\t\tthis.settings.credential.trim() !== ''\n\t\t\t)\n\t\t}\n\t}\n\n\tget remoteBaseDir() {\n\t\tlet remoteDir = normalizePath(this.settings.remoteDir.trim())\n\t\tif (remoteDir === '' || remoteDir === '/') {\n\t\t\tremoteDir = this.app.vault.getName()\n\t\t}\n\t\treturn stdRemotePath(remoteDir)\n\t}\n}\n"
  },
  {
    "path": "src/model/stat.model.ts",
    "content": "export type StatModel =\n\t| {\n\t\t\tpath: string\n\t\t\tbasename: string\n\t\t\tisDir: true\n\t\t\tisDeleted: boolean\n\t\t\tmtime?: number\n\t  }\n\t| {\n\t\t\tpath: string\n\t\t\tbasename: string\n\t\t\tisDir: false\n\t\t\tisDeleted: boolean\n\t\t\tmtime: number\n\t\t\tsize: number\n\t  }\n"
  },
  {
    "path": "src/model/sync-record.model.ts",
    "content": "import { StatModel } from './stat.model'\n\nexport interface SyncRecordModel {\n\tlocal: StatModel\n\tremote: StatModel\n\tbase?: {\n\t\tkey: string\n\t}\n}\n"
  },
  {
    "path": "src/polyfill.test.ts",
    "content": "import { afterEach, describe, expect, it, vi } from 'vitest'\n\nconst originalProcess = globalThis.process\n\nafterEach(() => {\n\tglobalThis.process = originalProcess\n\tvi.resetModules()\n})\n\ndescribe('polyfill', () => {\n\tit('adds process.env when it is missing', async () => {\n\t\t;(globalThis as typeof globalThis & { process: any }).process = {\n\t\t\tcwd() {\n\t\t\t\treturn '/mobile'\n\t\t\t},\n\t\t}\n\n\t\tvi.resetModules()\n\t\tawait import('./polyfill')\n\n\t\texpect(globalThis.process).toBeDefined()\n\t\texpect(typeof globalThis.process.cwd).toBe('function')\n\t\texpect(globalThis.process.cwd()).toBe('/mobile')\n\t\texpect(globalThis.process.env).toEqual({})\n\t})\n})\n"
  },
  {
    "path": "src/polyfill.ts",
    "content": "type ProcessLike = typeof globalThis.process & {\n\tenv?: Record<string, string | undefined>\n}\n\nconst processLike: ProcessLike = (globalThis.process ?? {\n\tcwd() {\n\t\treturn '/'\n\t},\n\tenv: {},\n}) as ProcessLike\n\nif (typeof processLike.cwd !== 'function') {\n\tprocessLike.cwd = () => '/'\n}\n\nif (!processLike.env || typeof processLike.env !== 'object') {\n\tprocessLike.env = {}\n}\n\nglobalThis.process = processLike\n\nexport {}\n"
  },
  {
    "path": "src/services/cache.service.v1.ts",
    "content": "import { deflateSync, inflateSync } from 'fflate/browser'\nimport { Notice } from 'obsidian'\nimport { join } from 'path-browserify'\nimport superjson from 'superjson'\nimport { BufferLike } from 'webdav'\nimport { getDirectoryContents } from '~/api/webdav'\nimport i18n from '~/i18n'\nimport { ExportedStorage } from '~/settings/cache'\nimport { traverseWebDAVKV } from '~/storage'\nimport { fileStatToStatModel } from '~/utils/file-stat-to-stat-model'\nimport { getTraversalWebDAVDBKey } from '~/utils/get-db-key'\nimport logger from '~/utils/logger'\nimport { uint8ArrayToArrayBuffer } from '~/utils/uint8array-to-arraybuffer'\nimport type NutstorePlugin from '..'\n\n/**\n * Service for handling cache operations (save, restore, delete, list)\n */\nexport default class CacheServiceV1 {\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate remoteCacheDir: string,\n\t) {}\n\n\t/**\n\t * Save the current cache to a file in the remote cache directory\n\t */\n\tasync saveCache(filename: string) {\n\t\ttry {\n\t\t\tconst webdav = await this.plugin.webDAVService.createWebDAVClient()\n\t\t\tconst traverseWebDAVCache = await traverseWebDAVKV.get(\n\t\t\t\tawait getTraversalWebDAVDBKey(\n\t\t\t\t\tawait this.plugin.getToken(),\n\t\t\t\t\tthis.plugin.remoteBaseDir,\n\t\t\t\t),\n\t\t\t)\n\n\t\t\tconst exportedStorage: ExportedStorage = {\n\t\t\t\ttraverseWebDAVCache: traverseWebDAVCache || undefined,\n\t\t\t\texportedAt: new Date().toISOString(),\n\t\t\t}\n\n\t\t\t// Encoding pipeline: superjson.stringify -> deflate level 9\n\t\t\tconst serializedStr = superjson.stringify(exportedStorage)\n\t\t\tif (!serializedStr || serializedStr.length === 0) {\n\t\t\t\tthrow new Error('Cache data serialization failed')\n\t\t\t}\n\n\t\t\tconst encoder = new TextEncoder()\n\n\t\t\tconst deflatedStorage = deflateSync(encoder.encode(serializedStr), {\n\t\t\t\tlevel: 9,\n\t\t\t}) as Uint8Array<ArrayBuffer>\n\t\t\tconst filePath = join(this.remoteCacheDir, filename)\n\n\t\t\tawait webdav.createDirectory(this.remoteCacheDir, { recursive: true })\n\t\t\tawait webdav.putFileContents(\n\t\t\t\tfilePath,\n\t\t\t\tuint8ArrayToArrayBuffer(deflatedStorage),\n\t\t\t\t{\n\t\t\t\t\toverwrite: true,\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tnew Notice(i18n.t('settings.cache.saveModal.success'))\n\t\t\treturn Promise.resolve()\n\t\t} catch (error) {\n\t\t\tlogger.error('Error saving cache:', error)\n\t\t\tnew Notice(\n\t\t\t\ti18n.t('settings.cache.saveModal.error', {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t}),\n\t\t\t)\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Restore the cache from a file in the remote cache directory\n\t */\n\tasync restoreCache(filename: string) {\n\t\ttry {\n\t\t\tconst webdav = await this.plugin.webDAVService.createWebDAVClient()\n\t\t\tconst filePath = join(this.remoteCacheDir, filename)\n\n\t\t\tconst fileExists = await webdav.exists(filePath).catch(() => false)\n\t\t\tif (!fileExists) {\n\t\t\t\tnew Notice(i18n.t('settings.cache.restoreModal.fileNotFound'))\n\t\t\t\treturn Promise.reject(new Error('File not found'))\n\t\t\t}\n\n\t\t\tconst fileContent = (await webdav.getFileContents(filePath, {\n\t\t\t\tformat: 'binary',\n\t\t\t})) as BufferLike\n\n\t\t\t// Check if file content is empty\n\t\t\tif (!fileContent || fileContent.byteLength === 0) {\n\t\t\t\tthrow new Error('Cache file is empty')\n\t\t\t}\n\n\t\t\t// Decoding pipeline: inflate -> superjson.parse\n\t\t\tconst inflatedFileContent = inflateSync(new Uint8Array(fileContent))\n\t\t\tif (!inflatedFileContent || inflatedFileContent.length === 0) {\n\t\t\t\tthrow new Error('Inflate failed or resulted in empty content')\n\t\t\t}\n\n\t\t\tconst decoder = new TextDecoder()\n\t\t\tconst decodedContent = decoder.decode(inflatedFileContent)\n\t\t\tif (!decodedContent || decodedContent.trim() === '') {\n\t\t\t\tthrow new Error('Cache file content is invalid or empty')\n\t\t\t}\n\n\t\t\tconst exportedStorage: ExportedStorage = superjson.parse(decodedContent)\n\n\t\t\t// Validate the structure of exported storage\n\t\t\tif (!exportedStorage) {\n\t\t\t\tthrow new Error('Invalid cache file format')\n\t\t\t}\n\t\t\tconst { traverseWebDAVCache } = exportedStorage\n\t\t\tif (traverseWebDAVCache) {\n\t\t\t\tawait traverseWebDAVKV.set(\n\t\t\t\t\tawait getTraversalWebDAVDBKey(\n\t\t\t\t\t\tawait this.plugin.getToken(),\n\t\t\t\t\t\tthis.plugin.remoteBaseDir,\n\t\t\t\t\t),\n\t\t\t\t\ttraverseWebDAVCache,\n\t\t\t\t)\n\t\t\t}\n\t\t\tnew Notice(i18n.t('settings.cache.restoreModal.success'))\n\t\t\treturn Promise.resolve()\n\t\t} catch (error) {\n\t\t\tlogger.error('Error restoring cache:', error)\n\t\t\tnew Notice(\n\t\t\t\ti18n.t('settings.cache.restoreModal.error', {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t}),\n\t\t\t)\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Delete a cache file from the remote cache directory\n\t */\n\tasync deleteCache(filename: string): Promise<void> {\n\t\ttry {\n\t\t\tconst webdav = await this.plugin.webDAVService.createWebDAVClient()\n\t\t\tconst filePath = join(this.remoteCacheDir, filename)\n\n\t\t\tawait webdav.deleteFile(filePath)\n\n\t\t\tnew Notice(i18n.t('settings.cache.restoreModal.deleteSuccess'))\n\t\t\treturn Promise.resolve()\n\t\t} catch (error) {\n\t\t\tlogger.error('Error deleting cache file:', error)\n\t\t\tnew Notice(\n\t\t\t\ti18n.t('settings.cache.restoreModal.deleteError', {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t}),\n\t\t\t)\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Load the list of cache files from the remote cache directory\n\t */\n\tasync loadCacheFileList() {\n\t\ttry {\n\t\t\tconst webdav = await this.plugin.webDAVService.createWebDAVClient()\n\t\t\tconst dirExists = await webdav\n\t\t\t\t.exists(this.remoteCacheDir)\n\t\t\t\t.catch(() => false)\n\t\t\tif (!dirExists) {\n\t\t\t\tawait webdav.createDirectory(this.remoteCacheDir, { recursive: true })\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst files = await getDirectoryContents(\n\t\t\t\tawait this.plugin.getToken(),\n\t\t\t\tthis.remoteCacheDir,\n\t\t\t)\n\t\t\treturn files.map(fileStatToStatModel)\n\t\t} catch (error) {\n\t\t\tlogger.error('Error loading cache file list:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/services/chat.service.test.ts",
    "content": "import { beforeEach, describe, expect, it, vi } from 'vitest'\nimport { z } from 'zod'\nimport type {\n\tChatPendingMessage,\n\tChatSessionHistoryItem,\n} from '~/chatbox/types'\nimport ChatService from './chat.service'\n\nconst storageState = vi.hoisted(() => {\n\tconst sessionStore = new Map<string, any>()\n\tconst metaStore = new Map<string, any>()\n\n\tfunction createStore(store: Map<string, any>) {\n\t\treturn {\n\t\t\tset: vi.fn(async (key: string, value: any) => {\n\t\t\t\tstore.set(key, structuredClone(value))\n\t\t\t\treturn value\n\t\t\t}),\n\t\t\tget: vi.fn(async (key: string) =>\n\t\t\t\tstore.has(key) ? structuredClone(store.get(key)) : null,\n\t\t\t),\n\t\t\tunset: vi.fn(async (key: string) => {\n\t\t\t\tstore.delete(key)\n\t\t\t}),\n\t\t\tclear: vi.fn(async () => {\n\t\t\t\tstore.clear()\n\t\t\t}),\n\t\t\tdump: vi.fn(async () => Object.fromEntries(store.entries())),\n\t\t}\n\t}\n\n\treturn {\n\t\treset() {\n\t\t\tsessionStore.clear()\n\t\t\tmetaStore.clear()\n\t\t},\n\t\tsessionStore,\n\t\tmetaStore,\n\t\tchatSessionKV: createStore(sessionStore),\n\t\tchatMetaKV: createStore(metaStore),\n\t}\n})\n\nconst { generateAssistantTurn, assertProviderUsable } = vi.hoisted(() => ({\n\tgenerateAssistantTurn: vi.fn(),\n\tassertProviderUsable: vi.fn(),\n}))\n\nvi.mock('~/ai/runtime', () => ({\n\tgenerateAssistantTurn,\n\tassertProviderUsable,\n}))\n\nvi.mock('~/storage', () => ({\n\tchatSessionKV: storageState.chatSessionKV,\n\tchatMetaKV: storageState.chatMetaKV,\n}))\n\nfunction createPlugin() {\n\treturn {\n\t\tapp: {},\n\t\tsettings: {\n\t\t\tai: {\n\t\t\t\tproviders: {\n\t\t\t\t\t'provider-1': {\n\t\t\t\t\t\tid: 'provider-1',\n\t\t\t\t\t\tname: 'Provider',\n\t\t\t\t\t\tapi: 'https://example.com/v1',\n\t\t\t\t\t\tapiKey: 'key',\n\t\t\t\t\t\tmodels: {\n\t\t\t\t\t\t\t'model-1': {\n\t\t\t\t\t\t\t\tid: 'model-1',\n\t\t\t\t\t\t\t\tname: 'model-a',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdefaultModel: { providerId: 'provider-1', modelId: 'model-1' },\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunction createPluginWithTwoProviders() {\n\treturn {\n\t\tapp: {},\n\t\tsettings: {\n\t\t\tai: {\n\t\t\t\tproviders: {\n\t\t\t\t\t'provider-1': {\n\t\t\t\t\t\tid: 'provider-1',\n\t\t\t\t\t\tname: 'Provider 1',\n\t\t\t\t\t\tapi: 'https://example.com/v1',\n\t\t\t\t\t\tapiKey: 'key',\n\t\t\t\t\t\tmodels: {\n\t\t\t\t\t\t\t'model-1': {\n\t\t\t\t\t\t\t\tid: 'model-1',\n\t\t\t\t\t\t\t\tname: 'model-a',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t'provider-2': {\n\t\t\t\t\t\tid: 'provider-2',\n\t\t\t\t\t\tname: 'Provider 2',\n\t\t\t\t\t\tapi: 'https://example.org/v1',\n\t\t\t\t\t\tapiKey: 'key',\n\t\t\t\t\t\tmodels: {\n\t\t\t\t\t\t\t'model-2': {\n\t\t\t\t\t\t\t\tid: 'model-2',\n\t\t\t\t\t\t\t\tname: 'model-b',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdefaultModel: { providerId: 'provider-1', modelId: 'model-1' },\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunction createPluginWithVault(initialFiles: Record<string, string> = {}) {\n\tconst files = new Map(Object.entries(initialFiles))\n\tconst folders = new Set<string>([''])\n\tconst normalize = (path: string) => path.replace(/^\\/+|\\/+$/g, '')\n\tconst dirname = (path: string) =>\n\t\t!path || !path.includes('/') ? '' : path.slice(0, path.lastIndexOf('/'))\n\tconst basename = (path: string) => {\n\t\tconst normalized = normalize(path)\n\t\treturn normalized.slice(normalized.lastIndexOf('/') + 1)\n\t}\n\tconst ensureFolder = (path: string) => {\n\t\tconst normalized = normalize(path)\n\t\tif (!normalized) {\n\t\t\treturn\n\t\t}\n\t\tconst parent = dirname(normalized)\n\t\tif (parent && parent !== normalized) {\n\t\t\tensureFolder(parent)\n\t\t}\n\t\tfolders.add(normalized)\n\t}\n\n\tfor (const path of files.keys()) {\n\t\tensureFolder(dirname(path))\n\t}\n\n\tconst getAbstractFileByPath = (path: string): any => {\n\t\tconst normalized = normalize(path)\n\t\tif (!normalized) {\n\t\t\treturn { path: '', children: [] }\n\t\t}\n\t\tif (folders.has(normalized) && !files.has(normalized)) {\n\t\t\treturn { path: normalized, children: [] }\n\t\t}\n\t\tif (files.has(normalized)) {\n\t\t\treturn { path: normalized, stat: { size: files.get(normalized)!.length } }\n\t\t}\n\t\treturn null\n\t}\n\n\treturn {\n\t\tplugin: {\n\t\t\tapp: {\n\t\t\t\tvault: {\n\t\t\t\t\tgetAbstractFileByPath,\n\t\t\t\t\tasync createFolder(path: string) {\n\t\t\t\t\t\tensureFolder(path)\n\t\t\t\t\t\treturn getAbstractFileByPath(path)\n\t\t\t\t\t},\n\t\t\t\t\tasync createBinary(path: string, data: ArrayBuffer) {\n\t\t\t\t\t\tconst normalized = normalize(path)\n\t\t\t\t\t\tensureFolder(dirname(normalized))\n\t\t\t\t\t\tfiles.set(normalized, new TextDecoder().decode(data))\n\t\t\t\t\t\treturn getAbstractFileByPath(normalized)\n\t\t\t\t\t},\n\t\t\t\t\tasync modifyBinary(file: any, data: ArrayBuffer) {\n\t\t\t\t\t\tfiles.set(normalize(file.path), new TextDecoder().decode(data))\n\t\t\t\t\t},\n\t\t\t\t\tasync delete(file: any) {\n\t\t\t\t\t\tconst normalized = normalize(file.path)\n\t\t\t\t\t\tfiles.delete(normalized)\n\t\t\t\t\t\tfor (const folder of [...folders]) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tfolder === normalized ||\n\t\t\t\t\t\t\t\tfolder.startsWith(`${normalized}/`)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tfolders.delete(folder)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tasync trash(file: any) {\n\t\t\t\t\t\treturn this.delete(file)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tsettings: createPlugin().settings,\n\t\t},\n\t\tfiles,\n\t\tfolders,\n\t}\n}\n\nfunction deferredCompletion() {\n\tlet resolve!: (value: {\n\t\tmessage: {\n\t\t\trole: 'assistant'\n\t\t\tcontent: { type: 'text'; text: string }[]\n\t\t\ttool_calls?: never[]\n\t\t}\n\t\tmeta: {\n\t\t\tproviderId?: string\n\t\t\tproviderName?: string\n\t\t\tmodelName?: string\n\t\t}\n\t}) => void\n\tconst promise = new Promise<{\n\t\tmessage: {\n\t\t\trole: 'assistant'\n\t\t\tcontent: { type: 'text'; text: string }[]\n\t\t\ttool_calls?: never[]\n\t\t}\n\t\tmeta: {\n\t\t\tproviderId?: string\n\t\t\tproviderName?: string\n\t\t\tmodelName?: string\n\t\t}\n\t}>((nextResolve) => {\n\t\tresolve = nextResolve\n\t})\n\n\treturn {\n\t\tpromise,\n\t\tresolve: (text: string) =>\n\t\t\tresolve({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t}),\n\t}\n}\n\nfunction deferredResult<T>() {\n\tlet resolve!: (value: T) => void\n\tlet reject!: (error: unknown) => void\n\tconst promise = new Promise<T>((nextResolve, nextReject) => {\n\t\tresolve = nextResolve\n\t\treject = nextReject\n\t})\n\n\treturn { promise, resolve, reject }\n}\n\nfunction getActiveSession(service: ChatService) {\n\treturn (service as any).getLoadedActiveSession()\n}\n\nfunction getLoadedSession(service: ChatService, sessionId: string) {\n\treturn (service as any).loadedSessions.get(sessionId)\n}\n\ndescribe('ChatService fragment workflows', () => {\n\tbeforeEach(() => {\n\t\tgenerateAssistantTurn.mockReset()\n\t\tassertProviderUsable.mockReset()\n\t\tstorageState.reset()\n\t})\n\n\tit('creates a new fragment inside the active session', async () => {\n\t\tconst service = new ChatService(createPlugin() as never)\n\n\t\tawait service.ensureSession()\n\t\tservice.createFragmentForActiveSession()\n\n\t\tconst session = getActiveSession(service)\n\t\texpect(session.fragments).toHaveLength(2)\n\t\texpect(session.activeFragmentId).toBe(session.fragments[1].id)\n\t\texpect(session.fragments[0].messages).toHaveLength(0)\n\t\texpect(session.fragments[1].messages).toHaveLength(0)\n\t})\n\n\tit('compresses the active fragment into a new fragment and stores the summary as a user message', async () => {\n\t\tgenerateAssistantTurn\n\t\t\t.mockResolvedValueOnce({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'Initial reply' }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t})\n\t\t\t.mockResolvedValueOnce({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'Compressed summary' }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t})\n\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\t\tawait service.sendMessage('Original message')\n\t\tawait service.compressContext()\n\n\t\tconst session = getActiveSession(service)\n\t\texpect(session.fragments).toHaveLength(2)\n\t\texpect(session.activeFragmentId).toBe(session.fragments[1].id)\n\t\texpect(session.fragments[1].messages).toHaveLength(1)\n\t\texpect(session.fragments[1].messages[0].message.role).toBe('user')\n\t\texpect(session.fragments[1].messages[0].message.content?.[0]).toEqual({\n\t\t\ttype: 'text',\n\t\t\ttext: 'Compressed summary',\n\t\t})\n\t})\n\n\tit('queues messages while thinking and flushes them into the same fragment after completion', async () => {\n\t\tconst first = deferredCompletion()\n\t\tgenerateAssistantTurn\n\t\t\t.mockImplementationOnce(() => first.promise)\n\t\t\t.mockResolvedValueOnce({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'Reply to queued batch' }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t})\n\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\n\t\tconst firstSend = service.sendMessage('First message')\n\t\tawait Promise.resolve()\n\t\tawait service.sendMessage('Second message')\n\t\tawait service.sendMessage('Third message')\n\n\t\texpect(\n\t\t\tservice\n\t\t\t\t.getViewProps()\n\t\t\t\t.pendingMessages.map((item: ChatPendingMessage) => item.text),\n\t\t).toEqual(['Second message', 'Third message'])\n\n\t\tfirst.resolve('Reply to first message')\n\t\tawait firstSend\n\n\t\tconst session = getActiveSession(service)\n\t\tconst fragment = session.fragments[0]\n\t\tconst userMessages = fragment.messages.filter(\n\t\t\t(item: any) => item.message.role === 'user',\n\t\t)\n\t\texpect(userMessages).toHaveLength(2)\n\t\texpect(userMessages[1].message.content?.[0]).toEqual({\n\t\t\ttype: 'text',\n\t\t\ttext: 'Second message\\n\\nThird message',\n\t\t})\n\t\texpect(service.getViewProps().pendingMessages).toHaveLength(0)\n\t})\n\n\tit('stops thinking runs and removes unmatched tool calls from the assistant message', async () => {\n\t\tconst response = deferredResult<{\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant'\n\t\t\t\tcontent: { type: 'text'; text: string }[]\n\t\t\t\ttool_calls: {\n\t\t\t\t\tid: string\n\t\t\t\t\ttype: 'function'\n\t\t\t\t\tfunction: {\n\t\t\t\t\t\tname: string\n\t\t\t\t\t\targuments: string\n\t\t\t\t\t}\n\t\t\t\t}[]\n\t\t\t}\n\t\t\tmeta: {\n\t\t\t\tproviderId?: string\n\t\t\t\tproviderName?: string\n\t\t\t\tmodelName?: string\n\t\t\t}\n\t\t}>()\n\n\t\tgenerateAssistantTurn.mockImplementationOnce(() => response.promise)\n\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\n\t\tconst run = service.sendMessage('Need help')\n\t\tawait vi.waitFor(() => {\n\t\t\texpect(service.getViewProps().runState).toBe('thinking')\n\t\t})\n\t\tservice.getViewProps().onStopActiveRun?.()\n\n\t\tresponse.resolve({\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant',\n\t\t\t\tcontent: [{ type: 'text', text: 'Partial answer' }],\n\t\t\t\ttool_calls: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'tool-1',\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t\tfunction: {\n\t\t\t\t\t\t\tname: 'spawn',\n\t\t\t\t\t\t\targuments: JSON.stringify({ task: 'Inspect note' }),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\tmeta: {\n\t\t\t\tproviderId: 'provider-1',\n\t\t\t\tproviderName: 'Provider',\n\t\t\t\tmodelName: 'model-a',\n\t\t\t},\n\t\t})\n\t\tawait run\n\n\t\tconst session = getActiveSession(service)\n\t\tconst fragment = session.fragments[0]\n\t\texpect(fragment.messages).toHaveLength(2)\n\t\texpect(fragment.messages[1].message.role).toBe('assistant')\n\t\texpect(fragment.messages[1].message.tool_calls).toBeUndefined()\n\t\texpect(fragment.messages[1].message.content?.[0]).toEqual({\n\t\t\ttype: 'text',\n\t\t\ttext: 'Partial answer',\n\t\t})\n\t})\n\n\tit('does not create a new fragment when compression fails and resumes pending messages in the original fragment', async () => {\n\t\tconst compression = deferredResult<{\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant'\n\t\t\t\tcontent: { type: 'text'; text: string }[]\n\t\t\t}\n\t\t\tmeta: {\n\t\t\t\tproviderId?: string\n\t\t\t\tproviderName?: string\n\t\t\t\tmodelName?: string\n\t\t\t}\n\t\t}>()\n\n\t\tgenerateAssistantTurn\n\t\t\t.mockResolvedValueOnce({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'Initial reply' }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t})\n\t\t\t.mockImplementationOnce(() => compression.promise)\n\t\t\t.mockResolvedValueOnce({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'Reply after compression failure' }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t})\n\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\t\tawait service.sendMessage('Original message')\n\n\t\tconst compressRun = service.compressContext()\n\t\tawait Promise.resolve()\n\t\tawait service.sendMessage('Queued after failure')\n\t\tcompression.reject(new Error('Compression failed'))\n\t\tawait compressRun\n\n\t\tawait vi.waitFor(() => {\n\t\t\tconst session = getActiveSession(service)\n\t\t\texpect(session.fragments).toHaveLength(1)\n\t\t\texpect(session.activeFragmentId).toBe(session.fragments[0].id)\n\t\t\texpect(service.getViewProps().pendingMessages).toHaveLength(0)\n\t\t\tconst userMessages = session.fragments[0].messages.filter(\n\t\t\t\t(item: any) => item.message.role === 'user',\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tuserMessages.map((item: any) => item.message.content?.[0]),\n\t\t\t).toEqual([\n\t\t\t\t{ type: 'text', text: 'Original message' },\n\t\t\t\t{ type: 'text', text: 'Queued after failure' },\n\t\t\t])\n\t\t})\n\t})\n\n\tit('restores the active session from persisted storage and lazily loads non-active sessions', async () => {\n\t\tgenerateAssistantTurn\n\t\t\t.mockResolvedValueOnce({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'First response' }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t})\n\t\t\t.mockResolvedValueOnce({\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'Second response' }],\n\t\t\t\t},\n\t\t\t\tmeta: {\n\t\t\t\t\tproviderId: 'provider-1',\n\t\t\t\t\tproviderName: 'Provider',\n\t\t\t\t\tmodelName: 'model-a',\n\t\t\t\t},\n\t\t\t})\n\n\t\tconst firstService = new ChatService(createPlugin() as never)\n\t\tawait firstService.ensureSession()\n\t\tawait firstService.sendMessage('First session message')\n\t\tawait firstService.createSession()\n\t\tawait firstService.sendMessage('Second session message')\n\n\t\tconst secondSessionId = firstService.getViewProps().activeSessionId!\n\t\tconst storedBeforeReload = await storageState.chatSessionKV.dump()\n\t\texpect(Object.keys(storedBeforeReload)).toHaveLength(2)\n\n\t\tconst reloadedService = new ChatService(createPlugin() as never)\n\t\tawait reloadedService.ensureSession()\n\n\t\tconst props = reloadedService.getViewProps()\n\t\texpect(props.activeSessionId).toBe(secondSessionId)\n\t\texpect(props.sessionHistory).toHaveLength(2)\n\t\tconst inactiveSession = props.sessionHistory.find(\n\t\t\t(session: ChatSessionHistoryItem) => session.id !== secondSessionId,\n\t\t)!\n\t\tconst activeSession = getActiveSession(reloadedService)\n\t\texpect(activeSession.fragments[0].messages[0].message.content?.[0]).toEqual(\n\t\t\t{\n\t\t\t\ttype: 'text',\n\t\t\t\ttext: 'Second session message',\n\t\t\t},\n\t\t)\n\n\t\tawait reloadedService.switchSession(inactiveSession.id)\n\t\tconst switched = getLoadedSession(reloadedService, inactiveSession.id)\n\t\texpect(switched.fragments[0].messages[0].message.content?.[0]).toEqual({\n\t\t\ttype: 'text',\n\t\t\ttext: 'First session message',\n\t\t})\n\t})\n\n\tit('hard deletes a non-active session from storage and index', async () => {\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\t\tconst firstSessionId = service.getViewProps().activeSessionId!\n\n\t\tawait service.createSession()\n\t\tconst secondSessionId = service.getViewProps().activeSessionId!\n\n\t\tawait service.deleteSession(firstSessionId)\n\n\t\tconst props = service.getViewProps()\n\t\texpect(props.activeSessionId).toBe(secondSessionId)\n\t\texpect(\n\t\t\tprops.sessionHistory.map((session: ChatSessionHistoryItem) => session.id),\n\t\t).toEqual([secondSessionId])\n\t\texpect(await storageState.chatSessionKV.get(firstSessionId)).toBeNull()\n\t\texpect(await storageState.chatMetaKV.get('chat_meta')).toEqual({\n\t\t\tactiveSessionId: secondSessionId,\n\t\t\torderedSessionIds: [secondSessionId],\n\t\t})\n\t})\n\n\tit('allows deleting the last session and recreates one on the next send', async () => {\n\t\tgenerateAssistantTurn.mockResolvedValueOnce({\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant',\n\t\t\t\tcontent: [{ type: 'text', text: 'New response' }],\n\t\t\t},\n\t\t\tmeta: {\n\t\t\t\tproviderId: 'provider-1',\n\t\t\t\tproviderName: 'Provider',\n\t\t\t\tmodelName: 'model-a',\n\t\t\t},\n\t\t})\n\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\t\tconst sessionId = service.getViewProps().activeSessionId!\n\n\t\tawait service.deleteSession(sessionId)\n\n\t\texpect(service.getViewProps().activeSessionId).toBeUndefined()\n\t\texpect(service.getViewProps().sessionHistory).toHaveLength(0)\n\t\texpect(service.getViewProps().selectedProviderId).toBe('provider-1')\n\t\texpect(service.getViewProps().selectedModelId).toBe('model-1')\n\t\texpect(service.getViewProps().canSend).toBe(true)\n\t\texpect(await storageState.chatSessionKV.get(sessionId)).toBeNull()\n\t\texpect(await storageState.chatMetaKV.get('chat_meta')).toEqual({\n\t\t\tactiveSessionId: undefined,\n\t\t\torderedSessionIds: [],\n\t\t})\n\n\t\tawait service.sendMessage('Recreated session')\n\n\t\tconst props = service.getViewProps()\n\t\texpect(props.activeSessionId).toBeTruthy()\n\t\texpect(props.sessionHistory).toHaveLength(1)\n\t\texpect(\n\t\t\tgetActiveSession(service).fragments[0].messages[0].message.content?.[0],\n\t\t).toEqual({\n\t\t\ttype: 'text',\n\t\t\ttext: 'Recreated session',\n\t\t})\n\t})\n\n\tit('allows changing provider and model in the empty state before creating a new session', async () => {\n\t\tconst service = new ChatService(createPluginWithTwoProviders() as never)\n\t\tawait service.ensureSession()\n\t\tconst sessionId = service.getViewProps().activeSessionId!\n\n\t\tawait service.deleteSession(sessionId)\n\n\t\tservice.selectProvider('provider-2')\n\t\tservice.selectModel('model-2')\n\n\t\tconst emptyStateProps = service.getViewProps()\n\t\texpect(emptyStateProps.selectedProviderId).toBe('provider-2')\n\t\texpect(emptyStateProps.selectedModelId).toBe('model-2')\n\n\t\tawait service.createSession()\n\n\t\tconst created = getActiveSession(service)\n\t\texpect(created.model?.providerId).toBe('provider-2')\n\t\texpect(created.model?.modelId).toBe('model-2')\n\t})\n\n\tit('applies default model to an unselected empty session after settings change', async () => {\n\t\tconst plugin = createPlugin() as any\n\t\tconst service = new ChatService(plugin as never)\n\t\tawait service.ensureSession()\n\n\t\tplugin.settings.ai.providers['provider-1'].models = {}\n\t\tplugin.settings.ai.defaultModel = undefined\n\t\tawait service.handleSettingsChanged()\n\n\t\texpect(getActiveSession(service).model).toBeUndefined()\n\n\t\tplugin.settings.ai.providers['provider-1'].models = {\n\t\t\t'model-1': {\n\t\t\t\tid: 'model-1',\n\t\t\t\tname: 'model-a',\n\t\t\t},\n\t\t}\n\t\tplugin.settings.ai.defaultModel = {\n\t\t\tproviderId: 'provider-1',\n\t\t\tmodelId: 'model-1',\n\t\t}\n\n\t\tawait service.handleSettingsChanged()\n\n\t\texpect(getActiveSession(service).model).toEqual({\n\t\t\tproviderId: 'provider-1',\n\t\t\tmodelId: 'model-1',\n\t\t})\n\t})\n\n\tit('does not apply default model to an unselected session with message history', async () => {\n\t\tgenerateAssistantTurn.mockResolvedValueOnce({\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant',\n\t\t\t\tcontent: [{ type: 'text', text: 'Initial response' }],\n\t\t\t},\n\t\t\tmeta: {\n\t\t\t\tproviderId: 'provider-1',\n\t\t\t\tproviderName: 'Provider',\n\t\t\t\tmodelName: 'model-a',\n\t\t\t},\n\t\t})\n\n\t\tconst plugin = createPlugin() as any\n\t\tconst service = new ChatService(plugin as never)\n\t\tawait service.ensureSession()\n\t\tawait service.sendMessage('Original message')\n\n\t\tplugin.settings.ai.providers['provider-1'].models = {}\n\t\tplugin.settings.ai.defaultModel = undefined\n\t\tawait service.handleSettingsChanged()\n\n\t\texpect(getActiveSession(service).model).toBeUndefined()\n\n\t\tplugin.settings.ai.providers['provider-1'].models = {\n\t\t\t'model-1': {\n\t\t\t\tid: 'model-1',\n\t\t\t\tname: 'model-a',\n\t\t\t},\n\t\t}\n\t\tplugin.settings.ai.defaultModel = {\n\t\t\tproviderId: 'provider-1',\n\t\t\tmodelId: 'model-1',\n\t\t}\n\n\t\tawait service.handleSettingsChanged()\n\n\t\texpect(getActiveSession(service).model).toBeUndefined()\n\t})\n\n\tit('deletes a thinking session after stopping the active run', async () => {\n\t\tconst response = deferredResult<{\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant'\n\t\t\t\tcontent: { type: 'text'; text: string }[]\n\t\t\t\ttool_calls?: never[]\n\t\t\t}\n\t\t\tmeta: {\n\t\t\t\tproviderId?: string\n\t\t\t\tproviderName?: string\n\t\t\t\tmodelName?: string\n\t\t\t}\n\t\t}>()\n\n\t\tgenerateAssistantTurn.mockImplementationOnce(() => response.promise)\n\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\n\t\tconst sendPromise = service.sendMessage('Delete me while thinking')\n\t\tawait vi.waitFor(() => {\n\t\t\texpect(service.getViewProps().runState).toBe('thinking')\n\t\t})\n\n\t\tconst sessionId = service.getViewProps().activeSessionId!\n\t\tconst deletePromise = service.deleteSession(sessionId)\n\n\t\tresponse.resolve({\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant',\n\t\t\t\tcontent: [{ type: 'text', text: 'Late reply' }],\n\t\t\t},\n\t\t\tmeta: {\n\t\t\t\tproviderId: 'provider-1',\n\t\t\t\tproviderName: 'Provider',\n\t\t\t\tmodelName: 'model-a',\n\t\t\t},\n\t\t})\n\n\t\tawait sendPromise\n\t\tawait deletePromise\n\n\t\texpect(service.getViewProps().activeSessionId).toBeUndefined()\n\t\texpect(service.getViewProps().sessionHistory).toHaveLength(0)\n\t\texpect(await storageState.chatSessionKV.get(sessionId)).toBeNull()\n\t})\n\n\tit('cancels interrupted tasks during rehydration', async () => {\n\t\tgenerateAssistantTurn.mockResolvedValueOnce({\n\t\t\tmessage: {\n\t\t\t\trole: 'assistant',\n\t\t\t\tcontent: [{ type: 'text', text: 'Initial response' }],\n\t\t\t},\n\t\t\tmeta: {\n\t\t\t\tproviderId: 'provider-1',\n\t\t\t\tproviderName: 'Provider',\n\t\t\t\tmodelName: 'model-a',\n\t\t\t},\n\t\t})\n\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tawait service.ensureSession()\n\t\tawait service.sendMessage('Original message')\n\n\t\tconst sessionId = service.getViewProps().activeSessionId!\n\t\tconst stored = await storageState.chatSessionKV.get(sessionId)\n\t\tstored.tasks = [\n\t\t\t{\n\t\t\t\tid: 'task-1',\n\t\t\t\tsessionId,\n\t\t\t\tdepth: 1,\n\t\t\t\tmaxDepth: 2,\n\t\t\t\ttitle: 'Background work',\n\t\t\t\tprompt: 'Do something',\n\t\t\t\tstatus: 'running',\n\t\t\t\tcreatedAt: 1,\n\t\t\t\tstartedAt: 2,\n\t\t\t},\n\t\t]\n\t\tawait storageState.chatSessionKV.set(sessionId, stored)\n\n\t\tconst reloadedService = new ChatService(createPlugin() as never)\n\t\tawait reloadedService.ensureSession()\n\n\t\tconst reloaded = getActiveSession(reloadedService)\n\t\tconst userMessages = reloaded.fragments[0].messages.filter(\n\t\t\t(item: any) => item.message.role === 'user',\n\t\t)\n\t\texpect(userMessages.at(-1)?.message.content?.[0]).toEqual({\n\t\t\ttype: 'text',\n\t\t\ttext: 'Original message',\n\t\t})\n\t\texpect(reloadedService.getViewProps().pendingMessages).toHaveLength(0)\n\t\texpect(reloaded.tasks[0]).toMatchObject({\n\t\t\tstatus: 'cancelled',\n\t\t\tcancelReason: 'interrupted_by_restart',\n\t\t})\n\t})\n\n\tit('coerces numeric string arguments before executing tools', async () => {\n\t\tconst service = new ChatService(createPlugin() as never)\n\t\tconst execute = vi.fn(async (params: Record<string, unknown>) => ({\n\t\t\tresult: {\n\t\t\t\tdepthType: typeof params.depth,\n\t\t\t\tdepth: params.depth,\n\t\t\t\tlimitType: typeof params.limit,\n\t\t\t\tlimit: params.limit,\n\t\t\t},\n\t\t}))\n\n\t\tconst result = await (service as any).executeToolCall(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tname: 'test_tool',\n\t\t\t\t\tdescription: 'test',\n\t\t\t\t\tinputSchema: z.object({\n\t\t\t\t\t\tdepth: z.number().int(),\n\t\t\t\t\t\tlimit: z.number(),\n\t\t\t\t\t}),\n\t\t\t\t\texecute,\n\t\t\t\t},\n\t\t\t],\n\t\t\t'test_tool',\n\t\t\tJSON.stringify({\n\t\t\t\tdepth: 2,\n\t\t\t\tlimit: 20.5,\n\t\t\t}),\n\t\t\t{\n\t\t\t\tsession: { id: 'session-1' },\n\t\t\t\tdepth: 0,\n\t\t\t\tmaxDepth: 2,\n\t\t\t},\n\t\t)\n\n\t\texpect(execute).toHaveBeenCalledOnce()\n\t\texpect(result).toEqual({\n\t\t\tpayload: {\n\t\t\t\tdepthType: 'number',\n\t\t\t\tdepth: 2,\n\t\t\t\tlimitType: 'number',\n\t\t\t\tlimit: 20.5,\n\t\t\t},\n\t\t})\n\t})\n\n\tit('restores files before deleting recalled messages when requested', async () => {\n\t\tconst { plugin, files, folders } = createPluginWithVault({\n\t\t\t'notes/existing.md': 'changed twice',\n\t\t\t'notes/new.md': 'created later',\n\t\t})\n\t\tconst service = new ChatService(plugin as never)\n\t\tawait service.ensureSession()\n\n\t\tconst session = getActiveSession(service)\n\t\tsession.fragments[0].messages = [\n\t\t\t{\n\t\t\t\tid: 'user-1',\n\t\t\t\tcreatedAt: 1,\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'user',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'please change files' }],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'tool-1',\n\t\t\t\tcreatedAt: 2,\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'tool',\n\t\t\t\t\tname: 'bash',\n\t\t\t\t\ttool_call_id: 'tool-call-1',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'done' }],\n\t\t\t\t},\n\t\t\t\treversibleOps: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvaultPath: 'notes/existing.md',\n\t\t\t\t\t\toperation: 'update',\n\t\t\t\t\t\tbefore: {\n\t\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\t\tcontentBase64: Buffer.from('original').toString('base64'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvaultPath: 'notes/new.md',\n\t\t\t\t\t\toperation: 'create',\n\t\t\t\t\t\tbefore: { kind: 'file' },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvaultPath: 'notes/deleted.md',\n\t\t\t\t\t\toperation: 'delete',\n\t\t\t\t\t\tbefore: {\n\t\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\t\tcontentBase64: Buffer.from('restore me').toString('base64'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvaultPath: 'notes/archive',\n\t\t\t\t\t\toperation: 'delete',\n\t\t\t\t\t\tbefore: { kind: 'dir' },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'tool-2',\n\t\t\t\tcreatedAt: 3,\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'tool',\n\t\t\t\t\tname: 'edit_file',\n\t\t\t\t\ttool_call_id: 'tool-call-2',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'done again' }],\n\t\t\t\t},\n\t\t\t\treversibleOps: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvaultPath: 'notes/existing.md',\n\t\t\t\t\t\toperation: 'update',\n\t\t\t\t\t\tbefore: {\n\t\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\t\tcontentBase64: Buffer.from('changed once').toString('base64'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t]\n\n\t\tawait service.recallMessage('user-1', { restoreFiles: true })\n\n\t\texpect(session.fragments[0].messages).toEqual([])\n\t\texpect(files.get('notes/existing.md')).toBe('original')\n\t\texpect(files.has('notes/new.md')).toBe(false)\n\t\texpect(files.get('notes/deleted.md')).toBe('restore me')\n\t\texpect(folders.has('notes/archive')).toBe(true)\n\t})\n\n\tit('normalizes legacy absolute reversible paths when restoring recalled files', async () => {\n\t\tconst files = new Map<string, string>([['notes/new.md', 'created later']])\n\t\tconst folders = new Set<string>(['', 'notes'])\n\t\tconst normalizeWritePath = (path: string) => path.replace(/^\\/+|\\/+$/g, '')\n\t\tconst normalizeLookupPath = (path: string) => path.replace(/\\/+$/g, '')\n\t\tconst dirname = (path: string) =>\n\t\t\t!path || !path.includes('/') ? '' : path.slice(0, path.lastIndexOf('/'))\n\t\tconst ensureFolder = (path: string) => {\n\t\t\tconst normalized = normalizeWritePath(path)\n\t\t\tif (!normalized) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst parent = dirname(normalized)\n\t\t\tif (parent && parent !== normalized) {\n\t\t\t\tensureFolder(parent)\n\t\t\t}\n\t\t\tfolders.add(normalized)\n\t\t}\n\t\tconst getAbstractFileByPath = (path: string): any => {\n\t\t\tconst normalized = normalizeLookupPath(path)\n\t\t\tif (!normalized) {\n\t\t\t\treturn { path: '', children: [] }\n\t\t\t}\n\t\t\tif (normalized.startsWith('/')) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (folders.has(normalized) && !files.has(normalized)) {\n\t\t\t\treturn { path: normalized, children: [] }\n\t\t\t}\n\t\t\tif (files.has(normalized)) {\n\t\t\t\treturn {\n\t\t\t\t\tpath: normalized,\n\t\t\t\t\tstat: { size: files.get(normalized)!.length },\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\t\tconst plugin = {\n\t\t\tapp: {\n\t\t\t\tvault: {\n\t\t\t\t\tgetAbstractFileByPath,\n\t\t\t\t\tasync createFolder(path: string) {\n\t\t\t\t\t\tconst normalized = normalizeWritePath(path)\n\t\t\t\t\t\tensureFolder(normalized)\n\t\t\t\t\t\treturn getAbstractFileByPath(normalized)\n\t\t\t\t\t},\n\t\t\t\t\tasync createBinary(path: string, data: ArrayBuffer) {\n\t\t\t\t\t\tconst normalized = normalizeWritePath(path)\n\t\t\t\t\t\tensureFolder(dirname(normalized))\n\t\t\t\t\t\tfiles.set(normalized, new TextDecoder().decode(data))\n\t\t\t\t\t\treturn getAbstractFileByPath(normalized)\n\t\t\t\t\t},\n\t\t\t\t\tasync modifyBinary(file: any, data: ArrayBuffer) {\n\t\t\t\t\t\tfiles.set(\n\t\t\t\t\t\t\tnormalizeWritePath(file.path),\n\t\t\t\t\t\t\tnew TextDecoder().decode(data),\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\tasync delete(file: any) {\n\t\t\t\t\t\tconst normalized = normalizeWritePath(file.path)\n\t\t\t\t\t\tfiles.delete(normalized)\n\t\t\t\t\t\tfor (const folder of [...folders]) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tfolder === normalized ||\n\t\t\t\t\t\t\t\tfolder.startsWith(`${normalized}/`)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tfolders.delete(folder)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tasync trash(file: any) {\n\t\t\t\t\t\treturn this.delete(file)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tsettings: createPlugin().settings,\n\t\t}\n\n\t\tconst service = new ChatService(plugin as never)\n\t\tawait service.ensureSession()\n\n\t\tconst session = getActiveSession(service)\n\t\tsession.fragments[0].messages = [\n\t\t\t{\n\t\t\t\tid: 'user-1',\n\t\t\t\tcreatedAt: 1,\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'user',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'rename files' }],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'tool-1',\n\t\t\t\tcreatedAt: 2,\n\t\t\t\tmessage: {\n\t\t\t\t\trole: 'tool',\n\t\t\t\t\tname: 'bash',\n\t\t\t\t\ttool_call_id: 'tool-call-1',\n\t\t\t\t\tcontent: [{ type: 'text', text: 'renamed' }],\n\t\t\t\t},\n\t\t\t\treversibleOps: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvaultPath: '/notes/old.md',\n\t\t\t\t\t\toperation: 'delete',\n\t\t\t\t\t\tbefore: {\n\t\t\t\t\t\t\tkind: 'file',\n\t\t\t\t\t\t\tcontentBase64: Buffer.from('original').toString('base64'),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvaultPath: '/notes/new.md',\n\t\t\t\t\t\toperation: 'create',\n\t\t\t\t\t\tbefore: { kind: 'file' },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t]\n\n\t\tawait service.recallMessage('user-1', { restoreFiles: true })\n\n\t\texpect(session.fragments[0].messages).toEqual([])\n\t\texpect(files.has('notes/new.md')).toBe(false)\n\t\texpect(files.get('notes/old.md')).toBe('original')\n\t})\n})\n"
  },
  {
    "path": "src/services/chat.service.ts",
    "content": "import { Notice, normalizePath } from 'obsidian'\nimport {\n\tgetFirstModel,\n\tgetModelById,\n\tgetProviderById,\n\tlistModels,\n\tlistProviders,\n\tresolveInitialSelection,\n} from '~/ai/config'\nimport { createPermissionGuard } from '~/ai/permission-guard'\nimport { assertProviderUsable, generateAssistantTurn } from '~/ai/runtime'\nimport {\n\tREPEATED_TOOL_CALL_THRESHOLD,\n\tToolCallRepeatState,\n\tupdateToolCallRepeatState,\n} from '~/ai/tool-call-repeat'\nimport { createAITools } from '~/ai/tools'\nimport {\n\tAIMessage,\n\tAIMessageContentPart,\n\tAIMessageRecord,\n\tAIProviderConfig,\n\tAISession,\n\tAITaskRecord,\n\tAIToolCall,\n\tAIToolDefinition,\n\tAIToolExecutionContext,\n\tToolExecutionResult,\n} from '~/ai/types'\nimport {\n\tChatFragment,\n\tChatMessage,\n\tChatPendingMessage,\n\tChatRunState,\n\tChatSessionIndexItem,\n\tcloneMessage,\n\tcloneReversibleToolOp,\n\tcloneSession,\n\tcreateQueuedTask,\n\tcreateRunningTask,\n\tisTerminalTask,\n\tmutateTaskRecord,\n\tQueuedChatTask,\n\ttoCancelledTask,\n\ttoCompletedTask,\n\ttoFailedTask,\n\ttoRunningTask,\n} from '~/chat/domain'\nimport type { ChatboxProps, ChatProviderOption } from '~/chatbox/types'\nimport i18n from '~/i18n'\nimport { chatMetaKV, chatSessionKV, type ChatMetaRecord } from '~/storage'\nimport createId from '~/utils/create-id'\nimport logger from '~/utils/logger'\nimport type NutstorePlugin from '..'\n\nconst MAX_TASK_DEPTH = 2\nconst MAX_CONCURRENT_TASKS_PER_SESSION = 3\nconst CHAT_META_KEY = 'chat_meta'\nconst CHAT_INDEX_KEY = 'chat_index'\nconst INTERRUPTED_TASK_CANCEL_REASON = 'interrupted_by_restart'\nconst INTERRUPTED_TASK_FAILURE_STAGE = 'interrupted_by_restart'\nconst COMPRESSION_PROMPT = [\n\t'Summarize the conversation above for continuation in a fresh context.',\n\t'Return a compact but information-dense handoff covering:',\n\t'1. Confirmed facts and file paths.',\n\t'2. Decisions already made.',\n\t'3. Constraints, caveats, and user preferences.',\n\t'4. Unfinished work and the next concrete step.',\n\t'5. Any tool results that remain relevant.',\n\t'Write the summary as a user message that can be pasted into a new chat segment.',\n].join(' ')\n\ninterface ResolvedToolResult {\n\tpayload: string | Record<string, unknown>\n\tisError: boolean\n\treversibleOps?: AIMessageRecord['reversibleOps']\n}\n\ninterface DeferredTaskCompletion {\n\tpromise: Promise<Record<string, unknown>>\n\tresolve: (payload: Record<string, unknown>) => void\n\tsettled: boolean\n}\n\ninterface AgentRunResult {\n\tstatus: 'completed' | 'failed' | 'cancelled'\n\tsummary?: string\n\terror?: string\n\tfailureStage?: string\n\tsourceCount: number\n}\n\ninterface SessionRuntimeState {\n\trunState: ChatRunState\n\tprocessing?: Promise<void>\n\tstopRequested?: boolean\n\tpendingMessages: ChatPendingMessage[]\n}\n\nfunction toTextParts(text: string): AIMessageContentPart[] {\n\treturn [{ type: 'text', text }]\n}\n\nfunction messageToText(message: Pick<ChatMessage, 'content'> | AIMessage) {\n\tif (!message.content) {\n\t\treturn ''\n\t}\n\treturn message.content\n\t\t.filter(\n\t\t\t(part): part is Extract<AIMessageContentPart, { type: 'text' }> =>\n\t\t\t\tpart.type === 'text',\n\t\t)\n\t\t.map((part) => part.text)\n\t\t.join('\\n')\n}\n\nfunction getAssistantToolCalls(message: ChatMessage) {\n\treturn message.role === 'assistant' ? message.tool_calls : undefined\n}\n\nfunction getPathDepth(path: string) {\n\treturn path.split('/').filter(Boolean).length\n}\n\nfunction getParentVaultPaths(path: string) {\n\tconst parts = path.split('/').filter(Boolean)\n\tconst parents: string[] = []\n\tlet current = ''\n\tfor (let index = 0; index < parts.length - 1; index += 1) {\n\t\tcurrent = current ? `${current}/${parts[index]}` : parts[index]\n\t\tparents.push(current)\n\t}\n\treturn parents\n}\n\nfunction normalizeReversibleVaultPath(path: string) {\n\tconst trimmed = path.trim()\n\tif (!trimmed) {\n\t\treturn ''\n\t}\n\tconst normalized = normalizePath(trimmed.replace(/^\\/+/, ''))\n\treturn normalized === '.' ? '' : normalized\n}\n\nfunction normalizeReversibleToolOpRecord(\n\top: NonNullable<AIMessageRecord['reversibleOps']>[number],\n) {\n\tconst normalizedPath = normalizeReversibleVaultPath(op.vaultPath)\n\tif (!normalizedPath) {\n\t\treturn null\n\t}\n\tconst cloned = cloneReversibleToolOp(op)\n\treturn {\n\t\t...cloned,\n\t\tvaultPath: normalizedPath,\n\t}\n}\n\nfunction decodeBase64ToArrayBuffer(contentBase64: string) {\n\tif (typeof Buffer !== 'undefined') {\n\t\tconst buffer = Buffer.from(contentBase64, 'base64')\n\t\treturn buffer.buffer.slice(\n\t\t\tbuffer.byteOffset,\n\t\t\tbuffer.byteOffset + buffer.byteLength,\n\t\t) as ArrayBuffer\n\t}\n\tconst binary = atob(contentBase64)\n\tconst bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0))\n\treturn bytes.buffer.slice(\n\t\tbytes.byteOffset,\n\t\tbytes.byteOffset + bytes.byteLength,\n\t) as ArrayBuffer\n}\n\nfunction isVaultFolder(\n\ttarget: unknown,\n): target is { path: string; children: unknown[] } {\n\treturn !!target && typeof target === 'object' && 'children' in target\n}\n\nfunction isVaultFile(target: unknown): target is { path: string } {\n\treturn !!target && typeof target === 'object' && !('children' in target)\n}\n\nfunction deriveTitle(session: Pick<AISession, 'fragments'>) {\n\tfor (const fragment of session.fragments) {\n\t\tconst firstUser = fragment.messages.find(\n\t\t\t(item) => item.message.role === 'user',\n\t\t)\n\t\tconst content = firstUser ? messageToText(firstUser.message).trim() : ''\n\t\tif (content) {\n\t\t\treturn content\n\t\t}\n\t}\n\treturn i18n.t('chatbox.newChat')\n}\n\nfunction createVaultToolGuidance() {\n\treturn [\n\t\t'For ambiguous user requests, you may broaden exploration when needed to improve answer quality.',\n\t\t'Base answers on evidence from tool results, and cite key file paths or outputs.',\n\t\t'Avoid unbounded exploration, but do not stop when evidence is still weak or conflicting.',\n\t\t'Stop when evidence is sufficient for a grounded answer, or when further tool use is clearly repetitive.',\n\t].join(' ')\n}\n\nfunction createMainSystemPrompt(maxDepth: number) {\n\treturn [\n\t\t'You are an Obsidian chat assistant with access to vault tools.',\n\t\t'Use vault tools directly for focused file operations.',\n\t\t'Use bash when shell-style workflows are more efficient.',\n\t\tcreateVaultToolGuidance(),\n\t\t`Use the spawn tool only for large independent tasks that should run in the background. Maximum task depth is ${maxDepth}.`,\n\t].join(' ')\n}\n\nfunction createSubagentSystemPrompt(canSpawn: boolean) {\n\treturn [\n\t\t'You are a focused background subagent working inside an Obsidian vault.',\n\t\tcreateVaultToolGuidance(),\n\t\tcanSpawn &&\n\t\t\t'Use spawn when this task must be split into smaller independent background tasks.',\n\t\t'When you finish, return a concise final answer. If the task fails, explain the failure clearly.',\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' ')\n}\n\nexport default class ChatService {\n\tprivate readonly loadedSessions = new Map<string, AISession>()\n\tprivate readonly autoApproveRequestsBySessionId = new Map<\n\t\tstring,\n\t\tSet<string>\n\t>()\n\tprivate sessionIndex: ChatSessionIndexItem[] = []\n\tprivate readonly deletedSessionIds = new Set<string>()\n\tprivate pendingProviderId?: string\n\tprivate pendingModelId?: string\n\tprivate activeSessionId?: string\n\tprivate listeners = new Set<() => void>()\n\tprivate readonly runtimeBySessionId = new Map<string, SessionRuntimeState>()\n\tprivate readonly taskModelSelection = new Map<\n\t\tstring,\n\t\t{ providerId: string; modelId: string } | undefined\n\t>()\n\tprivate readonly pendingTaskCompletions = new Map<\n\t\tstring,\n\t\tDeferredTaskCompletion\n\t>()\n\tprivate initialization?: Promise<void>\n\n\tconstructor(private plugin: NutstorePlugin) {}\n\n\tasync initialize() {\n\t\tif (this.initialization) {\n\t\t\treturn this.initialization\n\t\t}\n\n\t\tthis.initialization = this.initializeInternal().catch((error) => {\n\t\t\tthis.initialization = undefined\n\t\t\tthrow error\n\t\t})\n\t\treturn this.initialization\n\t}\n\n\tprivate async initializeInternal() {\n\t\tawait this.loadSessionIndex()\n\n\t\tif (this.sessionIndex.length === 0) {\n\t\t\tconst session = this.createEmptySession()\n\t\t\tthis.activeSessionId = session.id\n\t\t\tthis.loadedSessions.set(session.id, session)\n\t\t\tthis.upsertSessionIndexItem(session)\n\t\t\tawait this.persistSession(session)\n\t\t\tawait this.persistMetaAndIndex()\n\t\t\treturn\n\t\t}\n\n\t\tconst fallbackSessionId =\n\t\t\tthis.activeSessionId &&\n\t\t\tthis.sessionIndex.some((item) => item.id === this.activeSessionId)\n\t\t\t\t? this.activeSessionId\n\t\t\t\t: this.sessionIndex[0]?.id\n\t\tthis.activeSessionId = fallbackSessionId\n\t\tif (fallbackSessionId) {\n\t\t\tawait this.loadSessionById(fallbackSessionId)\n\t\t\tawait this.persistMetaAndIndex()\n\t\t}\n\t}\n\n\tsubscribe(listener: () => void) {\n\t\tthis.listeners.add(listener)\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener)\n\t\t}\n\t}\n\n\tasync handleSettingsChanged() {\n\t\tawait this.initialize()\n\t\tconst persisted: Promise<unknown>[] = []\n\t\tthis.syncPendingSelectionWithSettings()\n\t\tfor (const session of this.loadedSessions.values()) {\n\t\t\tif (this.sanitizeSessionSelection(session)) {\n\t\t\t\tpersisted.push(this.persistSession(session))\n\t\t\t}\n\t\t}\n\n\t\tif (persisted.length > 0) {\n\t\t\tawait Promise.all(persisted)\n\t\t}\n\t\tthis.notify()\n\t}\n\n\tgetViewProps(): ChatboxProps {\n\t\tconst activeSession = this.getLoadedActiveSession()\n\t\tconst activeRuntime = activeSession\n\t\t\t? this.getRuntime(activeSession.id)\n\t\t\t: { runState: 'idle' as const, pendingMessages: [] }\n\t\tconst fallbackSelection = resolveInitialSelection(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tthis.plugin.settings.ai.defaultModel,\n\t\t)\n\t\tconst emptyStateSelection = this.getEmptyStateSelection()\n\t\tconst providerIdForView = activeSession\n\t\t\t? activeSession.model?.providerId\n\t\t\t: emptyStateSelection.providerId || fallbackSelection.providerId\n\t\tconst modelIdForView = activeSession\n\t\t\t? activeSession.model?.modelId\n\t\t\t: emptyStateSelection.modelId || fallbackSelection.modelId\n\t\tconst selectedProvider = getProviderById(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tproviderIdForView,\n\t\t)\n\t\tconst selectedModel = getModelById(selectedProvider, modelIdForView)\n\n\t\treturn {\n\t\t\ttitle:\n\t\t\t\tthis.sessionIndex.find((item) => item.id === this.activeSessionId)\n\t\t\t\t\t?.title || i18n.t('chatbox.newChat'),\n\t\t\tsessionHistory: this.sessionIndex.map((item) => ({\n\t\t\t\t...item,\n\t\t\t})),\n\t\t\tactiveSessionId: this.activeSessionId,\n\t\t\ttimeline: activeSession ? this.buildTimeline(activeSession) : [],\n\t\t\tcurrentSessionTasks: activeSession\n\t\t\t\t? activeSession.tasks\n\t\t\t\t\t\t.slice()\n\t\t\t\t\t\t.sort((left, right) => right.createdAt - left.createdAt)\n\t\t\t\t: [],\n\t\t\totherSessionTasks: this.collectOtherSessionTasks(),\n\t\t\tproviders: listProviders(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t).map<ChatProviderOption>((provider) => ({\n\t\t\t\tid: provider.id,\n\t\t\t\tname: provider.name || i18n.t('settings.ai.unnamedProvider'),\n\t\t\t\tmodels: listModels(provider).map((model) => ({\n\t\t\t\t\tid: model.id,\n\t\t\t\t\tname: model.name || i18n.t('settings.ai.unnamedModel'),\n\t\t\t\t})),\n\t\t\t})),\n\t\t\tselectedProviderId: selectedProvider?.id,\n\t\t\tselectedModelId: selectedModel?.id,\n\t\t\trunState: activeRuntime.runState,\n\t\t\tpendingMessages: activeRuntime.pendingMessages.map((item) => ({\n\t\t\t\t...item,\n\t\t\t})),\n\t\t\tcanSend: true,\n\t\t\tcanCreateFragment: !!activeSession && activeRuntime.runState === 'idle',\n\t\t\tcanCompress:\n\t\t\t\t!!activeSession &&\n\t\t\t\tactiveRuntime.runState === 'idle' &&\n\t\t\t\tthis.getActiveFragment(activeSession).messages.length > 0,\n\t\t\tonNewSession: () => {\n\t\t\t\tvoid this.createSession()\n\t\t\t},\n\t\t\tonNewFragment: () => {\n\t\t\t\tthis.createFragmentForActiveSession()\n\t\t\t},\n\t\t\tonCompressContext: async () => {\n\t\t\t\tawait this.compressContext()\n\t\t\t},\n\t\t\tonSwitchSession: (sessionId: string) => {\n\t\t\t\tvoid this.switchSession(sessionId)\n\t\t\t},\n\t\t\tonDeleteSession: async (sessionId: string) => {\n\t\t\t\tawait this.deleteSession(sessionId)\n\t\t\t},\n\t\t\tonSelectProvider: (providerId: string) => {\n\t\t\t\tthis.selectProvider(providerId)\n\t\t\t},\n\t\t\tonSelectModel: (modelId: string) => {\n\t\t\t\tthis.selectModel(modelId)\n\t\t\t},\n\t\t\tonSendMessage: async (text: string) => {\n\t\t\t\tawait this.sendMessage(text)\n\t\t\t},\n\t\t\tonStopActiveRun: () => {\n\t\t\t\tthis.stopActiveSessionRun()\n\t\t\t},\n\t\t\tonCancelTask: (taskId: string) => {\n\t\t\t\tthis.cancelTask(taskId)\n\t\t\t},\n\t\t\tonDeleteMessage: (messageId: string) => {\n\t\t\t\tthis.deleteMessage(messageId)\n\t\t\t},\n\t\t\tonRegenerateMessage: async (messageId: string) => {\n\t\t\t\tawait this.regenerateMessage(messageId)\n\t\t\t},\n\t\t\tonRecallMessage: async (\n\t\t\t\tmessageId: string,\n\t\t\t\toptions?: { restoreFiles?: boolean },\n\t\t\t) => {\n\t\t\t\tawait this.recallMessage(messageId, options)\n\t\t\t},\n\t\t}\n\t}\n\n\tasync ensureSession() {\n\t\tawait this.initialize()\n\t}\n\n\tasync createSession() {\n\t\tawait this.initialize()\n\t\tconst session = this.createEmptySession()\n\t\tthis.loadedSessions.set(session.id, session)\n\t\tthis.activeSessionId = session.id\n\t\tthis.upsertSessionIndexItem(session, i18n.t('chatbox.newChat'), true)\n\t\tthis.getRuntime(session.id)\n\t\tawait this.persistSession(session)\n\t\tawait this.persistMetaAndIndex()\n\t\tthis.notify()\n\t\treturn session\n\t}\n\n\tasync switchSession(sessionId: string) {\n\t\tawait this.initialize()\n\t\tif (!this.sessionIndex.some((item) => item.id === sessionId)) {\n\t\t\treturn\n\t\t}\n\n\t\tawait this.loadSessionById(sessionId)\n\t\tthis.activeSessionId = sessionId\n\t\tawait this.persistMetaAndIndex()\n\t\tthis.notify()\n\t}\n\n\tasync deleteSession(sessionId: string) {\n\t\tawait this.initialize()\n\t\tif (!this.sessionIndex.some((item) => item.id === sessionId)) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.deletedSessionIds.add(sessionId)\n\t\tconst session = this.loadedSessions.get(sessionId)\n\t\tif (session) {\n\t\t\tawait this.stopSessionRun(session)\n\t\t\tthis.cancelAllNonTerminalTasks(session, 'user_cancelled')\n\t\t\tthis.cleanupSessionTaskTracking(session)\n\t\t}\n\n\t\tthis.sessionIndex = this.sessionIndex.filter(\n\t\t\t(item) => item.id !== sessionId,\n\t\t)\n\t\tif (this.activeSessionId === sessionId) {\n\t\t\tthis.activeSessionId = this.sessionIndex[0]?.id\n\t\t\tif (this.activeSessionId) {\n\t\t\t\tawait this.loadSessionById(this.activeSessionId)\n\t\t\t}\n\t\t}\n\n\t\tthis.loadedSessions.delete(sessionId)\n\t\tthis.runtimeBySessionId.delete(sessionId)\n\t\tthis.autoApproveRequestsBySessionId.delete(sessionId)\n\t\tawait chatSessionKV.unset(sessionId)\n\t\tawait this.persistMetaAndIndex()\n\t\tthis.notify()\n\t\tnew Notice(i18n.t('chatbox.sessionDeleted'))\n\t}\n\n\tselectProvider(providerId: string) {\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session) {\n\t\t\tif (!providerId) {\n\t\t\t\tthis.pendingProviderId = undefined\n\t\t\t\tthis.pendingModelId = undefined\n\t\t\t\tthis.notify()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst provider = getProviderById(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\tproviderId,\n\t\t\t)\n\t\t\tif (!provider) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.pendingProviderId = provider.id\n\t\t\tthis.pendingModelId = getFirstModel(provider)?.id\n\t\t\tthis.notify()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.getRuntime(session.id).runState !== 'idle') {\n\t\t\treturn\n\t\t}\n\t\tif (!providerId) {\n\t\t\tsession.model = undefined\n\t\t\tvoid this.persistSession(session)\n\t\t\tthis.notify()\n\t\t\treturn\n\t\t}\n\n\t\tconst provider = getProviderById(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tproviderId,\n\t\t)\n\t\tif (!provider) {\n\t\t\treturn\n\t\t}\n\n\t\tconst firstModelId = getFirstModel(provider)?.id\n\t\tsession.model = firstModelId\n\t\t\t? { providerId: provider.id, modelId: firstModelId }\n\t\t\t: undefined\n\t\tvoid this.persistSession(session)\n\t\tthis.notify()\n\t}\n\n\tselectModel(modelId: string) {\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session) {\n\t\t\tif (!modelId) {\n\t\t\t\tthis.pendingModelId = undefined\n\t\t\t\tthis.notify()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst provider = getProviderById(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\tthis.pendingProviderId,\n\t\t\t)\n\t\t\tconst model = getModelById(provider, modelId)\n\t\t\tif (!model) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.pendingModelId = model.id\n\t\t\tthis.notify()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.getRuntime(session.id).runState !== 'idle') {\n\t\t\treturn\n\t\t}\n\t\tif (!modelId) {\n\t\t\tsession.model = undefined\n\t\t\tvoid this.persistSession(session)\n\t\t\tthis.notify()\n\t\t\treturn\n\t\t}\n\n\t\tconst provider = getProviderById(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tsession.model?.providerId,\n\t\t)\n\t\tconst model = getModelById(provider, modelId)\n\t\tif (!model || !provider) {\n\t\t\treturn\n\t\t}\n\n\t\tsession.model = { providerId: provider.id, modelId: model.id }\n\t\tvoid this.persistSession(session)\n\t\tthis.notify()\n\t}\n\n\tasync sendMessage(text: string) {\n\t\tawait this.initialize()\n\t\tconst normalizedText = text.trim()\n\t\tif (!normalizedText) {\n\t\t\treturn\n\t\t}\n\n\t\tconst session =\n\t\t\tthis.getLoadedActiveSession() || (await this.createSession())\n\t\tif (!session || !this.validateSessionSelection(session)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (runtime.runState !== 'idle' || runtime.processing) {\n\t\t\truntime.pendingMessages.push(this.createPendingMessage(normalizedText))\n\t\t\tthis.notify()\n\t\t\treturn\n\t\t}\n\n\t\tthis.appendUserMessage(\n\t\t\tthis.getActiveFragment(session),\n\t\t\tnormalizedText,\n\t\t\tsession,\n\t\t)\n\t\tthis.upsertSessionIndexItem(session, deriveTitle(session))\n\t\truntime.runState = 'thinking'\n\t\tawait this.persistSession(session)\n\t\tawait this.persistMetaAndIndex()\n\t\tthis.notify()\n\t\tawait this.startSessionProcessor(session.id)\n\t}\n\n\tcreateFragmentForActiveSession() {\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session) {\n\t\t\treturn\n\t\t}\n\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (runtime.runState !== 'idle' || runtime.processing) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.createFragment(session)\n\t\tvoid this.persistSession(session)\n\t\tthis.notify()\n\t}\n\n\tasync compressContext() {\n\t\tawait this.initialize()\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session) {\n\t\t\treturn\n\t\t}\n\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (runtime.runState !== 'idle' || runtime.processing) {\n\t\t\treturn\n\t\t}\n\t\tif (!this.validateSessionSelection(session)) {\n\t\t\treturn\n\t\t}\n\n\t\tconst sourceFragment = this.getActiveFragment(session)\n\t\truntime.runState = 'compressing'\n\t\tthis.notify()\n\n\t\tconst task = (async () => {\n\t\t\ttry {\n\t\t\t\tif (sourceFragment.messages.length > 0) {\n\t\t\t\t\tconst provider = this.getProviderOrThrow(session)\n\t\t\t\t\tconst model = this.getModelOrThrow(provider, session)\n\t\t\t\t\tconst response = await generateAssistantTurn({\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tmessages: [\n\t\t\t\t\t\t\t...sourceFragment.messages.map((item) => item.message),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\trole: 'user',\n\t\t\t\t\t\t\t\tcontent: toTextParts(COMPRESSION_PROMPT),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttools: [],\n\t\t\t\t\t\t...session.inferenceParams,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (this.deletedSessionIds.has(session.id) || runtime.stopRequested) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tconst summary =\n\t\t\t\t\t\tmessageToText(response.message).trim() || COMPRESSION_PROMPT\n\t\t\t\t\tconst targetFragment = this.createFragment(session)\n\t\t\t\t\ttargetFragment.summary = summary\n\t\t\t\t\tthis.appendUserMessage(targetFragment, summary, session)\n\t\t\t\t\tthis.upsertSessionIndexItem(session, deriveTitle(session))\n\t\t\t\t\tawait this.persistSession(session)\n\t\t\t\t\tawait this.persistMetaAndIndex()\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst provider = getProviderById(\n\t\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\t\tsession.model?.providerId,\n\t\t\t\t)\n\t\t\t\tconst model = getModelById(provider, session.model?.modelId)\n\t\t\t\tthis.reportFatalError(\n\t\t\t\t\tsession,\n\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: i18n.t('chatbox.requestFailed'),\n\t\t\t\t\t{\n\t\t\t\t\t\tproviderId: provider?.id,\n\t\t\t\t\t\tproviderName: provider?.name,\n\t\t\t\t\t\tmodelId: model?.id,\n\t\t\t\t\t\tmodelName: model?.name,\n\t\t\t\t\t},\n\t\t\t\t\tsourceFragment,\n\t\t\t\t)\n\t\t\t\tawait this.persistSession(session)\n\t\t\t} finally {\n\t\t\t\truntime.processing = undefined\n\t\t\t\tif (runtime.pendingMessages.length > 0) {\n\t\t\t\t\truntime.runState = 'idle'\n\t\t\t\t\tthis.notify()\n\t\t\t\t\tvoid this.startSessionProcessor(session.id)\n\t\t\t\t} else {\n\t\t\t\t\truntime.runState = 'idle'\n\t\t\t\t\tthis.notify()\n\t\t\t\t}\n\t\t\t}\n\t\t})()\n\n\t\truntime.processing = task\n\t\tawait task\n\t}\n\n\tcancelTask(taskId: string) {\n\t\tconst session = this.findLoadedSessionByTaskId(taskId)\n\t\tconst rootTask = session?.tasks.find((item) => item.id === taskId)\n\t\tif (!session || !rootTask) {\n\t\t\treturn\n\t\t}\n\n\t\tconst terminalTasks = session.tasks.filter(\n\t\t\t(item) =>\n\t\t\t\titem.id === taskId || this.isTaskDescendantOf(session, item, taskId),\n\t\t)\n\t\tlet changed = false\n\n\t\tfor (const task of terminalTasks) {\n\t\t\tif (this.isTaskTerminal(task)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmutateTaskRecord(\n\t\t\t\ttask,\n\t\t\t\ttoCancelledTask(\n\t\t\t\t\ttask,\n\t\t\t\t\ttask.id === taskId ? 'user_cancelled' : 'ancestor_cancelled',\n\t\t\t\t\tDate.now(),\n\t\t\t\t\ti18n.t('chatbox.task.cancelledSummary', { task: task.title }),\n\t\t\t\t),\n\t\t\t)\n\t\t\tthis.resolveTaskCompletion(task.id, this.buildTaskToolPayload(task))\n\t\t\tthis.cleanupTaskTracking(task.id)\n\t\t\tchanged = true\n\t\t}\n\n\t\tif (changed) {\n\t\t\tvoid this.persistSession(session)\n\t\t\tthis.notify()\n\t\t\tthis.startQueuedTasksForSession(session)\n\t\t}\n\t}\n\n\tstopActiveSessionRun() {\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session) {\n\t\t\treturn\n\t\t}\n\n\t\tvoid this.stopSessionRun(session)\n\t}\n\n\tdeleteMessage(messageId: string) {\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session) {\n\t\t\treturn\n\t\t}\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (runtime.runState !== 'idle') {\n\t\t\treturn\n\t\t}\n\t\tconst fragment = this.getActiveFragment(session)\n\t\tconst idx = fragment.messages.findIndex((record) => record.id === messageId)\n\t\tif (idx === -1) {\n\t\t\treturn\n\t\t}\n\t\tconst target = fragment.messages[idx]\n\t\tif (target.message.role === 'user') {\n\t\t\t// Delete this user message and everything that follows until the next user message\n\t\t\t// (covers assistant replies, tool calls, and tool result messages in any chain depth)\n\t\t\tlet endIdx = idx + 1\n\t\t\twhile (\n\t\t\t\tendIdx < fragment.messages.length &&\n\t\t\t\tfragment.messages[endIdx].message.role !== 'user'\n\t\t\t) {\n\t\t\t\tendIdx++\n\t\t\t}\n\t\t\tfragment.messages.splice(idx, endIdx - idx)\n\t\t} else if (target.message.role === 'tool') {\n\t\t\tconst { tool_call_id: toolCallId } = target.message\n\t\t\t// Remove the matching tool call from the nearest preceding assistant message\n\t\t\tfor (let i = idx - 1; i >= 0; i--) {\n\t\t\t\tconst record = fragment.messages[i]\n\t\t\t\tif (record.message.role === 'user') break\n\t\t\t\tif (\n\t\t\t\t\trecord.message.role === 'assistant' &&\n\t\t\t\t\trecord.message.tool_calls?.some((tc) => tc.id === toolCallId)\n\t\t\t\t) {\n\t\t\t\t\trecord.message = {\n\t\t\t\t\t\t...record.message,\n\t\t\t\t\t\ttool_calls: record.message.tool_calls.filter(\n\t\t\t\t\t\t\t(tc) => tc.id !== toolCallId,\n\t\t\t\t\t\t),\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tfragment.messages.splice(idx, 1)\n\t\t} else {\n\t\t\tfragment.messages.splice(idx, 1)\n\t\t}\n\t\tvoid this.persistSession(session)\n\t\tthis.notify()\n\t}\n\n\tasync recallMessage(messageId: string, options?: { restoreFiles?: boolean }) {\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session) {\n\t\t\treturn\n\t\t}\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (runtime.runState !== 'idle') {\n\t\t\treturn\n\t\t}\n\t\tconst fragment = this.getActiveFragment(session)\n\t\tconst idx = fragment.messages.findIndex((record) => record.id === messageId)\n\t\tif (idx === -1) {\n\t\t\treturn\n\t\t}\n\t\tconst recallRange = fragment.messages.slice(idx)\n\t\tconst reversibleOps = recallRange.flatMap(\n\t\t\t(record) => record.reversibleOps ?? [],\n\t\t)\n\t\ttry {\n\t\t\tif (options?.restoreFiles) {\n\t\t\t\tawait this.restoreFilesForRecall(reversibleOps)\n\t\t\t}\n\t\t\tfragment.messages.splice(idx)\n\t\t\tawait this.persistSession(session)\n\t\t\tthis.notify()\n\t\t} catch (error) {\n\t\t\tnew Notice(error instanceof Error ? error.message : String(error))\n\t\t}\n\t}\n\n\tasync regenerateMessage(messageId: string) {\n\t\tconst session = this.getLoadedActiveSession()\n\t\tif (!session || !this.validateSessionSelection(session)) {\n\t\t\treturn\n\t\t}\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (runtime.runState !== 'idle' || runtime.processing) {\n\t\t\treturn\n\t\t}\n\t\tconst fragment = this.getActiveFragment(session)\n\t\tconst idx = fragment.messages.findIndex((record) => record.id === messageId)\n\t\tif (idx === -1) {\n\t\t\treturn\n\t\t}\n\t\t// Save messages after the target so we can restore them after regeneration\n\t\tconst messagesAfter = fragment.messages.slice(idx + 1)\n\t\tfragment.messages = fragment.messages.slice(0, idx)\n\t\truntime.runState = 'thinking'\n\t\tawait this.persistSession(session)\n\t\tthis.notify()\n\t\tawait this.startSessionProcessor(session.id)\n\t\t// Re-append the saved messages to achieve in-place replacement\n\t\tif (messagesAfter.length > 0) {\n\t\t\tconst updatedFragment = this.getActiveFragment(session)\n\t\t\tupdatedFragment.messages = [...updatedFragment.messages, ...messagesAfter]\n\t\t\tawait this.persistSession(session)\n\t\t\tthis.notify()\n\t\t}\n\t}\n\n\tprivate async stopSessionRun(session: AISession) {\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (\n\t\t\truntime.runState !== 'thinking' &&\n\t\t\truntime.runState !== 'waiting_for_tools' &&\n\t\t\truntime.runState !== 'compressing'\n\t\t) {\n\t\t\treturn\n\t\t}\n\n\t\truntime.stopRequested = true\n\n\t\tconst changed = this.cancelAllNonTerminalTasks(session, 'user_cancelled')\n\n\t\tif (changed) {\n\t\t\tvoid this.persistSession(session)\n\t\t\tthis.notify()\n\t\t\tthis.startQueuedTasksForSession(session)\n\t\t}\n\n\t\tawait runtime.processing\n\t}\n\n\tprivate async loadSessionIndex() {\n\t\tconst [metaRaw, indexRaw] = await Promise.all([\n\t\t\tchatMetaKV.get(CHAT_META_KEY),\n\t\t\tchatMetaKV.get(CHAT_INDEX_KEY),\n\t\t])\n\t\tconst meta = this.isChatMetaRecord(metaRaw)\n\t\t\t? metaRaw\n\t\t\t: { orderedSessionIds: [] }\n\t\tconst index = Array.isArray(indexRaw)\n\t\t\t? indexRaw.filter(\n\t\t\t\t\t(item): item is ChatSessionIndexItem =>\n\t\t\t\t\t\t!!item &&\n\t\t\t\t\t\ttypeof item.id === 'string' &&\n\t\t\t\t\t\ttypeof item.title === 'string' &&\n\t\t\t\t\t\ttypeof item.createdAt === 'number' &&\n\t\t\t\t\t\ttypeof item.updatedAt === 'number',\n\t\t\t\t)\n\t\t\t: []\n\n\t\tconst indexById = new Map(index.map((item) => [item.id, item]))\n\t\tthis.sessionIndex = meta.orderedSessionIds\n\t\t\t.map((sessionId) => indexById.get(sessionId))\n\t\t\t.filter((item): item is ChatSessionIndexItem => !!item)\n\t\tfor (const item of index) {\n\t\t\tif (!meta.orderedSessionIds.includes(item.id)) {\n\t\t\t\tthis.sessionIndex.push(item)\n\t\t\t}\n\t\t}\n\t\tthis.activeSessionId = meta.activeSessionId\n\t}\n\n\tprivate async loadSessionById(sessionId: string) {\n\t\tconst cached = this.loadedSessions.get(sessionId)\n\t\tif (cached) {\n\t\t\treturn cached\n\t\t}\n\n\t\tconst stored = await chatSessionKV.get(sessionId)\n\t\tif (!stored) {\n\t\t\tthrow new Error(i18n.t('chatbox.errors.sessionNotFound'))\n\t\t}\n\n\t\tconst { session, changed } = this.rehydrateSession(stored)\n\t\tthis.loadedSessions.set(sessionId, session)\n\t\tconst runtime = this.getRuntime(sessionId)\n\t\truntime.pendingMessages = []\n\t\tthis.upsertSessionIndexItem(session, deriveTitle(session))\n\t\tif (changed) {\n\t\t\tawait this.persistSession(session)\n\t\t\tawait this.persistMetaAndIndex()\n\t\t}\n\t\treturn session\n\t}\n\n\tprivate async persistSession(session: AISession) {\n\t\tif (this.deletedSessionIds.has(session.id)) {\n\t\t\treturn\n\t\t}\n\t\tawait chatSessionKV.set(session.id, cloneSession(session))\n\t}\n\n\tprivate async persistMetaAndIndex() {\n\t\tconst meta: ChatMetaRecord = {\n\t\t\tactiveSessionId: this.activeSessionId,\n\t\t\torderedSessionIds: this.sessionIndex.map((item) => item.id),\n\t\t}\n\t\tawait Promise.all([\n\t\t\tchatMetaKV.set(CHAT_META_KEY, meta),\n\t\t\tchatMetaKV.set(\n\t\t\t\tCHAT_INDEX_KEY,\n\t\t\t\tthis.sessionIndex.map((item) => ({ ...item })),\n\t\t\t),\n\t\t])\n\t}\n\n\tprivate rehydrateSession(session: AISession) {\n\t\tconst rehydrated = this.normalizeSession(session)\n\t\tlet changed = this.sanitizeSessionSelection(rehydrated)\n\n\t\tfor (const task of rehydrated.tasks) {\n\t\t\tif (task.status !== 'queued' && task.status !== 'running') {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmutateTaskRecord(\n\t\t\t\ttask,\n\t\t\t\ttoCancelledTask(\n\t\t\t\t\ttask,\n\t\t\t\t\tINTERRUPTED_TASK_CANCEL_REASON,\n\t\t\t\t\tDate.now(),\n\t\t\t\t\ti18n.t('chatbox.task.cancelledSummary', { task: task.title }),\n\t\t\t\t),\n\t\t\t)\n\t\t\tchanged = true\n\t\t}\n\n\t\treturn {\n\t\t\tsession: rehydrated,\n\t\t\tchanged,\n\t\t}\n\t}\n\n\tprivate normalizeSession(session: AISession): AISession {\n\t\tconst normalized: AISession = {\n\t\t\tid: session.id,\n\t\t\tcreatedAt: session.createdAt,\n\t\t\tupdatedAt: session.updatedAt || session.createdAt,\n\t\t\tmodel: session.model ? { ...session.model } : undefined,\n\t\t\tsystemPrompt: session.systemPrompt,\n\t\t\tinferenceParams: session.inferenceParams\n\t\t\t\t? { ...session.inferenceParams }\n\t\t\t\t: undefined,\n\t\t\tfragments:\n\t\t\t\tArray.isArray(session.fragments) && session.fragments.length > 0\n\t\t\t\t\t? session.fragments.map((fragment) => ({\n\t\t\t\t\t\t\tid: fragment.id,\n\t\t\t\t\t\t\tcreatedAt: fragment.createdAt,\n\t\t\t\t\t\t\tupdatedAt: fragment.updatedAt || fragment.createdAt,\n\t\t\t\t\t\t\tsummary: fragment.summary,\n\t\t\t\t\t\t\tmessages: Array.isArray(fragment.messages)\n\t\t\t\t\t\t\t\t? fragment.messages.map((message) => ({\n\t\t\t\t\t\t\t\t\t\t...message,\n\t\t\t\t\t\t\t\t\t\treversibleOps: Array.isArray(message.reversibleOps)\n\t\t\t\t\t\t\t\t\t\t\t? message.reversibleOps\n\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(op) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!!op &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttypeof op.vaultPath === 'string' &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(op.operation === 'create' ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\top.operation === 'update' ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\top.operation === 'delete') &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!!op.before &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(op.before.kind === 'file' ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\top.before.kind === 'dir') &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(op.operation !== 'update' ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\top.before.kind === 'file'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t.map(normalizeReversibleToolOpRecord)\n\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\top,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t): op is NonNullable<\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAIMessageRecord['reversibleOps']\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>[number] => !!op,\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\tmessage: cloneMessage(message.message),\n\t\t\t\t\t\t\t\t\t\tmeta: message.meta\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...message.meta,\n\t\t\t\t\t\t\t\t\t\t\t\t\tusage: message.meta.usage\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...message.meta.usage,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t\t\t: [],\n\t\t\t\t\t\t}))\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: createId('fragment'),\n\t\t\t\t\t\t\t\tcreatedAt: Date.now(),\n\t\t\t\t\t\t\t\tupdatedAt: Date.now(),\n\t\t\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\tactiveFragmentId: session.activeFragmentId,\n\t\t\ttasks: Array.isArray(session.tasks)\n\t\t\t\t? session.tasks.map((task) => ({ ...task }))\n\t\t\t\t: [],\n\t\t}\n\n\t\tif (\n\t\t\t!normalized.fragments.some(\n\t\t\t\t(item) => item.id === normalized.activeFragmentId,\n\t\t\t)\n\t\t) {\n\t\t\tnormalized.activeFragmentId =\n\t\t\t\tnormalized.fragments[normalized.fragments.length - 1].id\n\t\t}\n\t\treturn normalized\n\t}\n\n\tprivate isChatMetaRecord(value: unknown): value is ChatMetaRecord {\n\t\treturn (\n\t\t\t!!value &&\n\t\t\ttypeof value === 'object' &&\n\t\t\tArray.isArray((value as ChatMetaRecord).orderedSessionIds)\n\t\t)\n\t}\n\n\tprivate upsertSessionIndexItem(\n\t\tsession: AISession,\n\t\ttitle?: string,\n\t\tprepend = false,\n\t) {\n\t\tif (this.deletedSessionIds.has(session.id)) {\n\t\t\treturn\n\t\t}\n\t\tconst existingTitle =\n\t\t\tthis.sessionIndex.find((e) => e.id === session.id)?.title ??\n\t\t\ti18n.t('chatbox.newChat')\n\t\tconst item: ChatSessionIndexItem = {\n\t\t\tid: session.id,\n\t\t\ttitle: title ?? existingTitle,\n\t\t\tcreatedAt: session.createdAt,\n\t\t\tupdatedAt: session.updatedAt,\n\t\t}\n\t\tconst existingIndex = this.sessionIndex.findIndex(\n\t\t\t(entry) => entry.id === session.id,\n\t\t)\n\t\tif (existingIndex === -1) {\n\t\t\tthis.sessionIndex = prepend\n\t\t\t\t? [item, ...this.sessionIndex]\n\t\t\t\t: [...this.sessionIndex, item]\n\t\t\treturn\n\t\t}\n\n\t\tconst nextIndex = this.sessionIndex.slice()\n\t\tnextIndex[existingIndex] = item\n\t\tif (prepend && existingIndex > 0) {\n\t\t\tnextIndex.splice(existingIndex, 1)\n\t\t\tnextIndex.unshift(item)\n\t\t}\n\t\tthis.sessionIndex = nextIndex\n\t}\n\n\tprivate buildTimeline(session: AISession): ChatboxProps['timeline'] {\n\t\tconst flattenedMessages = session.fragments.flatMap(\n\t\t\t(fragment) => fragment.messages,\n\t\t)\n\n\t\treturn session.fragments.flatMap((fragment) => {\n\t\t\tconst items = fragment.messages.flatMap((message) => {\n\t\t\t\tconst toolMessage =\n\t\t\t\t\tmessage.message.role === 'tool' ? message.message : undefined\n\t\t\t\tif (\n\t\t\t\t\tmessage.message.role === 'assistant' &&\n\t\t\t\t\t!messageToText(message.message).trim() &&\n\t\t\t\t\tmessage.message.content?.every((part) => part.type === 'text') !==\n\t\t\t\t\t\tfalse &&\n\t\t\t\t\tArray.isArray(message.message.tool_calls) &&\n\t\t\t\t\tmessage.message.tool_calls.length > 0\n\t\t\t\t) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `message:${message.id}`,\n\t\t\t\t\t\tkind: 'message' as const,\n\t\t\t\t\t\tcreatedAt: message.createdAt,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\ttoolCall: toolMessage\n\t\t\t\t\t\t\t? flattenedMessages\n\t\t\t\t\t\t\t\t\t.slice(\n\t\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t\tflattenedMessages.findIndex(\n\t\t\t\t\t\t\t\t\t\t\t(item) => item.id === message.id,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.reverse()\n\t\t\t\t\t\t\t\t\t.flatMap((item) => getAssistantToolCalls(item.message) || [])\n\t\t\t\t\t\t\t\t\t.find((toolCall) => toolCall.id === toolMessage.tool_call_id)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: `fragment:${fragment.id}`,\n\t\t\t\t\tkind: 'fragment' as const,\n\t\t\t\t\tcreatedAt: fragment.createdAt,\n\t\t\t\t},\n\t\t\t\t...items,\n\t\t\t]\n\t\t})\n\t}\n\n\tprivate collectOtherSessionTasks() {\n\t\treturn Array.from(this.loadedSessions.values())\n\t\t\t.filter((session) => session.id !== this.activeSessionId)\n\t\t\t.flatMap((session) => session.tasks)\n\t\t\t.sort((left, right) => right.createdAt - left.createdAt)\n\t}\n\n\tprivate getLoadedActiveSession() {\n\t\treturn this.activeSessionId\n\t\t\t? this.loadedSessions.get(this.activeSessionId)\n\t\t\t: undefined\n\t}\n\n\tprivate async startSessionProcessor(sessionId: string) {\n\t\tconst runtime = this.getRuntime(sessionId)\n\t\tif (runtime.processing) {\n\t\t\treturn runtime.processing\n\t\t}\n\n\t\truntime.processing = this.runSessionProcessor(sessionId).finally(() => {\n\t\t\tconst latestRuntime = this.getRuntime(sessionId)\n\t\t\tlatestRuntime.processing = undefined\n\t\t\tif (\n\t\t\t\tlatestRuntime.runState === 'idle' &&\n\t\t\t\tlatestRuntime.pendingMessages.length\n\t\t\t) {\n\t\t\t\tvoid this.startSessionProcessor(sessionId)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (latestRuntime.runState === 'idle') {\n\t\t\t\tthis.notify()\n\t\t\t}\n\t\t})\n\t\treturn runtime.processing\n\t}\n\n\tprivate async runSessionProcessor(sessionId: string) {\n\t\tconst runtime = this.getRuntime(sessionId)\n\t\tconst session = this.loadedSessions.get(sessionId)\n\t\tif (!session) {\n\t\t\truntime.runState = 'idle'\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst provider = this.getProviderOrThrow(session)\n\t\t\tconst model = this.getModelOrThrow(provider, session)\n\t\t\tlet repeatState: ToolCallRepeatState = {\n\t\t\t\tconsecutiveCount: 0,\n\t\t\t\tisRepeatedTooManyTimes: false,\n\t\t\t}\n\n\t\t\twhile (true) {\n\t\t\t\tconst fragment = this.getActiveFragment(session)\n\t\t\t\tconst lastMessage =\n\t\t\t\t\tfragment.messages[fragment.messages.length - 1]?.message\n\n\t\t\t\tif (\n\t\t\t\t\t!lastMessage ||\n\t\t\t\t\t(lastMessage.role !== 'user' && lastMessage.role !== 'tool')\n\t\t\t\t) {\n\t\t\t\t\tconst flushed = this.flushPendingMessages(session)\n\t\t\t\t\tif (!flushed) {\n\t\t\t\t\t\truntime.runState = 'idle'\n\t\t\t\t\t\tthis.notify()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\truntime.runState = 'thinking'\n\t\t\t\tthis.notify()\n\n\t\t\t\tconst tools = this.createToolsForContext(session, 0, MAX_TASK_DEPTH)\n\t\t\t\tconst response = await generateAssistantTurn({\n\t\t\t\t\tprovider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tmessages: this.buildMessagesForFragment(fragment, session),\n\t\t\t\t\ttools,\n\t\t\t\t\t...session.inferenceParams,\n\t\t\t\t})\n\n\t\t\t\tif (this.deletedSessionIds.has(session.id)) {\n\t\t\t\t\truntime.stopRequested = false\n\t\t\t\t\truntime.runState = 'idle'\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (runtime.stopRequested) {\n\t\t\t\t\tfragment.messages.push(\n\t\t\t\t\t\tthis.createMessageRecord(response.message, {\n\t\t\t\t\t\t\tmeta: { ...response.meta, modelId: model.id },\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tthis.finishStoppedSessionRun(session, fragment)\n\t\t\t\t\tawait this.persistSession(session)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfragment.messages.push(\n\t\t\t\t\tthis.createMessageRecord(response.message, {\n\t\t\t\t\t\tmeta: { ...response.meta, modelId: model.id },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tfragment.updatedAt = Date.now()\n\t\t\t\tsession.updatedAt = Date.now()\n\t\t\t\tawait this.persistSession(session)\n\t\t\t\tthis.notify()\n\n\t\t\t\tconst assistantToolCalls = getAssistantToolCalls(response.message)\n\t\t\t\tif (!assistantToolCalls?.length) {\n\t\t\t\t\truntime.runState = 'idle'\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\trepeatState = updateToolCallRepeatState(repeatState, assistantToolCalls)\n\t\t\t\tif (repeatState.isRepeatedTooManyTimes) {\n\t\t\t\t\tthis.reportFatalError(\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\ti18n.t('chatbox.repeatedToolCallsStopped', {\n\t\t\t\t\t\t\tcount: REPEATED_TOOL_CALL_THRESHOLD,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\t\t\tproviderName: provider.name,\n\t\t\t\t\t\t\tmodelId: model.id,\n\t\t\t\t\t\t\tmodelName: model.name,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfragment,\n\t\t\t\t\t)\n\t\t\t\t\truntime.runState = 'idle'\n\t\t\t\t\tawait this.persistSession(session)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\truntime.runState = 'waiting_for_tools'\n\t\t\t\tthis.notify()\n\n\t\t\t\tconst toolMessages = await this.resolveToolCalls(\n\t\t\t\t\tassistantToolCalls,\n\t\t\t\t\ttools,\n\t\t\t\t\t{\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tdepth: 0,\n\t\t\t\t\t\tmaxDepth: MAX_TASK_DEPTH,\n\t\t\t\t\t},\n\t\t\t\t)\n\n\t\t\t\tif (runtime.stopRequested) {\n\t\t\t\t\tthis.finishStoppedSessionRun(session, fragment)\n\t\t\t\t\tawait this.persistSession(session)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfor (const item of toolMessages) {\n\t\t\t\t\tfragment.messages.push(\n\t\t\t\t\t\tthis.createMessageRecord(item.message, {\n\t\t\t\t\t\t\tisError: item.isError,\n\t\t\t\t\t\t\treversibleOps: item.reversibleOps,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tawait this.persistSession(session)\n\t\t\t\tthis.notify()\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this.deletedSessionIds.has(session.id)) {\n\t\t\t\truntime.runState = 'idle'\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst activeProvider = getProviderById(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\tsession.model?.providerId,\n\t\t\t)\n\t\t\tconst activeModel = getModelById(activeProvider, session.model?.modelId)\n\t\t\tthis.reportFatalError(\n\t\t\t\tsession,\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: i18n.t('chatbox.requestFailed'),\n\t\t\t\t{\n\t\t\t\t\tproviderId: activeProvider?.id,\n\t\t\t\t\tproviderName: activeProvider?.name,\n\t\t\t\t\tmodelId: activeModel?.id,\n\t\t\t\t\tmodelName: activeModel?.name,\n\t\t\t\t},\n\t\t\t\tthis.getActiveFragment(session),\n\t\t\t)\n\t\t\truntime.runState = 'idle'\n\t\t\tawait this.persistSession(session)\n\t\t}\n\t}\n\n\tprivate flushPendingMessages(session: AISession) {\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tif (runtime.pendingMessages.length === 0) {\n\t\t\treturn false\n\t\t}\n\n\t\tconst mergedText = runtime.pendingMessages\n\t\t\t.map((item) => item.text.trim())\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n\\n')\n\t\truntime.pendingMessages = []\n\t\tif (!mergedText) {\n\t\t\tthis.notify()\n\t\t\treturn false\n\t\t}\n\n\t\tconst fragment = this.getActiveFragment(session)\n\t\tthis.appendUserMessage(fragment, mergedText, session)\n\t\tthis.upsertSessionIndexItem(session, deriveTitle(session))\n\t\tvoid this.persistSession(session)\n\t\tvoid this.persistMetaAndIndex()\n\t\tthis.notify()\n\t\treturn true\n\t}\n\n\tprivate getRuntime(sessionId: string): SessionRuntimeState {\n\t\tlet runtime = this.runtimeBySessionId.get(sessionId)\n\t\tif (!runtime) {\n\t\t\truntime = {\n\t\t\t\trunState: 'idle',\n\t\t\t\tpendingMessages: [],\n\t\t\t}\n\t\t\tthis.runtimeBySessionId.set(sessionId, runtime)\n\t\t}\n\t\treturn runtime\n\t}\n\n\tprivate getAutoApproveRequests(sessionId: string) {\n\t\tlet requests = this.autoApproveRequestsBySessionId.get(sessionId)\n\t\tif (!requests) {\n\t\t\trequests = new Set<string>()\n\t\t\tthis.autoApproveRequestsBySessionId.set(sessionId, requests)\n\t\t}\n\t\treturn requests\n\t}\n\n\tprivate createPendingMessage(text: string): ChatPendingMessage {\n\t\treturn {\n\t\t\tid: createId('pending'),\n\t\t\tcreatedAt: Date.now(),\n\t\t\ttext,\n\t\t}\n\t}\n\n\tprivate createFragment(session: AISession): ChatFragment {\n\t\tconst now = Date.now()\n\t\tconst fragment: ChatFragment = {\n\t\t\tid: createId('fragment'),\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tmessages: [],\n\t\t}\n\t\tsession.fragments = [...session.fragments, fragment]\n\t\tsession.activeFragmentId = fragment.id\n\t\treturn fragment\n\t}\n\n\tprivate getActiveFragment(session: AISession) {\n\t\treturn (\n\t\t\tsession.fragments.find((item) => item.id === session.activeFragmentId) ||\n\t\t\tsession.fragments[session.fragments.length - 1]\n\t\t)\n\t}\n\n\tprivate appendUserMessage(\n\t\tfragment: ChatFragment,\n\t\ttext: string,\n\t\tsession?: AISession,\n\t) {\n\t\tconst now = Date.now()\n\t\tfragment.updatedAt = now\n\t\tif (session) {\n\t\t\tsession.updatedAt = now\n\t\t}\n\t\tfragment.messages.push(\n\t\t\tthis.createMessageRecord({\n\t\t\t\trole: 'user',\n\t\t\t\tcontent: toTextParts(text),\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate finishStoppedSessionRun(session: AISession, fragment: ChatFragment) {\n\t\tconst runtime = this.getRuntime(session.id)\n\t\tthis.removeUnmatchedToolCalls(fragment)\n\t\truntime.stopRequested = false\n\t\truntime.runState = 'idle'\n\t\tthis.notify()\n\t}\n\n\tprivate cancelAllNonTerminalTasks(session: AISession, cancelReason: string) {\n\t\tlet changed = false\n\t\tfor (const task of session.tasks) {\n\t\t\tif (this.isTaskTerminal(task)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmutateTaskRecord(\n\t\t\t\ttask,\n\t\t\t\ttoCancelledTask(\n\t\t\t\t\ttask,\n\t\t\t\t\tcancelReason,\n\t\t\t\t\tDate.now(),\n\t\t\t\t\ti18n.t('chatbox.task.cancelledSummary', { task: task.title }),\n\t\t\t\t),\n\t\t\t)\n\t\t\tthis.resolveTaskCompletion(task.id, this.buildTaskToolPayload(task))\n\t\t\tthis.cleanupTaskTracking(task.id)\n\t\t\tchanged = true\n\t\t}\n\t\treturn changed\n\t}\n\n\tprivate cleanupSessionTaskTracking(session: AISession) {\n\t\tfor (const task of session.tasks) {\n\t\t\tthis.cleanupTaskTracking(task.id)\n\t\t}\n\t}\n\n\tprivate async runTask(task: AITaskRecord) {\n\t\tconst session = this.loadedSessions.get(task.sessionId)\n\t\tconst selection = this.taskModelSelection.get(task.id)\n\t\tif (!session || !selection?.providerId || !selection.modelId) {\n\t\t\tthis.finishTaskAsFailed(\n\t\t\t\ttask,\n\t\t\t\ti18n.t('chatbox.errors.taskSessionUnavailable'),\n\t\t\t\t'session_invalid',\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst provider = this.getProviderByIdOrThrow(selection.providerId)\n\t\t\tconst model = this.getModelByIdsOrThrow(provider, selection.modelId)\n\t\t\tconst result = await this.runBackgroundTaskLoop(\n\t\t\t\ttask,\n\t\t\t\tsession,\n\t\t\t\tprovider,\n\t\t\t\tmodel,\n\t\t\t)\n\n\t\t\tif (task.status === 'cancelled') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (result.status === 'completed') {\n\t\t\t\tthis.finishTaskAsCompleted(\n\t\t\t\t\ttask,\n\t\t\t\t\tresult.summary || '',\n\t\t\t\t\tresult.sourceCount,\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (result.status === 'cancelled') {\n\t\t\t\tthis.finishTaskAsCancelled(task, 'user_cancelled')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.finishTaskAsFailed(\n\t\t\t\ttask,\n\t\t\t\tresult.error || i18n.t('chatbox.requestFailed'),\n\t\t\t\tresult.failureStage,\n\t\t\t\tresult.sourceCount,\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tif (task.status === 'cancelled') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.finishTaskAsFailed(\n\t\t\t\ttask,\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: i18n.t('chatbox.requestFailed'),\n\t\t\t\t'runtime_error',\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate async runBackgroundTaskLoop(\n\t\ttask: AITaskRecord,\n\t\tsession: AISession,\n\t\tprovider: AIProviderConfig,\n\t\tmodel: { id: string },\n\t): Promise<AgentRunResult> {\n\t\tconst tools = this.createToolsForContext(\n\t\t\tsession,\n\t\t\ttask.depth,\n\t\t\ttask.maxDepth,\n\t\t\ttask.id,\n\t\t)\n\t\tconst messages: AIMessage[] = [\n\t\t\t{\n\t\t\t\trole: 'system',\n\t\t\t\tcontent: toTextParts(\n\t\t\t\t\tcreateSubagentSystemPrompt(task.depth < task.maxDepth),\n\t\t\t\t),\n\t\t\t},\n\t\t\t{\n\t\t\t\trole: 'user',\n\t\t\t\tcontent: toTextParts(task.prompt),\n\t\t\t},\n\t\t]\n\t\tlet sourceCount = 0\n\t\tlet repeatState: ToolCallRepeatState = {\n\t\t\tconsecutiveCount: 0,\n\t\t\tisRepeatedTooManyTimes: false,\n\t\t}\n\n\t\twhile (true) {\n\t\t\tif (task.status === 'cancelled') {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'cancelled',\n\t\t\t\t\tsourceCount,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst response = await generateAssistantTurn({\n\t\t\t\tprovider,\n\t\t\t\tmodel: model.id,\n\t\t\t\tmessages,\n\t\t\t\ttools,\n\t\t\t\t...session.inferenceParams,\n\t\t\t})\n\t\t\tmessages.push(response.message)\n\n\t\t\tconst assistantToolCalls = getAssistantToolCalls(response.message)\n\t\t\tif (!assistantToolCalls?.length) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'completed',\n\t\t\t\t\tsummary:\n\t\t\t\t\t\tmessageToText(response.message).trim() ||\n\t\t\t\t\t\ti18n.t('chatbox.task.emptyResult'),\n\t\t\t\t\tsourceCount,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trepeatState = updateToolCallRepeatState(repeatState, assistantToolCalls)\n\t\t\tif (repeatState.isRepeatedTooManyTimes) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\terror: i18n.t('chatbox.repeatedToolCallsStopped', {\n\t\t\t\t\t\tcount: REPEATED_TOOL_CALL_THRESHOLD,\n\t\t\t\t\t}),\n\t\t\t\t\tfailureStage: 'repeated_tool_calls',\n\t\t\t\t\tsourceCount,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst toolMessages = await this.resolveToolCalls(\n\t\t\t\tassistantToolCalls,\n\t\t\t\ttools,\n\t\t\t\t{\n\t\t\t\t\tsession,\n\t\t\t\t\tdepth: task.depth,\n\t\t\t\t\tmaxDepth: task.maxDepth,\n\t\t\t\t\tparentTaskId: task.id,\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tfor (const item of toolMessages) {\n\t\t\t\tmessages.push(item.message)\n\t\t\t\tsourceCount += 1\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async resolveToolCalls(\n\t\ttoolCalls: AIToolCall[],\n\t\ttools: AIToolDefinition[],\n\t\tcontext: AIToolExecutionContext,\n\t) {\n\t\tconst results = await Promise.all(\n\t\t\ttoolCalls.map((toolCall) =>\n\t\t\t\tthis.resolveSingleToolCall(toolCall, tools, context),\n\t\t\t),\n\t\t)\n\n\t\treturn toolCalls.map((toolCall, index) => ({\n\t\t\tmessage: {\n\t\t\t\trole: 'tool' as const,\n\t\t\t\tcontent: toTextParts(\n\t\t\t\t\ttypeof results[index].payload === 'string'\n\t\t\t\t\t\t? results[index].payload\n\t\t\t\t\t\t: JSON.stringify(results[index].payload, null, 2),\n\t\t\t\t),\n\t\t\t\tname: toolCall.function.name,\n\t\t\t\ttool_call_id: toolCall.id,\n\t\t\t},\n\t\t\tisError: results[index].isError,\n\t\t\treversibleOps: results[index].reversibleOps,\n\t\t}))\n\t}\n\n\tprivate async resolveSingleToolCall(\n\t\ttoolCall: AIToolCall,\n\t\ttools: AIToolDefinition[],\n\t\tcontext: AIToolExecutionContext,\n\t): Promise<ResolvedToolResult> {\n\t\tif (toolCall.function.name === 'spawn') {\n\t\t\tconst payload = await this.startSpawnedTask(\n\t\t\t\ttoolCall.function.arguments || '{}',\n\t\t\t\tcontext,\n\t\t\t)\n\t\t\treturn {\n\t\t\t\tpayload,\n\t\t\t\tisError: payload.status !== 'completed',\n\t\t\t}\n\t\t}\n\n\t\tconst result = await this.executeToolCall(\n\t\t\ttools,\n\t\t\ttoolCall.function.name,\n\t\t\ttoolCall.function.arguments || '{}',\n\t\t\tcontext,\n\t\t)\n\t\treturn {\n\t\t\tpayload: result.payload,\n\t\t\treversibleOps: result.reversibleOps,\n\t\t\tisError: typeof result.payload === 'object' && !!result.payload.error,\n\t\t}\n\t}\n\n\tprivate startSpawnedTask(\n\t\trawArgs: string,\n\t\tcontext: AIToolExecutionContext,\n\t): Promise<Record<string, unknown>> {\n\t\ttry {\n\t\t\tconst params = JSON.parse(rawArgs) as Record<string, unknown>\n\t\t\tconst promptText = this.requireToolString(params.task, 'task')\n\t\t\tconst title =\n\t\t\t\ttypeof params.label === 'string' && params.label.trim()\n\t\t\t\t\t? params.label.trim()\n\t\t\t\t\t: undefined\n\t\t\treturn this.spawnTask({\n\t\t\t\tprompt: promptText,\n\t\t\t\ttitle,\n\t\t\t\tparentTaskId: context.parentTaskId,\n\t\t\t\tdepth: context.depth + 1,\n\t\t\t\tmaxDepth: context.maxDepth,\n\t\t\t\tsessionId: context.session.id,\n\t\t\t})\n\t\t} catch (error) {\n\t\t\treturn Promise.resolve({\n\t\t\t\ttask_id: null,\n\t\t\t\tparent_task_id: context.parentTaskId ?? null,\n\t\t\t\tlabel: null,\n\t\t\t\ttask: null,\n\t\t\t\tstatus: 'failed',\n\t\t\t\tresult_summary: null,\n\t\t\t\terror_summary: error instanceof Error ? error.message : String(error),\n\t\t\t\tfailure_stage: 'invalid_arguments',\n\t\t\t\tcancel_reason: null,\n\t\t\t\tdepth: context.depth + 1,\n\t\t\t\tmax_depth: context.maxDepth,\n\t\t\t\tstarted_at: null,\n\t\t\t\tfinished_at: Date.now(),\n\t\t\t\tsource_count: null,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate spawnTask(params: {\n\t\tprompt: string\n\t\ttitle?: string\n\t\tparentTaskId?: string\n\t\tdepth: number\n\t\tmaxDepth: number\n\t\tsessionId: string\n\t}) {\n\t\tconst session = this.loadedSessions.get(params.sessionId)\n\t\tif (!session) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tthis.buildImmediateTaskFailurePayload(\n\t\t\t\t\tparams,\n\t\t\t\t\ti18n.t('chatbox.errors.sessionNotFound'),\n\t\t\t\t\t'session_invalid',\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tif (params.depth > params.maxDepth) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tthis.buildImmediateTaskFailurePayload(\n\t\t\t\t\tparams,\n\t\t\t\t\ti18n.t('chatbox.errors.taskDepthExceeded'),\n\t\t\t\t\t'depth_limit',\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\n\t\tconst shouldQueue =\n\t\t\tthis.countRunningTasksForSession(session) >=\n\t\t\tMAX_CONCURRENT_TASKS_PER_SESSION\n\n\t\tconst taskId = createId('task')\n\t\tconst taskBase = {\n\t\t\tid: taskId,\n\t\t\tsessionId: session.id,\n\t\t\tparentTaskId: params.parentTaskId,\n\t\t\tdepth: params.depth,\n\t\t\tmaxDepth: params.maxDepth,\n\t\t\ttitle: params.title || params.prompt.slice(0, 48),\n\t\t\tprompt: params.prompt,\n\t\t\tcreatedAt: Date.now(),\n\t\t}\n\t\tconst task: AITaskRecord = shouldQueue\n\t\t\t? createQueuedTask(taskBase)\n\t\t\t: createRunningTask(taskBase, Date.now())\n\t\tconst deferred = this.createDeferredTaskCompletion()\n\n\t\tsession.tasks = [task, ...session.tasks]\n\t\tthis.taskModelSelection.set(task.id, session.model)\n\t\tthis.pendingTaskCompletions.set(task.id, deferred)\n\t\tvoid this.persistSession(session)\n\t\tthis.notify()\n\n\t\tif (shouldQueue) {\n\t\t\tthis.startQueuedTasksForSession(session)\n\t\t} else {\n\t\t\tvoid this.runTask(task)\n\t\t}\n\n\t\treturn deferred.promise\n\t}\n\n\tprivate finishTaskAsCompleted(\n\t\ttask: AITaskRecord,\n\t\tsummary: string,\n\t\tsourceCount: number,\n\t) {\n\t\tif (task.status !== 'running') {\n\t\t\treturn\n\t\t}\n\t\tmutateTaskRecord(\n\t\t\ttask,\n\t\t\ttoCompletedTask(\n\t\t\t\ttask,\n\t\t\t\tsummary || i18n.t('chatbox.task.emptyResult'),\n\t\t\t\tsourceCount,\n\t\t\t\tDate.now(),\n\t\t\t),\n\t\t)\n\t\tconst session = this.loadedSessions.get(task.sessionId)\n\t\tif (session) {\n\t\t\tvoid this.persistSession(session)\n\t\t}\n\t\tthis.notify()\n\t\tthis.resolveTaskCompletion(task.id, this.buildTaskToolPayload(task))\n\t\tthis.cleanupTaskTracking(task.id)\n\t\tif (session) {\n\t\t\tthis.startQueuedTasksForSession(session)\n\t\t}\n\t}\n\n\tprivate finishTaskAsFailed(\n\t\ttask: AITaskRecord,\n\t\tmessage: string,\n\t\tfailureStage?: string,\n\t\tsourceCount?: number,\n\t) {\n\t\tif (task.status !== 'queued' && task.status !== 'running') {\n\t\t\treturn\n\t\t}\n\t\tmutateTaskRecord(\n\t\t\ttask,\n\t\t\ttoFailedTask(task, message, Date.now(), failureStage, sourceCount),\n\t\t)\n\t\tconst session = this.loadedSessions.get(task.sessionId)\n\t\tif (session) {\n\t\t\tvoid this.persistSession(session)\n\t\t}\n\t\tthis.notify()\n\t\tthis.resolveTaskCompletion(task.id, this.buildTaskToolPayload(task))\n\t\tthis.cleanupTaskTracking(task.id)\n\t\tif (session) {\n\t\t\tthis.startQueuedTasksForSession(session)\n\t\t}\n\t}\n\n\tprivate finishTaskAsCancelled(task: AITaskRecord, cancelReason: string) {\n\t\tif (task.status === 'queued' || task.status === 'running') {\n\t\t\tmutateTaskRecord(\n\t\t\t\ttask,\n\t\t\t\ttoCancelledTask(\n\t\t\t\t\ttask,\n\t\t\t\t\tcancelReason,\n\t\t\t\t\tDate.now(),\n\t\t\t\t\ti18n.t('chatbox.task.cancelledSummary', { task: task.title }),\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tconst session = this.loadedSessions.get(task.sessionId)\n\t\tif (session) {\n\t\t\tvoid this.persistSession(session)\n\t\t}\n\t\tthis.notify()\n\t\tthis.resolveTaskCompletion(task.id, this.buildTaskToolPayload(task))\n\t\tthis.cleanupTaskTracking(task.id)\n\t\tif (session) {\n\t\t\tthis.startQueuedTasksForSession(session)\n\t\t}\n\t}\n\n\tprivate countRunningTasksForSession(session: AISession) {\n\t\treturn session.tasks.filter((item) => item.status === 'running').length\n\t}\n\n\tprivate startQueuedTasksForSession(session: AISession) {\n\t\tif (this.deletedSessionIds.has(session.id)) {\n\t\t\treturn\n\t\t}\n\t\twhile (\n\t\t\tthis.countRunningTasksForSession(session) <\n\t\t\tMAX_CONCURRENT_TASKS_PER_SESSION\n\t\t) {\n\t\t\tconst nextTask = session.tasks\n\t\t\t\t.filter((item) => item.status === 'queued')\n\t\t\t\t.sort((left, right) => left.createdAt - right.createdAt)[0]\n\n\t\t\tif (!nextTask) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tmutateTaskRecord(\n\t\t\t\tnextTask,\n\t\t\t\ttoRunningTask(nextTask as QueuedChatTask, Date.now()),\n\t\t\t)\n\t\t\tvoid this.persistSession(session)\n\t\t\tthis.notify()\n\t\t\tvoid this.runTask(nextTask)\n\t\t}\n\t}\n\n\tprivate createToolsForContext(\n\t\tsession: AISession,\n\t\tdepth: number,\n\t\tmaxDepth: number,\n\t\tparentTaskId?: string,\n\t) {\n\t\tconst allowSpawn = depth < maxDepth\n\t\tconst permissionGuard = createPermissionGuard(\n\t\t\tthis.plugin.app,\n\t\t\t() => this.plugin.settings,\n\t\t\t{\n\t\t\t\thas: (signature) =>\n\t\t\t\t\tthis.getAutoApproveRequests(session.id).has(signature),\n\t\t\t\tadd: (signature) => {\n\t\t\t\t\tthis.getAutoApproveRequests(session.id).add(signature)\n\t\t\t\t},\n\t\t\t},\n\t\t)\n\t\treturn createAITools(this.plugin.app, {\n\t\t\tallowSpawn,\n\t\t\tpermissionGuard,\n\t\t\tspawnTask: async (params) => ({\n\t\t\t\ttask_id: null,\n\t\t\t\tparent_task_id: parentTaskId || params.parentTaskId || null,\n\t\t\t\tlabel: params.title || params.prompt.slice(0, 48),\n\t\t\t\ttask: params.prompt,\n\t\t\t\tstatus: 'running',\n\t\t\t\tdepth: params.depth,\n\t\t\t\tmax_depth: params.maxDepth,\n\t\t\t\tasync: true,\n\t\t\t}),\n\t\t})\n\t}\n\n\tprivate async executeToolCall(\n\t\ttools: AIToolDefinition[],\n\t\tname: string,\n\t\targs: string,\n\t\tcontext: AIToolExecutionContext,\n\t) {\n\t\tconst tool = new Map(tools.map((item) => [item.name, item])).get(name)\n\t\tlet result: ToolExecutionResult\n\n\t\ttry {\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\ti18n.t('chatbox.errors.unknownTool', {\n\t\t\t\t\t\tname,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tconst parsedArgs = JSON.parse(args) as Record<string, unknown>\n\t\t\tconst params = tool.inputSchema.parse(parsedArgs)\n\t\t\tresult = await tool.execute(params, context)\n\t\t} catch (error) {\n\t\t\tlogger.error(error)\n\t\t\tresult = {\n\t\t\t\tresult: {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tpayload: result.result,\n\t\t\treversibleOps: result.reversibleOps\n\t\t\t\t?.map(normalizeReversibleToolOpRecord)\n\t\t\t\t.filter(\n\t\t\t\t\t(op): op is NonNullable<AIMessageRecord['reversibleOps']>[number] =>\n\t\t\t\t\t\t!!op,\n\t\t\t\t),\n\t\t}\n\t}\n\n\tprivate buildMessagesForFragment(\n\t\tfragment: ChatFragment,\n\t\tsession: AISession,\n\t): AIMessage[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'system',\n\t\t\t\tcontent: toTextParts(\n\t\t\t\t\tsession.systemPrompt || createMainSystemPrompt(MAX_TASK_DEPTH),\n\t\t\t\t),\n\t\t\t},\n\t\t\t...fragment.messages.map((item) => item.message),\n\t\t]\n\t}\n\n\tprivate async restoreFilesForRecall(\n\t\toperations: NonNullable<AIMessageRecord['reversibleOps']>,\n\t) {\n\t\tconst normalizedOperations = operations\n\t\t\t.map(normalizeReversibleToolOpRecord)\n\t\t\t.filter(\n\t\t\t\t(op): op is NonNullable<AIMessageRecord['reversibleOps']>[number] =>\n\t\t\t\t\t!!op,\n\t\t\t)\n\t\tif (normalizedOperations.length === 0) {\n\t\t\treturn\n\t\t}\n\n\t\tconst earliestByPath = new Map<\n\t\t\tstring,\n\t\t\t(typeof normalizedOperations)[number]\n\t\t>()\n\t\tfor (const operation of normalizedOperations) {\n\t\t\tif (!earliestByPath.has(operation.vaultPath)) {\n\t\t\t\tearliestByPath.set(operation.vaultPath, operation)\n\t\t\t}\n\t\t}\n\n\t\tconst deletePaths = new Set<string>()\n\t\tconst restoreDirs = new Set<string>()\n\t\tconst restoreFiles = new Map<string, string>()\n\n\t\tfor (const operation of earliestByPath.values()) {\n\t\t\tif (operation.operation === 'create') {\n\t\t\t\tdeletePaths.add(operation.vaultPath)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (operation.operation === 'update') {\n\t\t\t\trestoreFiles.set(operation.vaultPath, operation.before.contentBase64)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (operation.before.kind === 'dir') {\n\t\t\t\trestoreDirs.add(operation.vaultPath)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\trestoreFiles.set(operation.vaultPath, operation.before.contentBase64)\n\t\t}\n\n\t\tfor (const path of [...deletePaths].sort((left, right) => {\n\t\t\tconst depthDelta = getPathDepth(right) - getPathDepth(left)\n\t\t\treturn depthDelta !== 0 ? depthDelta : left.localeCompare(right)\n\t\t})) {\n\t\t\tawait this.deleteVaultPathIfExists(path)\n\t\t}\n\n\t\tconst requiredDirs = new Set<string>(restoreDirs)\n\t\tfor (const filePath of restoreFiles.keys()) {\n\t\t\tfor (const parentPath of getParentVaultPaths(filePath)) {\n\t\t\t\trequiredDirs.add(parentPath)\n\t\t\t}\n\t\t}\n\n\t\tfor (const path of [...requiredDirs].sort((left, right) => {\n\t\t\tconst depthDelta = getPathDepth(left) - getPathDepth(right)\n\t\t\treturn depthDelta !== 0 ? depthDelta : left.localeCompare(right)\n\t\t})) {\n\t\t\tawait this.ensureVaultDirectory(path)\n\t\t}\n\n\t\tfor (const filePath of [...restoreFiles.keys()].sort((left, right) => {\n\t\t\tconst depthDelta = getPathDepth(left) - getPathDepth(right)\n\t\t\treturn depthDelta !== 0 ? depthDelta : left.localeCompare(right)\n\t\t})) {\n\t\t\tawait this.writeVaultFile(filePath, restoreFiles.get(filePath) || '')\n\t\t}\n\t}\n\n\tprivate async deleteVaultPathIfExists(path: string) {\n\t\tconst target = this.plugin.app.vault.getAbstractFileByPath(path)\n\t\tif (!target) {\n\t\t\treturn\n\t\t}\n\t\tif (typeof this.plugin.app.vault.delete === 'function') {\n\t\t\tawait this.plugin.app.vault.delete(target, true)\n\t\t\treturn\n\t\t}\n\t\tif (typeof this.plugin.app.vault.trash === 'function') {\n\t\t\tawait this.plugin.app.vault.trash(target, false)\n\t\t\treturn\n\t\t}\n\t\tthrow new Error(`Unable to delete ${path}: vault delete is unavailable.`)\n\t}\n\n\tprivate async ensureVaultDirectory(path: string) {\n\t\tif (!path) {\n\t\t\treturn\n\t\t}\n\t\tconst target = this.plugin.app.vault.getAbstractFileByPath(path)\n\t\tif (target) {\n\t\t\tif (isVaultFolder(target)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow new Error(`Unable to restore ${path}: a file already exists there.`)\n\t\t}\n\t\tawait this.plugin.app.vault.createFolder(path)\n\t}\n\n\tprivate async writeVaultFile(path: string, contentBase64: string) {\n\t\tconst data = decodeBase64ToArrayBuffer(contentBase64)\n\t\tconst existing = this.plugin.app.vault.getAbstractFileByPath(path)\n\t\tif (existing && isVaultFolder(existing)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unable to restore ${path}: a directory already exists there.`,\n\t\t\t)\n\t\t}\n\t\tif (existing && isVaultFile(existing)) {\n\t\t\tawait this.plugin.app.vault.modifyBinary(existing as never, data)\n\t\t\treturn\n\t\t}\n\t\tawait this.plugin.app.vault.createBinary(path, data)\n\t}\n\n\tprivate removeUnmatchedToolCalls(fragment: ChatFragment) {\n\t\tconst resolvedToolCallIds = new Set(\n\t\t\tfragment.messages.flatMap((item) =>\n\t\t\t\titem.message.role === 'tool' && item.message.tool_call_id\n\t\t\t\t\t? [item.message.tool_call_id]\n\t\t\t\t\t: [],\n\t\t\t),\n\t\t)\n\n\t\tfragment.messages = fragment.messages.filter((record) => {\n\t\t\tif (\n\t\t\t\trecord.message.role !== 'assistant' ||\n\t\t\t\t!record.message.tool_calls?.length\n\t\t\t) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tconst nextToolCalls = record.message.tool_calls.filter((toolCall) =>\n\t\t\t\tresolvedToolCallIds.has(toolCall.id),\n\t\t\t)\n\t\t\tconst hasText = !!messageToText(record.message).trim()\n\t\t\tif (!hasText && nextToolCalls.length === 0) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\trecord.message =\n\t\t\t\tnextToolCalls.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\trole: 'assistant',\n\t\t\t\t\t\t\tcontent: hasText\n\t\t\t\t\t\t\t\t? record.message.content || toTextParts('')\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\ttool_calls: nextToolCalls,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\trole: 'assistant',\n\t\t\t\t\t\t\tcontent: record.message.content || toTextParts(''),\n\t\t\t\t\t\t}\n\t\t\treturn true\n\t\t})\n\t}\n\n\tprivate buildTaskToolPayload(task: AITaskRecord) {\n\t\treturn {\n\t\t\ttask_id: task.id,\n\t\t\tparent_task_id: task.parentTaskId ?? null,\n\t\t\tlabel: task.title,\n\t\t\ttask: task.prompt,\n\t\t\tstatus: task.status,\n\t\t\tresult_summary:\n\t\t\t\ttask.status === 'completed' ? (task.summary ?? null) : null,\n\t\t\terror_summary:\n\t\t\t\ttask.status === 'failed' ? task.error || task.summary || null : null,\n\t\t\tfailure_stage:\n\t\t\t\ttask.status === 'failed' ? (task.failureStage ?? null) : null,\n\t\t\tcancel_reason:\n\t\t\t\ttask.status === 'cancelled' ? (task.cancelReason ?? null) : null,\n\t\t\tdepth: task.depth,\n\t\t\tmax_depth: task.maxDepth,\n\t\t\tstarted_at: 'startedAt' in task ? (task.startedAt ?? null) : null,\n\t\t\tfinished_at: 'finishedAt' in task ? (task.finishedAt ?? null) : null,\n\t\t\tsource_count:\n\t\t\t\ttask.status === 'completed'\n\t\t\t\t\t? task.sourceCount\n\t\t\t\t\t: task.status === 'failed'\n\t\t\t\t\t\t? (task.sourceCount ?? null)\n\t\t\t\t\t\t: null,\n\t\t}\n\t}\n\n\tprivate buildImmediateTaskFailurePayload(\n\t\tparams: {\n\t\t\tprompt: string\n\t\t\ttitle?: string\n\t\t\tparentTaskId?: string\n\t\t\tdepth: number\n\t\t\tmaxDepth: number\n\t\t},\n\t\tmessage: string,\n\t\tfailureStage: string,\n\t) {\n\t\treturn {\n\t\t\ttask_id: null,\n\t\t\tparent_task_id: params.parentTaskId ?? null,\n\t\t\tlabel: params.title || params.prompt.slice(0, 48),\n\t\t\ttask: params.prompt,\n\t\t\tstatus: 'failed',\n\t\t\tresult_summary: null,\n\t\t\terror_summary: message,\n\t\t\tfailure_stage: failureStage,\n\t\t\tcancel_reason: null,\n\t\t\tdepth: params.depth,\n\t\t\tmax_depth: params.maxDepth,\n\t\t\tstarted_at: null,\n\t\t\tfinished_at: Date.now(),\n\t\t\tsource_count: null,\n\t\t}\n\t}\n\n\tprivate createDeferredTaskCompletion(): DeferredTaskCompletion {\n\t\tlet resolve!: (payload: Record<string, unknown>) => void\n\t\tconst deferred: DeferredTaskCompletion = {\n\t\t\tpromise: new Promise<Record<string, unknown>>((nextResolve) => {\n\t\t\t\tresolve = nextResolve\n\t\t\t}),\n\t\t\tresolve: (payload) => {\n\t\t\t\tdeferred.settled = true\n\t\t\t\tresolve(payload)\n\t\t\t},\n\t\t\tsettled: false,\n\t\t}\n\t\treturn deferred\n\t}\n\n\tprivate resolveTaskCompletion(\n\t\ttaskId: string,\n\t\tpayload: Record<string, unknown>,\n\t) {\n\t\tconst deferred = this.pendingTaskCompletions.get(taskId)\n\t\tif (!deferred || deferred.settled) {\n\t\t\treturn\n\t\t}\n\t\tdeferred.resolve(payload)\n\t\tthis.pendingTaskCompletions.delete(taskId)\n\t}\n\n\tprivate cleanupTaskTracking(taskId: string) {\n\t\tthis.pendingTaskCompletions.delete(taskId)\n\t\tthis.taskModelSelection.delete(taskId)\n\t}\n\n\tprivate requireToolString(value: unknown, field: string) {\n\t\tif (typeof value !== 'string' || !value.trim()) {\n\t\t\tthrow new Error(i18n.t('chatbox.errors.toolFieldRequired', { field }))\n\t\t}\n\t\treturn value.trim()\n\t}\n\n\tprivate isTaskTerminal(task: AITaskRecord) {\n\t\treturn isTerminalTask(task)\n\t}\n\n\tprivate isTaskDescendantOf(\n\t\tsession: AISession,\n\t\ttask: AITaskRecord,\n\t\tancestorTaskId: string,\n\t): boolean {\n\t\tlet currentParentId = task.parentTaskId\n\t\twhile (currentParentId) {\n\t\t\tif (currentParentId === ancestorTaskId) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tcurrentParentId = session.tasks.find(\n\t\t\t\t(item) => item.id === currentParentId,\n\t\t\t)?.parentTaskId\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate getProviderOrThrow(session: AISession) {\n\t\tconst provider = getProviderById(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tsession.model?.providerId,\n\t\t)\n\t\tif (!provider) {\n\t\t\tthrow new Error(i18n.t('chatbox.errors.noProvider'))\n\t\t}\n\t\tassertProviderUsable(provider)\n\t\treturn provider\n\t}\n\n\tprivate getProviderByIdOrThrow(providerId: string) {\n\t\tconst provider = getProviderById(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tproviderId,\n\t\t)\n\t\tif (!provider) {\n\t\t\tthrow new Error(i18n.t('chatbox.errors.noProvider'))\n\t\t}\n\t\tassertProviderUsable(provider)\n\t\treturn provider\n\t}\n\n\tprivate getModelOrThrow(provider: AIProviderConfig, session: AISession) {\n\t\tconst model = getModelById(provider, session.model?.modelId)\n\t\tif (!model) {\n\t\t\tthrow new Error(i18n.t('chatbox.errors.noModel'))\n\t\t}\n\t\treturn model\n\t}\n\n\tprivate getModelByIdsOrThrow(provider: AIProviderConfig, modelId: string) {\n\t\tconst model = getModelById(provider, modelId)\n\t\tif (!model) {\n\t\t\tthrow new Error(i18n.t('chatbox.errors.noModel'))\n\t\t}\n\t\treturn model\n\t}\n\n\tprivate createEmptySession(): AISession {\n\t\tconst { providerId, modelId } = this.getInitialSelectionForNewSession()\n\t\tconst now = Date.now()\n\t\tconst fragment: ChatFragment = {\n\t\t\tid: createId('fragment'),\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tmessages: [],\n\t\t}\n\n\t\treturn {\n\t\t\tid: createId('session'),\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tmodel: providerId && modelId ? { providerId, modelId } : undefined,\n\t\t\tfragments: [fragment],\n\t\t\tactiveFragmentId: fragment.id,\n\t\t\ttasks: [],\n\t\t}\n\t}\n\n\tprivate createMessageRecord(\n\t\tmessage: AIMessage,\n\t\toptions?: {\n\t\t\tmeta?: AIMessageRecord['meta']\n\t\t\tisError?: boolean\n\t\t\treversibleOps?: AIMessageRecord['reversibleOps']\n\t\t},\n\t): AIMessageRecord {\n\t\treturn {\n\t\t\tid: createId('message'),\n\t\t\tcreatedAt: Date.now(),\n\t\t\tmessage,\n\t\t\tmeta: options?.meta,\n\t\t\tisError: options?.isError,\n\t\t\treversibleOps: options?.reversibleOps\n\t\t\t\t?.map(normalizeReversibleToolOpRecord)\n\t\t\t\t.filter(\n\t\t\t\t\t(op): op is NonNullable<AIMessageRecord['reversibleOps']>[number] =>\n\t\t\t\t\t\t!!op,\n\t\t\t\t),\n\t\t}\n\t}\n\n\tprivate sanitizeSessionSelection(session: AISession) {\n\t\tif (!session.model) {\n\t\t\tif (this.sessionHasMessages(session)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst fallbackSelection = resolveInitialSelection(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\tthis.plugin.settings.ai.defaultModel,\n\t\t\t)\n\t\t\tconst fallbackProvider = getProviderById(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\tfallbackSelection.providerId,\n\t\t\t)\n\t\t\tconst fallbackModel = getModelById(\n\t\t\t\tfallbackProvider,\n\t\t\t\tfallbackSelection.modelId,\n\t\t\t)\n\t\t\tif (!fallbackProvider || !fallbackModel) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tsession.model = {\n\t\t\t\tproviderId: fallbackProvider.id,\n\t\t\t\tmodelId: fallbackModel.id,\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\n\t\tconst provider = getProviderById(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tsession.model?.providerId,\n\t\t)\n\t\tif (!provider) {\n\t\t\tsession.model = undefined\n\t\t\treturn true\n\t\t}\n\n\t\tconst nextModelId =\n\t\t\tgetModelById(provider, session.model?.modelId)?.id ||\n\t\t\tgetFirstModel(provider)?.id\n\t\tconst nextModel = nextModelId\n\t\t\t? { providerId: provider.id, modelId: nextModelId }\n\t\t\t: undefined\n\t\tconst changed =\n\t\t\tsession.model?.providerId !== provider.id ||\n\t\t\tsession.model?.modelId !== nextModelId\n\t\tsession.model = nextModel\n\t\treturn changed\n\t}\n\n\tprivate sessionHasMessages(session: AISession) {\n\t\treturn session.fragments.some((fragment) => fragment.messages.length > 0)\n\t}\n\n\tprivate getInitialSelectionForNewSession() {\n\t\tconst emptyStateSelection = this.getEmptyStateSelection()\n\t\treturn {\n\t\t\tproviderId: emptyStateSelection.providerId,\n\t\t\tmodelId: emptyStateSelection.modelId,\n\t\t}\n\t}\n\n\tprivate getEmptyStateSelection() {\n\t\tconst defaults = resolveInitialSelection(\n\t\t\tthis.plugin.settings.ai.providers,\n\t\t\tthis.plugin.settings.ai.defaultModel,\n\t\t)\n\t\tconst provider =\n\t\t\tgetProviderById(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\tthis.pendingProviderId,\n\t\t\t) ||\n\t\t\tgetProviderById(this.plugin.settings.ai.providers, defaults.providerId)\n\t\tconst model =\n\t\t\tgetModelById(provider, this.pendingModelId) ||\n\t\t\tgetModelById(provider, defaults.modelId) ||\n\t\t\tgetFirstModel(provider)\n\n\t\treturn {\n\t\t\tproviderId: provider?.id,\n\t\t\tmodelId: model?.id,\n\t\t}\n\t}\n\n\tprivate syncPendingSelectionWithSettings() {\n\t\tconst normalized = this.getEmptyStateSelection()\n\t\tthis.pendingProviderId = normalized.providerId\n\t\tthis.pendingModelId = normalized.modelId\n\t}\n\n\tprivate findLoadedSessionByTaskId(taskId: string) {\n\t\tfor (const session of this.loadedSessions.values()) {\n\t\t\tif (session.tasks.some((task) => task.id === taskId)) {\n\t\t\t\treturn session\n\t\t\t}\n\t\t}\n\t\treturn undefined\n\t}\n\n\tprivate notify() {\n\t\tfor (const listener of this.listeners) {\n\t\t\tlistener()\n\t\t}\n\t}\n\n\tprivate validateSessionSelection(session: AISession) {\n\t\ttry {\n\t\t\tconst provider = this.getProviderOrThrow(session)\n\t\t\tthis.getModelOrThrow(provider, session)\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : i18n.t('chatbox.requestFailed')\n\t\t\tlogger.error(error)\n\t\t\tnew Notice(message)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tprivate reportFatalError(\n\t\tsession: AISession,\n\t\tmessage: string,\n\t\tmeta?: AIMessageRecord['meta'],\n\t\tfragment: ChatFragment = this.getActiveFragment(session),\n\t) {\n\t\tlogger.error(message)\n\t\tnew Notice(message)\n\t\tfragment.messages.push(\n\t\t\tthis.createMessageRecord(\n\t\t\t\t{\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\tcontent: toTextParts(message),\n\t\t\t\t},\n\t\t\t\t{ meta, isError: true },\n\t\t\t),\n\t\t)\n\t\tthis.notify()\n\t}\n}\n"
  },
  {
    "path": "src/services/command.service.ts",
    "content": "import { Notice } from 'obsidian'\nimport SyncConfirmModal from '~/components/SyncConfirmModal'\nimport { emitCancelSync } from '~/events'\nimport i18n from '~/i18n'\nimport { NutstoreSync, SyncStartMode } from '~/sync'\nimport logger from '~/utils/logger'\nimport { CHATBOX_VIEW_TYPE } from '~/views/chatbox.view'\nimport NutstorePlugin from '..'\n\nexport default class CommandService {\n\tconstructor(plugin: NutstorePlugin) {\n\t\tplugin.addCommand({\n\t\t\tid: 'start-sync',\n\t\t\tname: i18n.t('sync.startButton'),\n\t\t\ticon: 'refresh-cw',\n\t\t\tcheckCallback: (checking) => {\n\t\t\t\tif (plugin.isSyncing) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (checking) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\t// 检查账号配置\n\t\t\t\tif (!plugin.isAccountConfigured()) {\n\t\t\t\t\tnew Notice(i18n.t('sync.error.accountNotConfigured'))\n\t\t\t\t\t// 打开设置页面，引导用户配置账号\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst setting = plugin.app.setting\n\t\t\t\t\t\tif (setting) {\n\t\t\t\t\t\t\tsetting.open()\n\t\t\t\t\t\t\tsetting.openTabById(plugin.manifest.id)\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger.error('Failed to open settings:', error)\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst startSync = async () => {\n\t\t\t\t\tconst sync = new NutstoreSync(plugin, {\n\t\t\t\t\t\twebdav: await plugin.webDAVService.createWebDAVClient(),\n\t\t\t\t\t\tvault: plugin.app.vault,\n\t\t\t\t\t\ttoken: await plugin.getToken(),\n\t\t\t\t\t\tremoteBaseDir: plugin.remoteBaseDir,\n\t\t\t\t\t})\n\t\t\t\t\tawait sync.start({\n\t\t\t\t\t\tmode: SyncStartMode.MANUAL_SYNC,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (plugin.settings.confirmBeforeSync) {\n\t\t\t\t\tnew SyncConfirmModal(plugin.app, startSync).open()\n\t\t\t\t} else {\n\t\t\t\t\tstartSync()\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\n\t\tplugin.addCommand({\n\t\t\tid: 'open-chatbox',\n\t\t\tname: i18n.t('chatbox.openCommand'),\n\t\t\ticon: 'bot',\n\t\t\tcallback: async () => {\n\t\t\t\tconst existingLeaf =\n\t\t\t\t\tplugin.app.workspace.getLeavesOfType(CHATBOX_VIEW_TYPE)[0]\n\t\t\t\tconst leaf = existingLeaf || plugin.app.workspace.getRightLeaf(false)\n\t\t\t\tif (!leaf) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait leaf.setViewState({\n\t\t\t\t\ttype: CHATBOX_VIEW_TYPE,\n\t\t\t\t\tactive: true,\n\t\t\t\t})\n\t\t\t\tplugin.app.workspace.revealLeaf(leaf)\n\t\t\t},\n\t\t})\n\n\t\tplugin.addCommand({\n\t\t\tid: 'stop-sync',\n\t\t\tname: i18n.t('sync.stopButton'),\n\t\t\ticon: 'x-circle',\n\t\t\tcheckCallback: (checking) => {\n\t\t\t\tif (plugin.isSyncing) {\n\t\t\t\t\tif (!checking) {\n\t\t\t\t\t\temitCancelSync()\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t},\n\t\t})\n\n\t\tplugin.addCommand({\n\t\t\tid: 'show-sync-progress',\n\t\t\tname: i18n.t('sync.showProgressButton'),\n\t\t\ticon: 'activity',\n\t\t\tcallback: () => {\n\t\t\t\tplugin.progressService.showProgressModal()\n\t\t\t},\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "src/services/events.service.ts",
    "content": "import { Notice } from 'obsidian'\nimport { Subscription } from 'rxjs'\nimport {\n\tonEndSync,\n\tonPreparingSync,\n\tonStartSync,\n\tonSyncError,\n\tonSyncProgress,\n} from '~/events'\nimport i18n from '~/i18n'\nimport { is503Error } from '~/utils/is-503-error'\nimport NutstorePlugin from '..'\n\nexport default class EventsService {\n\tsubscriptions: Subscription[]\n\n\tconstructor(private plugin: NutstorePlugin) {\n\t\tthis.subscriptions = [\n\t\t\tonPreparingSync().subscribe(({ showNotice }) => {\n\t\t\t\tplugin.toggleSyncUI(true)\n\t\t\t\tplugin.statusService.updateSyncStatus({\n\t\t\t\t\ttext: i18n.t('sync.preparing'),\n\t\t\t\t\tshowNotice,\n\t\t\t\t})\n\t\t\t}),\n\n\t\t\tonStartSync().subscribe(({ showNotice }) => {\n\t\t\t\tplugin.statusService.updateSyncStatus({\n\t\t\t\t\ttext: i18n.t('sync.start'),\n\t\t\t\t\tshowNotice,\n\t\t\t\t})\n\t\t\t}),\n\n\t\t\tonSyncProgress().subscribe((progress) => {\n\t\t\t\tconst percent =\n\t\t\t\t\tMath.round((progress.completed.length / progress.total) * 10000) / 100\n\t\t\t\tplugin.statusService.updateSyncStatus({\n\t\t\t\t\ttext: i18n.t('sync.progress', { percent }),\n\t\t\t\t})\n\t\t\t}),\n\n\t\t\tonEndSync().subscribe(async ({ failedCount, showNotice }) => {\n\t\t\t\tplugin.toggleSyncUI(false)\n\t\t\t\tconst now = Date.now()\n\t\t\t\tplugin.statusService.setLastSyncTime(now, failedCount)\n\t\t\t\tif (showNotice) {\n\t\t\t\t\tconst text =\n\t\t\t\t\t\tfailedCount > 0\n\t\t\t\t\t\t\t? i18n.t('sync.completeWithFailed', { failedCount })\n\t\t\t\t\t\t\t: i18n.t('sync.complete')\n\t\t\t\t\tnew Notice(text)\n\t\t\t\t}\n\t\t\t}),\n\n\t\t\tonSyncError().subscribe((error) => {\n\t\t\t\tplugin.toggleSyncUI(false)\n\t\t\t\tplugin.statusService.updateSyncStatus({\n\t\t\t\t\ttext: i18n.t('sync.failedStatus'),\n\t\t\t\t\tisError: true,\n\t\t\t\t\tshowNotice: false,\n\t\t\t\t})\n\t\t\t\tnew Notice(\n\t\t\t\t\ti18n.t('sync.failedWithError', {\n\t\t\t\t\t\terror: is503Error(error)\n\t\t\t\t\t\t\t? i18n.t('sync.error.requestsTooFrequent')\n\t\t\t\t\t\t\t: error.message,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t]\n\t}\n\n\tunload() {\n\t\tthis.subscriptions.forEach((subscription) => subscription.unsubscribe())\n\t}\n}\n"
  },
  {
    "path": "src/services/i18n.service.ts",
    "content": "import i18n from '~/i18n'\nimport { useSettings } from '~/settings'\nimport logger from '~/utils/logger'\nimport NutstorePlugin from '..'\n\nexport default class I18nService {\n\tconstructor(private plugin: NutstorePlugin) {\n\t\tthis.update()\n\t}\n\n\tupdate = async () => {\n\t\ttry {\n\t\t\tconst settings = await useSettings()\n\t\t\tif (settings.language) {\n\t\t\t\ti18n.changeLanguage(settings.language.toLowerCase())\n\t\t\t} else {\n\t\t\t\tconst code = navigator.language.split('-')[0]\n\t\t\t\ti18n.changeLanguage(code.toLowerCase())\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tlogger.error(e)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/services/logger.service.ts",
    "content": "import { moment } from 'obsidian'\nimport { IN_DEV } from '~/consts'\nimport logger from '~/utils/logger'\nimport NutstorePlugin from '..'\n\nexport default class LoggerService {\n\tlogs: any[] = []\n\n\tconstructor(private plugin: NutstorePlugin) {\n\t\tif (IN_DEV) {\n\t\t\tlogger.addReporter({\n\t\t\t\tlog: (logObj) => {\n\t\t\t\t\tconst log = [\n\t\t\t\t\t\tmoment(logObj.date).format('YYYY-MM-DD HH:mm:ss'),\n\t\t\t\t\t\tlogObj.type,\n\t\t\t\t\t\tlogObj.args,\n\t\t\t\t\t]\n\t\t\t\t\tthis.logs.push(log)\n\t\t\t\t},\n\t\t\t})\n\t\t} else {\n\t\t\tlogger.setReporters([\n\t\t\t\t{\n\t\t\t\t\tlog: (logObj) => {\n\t\t\t\t\t\tthis.logs.push(logObj)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t}\n\t}\n\n\tclear() {\n\t\tthis.logs = []\n\t}\n}\n"
  },
  {
    "path": "src/services/progress.service.ts",
    "content": "import { throttle } from 'lodash-es'\nimport { Notice } from 'obsidian'\nimport SyncProgressModal from '../components/SyncProgressModal'\nimport {\n\tonEndSync,\n\tonStartSync,\n\tonSyncProgress,\n\tUpdateSyncProgress,\n} from '../events'\nimport i18n from '../i18n'\nimport NutstorePlugin from '../index'\n\nexport class ProgressService {\n\tprivate progressModal: SyncProgressModal | null = null\n\n\tpublic syncProgress: UpdateSyncProgress = {\n\t\ttotal: 0,\n\t\tcompleted: [],\n\t}\n\n\tsyncEnd = false\n\n\tprivate subscriptions = [\n\t\tonStartSync().subscribe(() => {\n\t\t\tthis.syncEnd = false\n\t\t\tthis.resetProgress()\n\t\t}),\n\t\tonEndSync().subscribe(() => {\n\t\t\tthis.syncEnd = true\n\t\t\tthis.updateModal()\n\t\t}),\n\t\tonSyncProgress().subscribe((p) => {\n\t\t\tthis.syncProgress = p\n\t\t\tthis.updateModal()\n\t\t}),\n\t]\n\n\tconstructor(private plugin: NutstorePlugin) {}\n\n\tupdateModal = throttle(() => {\n\t\tif (this.progressModal) {\n\t\t\tthis.progressModal.update()\n\t\t}\n\t}, 200)\n\n\tpublic resetProgress() {\n\t\tthis.syncProgress = {\n\t\t\ttotal: 0,\n\t\t\tcompleted: [],\n\t\t}\n\t}\n\n\tpublic showProgressModal() {\n\t\tif (!this.plugin.isSyncing) {\n\t\t\tnew Notice(i18n.t('sync.notSyncing'))\n\t\t\treturn\n\t\t}\n\t\tthis.closeProgressModal()\n\t\tthis.progressModal = new SyncProgressModal(this.plugin)\n\t\tthis.progressModal.open()\n\t}\n\n\tpublic closeProgressModal() {\n\t\tif (this.progressModal) {\n\t\t\tthis.progressModal.close()\n\t\t\tthis.progressModal = null\n\t\t}\n\t}\n\n\tpublic unload() {\n\t\tthis.subscriptions.forEach((sub) => sub.unsubscribe())\n\t\tthis.closeProgressModal()\n\t}\n}\n"
  },
  {
    "path": "src/services/realtime-sync.service.ts",
    "content": "import { debounce } from 'lodash-es'\nimport { useSettings } from '~/settings'\nimport { SyncStartMode } from '~/sync'\nimport waitUntil from '~/utils/wait-until'\nimport NutstorePlugin from '..'\nimport type SyncExecutorService from './sync-executor.service'\n\nexport default class RealtimeSyncService {\n\tprivate waiting = false\n\n\tprivate submitDirectly = async () => {\n\t\tif (this.waiting) {\n\t\t\treturn\n\t\t}\n\t\tthis.waiting = true\n\t\tawait waitUntil(() => this.plugin.isSyncing === false, 500)\n\t\tthis.waiting = false\n\t\tawait this.syncExecutor.executeSync({ mode: SyncStartMode.AUTO_SYNC })\n\t}\n\n\tprivate submitSyncRequest = debounce(this.submitDirectly, 8000)\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate syncExecutor: SyncExecutorService,\n\t) {\n\t\tthis.plugin.registerEvent(\n\t\t\tthis.vault.on('create', async () => {\n\t\t\t\tconst settings = await useSettings()\n\t\t\t\tif (!settings.realtimeSync) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait this.submitSyncRequest()\n\t\t\t}),\n\t\t)\n\t\tthis.plugin.registerEvent(\n\t\t\tthis.vault.on('delete', async () => {\n\t\t\t\tconst settings = await useSettings()\n\t\t\t\tif (!settings.realtimeSync) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait this.submitSyncRequest()\n\t\t\t}),\n\t\t)\n\t\tthis.plugin.registerEvent(\n\t\t\tthis.vault.on('modify', async () => {\n\t\t\t\tconst settings = await useSettings()\n\t\t\t\tif (!settings.realtimeSync) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait this.submitSyncRequest()\n\t\t\t}),\n\t\t)\n\t\tthis.plugin.registerEvent(\n\t\t\tthis.vault.on('rename', async () => {\n\t\t\t\tconst settings = await useSettings()\n\t\t\t\tif (!settings.realtimeSync) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tawait this.submitSyncRequest()\n\t\t\t}),\n\t\t)\n\t}\n\n\tget vault() {\n\t\treturn this.plugin.app.vault\n\t}\n\n\tunload() {\n\t\tthis.submitSyncRequest.cancel()\n\t}\n}\n"
  },
  {
    "path": "src/services/scheduled-sync.service.ts",
    "content": "import { clamp } from 'lodash-es'\nimport { useSettings } from '~/settings'\nimport { SyncStartMode } from '~/sync'\nimport type NutstorePlugin from '..'\nimport type SyncExecutorService from './sync-executor.service'\n\nexport default class ScheduledSyncService {\n\tprivate autoSyncTimer: number | null = null\n\tprivate startupSyncTimer: number | null = null\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate syncExecutor: SyncExecutorService,\n\t) {}\n\n\tasync start() {\n\t\tconst settings = await useSettings()\n\n\t\tif (settings.startupSyncDelaySeconds > 0) {\n\t\t\tthis.startupSyncTimer = window.setTimeout(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.syncExecutor.executeSync({\n\t\t\t\t\t\tmode: SyncStartMode.AUTO_SYNC,\n\t\t\t\t\t})\n\t\t\t\t} finally {\n\t\t\t\t\tthis.startTimer(settings.autoSyncIntervalSeconds)\n\t\t\t\t}\n\t\t\t}, settings.startupSyncDelaySeconds * 1000)\n\t\t} else {\n\t\t\tthis.startTimer(settings.autoSyncIntervalSeconds)\n\t\t}\n\t}\n\n\tprivate startTimer(intervalSeconds: number) {\n\t\tthis.stopTimer()\n\n\t\tconst intervalMs = intervalSeconds * 1000\n\t\tconst clampedIntervalMs = clamp(intervalMs, 0, 2 ** 31 - 1)\n\n\t\tif (clampedIntervalMs > 0) {\n\t\t\tthis.autoSyncTimer = window.setInterval(async () => {\n\t\t\t\tawait this.syncExecutor.executeSync({\n\t\t\t\t\tmode: SyncStartMode.AUTO_SYNC,\n\t\t\t\t})\n\t\t\t}, clampedIntervalMs)\n\t\t}\n\t}\n\n\tprivate stopTimer() {\n\t\tif (this.autoSyncTimer !== null) {\n\t\t\twindow.clearInterval(this.autoSyncTimer)\n\t\t\tthis.autoSyncTimer = null\n\t\t}\n\t}\n\n\tasync updateInterval() {\n\t\tconst settings = await useSettings()\n\t\tthis.startTimer(settings.autoSyncIntervalSeconds)\n\t}\n\n\tunload() {\n\t\tthis.stopTimer()\n\t\tif (this.startupSyncTimer !== null) {\n\t\t\twindow.clearTimeout(this.startupSyncTimer)\n\t\t\tthis.startupSyncTimer = null\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/services/status.service.ts",
    "content": "import { Notice } from 'obsidian'\nimport i18n from '../i18n'\nimport NutstorePlugin from '../index'\nimport { formatRelativeTime } from '../utils/format-relative-time'\n\nexport class StatusService {\n\tpublic syncStatusBar: HTMLElement\n\tprivate lastSyncTime: number | null = null\n\tprivate updateInterval: number | null = null\n\tprivate baseStatusText: string = ''\n\n\tconstructor(private plugin: NutstorePlugin) {\n\t\tthis.syncStatusBar = plugin.addStatusBarItem()\n\t}\n\n\t/**\n\t * Updates the sync status display in the status bar\n\t */\n\tpublic updateSyncStatus(status: {\n\t\ttext: string\n\t\tisError?: boolean\n\t\tshowNotice?: boolean\n\t}): void {\n\t\tthis.syncStatusBar.setText(status.text)\n\n\t\tif (status.showNotice) {\n\t\t\tnew Notice(status.text)\n\t\t}\n\t}\n\n\t/**\n\t * Set the last sync completion time and start updating the status bar\n\t */\n\tpublic setLastSyncTime(timestamp: number, failedCount: number = 0): void {\n\t\tthis.lastSyncTime = timestamp\n\t\tthis.baseStatusText =\n\t\t\tfailedCount > 0\n\t\t\t\t? i18n.t('sync.completeWithFailed', { failedCount })\n\t\t\t\t: i18n.t('sync.complete')\n\n\t\t// Update immediately\n\t\tthis.updateStatusBarWithTime()\n\n\t\t// Clear any existing interval\n\t\tthis.stopTimeUpdates()\n\n\t\t// Update every minute\n\t\tthis.updateInterval = window.setInterval(() => {\n\t\t\tthis.updateStatusBarWithTime()\n\t\t}, 60000)\n\t}\n\n\t/**\n\t * Updates the status bar with relative time\n\t */\n\tprivate updateStatusBarWithTime(): void {\n\t\tif (this.lastSyncTime === null) {\n\t\t\treturn\n\t\t}\n\n\t\tconst now = Date.now()\n\t\tconst diffSeconds = Math.floor((now - this.lastSyncTime) / 1000)\n\n\t\t// Don't show relative time if less than 60 seconds (just now)\n\t\tif (diffSeconds < 60) {\n\t\t\tthis.syncStatusBar.setText(this.baseStatusText)\n\t\t} else {\n\t\t\tconst relativeTime = formatRelativeTime(this.lastSyncTime)\n\t\t\tconst statusText = `${this.baseStatusText} (${relativeTime})`\n\t\t\tthis.syncStatusBar.setText(statusText)\n\t\t}\n\t}\n\n\t/**\n\t * Stop updating the status bar time\n\t */\n\tpublic stopTimeUpdates(): void {\n\t\tif (this.updateInterval !== null) {\n\t\t\twindow.clearInterval(this.updateInterval)\n\t\t\tthis.updateInterval = null\n\t\t}\n\t}\n\n\tpublic unload(): void {\n\t\tthis.stopTimeUpdates()\n\t}\n}\n"
  },
  {
    "path": "src/services/sync-executor.service.ts",
    "content": "import { syncRecordKV } from '~/storage'\nimport { SyncRecord } from '~/storage/sync-record'\nimport { NutstoreSync, SyncStartMode } from '~/sync'\nimport TwoWaySyncDecider from '~/sync/decision/two-way.decider'\nimport { getDBKey } from '~/utils/get-db-key'\nimport waitUntil from '~/utils/wait-until'\nimport type NutstorePlugin from '..'\n\nexport interface SyncOptions {\n\tmode: SyncStartMode\n}\n\nexport default class SyncExecutorService {\n\tconstructor(private plugin: NutstorePlugin) {}\n\n\tasync executeSync(options: SyncOptions) {\n\t\tif (this.plugin.isSyncing) {\n\t\t\treturn false\n\t\t}\n\n\t\t// 检查账号配置，未配置时静默返回（自动同步场景）\n\t\tif (!this.plugin.isAccountConfigured()) {\n\t\t\treturn false\n\t\t}\n\n\t\tawait waitUntil(() => this.plugin.isSyncing === false, 500)\n\n\t\tconst sync = new NutstoreSync(this.plugin, {\n\t\t\tvault: this.plugin.app.vault,\n\t\t\ttoken: await this.plugin.getToken(),\n\t\t\tremoteBaseDir: this.plugin.remoteBaseDir,\n\t\t\twebdav: await this.plugin.webDAVService.createWebDAVClient(),\n\t\t})\n\n\t\tconst syncRecord = new SyncRecord(\n\t\t\tgetDBKey(this.plugin.app.vault.getName(), this.plugin.remoteBaseDir),\n\t\t\tsyncRecordKV,\n\t\t)\n\n\t\tconst decider = new TwoWaySyncDecider(sync, syncRecord)\n\t\tconst decided = await decider.decide()\n\n\t\tif (decided.length === 0) {\n\t\t\treturn false\n\t\t}\n\n\t\tawait sync.start({\n\t\t\tmode: options.mode,\n\t\t})\n\n\t\treturn true\n\t}\n}\n"
  },
  {
    "path": "src/services/webdav.service.ts",
    "content": "import { createClient, WebDAVClient } from 'webdav'\nimport { NS_DAV_ENDPOINT } from '../consts'\nimport NutstorePlugin from '../index'\nimport { createRateLimitedWebDAVClient } from '../utils/rate-limited-client'\n\nexport class WebDAVService {\n\tconstructor(private plugin: NutstorePlugin) {}\n\n\tasync createWebDAVClient(): Promise<WebDAVClient> {\n\t\tlet client: WebDAVClient\n\t\tif (this.plugin.settings.loginMode === 'manual') {\n\t\t\tclient = createClient(NS_DAV_ENDPOINT, {\n\t\t\t\tusername: this.plugin.settings.account,\n\t\t\t\tpassword: this.plugin.settings.credential,\n\t\t\t})\n\t\t} else {\n\t\t\tconst oauth = await this.plugin.getDecryptedOAuthInfo()\n\t\t\tclient = createClient(NS_DAV_ENDPOINT, {\n\t\t\t\tusername: oauth.username,\n\t\t\t\tpassword: oauth.access_token,\n\t\t\t})\n\t\t}\n\t\treturn createRateLimitedWebDAVClient(client)\n\t}\n\n\tasync checkWebDAVConnection(): Promise<{ error?: Error; success: boolean }> {\n\t\ttry {\n\t\t\tconst client = await this.createWebDAVClient()\n\t\t\treturn { success: await client.exists('/') }\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\terror,\n\t\t\t\tsuccess: false,\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/settings/account.ts",
    "content": "import { createOAuthUrl } from '@nutstore/sso-js'\nimport { Notice, Setting } from 'obsidian'\nimport LogoutConfirmModal from '~/components/LogoutConfirmModal'\nimport i18n from '~/i18n'\nimport { OAuthResponse } from '~/utils/decrypt-ticket-response'\nimport { is503Error } from '~/utils/is-503-error'\nimport logger from '~/utils/logger'\nimport BaseSettings from './settings.base'\n\nexport default class AccountSettings extends BaseSettings {\n\tprivate updateOAuthUrlTimer: number | null = null\n\n\tasync display() {\n\t\tthis.containerEl.empty()\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.sections.account'))\n\t\t\t.setHeading()\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.loginMode.name'))\n\t\t\t.addDropdown((dropdown) =>\n\t\t\t\tdropdown\n\t\t\t\t\t.addOption('manual', i18n.t('settings.loginMode.manual'))\n\t\t\t\t\t.addOption('sso', i18n.t('settings.loginMode.sso'))\n\t\t\t\t\t.setValue(this.plugin.settings.loginMode)\n\t\t\t\t\t.onChange(async (value: 'manual' | 'sso') => {\n\t\t\t\t\t\tthis.plugin.settings.loginMode = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\tthis.display()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tif (this.settings.isSSO) {\n\t\t\tawait this.displaySSOLoginSettings()\n\t\t} else {\n\t\t\tawait this.displayManualLoginSettings()\n\t\t}\n\t}\n\n\tasync hide() {\n\t\tif (this.updateOAuthUrlTimer !== null) {\n\t\t\twindow.clearInterval(this.updateOAuthUrlTimer)\n\t\t\tthis.updateOAuthUrlTimer = null\n\t\t}\n\t}\n\n\tprivate displayManualLoginSettings(): void {\n\t\tconst helper = new Setting(this.containerEl)\n\t\tconst anchor = helper.descEl.createEl('a', {\n\t\t\thref: 'https://help.jianguoyun.com/?p=2064',\n\t\t\tcls: 'no-underline',\n\t\t\ttext: i18n.t('settings.help.name'),\n\t\t})\n\t\tanchor.target = '_blank'\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.account.name'))\n\t\t\t.setDesc(i18n.t('settings.account.desc'))\n\t\t\t.addText((text) =>\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder(i18n.t('settings.account.placeholder'))\n\t\t\t\t\t.setValue(this.plugin.settings.account)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.account = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.credential.name'))\n\t\t\t.setDesc(i18n.t('settings.credential.desc'))\n\t\t\t.addText((text) => {\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder(i18n.t('settings.credential.placeholder'))\n\t\t\t\t\t.setValue(this.plugin.settings.credential)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.credential = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t})\n\t\t\t\ttext.inputEl.type = 'password'\n\t\t\t})\n\n\t\tthis.displayCheckConnection()\n\t}\n\n\tprivate async displaySSOLoginSettings() {\n\t\tlet isLoggedIn = this.plugin.settings.oauthResponseText.length > 0\n\t\tlet oauth: OAuthResponse | undefined\n\t\tif (isLoggedIn) {\n\t\t\ttry {\n\t\t\t\toauth = await this.plugin.getDecryptedOAuthInfo()\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(e)\n\t\t\t\tisLoggedIn = false\n\t\t\t}\n\t\t}\n\t\tif (isLoggedIn && oauth?.username) {\n\t\t\tconst el = new Setting(this.containerEl)\n\t\t\t\t.setName(i18n.t('settings.ssoStatus.loggedIn'))\n\t\t\t\t.setDesc(oauth.username)\n\t\t\t\t.addButton((button) => {\n\t\t\t\t\tbutton\n\t\t\t\t\t\t.setWarning()\n\t\t\t\t\t\t.setButtonText(i18n.t('settings.ssoStatus.logout'))\n\t\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\t\tnew LogoutConfirmModal(this.app, async () => {\n\t\t\t\t\t\t\t\tthis.plugin.settings.oauthResponseText = ''\n\t\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.ssoStatus.logoutSuccess'))\n\t\t\t\t\t\t\t\tthis.display()\n\t\t\t\t\t\t\t}).open()\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\tel.descEl.classList.add('max-w-full', 'truncate')\n\t\t\tel.infoEl.classList.add('max-w-full')\n\t\t\tthis.displayCheckConnection()\n\t\t} else {\n\t\t\tnew Setting(this.containerEl)\n\t\t\t\t.setName(i18n.t('settings.ssoStatus.notLoggedIn'))\n\t\t\t\t.addButton(async (button) => {\n\t\t\t\t\tbutton.setButtonText(i18n.t('settings.login.name'))\n\t\t\t\t\tconst anchor = document.createElement('a')\n\t\t\t\t\tanchor.target = '_blank'\n\t\t\t\t\tbutton.buttonEl.parentElement?.appendChild(anchor)\n\t\t\t\t\tanchor.appendChild(button.buttonEl)\n\t\t\t\t\tanchor.href = await createOAuthUrl({\n\t\t\t\t\t\tapp: 'obsidian',\n\t\t\t\t\t})\n\t\t\t\t\tthis.updateOAuthUrlTimer = window.setInterval(async () => {\n\t\t\t\t\t\tconst stillInDoc = document.contains(anchor)\n\t\t\t\t\t\tif (stillInDoc) {\n\t\t\t\t\t\t\tanchor.href = await createOAuthUrl({\n\t\t\t\t\t\t\t\tapp: 'obsidian',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twindow.clearInterval(this.updateOAuthUrlTimer!)\n\t\t\t\t\t\t\tthis.updateOAuthUrlTimer = null\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 60 * 1000)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tprivate displayCheckConnection() {\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.checkConnection.name'))\n\t\t\t.setDesc(i18n.t('settings.checkConnection.desc'))\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.checkConnection.name'))\n\t\t\t\t\t.onClick(async (e) => {\n\t\t\t\t\t\tconst buttonEl = e.target as HTMLElement\n\t\t\t\t\t\tbuttonEl.classList.add('connection-button', 'loading')\n\t\t\t\t\t\tbuttonEl.classList.remove('success', 'error')\n\t\t\t\t\t\tbuttonEl.textContent = i18n.t('settings.checkConnection.name')\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst { success, error } =\n\t\t\t\t\t\t\t\tawait this.plugin.webDAVService.checkWebDAVConnection()\n\t\t\t\t\t\t\tbuttonEl.classList.remove('loading')\n\t\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\t\tbuttonEl.classList.add('success')\n\t\t\t\t\t\t\t\tbuttonEl.textContent = i18n.t(\n\t\t\t\t\t\t\t\t\t'settings.checkConnection.successButton',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.checkConnection.success'))\n\t\t\t\t\t\t\t} else if (error && is503Error(error)) {\n\t\t\t\t\t\t\t\tbuttonEl.classList.add('error')\n\t\t\t\t\t\t\t\tbuttonEl.textContent = i18n.t('sync.error.requestsTooFrequent')\n\t\t\t\t\t\t\t\tnew Notice(i18n.t('sync.error.requestsTooFrequent'))\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbuttonEl.classList.add('error')\n\t\t\t\t\t\t\t\tbuttonEl.textContent = i18n.t(\n\t\t\t\t\t\t\t\t\t'settings.checkConnection.failureButton',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.checkConnection.failure'))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tbuttonEl.classList.remove('loading')\n\t\t\t\t\t\t\tbuttonEl.classList.add('error')\n\t\t\t\t\t\t\tbuttonEl.textContent = i18n.t(\n\t\t\t\t\t\t\t\t'settings.checkConnection.failureButton',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tnew Notice(i18n.t('settings.checkConnection.failure'))\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t})\n\t}\n}\n"
  },
  {
    "path": "src/settings/ai.ts",
    "content": "import { Notice, Setting } from 'obsidian'\nimport {\n\tgetFirstModel,\n\tgetModelById,\n\tgetProviderById,\n\tlistModels,\n\tlistProviders,\n\tsanitizeDefaultSelections,\n\tsanitizeProviders,\n} from '~/ai/config'\nimport ProvidersManagerModal from '~/components/ProvidersManagerModal'\nimport i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport BaseSettings from './settings.base'\n\nexport default class AISettings extends BaseSettings {\n\tasync display() {\n\t\tthis.containerEl.empty()\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.sections.ai'))\n\t\t\t.setHeading()\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.ai.providers.name'))\n\t\t\t.setDesc(\n\t\t\t\ti18n.t('settings.ai.providers.summary', {\n\t\t\t\t\tcount: listProviders(this.plugin.settings.ai.providers).length,\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.ai.providers.manage'))\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tnew ProvidersManagerModal(this.plugin, async () => {\n\t\t\t\t\t\t\tawait this.persist(false)\n\t\t\t\t\t\t\tthis.display()\n\t\t\t\t\t\t}).open()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.ai.defaultProvider.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.defaultProvider.desc'))\n\t\t\t.addDropdown((dropdown) => {\n\t\t\t\tdropdown.addOption('', i18n.t('settings.ai.none'))\n\t\t\t\tfor (const provider of listProviders(\n\t\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\t)) {\n\t\t\t\t\tdropdown.addOption(\n\t\t\t\t\t\tprovider.id,\n\t\t\t\t\t\tprovider.name || i18n.t('settings.ai.unnamedProvider'),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tdropdown\n\t\t\t\t\t.setValue(this.plugin.settings.ai.defaultModel?.providerId || '')\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tif (!value) {\n\t\t\t\t\t\t\tthis.plugin.settings.ai.defaultModel = undefined\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst provider = getProviderById(\n\t\t\t\t\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst currentModelId =\n\t\t\t\t\t\t\t\tthis.plugin.settings.ai.defaultModel?.modelId\n\t\t\t\t\t\t\tconst model =\n\t\t\t\t\t\t\t\tgetModelById(provider, currentModelId) ||\n\t\t\t\t\t\t\t\tgetFirstModel(provider)\n\t\t\t\t\t\t\tthis.plugin.settings.ai.defaultModel = model\n\t\t\t\t\t\t\t\t? { providerId: value, modelId: model.id }\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.persist()\n\t\t\t\t\t\tthis.display()\n\t\t\t\t\t})\n\t\t\t})\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.ai.defaultModel.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.defaultModel.desc'))\n\t\t\t.addDropdown((dropdown) => {\n\t\t\t\tconst provider = getProviderById(\n\t\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\t\tthis.plugin.settings.ai.defaultModel?.providerId,\n\t\t\t\t)\n\t\t\t\tdropdown.addOption('', i18n.t('settings.ai.none'))\n\t\t\t\tfor (const model of listModels(provider)) {\n\t\t\t\t\tdropdown.addOption(\n\t\t\t\t\t\tmodel.id,\n\t\t\t\t\t\tmodel.name || i18n.t('settings.ai.unnamedModel'),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tdropdown\n\t\t\t\t\t.setValue(this.plugin.settings.ai.defaultModel?.modelId || '')\n\t\t\t\t\t.setDisabled(!provider)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tconst providerId = this.plugin.settings.ai.defaultModel?.providerId\n\t\t\t\t\t\tif (providerId && value) {\n\t\t\t\t\t\t\tthis.plugin.settings.ai.defaultModel = {\n\t\t\t\t\t\t\t\tproviderId,\n\t\t\t\t\t\t\t\tmodelId: value,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.plugin.settings.ai.defaultModel = undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.persist()\n\t\t\t\t\t})\n\t\t\t})\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.ai.yolo.name'))\n\t\t\t.setDesc(i18n.t('settings.ai.yolo.desc'))\n\t\t\t.addToggle((toggle) =>\n\t\t\t\ttoggle\n\t\t\t\t\t.setValue(this.plugin.settings.ai.yolo ?? false)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.ai.yolo = value\n\t\t\t\t\t\tawait this.persist()\n\t\t\t\t\t}),\n\t\t\t)\n\t}\n\n\tprivate async persist(showNotice: boolean = true) {\n\t\ttry {\n\t\t\tthis.plugin.settings.ai.providers = sanitizeProviders(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t)\n\t\t\tthis.plugin.settings.ai.defaultModel = sanitizeDefaultSelections(\n\t\t\t\tthis.plugin.settings.ai.providers,\n\t\t\t\tthis.plugin.settings.ai.defaultModel,\n\t\t\t)\n\t\t\tawait this.plugin.saveSettings()\n\t\t\tif (showNotice) {\n\t\t\t\tnew Notice(i18n.t('settings.ai.saved'))\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(error)\n\t\t\tnew Notice(\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? i18n.t('settings.ai.errors.saveFailedWithReason', {\n\t\t\t\t\t\t\treason: error.message,\n\t\t\t\t\t\t})\n\t\t\t\t\t: i18n.t('settings.ai.errors.saveFailed'),\n\t\t\t\t10000,\n\t\t\t)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/settings/cache.ts",
    "content": "import { Notice, Setting } from 'obsidian'\nimport { join } from 'path-browserify'\nimport CacheClearModal from '~/components/CacheClearModal'\nimport CacheRestoreModal from '~/components/CacheRestoreModal'\nimport CacheSaveModal from '~/components/CacheSaveModal'\nimport SelectRemoteBaseDirModal from '~/components/SelectRemoteBaseDirModal'\nimport i18n from '~/i18n'\nimport { TraverseWebDAVCache } from '~/storage'\nimport { getDBKey } from '~/utils/get-db-key'\nimport logger from '~/utils/logger'\nimport { stdRemotePath } from '~/utils/std-remote-path'\nimport BaseSettings from './settings.base'\n\nexport interface ExportedStorage {\n\texportedAt: string\n\ttraverseWebDAVCache?: TraverseWebDAVCache\n}\n\nexport default class CacheSettings extends BaseSettings {\n\tasync display() {\n\t\tthis.containerEl.empty()\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.cache.title'))\n\t\t\t.setHeading()\n\n\t\t// set remote cache directory\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.cache.remoteCacheDir.name'))\n\t\t\t.setDesc(i18n.t('settings.cache.remoteCacheDir.desc'))\n\t\t\t.addText((text) => {\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder(i18n.t('settings.cache.remoteCacheDir.placeholder'))\n\t\t\t\t\t.setValue(this.remoteCacheDir)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.remoteCacheDir = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t})\n\t\t\t\ttext.inputEl.addEventListener('blur', async () => {\n\t\t\t\t\tthis.plugin.settings.remoteCacheDir = this.remoteCacheDir\n\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\tthis.display()\n\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setIcon('folder').onClick(() => {\n\t\t\t\t\t// 检查账号配置\n\t\t\t\t\tif (!this.plugin.isAccountConfigured()) {\n\t\t\t\t\t\tnew Notice(i18n.t('sync.error.accountNotConfigured'))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tnew SelectRemoteBaseDirModal(this.app, this.plugin, async (path) => {\n\t\t\t\t\t\tthis.plugin.settings.remoteCacheDir = path\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\tthis.display()\n\t\t\t\t\t}).open()\n\t\t\t\t})\n\t\t\t})\n\n\t\t// Save and restore cache\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.cache.dumpName'))\n\t\t\t.setDesc(i18n.t('settings.cache.dumpDesc'))\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('settings.cache.dump')).onClick(() => {\n\t\t\t\t\tnew CacheSaveModal(this.plugin, this.remoteCacheDir, () =>\n\t\t\t\t\t\tthis.display(),\n\t\t\t\t\t).open()\n\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('settings.cache.restore')).onClick(() => {\n\t\t\t\t\tnew CacheRestoreModal(this.plugin, this.remoteCacheDir, () =>\n\t\t\t\t\t\tthis.display(),\n\t\t\t\t\t).open()\n\t\t\t\t})\n\t\t\t})\n\n\t\t// clear\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.cache.clearName'))\n\t\t\t.setDesc(i18n.t('settings.cache.clearDesc'))\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.cache.clear'))\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\tnew CacheClearModal(this.plugin, async (options) => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst cleared =\n\t\t\t\t\t\t\t\t\tawait CacheClearModal.clearSelectedCaches(options)\n\t\t\t\t\t\t\t\tif (cleared.length > 0) {\n\t\t\t\t\t\t\t\t\tnew Notice(i18n.t('settings.cache.cleared'))\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnew Notice(\n\t\t\t\t\t\t\t\t\t\ti18n.t('settings.cache.clearModal.nothingSelected'),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tlogger.error('Error clearing cache:', error)\n\t\t\t\t\t\t\t\tnew Notice(`Error clearing cache: ${error.message}`)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).open()\n\t\t\t\t\t})\n\t\t\t})\n\t}\n\n\tget remoteCacheDir() {\n\t\treturn stdRemotePath(\n\t\t\tthis.plugin.settings.remoteCacheDir?.trim() ||\n\t\t\t\tthis.plugin.manifest.name.trim(),\n\t\t)\n\t}\n\n\tget remoteCachePath() {\n\t\tconst filename = getDBKey(\n\t\t\tthis.app.vault.getName(),\n\t\t\tthis.plugin.settings.remoteDir,\n\t\t)\n\t\treturn join(this.remoteCacheDir, filename + '.json')\n\t}\n\n\tasync createRemoteCacheDir() {\n\t\tconst webdav = await this.plugin.webDAVService.createWebDAVClient()\n\t\treturn await webdav.createDirectory(this.remoteCacheDir, {\n\t\t\trecursive: true,\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "src/settings/common.ts",
    "content": "import { parse as bytesParse } from 'bytes-iec'\nimport { clamp, isNil } from 'lodash-es'\nimport { Notice, Setting, TextComponent } from 'obsidian'\nimport { isNotNil } from 'ramda'\nimport SelectRemoteBaseDirModal from '~/components/SelectRemoteBaseDirModal'\nimport i18n from '~/i18n'\nimport { ConflictStrategy } from '~/sync/tasks/conflict-resolve.task'\nimport { isNumeric } from '~/utils/is-numeric'\nimport { SyncMode } from './index'\nimport BaseSettings from './settings.base'\n\n/**\n * https://help.jianguoyun.com/?p=2064\n */\nconst MAX_FILE_SIZE = '500MB'\nconst MAX_BYTES = bytesParse(MAX_FILE_SIZE, { mode: 'jedec' })!\n\nexport default class CommonSettings extends BaseSettings {\n\tasync display() {\n\t\tthis.containerEl.empty()\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.sections.common'))\n\t\t\t.setHeading()\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.remoteDir.name'))\n\t\t\t.setDesc(i18n.t('settings.remoteDir.desc'))\n\t\t\t.addText((text) => {\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder(i18n.t('settings.remoteDir.placeholder'))\n\t\t\t\t\t.setValue(this.plugin.remoteBaseDir)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.remoteDir = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t})\n\t\t\t\ttext.inputEl.addEventListener('blur', () => {\n\t\t\t\t\tthis.plugin.settings.remoteDir = this.plugin.remoteBaseDir\n\t\t\t\t\tthis.display()\n\t\t\t\t})\n\t\t\t})\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setIcon('folder').onClick(() => {\n\t\t\t\t\t// 检查账号配置\n\t\t\t\t\tif (!this.plugin.isAccountConfigured()) {\n\t\t\t\t\t\tnew Notice(i18n.t('sync.error.accountNotConfigured'))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tnew SelectRemoteBaseDirModal(this.app, this.plugin, async (path) => {\n\t\t\t\t\t\tthis.plugin.settings.remoteDir = path\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\tthis.display()\n\t\t\t\t\t}).open()\n\t\t\t\t})\n\t\t\t})\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.skipLargeFiles.name'))\n\t\t\t.setDesc(i18n.t('settings.skipLargeFiles.desc'))\n\t\t\t.addText((text) => {\n\t\t\t\tconst currentValue = this.plugin.settings.skipLargeFiles.maxSize.trim()\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder(i18n.t('settings.skipLargeFiles.placeholder'))\n\t\t\t\t\t.setValue(currentValue)\n\n\t\t\t\ttext.inputEl.addEventListener('blur', () => {\n\t\t\t\t\tthis.handleMaxFileSizeBlur(text)\n\t\t\t\t})\n\t\t\t})\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.conflictStrategy.name'))\n\t\t\t.setDesc(i18n.t('settings.conflictStrategy.desc'))\n\t\t\t.addDropdown((dropdown) =>\n\t\t\t\tdropdown\n\t\t\t\t\t.addOption(\n\t\t\t\t\t\tConflictStrategy.DiffMatchPatch,\n\t\t\t\t\t\ti18n.t('settings.conflictStrategy.diffMatchPatch'),\n\t\t\t\t\t)\n\t\t\t\t\t.addOption(\n\t\t\t\t\t\tConflictStrategy.LatestTimeStamp,\n\t\t\t\t\t\ti18n.t('settings.conflictStrategy.latestTimestamp'),\n\t\t\t\t\t)\n\t\t\t\t\t.addOption(\n\t\t\t\t\t\tConflictStrategy.Skip,\n\t\t\t\t\t\ti18n.t('settings.conflictStrategy.skip'),\n\t\t\t\t\t)\n\t\t\t\t\t.addOption(\n\t\t\t\t\t\tConflictStrategy.DiffMatchPatchOrSkip,\n\t\t\t\t\t\ti18n.t('settings.conflictStrategy.diffMatchPatchOrSkip'),\n\t\t\t\t\t)\n\t\t\t\t\t.setValue(this.plugin.settings.conflictStrategy)\n\t\t\t\t\t.onChange(async (value: ConflictStrategy) => {\n\t\t\t\t\t\tthis.plugin.settings.conflictStrategy = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.useGitStyle.name'))\n\t\t\t.setDesc(i18n.t('settings.useGitStyle.desc'))\n\t\t\t.addToggle((toggle) =>\n\t\t\t\ttoggle\n\t\t\t\t\t.setValue(this.plugin.settings.useGitStyle)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.useGitStyle = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.confirmBeforeSync.name'))\n\t\t\t.setDesc(i18n.t('settings.confirmBeforeSync.desc'))\n\t\t\t.addToggle((toggle) =>\n\t\t\t\ttoggle\n\t\t\t\t\t.setValue(this.plugin.settings.confirmBeforeSync)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.confirmBeforeSync = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.confirmBeforeDeleteInAutoSync.name'))\n\t\t\t.setDesc(i18n.t('settings.confirmBeforeDeleteInAutoSync.desc'))\n\t\t\t.addToggle((toggle) =>\n\t\t\t\ttoggle\n\t\t\t\t\t.setValue(this.plugin.settings.confirmBeforeDeleteInAutoSync)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.confirmBeforeDeleteInAutoSync = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.realtimeSync.name'))\n\t\t\t.setDesc(i18n.t('settings.realtimeSync.desc'))\n\t\t\t.addToggle((toggle) =>\n\t\t\t\ttoggle\n\t\t\t\t\t.setValue(this.plugin.settings.realtimeSync)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tthis.plugin.settings.realtimeSync = value\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.startupSyncDelay.name'))\n\t\t\t.setDesc(i18n.t('settings.startupSyncDelay.desc'))\n\t\t\t.addText((text) => {\n\t\t\t\tconst MAX_SECONDS = 86400 // 1 day\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder(i18n.t('settings.startupSyncDelay.placeholder'))\n\t\t\t\t\t.setValue(this.plugin.settings.startupSyncDelaySeconds.toString())\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tconst numValue = parseFloat(value)\n\t\t\t\t\t\tif (!isNaN(numValue)) {\n\t\t\t\t\t\t\tconst clampedValue = clamp(numValue, 0, MAX_SECONDS)\n\t\t\t\t\t\t\tthis.plugin.settings.startupSyncDelaySeconds = clampedValue\n\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\tif (clampedValue !== numValue) {\n\t\t\t\t\t\t\t\tnew Notice(\n\t\t\t\t\t\t\t\t\ti18n.t('settings.startupSyncDelay.exceedsMax', {\n\t\t\t\t\t\t\t\t\t\tmax: MAX_SECONDS,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\ttext.setValue(clampedValue.toString())\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\ttext.inputEl.addEventListener('blur', async () => {\n\t\t\t\t\tconst numValue = parseFloat(text.getValue())\n\t\t\t\t\tconst finalValue = isNaN(numValue)\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: clamp(numValue, 0, MAX_SECONDS)\n\n\t\t\t\t\tif (isNaN(numValue)) {\n\t\t\t\t\t\tnew Notice(i18n.t('settings.startupSyncDelay.invalidValue'))\n\t\t\t\t\t} else if (finalValue !== numValue) {\n\t\t\t\t\t\tnew Notice(\n\t\t\t\t\t\t\ti18n.t('settings.startupSyncDelay.exceedsMax', {\n\t\t\t\t\t\t\t\tmax: MAX_SECONDS,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\ttext.setValue(finalValue.toString())\n\t\t\t\t\tthis.plugin.settings.startupSyncDelaySeconds = finalValue\n\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t})\n\t\t\t\ttext.inputEl.type = 'number'\n\t\t\t\ttext.inputEl.min = '0'\n\t\t\t\ttext.inputEl.max = MAX_SECONDS.toString()\n\t\t\t})\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.autoSyncInterval.name'))\n\t\t\t.setDesc(i18n.t('settings.autoSyncInterval.desc'))\n\t\t\t.addText((text) => {\n\t\t\t\tconst MAX_MINUTES = 1440 // 1 day\n\t\t\t\ttext\n\t\t\t\t\t.setPlaceholder(i18n.t('settings.autoSyncInterval.placeholder'))\n\t\t\t\t\t.setValue(\n\t\t\t\t\t\tMath.round(\n\t\t\t\t\t\t\tthis.plugin.settings.autoSyncIntervalSeconds / 60,\n\t\t\t\t\t\t).toString(),\n\t\t\t\t\t)\n\t\t\t\t\t.onChange(async (value) => {\n\t\t\t\t\t\tconst numValue = parseFloat(value)\n\t\t\t\t\t\tif (!isNaN(numValue)) {\n\t\t\t\t\t\t\tconst clampedValue = clamp(numValue, 0, MAX_MINUTES)\n\t\t\t\t\t\t\tthis.plugin.settings.autoSyncIntervalSeconds = clampedValue * 60\n\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\tawait this.plugin.scheduledSyncService.updateInterval()\n\t\t\t\t\t\t\tif (clampedValue !== numValue) {\n\t\t\t\t\t\t\t\tnew Notice(\n\t\t\t\t\t\t\t\t\ti18n.t('settings.autoSyncInterval.exceedsMax', {\n\t\t\t\t\t\t\t\t\t\tmax: MAX_MINUTES,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\ttext.setValue(clampedValue.toString())\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\ttext.inputEl.addEventListener('blur', async () => {\n\t\t\t\t\tconst numValue = parseFloat(text.getValue())\n\t\t\t\t\tconst finalValue = isNaN(numValue)\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: Math.round(clamp(numValue, 0, MAX_MINUTES))\n\t\t\t\t\ttext.setValue(finalValue.toString())\n\n\t\t\t\t\tif (isNaN(numValue)) {\n\t\t\t\t\t\tnew Notice(i18n.t('settings.autoSyncInterval.invalidValue'))\n\t\t\t\t\t} else if (finalValue !== numValue) {\n\t\t\t\t\t\tnew Notice(\n\t\t\t\t\t\t\ti18n.t('settings.autoSyncInterval.exceedsMax', {\n\t\t\t\t\t\t\t\tmax: MAX_MINUTES,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.plugin.settings.autoSyncIntervalSeconds = finalValue * 60\n\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\tawait this.plugin.scheduledSyncService.updateInterval()\n\t\t\t\t})\n\t\t\t\ttext.inputEl.type = 'number'\n\t\t\t\ttext.inputEl.min = '0'\n\t\t\t\ttext.inputEl.max = MAX_MINUTES.toString()\n\t\t\t\ttext.inputEl.step = '1'\n\t\t\t})\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.syncMode.name'))\n\t\t\t.setDesc(i18n.t('settings.syncMode.desc'))\n\t\t\t.addDropdown((dropdown) =>\n\t\t\t\tdropdown\n\t\t\t\t\t.addOption(SyncMode.STRICT, i18n.t('settings.syncMode.strict'))\n\t\t\t\t\t.addOption(SyncMode.LOOSE, i18n.t('settings.syncMode.loose'))\n\t\t\t\t\t.setValue(this.plugin.settings.syncMode)\n\t\t\t\t\t.onChange(async (value: string) => {\n\t\t\t\t\t\tthis.plugin.settings.syncMode = value as SyncMode\n\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.language.name'))\n\t\t\t.setDesc(i18n.t('settings.language.desc'))\n\t\t\t.addDropdown((dropdown) =>\n\t\t\t\tdropdown\n\t\t\t\t\t.addOption('', i18n.t('settings.language.auto'))\n\t\t\t\t\t.addOption('zh', '简体中文')\n\t\t\t\t\t.addOption('en', 'English')\n\t\t\t\t\t.setValue(this.plugin.settings.language || '')\n\t\t\t\t\t.onChange(async (value: string) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tvalue === 'zh' ||\n\t\t\t\t\t\t\tvalue === 'en' ||\n\t\t\t\t\t\t\tvalue === '' ||\n\t\t\t\t\t\t\tisNil(value)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.plugin.settings.language = value || undefined\n\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\tawait this.plugin.i18nService.update()\n\t\t\t\t\t\t\tawait this.settings.display()\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t)\n\t}\n\n\tprivate async handleMaxFileSizeBlur(component: TextComponent) {\n\t\tlet value = component.getValue().trim()\n\t\t// Empty value: restore to default max size\n\t\tif (!value) {\n\t\t\tvalue = MAX_FILE_SIZE\n\t\t}\n\t\t// Plain number without unit: append 'B' for better UX\n\t\telse if (\n\t\t\tisNumeric(value) ||\n\t\t\t(isNil(bytesParse(value)) && isNotNil(bytesParse(value + 'B')))\n\t\t) {\n\t\t\tvalue += 'B'\n\t\t}\n\t\t// Validate the input format\n\t\tconst parsedBytes = bytesParse(value, { mode: 'jedec' })\n\t\t// Invalid format (e.g., \"100FOO\"): show error and revert to last saved value\n\t\tif (parsedBytes === null) {\n\t\t\tnew Notice(i18n.t('settings.skipLargeFiles.invalidFormat'))\n\t\t\tcomponent.setValue(this.plugin.settings.skipLargeFiles.maxSize)\n\t\t\treturn\n\t\t}\n\t\t// Exceeds max limit (e.g., \"1GB\"): show error and clamp to max allowed value\n\t\tif (parsedBytes > MAX_BYTES) {\n\t\t\tnew Notice(i18n.t('settings.skipLargeFiles.exceedsMaxSize'))\n\t\t\tvalue = MAX_FILE_SIZE\n\t\t}\n\t\t// Update UI with formatted value to ensure consistency\n\t\tcomponent.setValue(value)\n\t\t// Save to disk only if value actually changed\n\t\tif (this.plugin.settings.skipLargeFiles.maxSize !== value) {\n\t\t\tthis.plugin.settings.skipLargeFiles.maxSize = value\n\t\t\tawait this.plugin.saveSettings()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/settings/filter.ts",
    "content": "import { App, Modal, Setting } from 'obsidian'\nimport FilterEditorModal from '~/components/FilterEditorModal'\nimport i18n from '~/i18n'\nimport BaseSettings from './settings.base'\n\ntype ConfigDirSyncMode = 'none' | 'bookmarks' | 'all'\n\nfunction isConfigDirSyncMode(value: string): value is ConfigDirSyncMode {\n\treturn value === 'none' || value === 'bookmarks' || value === 'all'\n}\n\nexport default class FilterSettings extends BaseSettings {\n\tasync display() {\n\t\tthis.containerEl.empty()\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.sections.filters'))\n\t\t\t.setHeading()\n\n\t\tconst configDir = this.plugin.app.vault.configDir\n\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.configDirSync.name'))\n\t\t\t.setDesc(i18n.t('settings.configDirSync.desc', { configDir }))\n\t\t\t.addDropdown((dropdown) =>\n\t\t\t\tdropdown\n\t\t\t\t\t.addOption('none', i18n.t('settings.configDirSync.none'))\n\t\t\t\t\t.addOption('bookmarks', i18n.t('settings.configDirSync.bookmarks'))\n\t\t\t\t\t.addOption('all', i18n.t('settings.configDirSync.all'))\n\t\t\t\t\t.setValue(this.plugin.settings.configDirSyncMode ?? 'none')\n\t\t\t\t\t.onChange(async (value: string) => {\n\t\t\t\t\t\tif (!isConfigDirSyncMode(value)) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value === 'bookmarks') {\n\t\t\t\t\t\t\tnew ConfigDirSyncBookmarksModal(\n\t\t\t\t\t\t\t\tthis.app,\n\t\t\t\t\t\t\t\tconfigDir,\n\t\t\t\t\t\t\t\tasync (confirmed) => {\n\t\t\t\t\t\t\t\t\tif (confirmed) {\n\t\t\t\t\t\t\t\t\t\tthis.plugin.settings.configDirSyncMode = 'bookmarks'\n\t\t\t\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis.display()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t).open()\n\t\t\t\t\t\t} else if (value === 'all') {\n\t\t\t\t\t\t\tnew ConfigDirSyncWarningModal(\n\t\t\t\t\t\t\t\tthis.app,\n\t\t\t\t\t\t\t\tconfigDir,\n\t\t\t\t\t\t\t\tasync (confirmed) => {\n\t\t\t\t\t\t\t\t\tif (confirmed) {\n\t\t\t\t\t\t\t\t\t\tthis.plugin.settings.configDirSyncMode = 'all'\n\t\t\t\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis.display()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t).open()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.plugin.settings.configDirSyncMode = value\n\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t)\n\n\t\t// Inclusion\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.filters.include.name'))\n\t\t\t.setDesc(i18n.t('settings.filters.include.desc'))\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('settings.filters.edit')).onClick(() => {\n\t\t\t\t\tnew FilterEditorModal(\n\t\t\t\t\t\tthis.plugin,\n\t\t\t\t\t\tthis.plugin.settings.filterRules.inclusionRules,\n\t\t\t\t\t\tasync (filters) => {\n\t\t\t\t\t\t\tthis.plugin.settings.filterRules.inclusionRules = filters\n\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\tthis.display()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tFilterEditorModal.FilterType.Include,\n\t\t\t\t\t).open()\n\t\t\t\t})\n\t\t\t})\n\n\t\t// Exclusion\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.filters.exclude.name'))\n\t\t\t.setDesc(i18n.t('settings.filters.exclude.desc'))\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('settings.filters.edit')).onClick(() => {\n\t\t\t\t\tnew FilterEditorModal(\n\t\t\t\t\t\tthis.plugin,\n\t\t\t\t\t\tthis.plugin.settings.filterRules.exclusionRules,\n\t\t\t\t\t\tasync (filters) => {\n\t\t\t\t\t\t\tthis.plugin.settings.filterRules.exclusionRules = filters\n\t\t\t\t\t\t\tawait this.plugin.saveSettings()\n\t\t\t\t\t\t\tthis.display()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tFilterEditorModal.FilterType.Exclude,\n\t\t\t\t\t).open()\n\t\t\t\t})\n\t\t\t})\n\t}\n}\n\nclass ConfigDirSyncBookmarksModal extends Modal {\n\tconstructor(\n\t\tapp: App,\n\t\tprivate configDir: string,\n\t\tprivate onResult: (confirmed: boolean) => void,\n\t) {\n\t\tsuper(app)\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\t\tcontentEl.createEl('h2', {\n\t\t\ttext: i18n.t('settings.configDirSync.bookmarksTitle'),\n\t\t})\n\t\tcontentEl.createEl('p', {\n\t\t\ttext: i18n.t('settings.configDirSync.bookmarksDesc', {\n\t\t\t\tconfigDir: this.configDir,\n\t\t\t}),\n\t\t})\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((btn) =>\n\t\t\t\tbtn\n\t\t\t\t\t.setButtonText(i18n.t('settings.configDirSync.confirm'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\tthis.onResult(true)\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.addButton((btn) =>\n\t\t\t\tbtn\n\t\t\t\t\t.setButtonText(i18n.t('settings.configDirSync.cancel'))\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\tthis.onResult(false)\n\t\t\t\t\t}),\n\t\t\t)\n\t}\n\n\tonClose() {\n\t\tthis.contentEl.empty()\n\t}\n}\n\nclass ConfigDirSyncWarningModal extends Modal {\n\tconstructor(\n\t\tapp: App,\n\t\tprivate configDir: string,\n\t\tprivate onResult: (confirmed: boolean) => void,\n\t) {\n\t\tsuper(app)\n\t}\n\n\tonOpen() {\n\t\tconst { contentEl } = this\n\t\tconst warningKeys = [\n\t\t\t'settings.configDirSync.warnSyncs',\n\t\t\t'settings.configDirSync.warnExcludes',\n\t\t\t'settings.configDirSync.warnConflict',\n\t\t\t'settings.configDirSync.warnRisk',\n\t\t] as const\n\t\tconst t = (key: (typeof warningKeys)[number]) =>\n\t\t\ti18n.t(key, { configDir: this.configDir })\n\n\t\tcontentEl.createEl('h2', {\n\t\t\ttext: i18n.t('settings.configDirSync.warnTitle'),\n\t\t})\n\t\tfor (const key of warningKeys) {\n\t\t\tcontentEl.createEl('p', { text: t(key) })\n\t\t}\n\t\tnew Setting(contentEl)\n\t\t\t.addButton((btn) =>\n\t\t\t\tbtn\n\t\t\t\t\t.setButtonText(i18n.t('settings.configDirSync.confirm'))\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\tthis.onResult(true)\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\t.addButton((btn) =>\n\t\t\t\tbtn\n\t\t\t\t\t.setButtonText(i18n.t('settings.configDirSync.cancel'))\n\t\t\t\t\t.onClick(() => {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\tthis.onResult(false)\n\t\t\t\t\t}),\n\t\t\t)\n\t}\n\n\tonClose() {\n\t\tthis.contentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/settings/index.ts",
    "content": "import { App, PluginSettingTab, Setting } from 'obsidian'\nimport { onSsoReceive } from '~/events/sso-receive'\nimport i18n from '~/i18n'\nimport type NutstorePlugin from '~/index'\nimport { ConflictStrategy } from '~/sync/tasks/conflict-resolve.task'\nimport { GlobMatchOptions } from '~/utils/glob-match'\nimport waitUntil from '~/utils/wait-until'\nimport AccountSettings from './account'\nimport CacheSettings from './cache'\nimport CommonSettings from './common'\nimport FilterSettings from './filter'\nimport LogSettings from './log'\nimport AISettings from './ai'\nimport { AIProviderConfigs } from '~/ai/types'\n\nexport enum SyncMode {\n\tSTRICT = 'strict',\n\tLOOSE = 'loose',\n}\n\nexport interface NutstoreSettings {\n\taccount: string\n\tcredential: string\n\tremoteDir: string\n\tremoteCacheDir?: string\n\tuseGitStyle: boolean\n\tconflictStrategy: ConflictStrategy\n\toauthResponseText: string\n\tloginMode: 'manual' | 'sso'\n\tconfirmBeforeSync: boolean\n\tconfirmBeforeDeleteInAutoSync: boolean\n\tsyncMode: SyncMode\n\tfilterRules: {\n\t\texclusionRules: GlobMatchOptions[]\n\t\tinclusionRules: GlobMatchOptions[]\n\t}\n\tskipLargeFiles: {\n\t\tmaxSize: string\n\t}\n\trealtimeSync: boolean\n\tstartupSyncDelaySeconds: number\n\tautoSyncIntervalSeconds: number\n\tlanguage?: 'zh' | 'en'\n\tai: {\n\t\tproviders: AIProviderConfigs\n\t\tdefaultModel?: { providerId: string; modelId: string }\n\t\tyolo?: boolean\n\t}\n\tconfigDirSyncMode?: 'none' | 'bookmarks' | 'all'\n}\n\nlet pluginInstance: NutstorePlugin | null = null\n\nexport function setPluginInstance(plugin: NutstorePlugin | null) {\n\tpluginInstance = plugin\n}\n\nexport function waitUntilPluginInstance() {\n\treturn waitUntil(() => !!pluginInstance, 100)\n}\n\nexport async function useSettings() {\n\tawait waitUntilPluginInstance()\n\treturn pluginInstance!.settings\n}\n\nexport class NutstoreSettingTab extends PluginSettingTab {\n\tplugin: NutstorePlugin\n\taccountSettings: AccountSettings\n\tcommonSettings: CommonSettings\n\tfilterSettings: FilterSettings\n\tlogSettings: LogSettings\n\tcacheSettings: CacheSettings\n\taiSettings: AISettings\n\twarningContainerEl: HTMLElement\n\n\tsubSso = onSsoReceive().subscribe(() => {\n\t\tthis.display()\n\t})\n\n\tconstructor(app: App, plugin: NutstorePlugin) {\n\t\tsuper(app, plugin)\n\t\tthis.plugin = plugin\n\t\tthis.warningContainerEl = this.containerEl.createDiv()\n\t\tthis.accountSettings = new AccountSettings(\n\t\t\tthis.app,\n\t\t\tthis.plugin,\n\t\t\tthis,\n\t\t\tthis.containerEl.createDiv(),\n\t\t)\n\t\tthis.commonSettings = new CommonSettings(\n\t\t\tthis.app,\n\t\t\tthis.plugin,\n\t\t\tthis,\n\t\t\tthis.containerEl.createDiv(),\n\t\t)\n\t\tthis.filterSettings = new FilterSettings(\n\t\t\tthis.app,\n\t\t\tthis.plugin,\n\t\t\tthis,\n\t\t\tthis.containerEl.createDiv(),\n\t\t)\n\t\tthis.cacheSettings = new CacheSettings(\n\t\t\tthis.app,\n\t\t\tthis.plugin,\n\t\t\tthis,\n\t\t\tthis.containerEl.createDiv(),\n\t\t)\n\t\tthis.aiSettings = new AISettings(\n\t\t\tthis.app,\n\t\t\tthis.plugin,\n\t\t\tthis,\n\t\t\tthis.containerEl.createDiv(),\n\t\t)\n\t\tthis.logSettings = new LogSettings(\n\t\t\tthis.app,\n\t\t\tthis.plugin,\n\t\t\tthis,\n\t\t\tthis.containerEl.createDiv(),\n\t\t)\n\t}\n\n\tasync display() {\n\t\tthis.warningContainerEl.empty()\n\t\tnew Setting(this.warningContainerEl)\n\t\t\t.setName(i18n.t('settings.backupWarning.name'))\n\t\t\t.setDesc(i18n.t('settings.backupWarning.desc'))\n\t\tawait this.accountSettings.display()\n\t\tawait this.commonSettings.display()\n\t\tawait this.filterSettings.display()\n\t\tawait this.cacheSettings.display()\n\t\tawait this.aiSettings.display()\n\t\tawait this.logSettings.display()\n\t}\n\n\tget isSSO() {\n\t\treturn this.plugin.settings.loginMode === 'sso'\n\t}\n\n\tasync hide() {\n\t\tawait this.accountSettings.hide()\n\t}\n}\n"
  },
  {
    "path": "src/settings/log.ts",
    "content": "import { Notice, Setting } from 'obsidian'\nimport { isNotNil } from 'ramda'\nimport i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport logsStringify from '~/utils/logs-stringify'\nimport BaseSettings from './settings.base'\n\nexport default class LogSettings extends BaseSettings {\n\tasync display() {\n\t\tthis.containerEl.empty()\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.log.title'))\n\t\t\t.setHeading()\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.log.name'))\n\t\t\t.setDesc(i18n.t('settings.log.desc'))\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(i18n.t('settings.log.saveToNote'))\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\tawait this.saveLogsToNote()\n\t\t\t\t\t})\n\t\t\t})\n\t\tnew Setting(this.containerEl)\n\t\t\t.setName(i18n.t('settings.log.clearName'))\n\t\t\t.setDesc(i18n.t('settings.log.clearDesc'))\n\t\t\t.addButton((button) => {\n\t\t\t\tbutton.setButtonText(i18n.t('settings.log.clear')).onClick(() => {\n\t\t\t\t\tthis.plugin.loggerService.clear()\n\t\t\t\t\tnew Notice(i18n.t('settings.log.cleared'))\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\tget logs() {\n\t\treturn this.plugin.loggerService.logs\n\t\t\t.map(logsStringify)\n\t\t\t.filter(isNotNil)\n\t\t\t.join('\\n\\n')\n\t}\n\n\tasync saveLogsToNote() {\n\t\ttry {\n\t\t\tconst timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n\t\t\tconst fileName = `nutstore-logs-${timestamp}.md`\n\t\t\tconst dirPath = 'nutstore-sync/logs'\n\t\t\tconst filePath = `${dirPath}/${fileName}`\n\t\t\tconst content = `# Nutstore Plugin Logs\\n\\nGenerated at: ${new Date().toLocaleString()}\\n\\n---\\n\\n${this.logs}`\n\n\t\t\t// 确保目录存在\n\t\t\tconst folderExists = await this.app.vault.adapter.exists(dirPath)\n\t\t\tif (!folderExists) {\n\t\t\t\tawait this.app.vault.adapter.mkdir(dirPath)\n\t\t\t}\n\n\t\t\tconst file = await this.app.vault.create(filePath, content)\n\t\t\tnew Notice(i18n.t('settings.log.savedToNote', { fileName: filePath }))\n\n\t\t\tawait this.app.workspace.getLeaf().openFile(file)\n\t\t} catch (error) {\n\t\t\tnew Notice(i18n.t('settings.log.saveError'))\n\t\t\tlogger.error('Failed to save logs to note:', error)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/settings/settings.base.ts",
    "content": "import { App } from 'obsidian'\nimport { NutstoreSettingTab } from '.'\nimport NutstorePlugin from '..'\n\nexport default abstract class BaseSettings {\n\tconstructor(\n\t\tprotected app: App,\n\t\tprotected plugin: NutstorePlugin,\n\t\tprotected settings: NutstoreSettingTab,\n\t\tprotected containerEl: HTMLElement,\n\t) {}\n\n\tabstract display(): void\n}\n"
  },
  {
    "path": "src/shims/node-zlib.ts",
    "content": "function unsupported(functionName: string): never {\n\tthrow new Error(\n\t\t`node:zlib ${functionName} is not available in this Obsidian browser bundle.`,\n\t)\n}\n\nexport const constants = {\n\tZ_BEST_COMPRESSION: 9,\n\tZ_BEST_SPEED: 1,\n\tZ_DEFAULT_COMPRESSION: -1,\n}\n\nexport function gunzipSync(): never {\n\treturn unsupported('gunzipSync')\n}\n\nexport function gzipSync(): never {\n\treturn unsupported('gzipSync')\n}\n\nexport function deflateSync(): never {\n\treturn unsupported('deflateSync')\n}\n\nexport function inflateSync(): never {\n\treturn unsupported('inflateSync')\n}\n"
  },
  {
    "path": "src/storage/blob.ts",
    "content": "import { sha256Base64 } from '~/utils/sha256'\nimport { blobKV } from './kv'\n\nexport function useBlobStore() {\n\tfunction get(key: string) {\n\t\treturn blobKV.get(key)\n\t}\n\tasync function store(value: Blob | ArrayBuffer) {\n\t\tlet key: string\n\t\tlet blob: Blob\n\t\tif (value instanceof Blob) {\n\t\t\tkey = await sha256Base64(await value.arrayBuffer())\n\t\t\tblob = value\n\t\t} else {\n\t\t\tkey = await sha256Base64(value)\n\t\t\tblob = new Blob([value])\n\t\t}\n\t\treturn {\n\t\t\tkey,\n\t\t\tvalue: await blobKV.set(key, blob),\n\t\t}\n\t}\n\treturn {\n\t\tget,\n\t\tstore,\n\t}\n}\n\nexport const blobStore = useBlobStore()\n"
  },
  {
    "path": "src/storage/index.ts",
    "content": "export * from './kv'\n"
  },
  {
    "path": "src/storage/kv.ts",
    "content": "import localforage from 'localforage'\nimport type { ChatSession, ChatSessionIndexItem } from '~/chat/domain'\nimport { StatModel } from '~/model/stat.model'\nimport { SyncRecordModel } from '~/model/sync-record.model'\nimport useStorage from './use-storage'\n\nconst DB_NAME = 'Nutstore_Plugin_Cache'\n\nexport const syncRecordKV = useStorage<Map<string, SyncRecordModel>>(\n\tlocalforage.createInstance({\n\t\tname: DB_NAME,\n\t\tstoreName: 'sync_record',\n\t}),\n)\n\nexport const blobKV = useStorage<Blob>(\n\tlocalforage.createInstance({\n\t\tname: DB_NAME,\n\t\tstoreName: 'base_blob_store',\n\t}),\n)\n\nexport interface TraverseWebDAVCache {\n\trootCursor: string\n\tqueue: string[]\n\tnodes: Record<string, StatModel[]>\n}\n\nexport const traverseWebDAVKV = useStorage<TraverseWebDAVCache>(\n\tlocalforage.createInstance({\n\t\tname: DB_NAME,\n\t\tstoreName: 'traverse_webdav_cache',\n\t}),\n)\n\nexport interface ChatMetaRecord {\n\tactiveSessionId?: string\n\torderedSessionIds: string[]\n}\n\nexport const chatSessionKV = useStorage<ChatSession>(\n\tlocalforage.createInstance({\n\t\tname: DB_NAME,\n\t\tstoreName: 'chat_sessions',\n\t}),\n)\n\nexport const chatMetaKV = useStorage<ChatMetaRecord | ChatSessionIndexItem[]>(\n\tlocalforage.createInstance({\n\t\tname: DB_NAME,\n\t\tstoreName: 'chat_meta',\n\t}),\n)\n"
  },
  {
    "path": "src/storage/sync-record.ts",
    "content": "import { SyncRecordModel } from '~/model/sync-record.model'\nimport { UseStorageType } from './use-storage'\n\nexport class SyncRecord {\n\tconstructor(\n\t\tprivate namespace: string,\n\t\tprivate storage: UseStorageType<Map<string, SyncRecordModel>>,\n\t) {}\n\n\tasync updateFileRecord(path: string, record: SyncRecordModel): Promise<void> {\n\t\tconst map = await this.storage.get(this.namespace)\n\t\tif (map) {\n\t\t\tmap.set(path, record)\n\t\t\tawait this.storage.set(this.namespace, map)\n\t\t} else {\n\t\t\tawait this.storage.set(this.namespace, new Map([[path, record]]))\n\t\t}\n\t}\n\n\tasync deleteFileRecord(path: string): Promise<void> {\n\t\tconst map = await this.storage.get(this.namespace)\n\t\tif (map) {\n\t\t\tif (map.has(path)) {\n\t\t\t\tmap.delete(path)\n\t\t\t\tawait this.storage.set(this.namespace, map)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getRecords(): Promise<Map<string, SyncRecordModel>> {\n\t\tconst map = await this.storage.get(this.namespace)\n\t\treturn map ?? new Map()\n\t}\n\n\tasync setRecords(records: Map<string, SyncRecordModel>) {\n\t\tawait this.storage.set(this.namespace, records)\n\t}\n\n\tasync getRecord(path: string): Promise<SyncRecordModel | undefined> {\n\t\tconst map = await this.storage.get(this.namespace)\n\t\tif (map) {\n\t\t\treturn map.get(path)\n\t\t}\n\t}\n\n\tasync drop() {\n\t\tawait this.storage.unset(this.namespace)\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\tconst map = await this.storage.get(this.namespace)\n\t\tif (map) {\n\t\t\treturn map.has(path)\n\t\t}\n\t\treturn false\n\t}\n\n\tasync batchUpdate(updates: [string, SyncRecordModel][]): Promise<void> {\n\t\tif (updates.length === 0) {\n\t\t\treturn\n\t\t}\n\t\tconst map = await this.storage.get(this.namespace)\n\n\t\tif (map) {\n\t\t\tfor (const [path, record] of updates) {\n\t\t\t\tmap.set(path, record)\n\t\t\t}\n\t\t\tawait this.storage.set(this.namespace, map)\n\t\t} else {\n\t\t\tawait this.storage.set(this.namespace, new Map(updates))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/storage/use-storage.ts",
    "content": "export abstract class StorageInterface<T = any> {\n\tabstract setItem(key: string, value: T): Promise<T>\n\tabstract getItem(key: string): Promise<T | null>\n\tabstract removeItem(key: string): Promise<void>\n\tabstract keys(): Promise<string[]>\n\tabstract clear(): Promise<void>\n}\n\nexport type UseStorageType<T = any> = ReturnType<typeof useStorage<T>>\n\nexport default function useStorage<T = any>(instance: StorageInterface<T>) {\n\tfunction set(key: string, value: T) {\n\t\treturn instance.setItem(key, value)\n\t}\n\n\tfunction get(key: string) {\n\t\treturn instance.getItem(key)\n\t}\n\n\tfunction unset(key: string) {\n\t\treturn instance.removeItem(key)\n\t}\n\n\tfunction clear() {\n\t\treturn instance.clear()\n\t}\n\n\tasync function dump() {\n\t\tconst keys = await instance.keys()\n\t\tconst data: Record<string, T> = {}\n\t\tfor (const key of keys) {\n\t\t\tconst val = await instance.getItem(key)\n\t\t\tif (val) {\n\t\t\t\tdata[key] = val\n\t\t\t}\n\t\t}\n\t\treturn data\n\t}\n\n\tasync function restore(data: Record<string, any>) {\n\t\tif (!data || typeof data !== 'object') {\n\t\t\tthrow new Error('Invalid data format for restore')\n\t\t}\n\t\tconst temp = await dump()\n\t\ttry {\n\t\t\tawait instance.clear()\n\t\t\tfor (const key in data) {\n\t\t\t\tawait instance.setItem(key, data[key])\n\t\t\t}\n\t\t} catch {\n\t\t\tawait instance.clear()\n\t\t\tfor (const key in temp) {\n\t\t\t\tawait instance.setItem(key, temp[key])\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tset,\n\t\tget,\n\t\tunset,\n\t\tclear,\n\t\tdump,\n\t\trestore,\n\t}\n}\n"
  },
  {
    "path": "src/sync/core/merge-utils.test.ts",
    "content": "import { Buffer } from 'buffer' // Import Buffer for explicit Buffer testing\nimport { describe, expect, it } from 'vitest'\nimport {\n\tLatestTimestampResolution,\n\tresolveByIntelligentMerge,\n\tresolveByLatestTimestamp,\n\ttype IntelligentMergeParams,\n\ttype LatestTimestampParams,\n} from './merge-utils'\n\ndescribe('resolveByLatestTimestamp', () => {\n\t// --- 无更改 ---\n\tit('情况 1.1: 时间戳相同，应无更改', () => {\n\t\tconst params: LatestTimestampParams = {\n\t\t\tlocalMtime: 1000,\n\t\t\tremoteMtime: 1000,\n\t\t\tlocalContent: Buffer.from('abc'),\n\t\t\tremoteContent: Buffer.from('abc'),\n\t\t}\n\t\tconst result = resolveByLatestTimestamp(params)\n\t\texpect(result.status).toBe(LatestTimestampResolution.NoChange)\n\t})\n\n\tit('情况 1.2: 远程较新但内容相同，应无更改', () => {\n\t\tconst params: LatestTimestampParams = {\n\t\t\tlocalMtime: 1000,\n\t\t\tremoteMtime: 1001,\n\t\t\tlocalContent: Buffer.from('abc'),\n\t\t\tremoteContent: Buffer.from('abc'),\n\t\t}\n\t\tconst result = resolveByLatestTimestamp(params)\n\t\texpect(result.status).toBe(LatestTimestampResolution.NoChange)\n\t})\n\n\tit('情况 1.3: 本地较新但内容相同，应无更改', () => {\n\t\tconst params: LatestTimestampParams = {\n\t\t\tlocalMtime: 1001,\n\t\t\tremoteMtime: 1000,\n\t\t\tlocalContent: Buffer.from('abc'),\n\t\t\tremoteContent: Buffer.from('abc'),\n\t\t}\n\t\tconst result = resolveByLatestTimestamp(params)\n\t\texpect(result.status).toBe(LatestTimestampResolution.NoChange)\n\t})\n\n\t// --- 使用远程版本 ---\n\tit('情况 2.1: 远程较新且内容不同，应使用远程版本', () => {\n\t\tconst params: LatestTimestampParams = {\n\t\t\tlocalMtime: 1000,\n\t\t\tremoteMtime: 1001,\n\t\t\tlocalContent: Buffer.from('abc'),\n\t\t\tremoteContent: Buffer.from('abcd'),\n\t\t}\n\t\tconst result = resolveByLatestTimestamp(params)\n\t\texpect(result.status).toBe(LatestTimestampResolution.UseRemote)\n\t\tif (result.status === LatestTimestampResolution.UseRemote) {\n\t\t\texpect(result.content).toEqual(Buffer.from('abcd'))\n\t\t}\n\t})\n\n\tit('情况 2.2: 远程较新，Buffer 内容不同，应使用远程版本', () => {\n\t\tconst params: LatestTimestampParams = {\n\t\t\tlocalMtime: 1000,\n\t\t\tremoteMtime: 1001,\n\t\t\tlocalContent: Buffer.from('binarydata1'),\n\t\t\tremoteContent: Buffer.from('binarydata2'),\n\t\t}\n\t\tconst result = resolveByLatestTimestamp(params)\n\t\texpect(result.status).toBe(LatestTimestampResolution.UseRemote)\n\t\tif (result.status === LatestTimestampResolution.UseRemote) {\n\t\t\texpect(result.content).toEqual(Buffer.from('binarydata2'))\n\t\t}\n\t})\n\n\t// --- 使用本地版本 ---\n\tit('情况 3.1: 本地较新且内容不同，应使用本地版本', () => {\n\t\tconst params: LatestTimestampParams = {\n\t\t\tlocalMtime: 1001,\n\t\t\tremoteMtime: 1000,\n\t\t\tlocalContent: Buffer.from('xyz'),\n\t\t\tremoteContent: Buffer.from('xy'),\n\t\t}\n\t\tconst result = resolveByLatestTimestamp(params)\n\t\texpect(result.status).toBe(LatestTimestampResolution.UseLocal)\n\t\tif (result.status === LatestTimestampResolution.UseLocal) {\n\t\t\texpect(result.content).toEqual(Buffer.from('xyz'))\n\t\t}\n\t})\n\n\tit('情况 3.2: 本地较新，Buffer 内容不同，应使用本地版本', () => {\n\t\tconst params: LatestTimestampParams = {\n\t\t\tlocalMtime: 1001,\n\t\t\tremoteMtime: 1000,\n\t\t\tlocalContent: Buffer.from('localbinary'),\n\t\t\tremoteContent: Buffer.from('remotebinary'),\n\t\t}\n\t\tconst result = resolveByLatestTimestamp(params)\n\t\texpect(result.status).toBe(LatestTimestampResolution.UseLocal)\n\t\tif (result.status === LatestTimestampResolution.UseLocal) {\n\t\t\texpect(result.content).toEqual(Buffer.from('localbinary'))\n\t\t}\n\t})\n})\n\ndescribe('resolveByIntelligentMerge', () => {\n\t// --- 内容一致 ---\n\tit('情况 1.1: 本地与远程内容一致，应成功且标记为相同', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'line1\\nline2',\n\t\t\tlocalContentText: 'line1\\nline2\\nline3',\n\t\t\tremoteContentText: 'line1\\nline2\\nline3',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.isIdentical).toBe(true)\n\t})\n\n\t// --- node-diff3 成功合并 ---\n\tit('情况 2.1: 本地新增，远程不变 (node-diff3)，应成功合并', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'a\\nb',\n\t\t\tlocalContentText: 'a\\nb\\nc',\n\t\t\tremoteContentText: 'a\\nb',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe('a\\nb\\nc')\n\t})\n\n\tit('情况 2.2: 远程删除，本地不变 (node-diff3)，应成功合并', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'a\\nb\\nc',\n\t\t\tlocalContentText: 'a\\nb\\nc',\n\t\t\tremoteContentText: 'a\\nc',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe('a\\nc')\n\t})\n\n\tit('情况 2.3: 本地修改，远程不变 (node-diff3)，应成功合并', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'hello world',\n\t\t\tlocalContentText: 'hello universe',\n\t\t\tremoteContentText: 'hello world',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe('hello universe')\n\t})\n\n\tit('情况 2.4: 并发无重叠修改 (node-diff3)，应成功合并', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'line1\\nline2\\nline3\\nline4',\n\t\t\tlocalContentText: 'line1-local\\nline2\\nline3\\nline4',\n\t\t\tremoteContentText: 'line1\\nline2\\nline3\\nline4-remote',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe('line1-local\\nline2\\nline3\\nline4-remote')\n\t})\n\n\tit('情况 2.5: 本地在开头修改 (node-diff3)，应成功合并', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'original line',\n\t\t\tlocalContentText: 'new first line\\noriginal line',\n\t\t\tremoteContentText: 'original line',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe('new first line\\noriginal line')\n\t})\n\n\tit('情况 2.6: 远程在末尾修改 (node-diff3)，应成功合并', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'original line',\n\t\t\tlocalContentText: 'original line',\n\t\t\tremoteContentText: 'original line\\nnew last line',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe('original line\\nnew last line')\n\t})\n\n\t// --- dmp 回退合并测试 ---\n\tit('情况 3.1: node-diff3 冲突，dmp 回退亦无法解决', async () => {\n\t\t// 此场景模拟 diff3 在 'shared_line' 上报告冲突\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'common_prefix\\nshared_line_base\\ncommon_suffix',\n\t\t\tlocalContentText:\n\t\t\t\t'common_prefix\\nshared_line_local_version\\ncommon_suffix', // Local made a change\n\t\t\tremoteContentText:\n\t\t\t\t'common_prefix\\nshared_line_remote_version\\ncommon_suffix', // Remote also made a change\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 3.2: node-diff3 冲突，但 dmp 回退成功合并', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: '第一行\\n共同祖先\\n第三行',\n\t\t\tlocalContentText: '第一行\\n本地修改了共同祖先\\n第三行\\n本地新增行', // 本地修改并添加\n\t\t\tremoteContentText: '第一行\\n共同祖先被修改了\\n第三行', // 远程仅修改\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t'第一行\\n本地修改了共同祖先被修改了\\n第三行\\n本地新增行',\n\t\t)\n\t})\n\n\tit('情况 3.3: 并发编辑句子 - 一个添加修饰词，另一个更改名词 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'The cat sat on the mat.',\n\t\t\tlocalContentText: 'The fluffy cat sat on the mat.', // User A adds \"fluffy\"\n\t\t\tremoteContentText: 'The cat sat on the rug.', // User B changes \"mat\" to \"rug\"\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe('The fluffy cat sat on the rug.')\n\t})\n\n\tit('情况 3.4: 同一行文本两端同时编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'This is a shared line of text.',\n\t\t\tlocalContentText: 'NEW_PREFIX This is a shared line of text.', // User A adds a prefix\n\t\t\tremoteContentText: 'This is a shared line of text. NEW_SUFFIX', // User B adds a suffix\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t'NEW_PREFIX This is a shared line of text. NEW_SUFFIX',\n\t\t)\n\t})\n\n\tit('情况 3.5: 复杂交织的真实冲突 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'Report for Q1: Sales are up by 10%.',\n\t\t\tlocalContentText:\n\t\t\t\t'Urgent Report for Q1: Sales are significantly up by 10%.',\n\t\t\tremoteContentText: 'Report for Q1: Revenue is up by 10%, not sales.',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t'Urgent Report for Q1: Revenue is significantly up by 10%, not sales.',\n\t\t)\n\t})\n\n\tit('情况 3.6: 大段文本 - 两端非冲突编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `This is the first sentence of a long paragraph that serves as a base for testing.\nIt contains multiple lines and ideas to simulate a real-world text block.\nThe middle section of this paragraph will remain untouched by direct edits from either local or remote.\nHowever, changes will occur at the beginning and at the very end of this paragraph.\nThis setup helps verify if DMP can handle non-overlapping changes in a larger text body.`,\n\t\t\tlocalContentText: `A new introductory sentence has been added locally.\nThis is the first sentence of a long paragraph that serves as a base for testing.\nIt contains multiple lines and ideas to simulate a real-world text block.\nThe middle section of this paragraph will remain untouched by direct edits from either local or remote.\nHowever, changes will occur at the beginning and at the very end of this paragraph.\nThis setup helps verify if DMP can handle non-overlapping changes in a larger text body.`,\n\t\t\tremoteContentText: `This is the first sentence of a long paragraph that serves as a base for testing.\nIt contains multiple lines and ideas to simulate a real-world text block.\nThe middle section of this paragraph will remain untouched by direct edits from either local or remote.\nHowever, changes will occur at the beginning and at the very end of this paragraph.\nThis setup helps verify if DMP can handle non-overlapping changes in a larger text body.\nAnd a concluding sentence has been added remotely.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`A new introductory sentence has been added locally.\nThis is the first sentence of a long paragraph that serves as a base for testing.\nIt contains multiple lines and ideas to simulate a real-world text block.\nThe middle section of this paragraph will remain untouched by direct edits from either local or remote.\nHowever, changes will occur at the beginning and at the very end of this paragraph.\nThis setup helps verify if DMP can handle non-overlapping changes in a larger text body.\nAnd a concluding sentence has been added remotely.`,\n\t\t)\n\t})\n\n\tit('情况 3.7: 多段文本 - 不同段落非冲突编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `Paragraph one, initial state.\nIt has a few lines.\n\nParagraph two, also in its initial state.\nThis one also has some content.`,\n\t\t\tlocalContentText: `Paragraph one, with local modifications.\nIt has a few lines, and this is a local addition.\n\nParagraph two, also in its initial state.\nThis one also has some content.`,\n\t\t\tremoteContentText: `Paragraph one, initial state.\nIt has a few lines.\n\nParagraph two, with remote changes applied.\nThis one also has some content, and this is a remote addition.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`Paragraph one, with local modifications.\nIt has a few lines, and this is a local addition.\n\nParagraph two, with remote changes applied.\nThis one also has some content, and this is a remote addition.`,\n\t\t)\n\t})\n\n\tit('情况 3.8: 大段文本 - 内部冲突编辑 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `The project's primary goal is to enhance user experience.\nWe will achieve this by redesigning the interface and optimizing performance.\nThe timeline for this phase is three months.`,\n\t\t\tlocalContentText: `The project's primary goal is to revolutionize user interaction.\nWe will achieve this by completely overhauling the UI and boosting speed.\nThe timeline for this critical phase is two months.`,\n\t\t\tremoteContentText: `The project's main objective is to improve customer satisfaction.\nWe will achieve this by simplifying the navigation and ensuring stability.\nThe deadline for this phase is strictly four months.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 3.9: 多段文本 - 一段冲突，其他段落非冲突 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `Paragraph A: Initial content for the first section.\nIt discusses introductory concepts.\n\nParagraph B: Core ideas are presented here.\nThis section is crucial for understanding.\n\nParagraph C: Concluding remarks and future work.\nThis summarizes the document.`,\n\t\t\tlocalContentText: `Paragraph A: Initial content for the first section, with local additions.\nIt discusses introductory concepts and some new insights.\n\nParagraph B: Core ideas are presented here, but locally rephrased for clarity.\nThis section is absolutely vital for comprehension.\n\nParagraph C: Concluding remarks and future work.\nThis summarizes the document.`,\n\t\t\tremoteContentText: `Paragraph A: Initial content for the first section.\nIt discusses introductory concepts, expanded with remote details.\n\nParagraph B: Core concepts are detailed in this part.\nThis section is fundamentally important for understanding.\n\nParagraph C: Concluding remarks and future work, with an added action item.\nThis summarizes the document and suggests next steps.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false) // Conflict in Paragraph B should cause overall failure\n\t})\n\n\tit('情况 3.10: 大段中文文本 - 两端非冲突编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `这是一段用于测试的长中文段落的第一句话。\n它包含多行内容和若干观点，旨在模拟真实的文本块。\n该段落的中间部分将保持不变，本地和远程均不直接编辑。\n然而，段落的开头和末尾会发生更改。\n此设置有助于验证DMP是否能处理较长文本主体中的非重叠更改。`,\n\t\t\tlocalContentText: `本地新增了一个引言句。\n这是一段用于测试的长中文段落的第一句话。\n它包含多行内容和若干观点，旨在模拟真实的文本块。\n该段落的中间部分将保持不变，本地和远程均不直接编辑。\n然而，段落的开头和末尾会发生更改。\n此设置有助于验证DMP是否能处理较长文本主体中的非重叠更改。`,\n\t\t\tremoteContentText: `这是一段用于测试的长中文段落的第一句话。\n它包含多行内容和若干观点，旨在模拟真实的文本块。\n该段落的中间部分将保持不变，本地和远程均不直接编辑。\n然而，段落的开头和末尾会发生更改。\n此设置有助于验证DMP是否能处理较长文本主体中的非重叠更改。\n并且远程添加了一个总结句。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`本地新增了一个引言句。\n这是一段用于测试的长中文段落的第一句话。\n它包含多行内容和若干观点，旨在模拟真实的文本块。\n该段落的中间部分将保持不变，本地和远程均不直接编辑。\n然而，段落的开头和末尾会发生更改。\n此设置有助于验证DMP是否能处理较长文本主体中的非重叠更改。\n并且远程添加了一个总结句。`,\n\t\t)\n\t})\n\n\tit('情况 3.11: 多段中文文本 - 不同段落非冲突编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `段落一，初始状态。\n它有几行文字。\n\n段落二，同样处于初始状态。\n这一个也有一些内容。`,\n\t\t\tlocalContentText: `段落一，经过本地修改。\n它有几行文字，这是本地新增的内容。\n\n段落二，同样处于初始状态。\n这一个也有一些内容。`,\n\t\t\tremoteContentText: `段落一，初始状态。\n它有几行文字。\n\n段落二，已应用远程更改。\n这一个也有一些内容，这是远程新增的内容。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`段落一，经过本地修改。\n它有几行文字，这是本地新增的内容。\n\n段落二，已应用远程更改。\n这一个也有一些内容，这是远程新增的内容。`,\n\t\t)\n\t})\n\n\tit('情况 3.12: 大段中文文本 - 内部冲突编辑 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `项目的主要目标是提升用户体验。\n我们将通过重新设计界面和优化性能来实现这一目标。\n此阶段的时间表为三个月。`,\n\t\t\tlocalContentText: `项目的主要目标是革新用户交互。\n我们将通过彻底改造用户界面并提升速度来实现。\n这个关键阶段的时间表为两个月。`,\n\t\t\tremoteContentText: `项目的主要目的是提高客户满意度。\n我们将通过简化导航和确保稳定性来实现。\n此阶段的截止日期严格限定为四个月。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 3.13: 多段中文文本 - 一段冲突，其他段落非冲突 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `段落甲：第一部分的初始内容。\n它讨论了介绍性的概念。\n\n段落乙：核心思想在此呈现。\n这部分对于理解至关重要。\n\n段落丙：结论和未来工作。\n这总结了文档。`,\n\t\t\tlocalContentText: `段落甲：第一部分的初始内容，附带本地增补。\n它讨论了介绍性的概念和一些新的见解。\n\n段落乙：核心思想在此呈现，但本地为了清晰重新表述。\n这部分对于理解绝对关键。\n\n段落丙：结论和未来工作。\n这总结了文档。`,\n\t\t\tremoteContentText: `段落甲：第一部分的初始内容。\n它讨论了介绍性的概念，并用远程细节进行了扩展。\n\n段落乙：核心概念在这一部分有详细说明。\n这部分对于理解具有根本的重要性。\n\n段落丙：结论和未来工作，并增加了一个行动项。\n这总结了文档并建议了后续步骤。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false) // Conflict in 段落乙 should cause overall failure\n\t})\n\n\t// --- Markdown Specific Test Cases ---\n\tit('情况 3.14: Markdown - 非冲突编辑 (本地添加列表，远程修改段落) (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# Section Title\n\nThis is the original paragraph content. It discusses important concepts.`,\n\t\t\tlocalContentText: `# Section Title\n\nThis is the original paragraph content. It discusses important concepts.\n\n- Item 1\n- Item 2`,\n\t\t\tremoteContentText: `# Section Title\n\nThis is the modified paragraph content by remote. It elaborates on the important concepts with new details.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# Section Title\n\nThis is the modified paragraph content by remote. It elaborates on the important concepts with new details.\n\n- Item 1\n- Item 2`,\n\t\t)\n\t})\n\n\tit('情况 3.15: Markdown - 列表内非冲突编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `- First item: original text.\n- Second item: original text.\n- Third item: original text.`,\n\t\t\tlocalContentText: `- First item: locally modified text.\n- Second item: original text.\n- Third item: original text.`,\n\t\t\tremoteContentText: `- First item: original text.\n- Second item: remotely modified text.\n- Third item: original text.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`- First item: locally modified text.\n- Second item: remotely modified text.\n- Third item: original text.`,\n\t\t)\n\t})\n\n\tit('情况 3.16: Markdown - 标题冲突 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `## Original Subheading`,\n\t\t\tlocalContentText: `## Locally Updated Subheading`,\n\t\t\tremoteContentText: `## Remotely Revised Subheading`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 3.17: Markdown - 大型知识库片段 - 复杂非冲突编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# Main Topic: System Architecture\n\n## Introduction\nThis document outlines the system architecture. Key components include the API, database, and frontend.\n\n## Components\n- **API Server:** Handles all client requests.\n  - Built with Node.js.\n- **Database:** Stores persistent data.\n  - Uses PostgreSQL.\n- **Frontend:** User interface.\n  - Developed with React.\n\n### Data Flow\nData flows from Frontend -> API Server -> Database.`,\n\t\t\tlocalContentText: `# Main Topic: System Architecture\n\n## Introduction\nThis document outlines the system architecture. Key components include the API, database, and frontend.\n\n## Components\n- **API Server:** Handles all client requests and business logic.\n  - Built with Node.js and Express.\n- **Database:** Stores persistent data.\n  - Uses PostgreSQL.\n- **Frontend:** User interface.\n  - Developed with React.\n- **Caching Layer:** (New) Improves performance.\n  - Uses Redis.\n\n### Data Flow\nData flows from Frontend -> API Server -> Database.`,\n\t\t\tremoteContentText: `# Main Topic: System Architecture\n\n## Introduction\nThis document provides a comprehensive overview of the system architecture. Key components include the API, database, and frontend, working in concert.\n\n## Components\n- **API Server:** Handles all client requests.\n  - Built with Node.js.\n- **Database:** Stores persistent data.\n  - Uses PostgreSQL.\n- **Frontend:** User interface for interaction.\n  - Developed with React and Redux for state management.\n\n### Data Flow\nData flows from Frontend -> API Server -> Database.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# Main Topic: System Architecture\n\n## Introduction\nThis document provides a comprehensive overview of the system architecture. Key components include the API, database, and frontend, working in concert.\n\n## Components\n- **API Server:** Handles all client requests and business logic.\n  - Built with Node.js and Express.\n- **Database:** Stores persistent data.\n  - Uses PostgreSQL.\n- **Frontend:** User interface for interaction.\n  - Developed with React and Redux for state management.\n- **Caching Layer:** (New) Improves performance.\n  - Uses Redis.\n\n### Data Flow\nData flows from Frontend -> API Server -> Database.`,\n\t\t)\n\t})\n\n\tit('情况 3.18: Markdown - 大型知识库片段 - 复杂冲突编辑 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# Project Alpha: Guidelines\n\n## Setup Instructions\n1. Clone the repository.\n2. Run \\`npm install\\`.\n3. Run \\`npm start\\`.\n\n## Coding Standards\n- Use Prettier for formatting.\n- Write unit tests for all new features.`,\n\t\t\tlocalContentText: `# Project Alpha: Guidelines\n\n## Setup Instructions\n1. Clone the repository from the new URL.\n2. Run \\`yarn install\\`.\n3. Run \\`yarn dev\\`.\n\n## Coding Standards\n- Use Prettier for formatting.\n- Write unit tests for all new features.\n- All functions must have JSDoc comments.`,\n\t\t\tremoteContentText: `# Project Alpha: Guidelines\n\n## Setup Instructions\n1. Ensure you have Docker installed.\n2. Run \\`docker-compose up\\`.\n\n## Coding Standards\n- Use ESLint and Prettier for formatting and linting.\n- Write unit tests for all new features.`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 3.19: Markdown (中文) - 非冲突编辑 (本地添加列表，远程修改段落) (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 章节标题\n\n这是原始的段落内容。它讨论了重要的概念。`,\n\t\t\tlocalContentText: `# 章节标题\n\n这是原始的段落内容。它讨论了重要的概念。\n\n- 项目点 1\n- 项目点 2`,\n\t\t\tremoteContentText: `# 章节标题\n\n这是由远程修改的段落内容。它用新的细节阐述了重要的概念。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# 章节标题\n\n这是由远程修改的段落内容。它用新的细节阐述了重要的概念。\n\n- 项目点 1\n- 项目点 2`,\n\t\t)\n\t})\n\n\tit('情况 3.20: Markdown (中文) - 大型知识库片段 - 复杂非冲突编辑 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 主题：系统架构\n\n## 引言\n本文档概述了系统架构。关键组件包括API、数据库和前端。\n\n## 组件详情\n- **API服务器：** 处理所有客户端请求。\n  - 使用Node.js构建。\n- **数据库：** 存储持久化数据。\n  - 使用PostgreSQL。\n- **前端：** 用户界面。\n  - 使用React开发。`,\n\t\t\tlocalContentText: `# 主题：系统架构\n\n## 引言\n本文档概述了系统架构。关键组件包括API、数据库和前端。\n\n## 组件详情\n- **API服务器：** 处理所有客户端请求及业务逻辑。\n  - 使用Node.js和Express构建。\n- **数据库：** 存储持久化数据。\n  - 使用PostgreSQL。\n- **前端：** 用户界面。\n  - 使用React开发。\n- **缓存层：** (新增) 提升性能。\n  - 使用Redis。`,\n\t\t\tremoteContentText: `# 主题：系统架构\n\n## 引言\n本文档对系统架构进行了全面概述。关键组件包括API、数据库和前端，它们协同工作。\n\n## 组件详情\n- **API服务器：** 处理所有客户端请求。\n  - 使用Node.js构建。\n- **数据库：** 存储持久化数据。\n  - 使用PostgreSQL。\n- **前端：** 用于交互的用户界面。\n  - 使用React和Redux进行状态管理。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# 主题：系统架构\n\n## 引言\n本文档对系统架构进行了全面概述。关键组件包括API、数据库和前端，它们协同工作。\n\n## 组件详情\n- **API服务器：** 处理所有客户端请求及业务逻辑。\n  - 使用Node.js和Express构建。\n- **数据库：** 存储持久化数据。\n  - 使用PostgreSQL。\n- **前端：** 用于交互的用户界面。\n  - 使用React和Redux进行状态管理。\n- **缓存层：** (新增) 提升性能。\n  - 使用Redis。`,\n\t\t)\n\t})\n\n\tit('情况 3.21: Markdown (中文) - 大型知识库片段 - 复杂冲突编辑 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 项目甲：开发指南\n\n## 环境设置\n1. 克隆代码仓库。\n2. 运行 \\`npm install\\`。\n3. 运行 \\`npm start\\`。\n\n##编码规范\n- 使用 Prettier 进行格式化。\n- 为所有新功能编写单元测试。`,\n\t\t\tlocalContentText: `# 项目甲：开发指南\n\n## 环境设置\n1. 从新的URL克隆代码仓库。\n2. 运行 \\`yarn install\\`。\n3. 运行 \\`yarn dev\\`。\n\n##编码规范\n- 使用 Prettier 进行格式化。\n- 为所有新功能编写单元测试。\n- 所有函数必须有 JSDoc 注释。`,\n\t\t\tremoteContentText: `# 项目甲：开发指南\n\n## 环境设置\n1. 确保已安装 Docker。\n2. 运行 \\`docker-compose up\\`。\n\n##编码规范\n- 使用 ESLint 和 Prettier 进行格式化和代码检查。\n- 为所有新功能编写单元测试。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 3.22: Markdown - 本地在文档中间插入大段文字，远程在末尾小幅修改 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 原始标题\n\n这是文档的初始段落。\n它包含了一些基本信息。\n\n这是文档的结束部分。`,\n\t\t\tlocalContentText: `# 原始标题\n\n这是文档的初始段落。\n它包含了一些基本信息。\n\n## 本地新增章节\n\n这是本地插入的一大段新内容。\n它可能包含多个段落，详细阐述某个主题。\n例如，这里可以有列表：\n- 列表项A\n- 列表项B\n\n甚至可以有更复杂的 Markdown 结构。\n\n这是文档的结束部分。`,\n\t\t\tremoteContentText: `# 原始标题\n\n这是文档的初始段落。\n它包含了一些基本信息。\n\n这是文档的结束部分。远程在这里添加了一句总结性的话。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# 原始标题\n\n这是文档的初始段落。\n它包含了一些基本信息。\n\n## 本地新增章节\n\n这是本地插入的一大段新内容。\n它可能包含多个段落，详细阐述某个主题。\n例如，这里可以有列表：\n- 列表项A\n- 列表项B\n\n甚至可以有更复杂的 Markdown 结构。\n\n这是文档的结束部分。远程在这里添加了一句总结性的话。`,\n\t\t)\n\t})\n\n\tit('情况 3.23: Markdown - 本地和远程在不同位置分别插入大段非冲突文字 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 文档标题\n\n## 章节一：引言\n\n这是引言内容。\n\n## 章节二：核心概念\n\n这是核心概念的阐述。\n\n## 章节三：结论\n\n这是结论部分。`,\n\t\t\tlocalContentText: `# 文档标题\n\n## 章节一：引言\n\n这是引言内容。\n\n### 本地新增：引言的补充说明\n\n这部分是本地在引言章节中新增的详细内容。\n它可以很长，包含多个要点。\n- 要点1\n- 要点2\n\n## 章节二：核心概念\n\n这是核心概念的阐述。\n\n## 章节三：结论\n\n这是结论部分。`,\n\t\t\tremoteContentText: `# 文档标题\n\n## 章节一：引言\n\n这是引言内容。\n\n## 章节二：核心概念\n\n这是核心概念的阐述。\n\n### 远程新增：核心概念的案例分析\n\n这部分是远程在核心概念章节中新增的案例。\n它可以包含代码示例：\n\\`\\`\\`\nfunction example() {\n  console.log(\"Hello from remote\");\n}\n\\`\\`\\`\n以及对案例的详细解释。\n\n## 章节三：结论\n\n这是结论部分。`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# 文档标题\n\n## 章节一：引言\n\n这是引言内容。\n\n### 本地新增：引言的补充说明\n\n这部分是本地在引言章节中新增的详细内容。\n它可以很长，包含多个要点。\n- 要点1\n- 要点2\n\n## 章节二：核心概念\n\n这是核心概念的阐述。\n\n### 远程新增：核心概念的案例分析\n\n这部分是远程在核心概念章节中新增的案例。\n它可以包含代码示例：\n\\`\\`\\`\nfunction example() {\n  console.log(\"Hello from remote\");\n}\n\\`\\`\\`\n以及对案例的详细解释。\n\n## 章节三：结论\n\n这是结论部分。`,\n\t\t)\n\t})\n\n\tit('情况 3.24: Markdown - 本地插入一个极长的段落，远程在另一处添加简短注释 (DMP 成功)', async () => {\n\t\tconst longParagraph = `这是一个极长的段落，模拟用户在Obsidian中撰写或粘贴大量文本的场景。这个段落需要足够长，以测试合并算法在处理大块文本时的性能和准确性。它可以包含各种类型的文本，例如详细的解释、复杂的思考过程、或者从其他地方引用的长篇内容。为了达到“极长”的目的，我会在这里重复一些句子，或者添加一些无意义的填充文本。这仅仅是为了增加段落的字符数和行数。在实际应用中，这样的段落通常会包含有价值的信息，但对于测试来说，长度是关键。我们希望确保即使用户进行了如此大规模的单次编辑，合并过程依然能够正确处理，并且不会丢失任何信息，也不会引入错误。这个段落将继续延伸，以确保它确实很长。重复的文本有助于快速增加长度，同时保持一定的可读性（尽管内容上可能没有新增信息）。这个段落现在应该已经足够长了，可以有效地测试我们想要验证的场景。再加几句确保长度。这真的是一个很长的段落，对吧？我们还在继续写，确保它足够长。最后几句了，这个段落的长度应该可以满足测试需求了。`\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 原始文档\n\n第一段内容。\n\n第二段内容，这里将保持不变。\n\n最后一段。`,\n\t\t\tlocalContentText: `# 原始文档\n\n第一段内容。\n\n${longParagraph}\n\n第二段内容，这里将保持不变。\n\n最后一段。`,\n\t\t\tremoteContentText: `# 原始文档 (远程修改了标题)\n\n第一段内容。\n\n第二段内容，这里将保持不变。\n\n最后一段。 (远程添加了注释)`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# 原始文档 (远程修改了标题)\n\n第一段内容。\n\n${longParagraph}\n\n第二段内容，这里将保持不变。\n\n最后一段。 (远程添加了注释)`,\n\t\t)\n\t})\n\n\tit('情况 3.25: Markdown - 本地插入大段文字，远程删除另一不相关段落 (DMP 成功)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 初始文档结构\n\n## 第一节：引言\n\n这是引言部分的文字。\n\n## 第二节：待删除内容\n\n这部分内容将在远程版本中被删除。\n它包含几行文字，用于测试删除操作。\n\n## 第三节：核心论述\n\n这是核心论述部分。`,\n\t\t\tlocalContentText: `# 初始文档结构\n\n## 第一节：引言\n\n这是引言部分的文字。\n\n### 本地新增：引言的扩展\n\n这里是本地在引言部分新增的大段内容。\n它详细地扩展了引言中的观点。\n可以包含多个小节和列表。\n- 扩展点1\n- 扩展点2\n\n## 第二节：待删除内容\n\n这部分内容将在远程版本中被删除。\n它包含几行文字，用于测试删除操作。\n\n## 第三节：核心论述\n\n这是核心论述部分。`,\n\t\t\tremoteContentText: `# 初始文档结构\n\n## 第一节：引言\n\n这是引言部分的文字。\n\n## 第三节：核心论述\n\n这是核心论述部分。 (远程在此处可能有一些微小调整)`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.mergedText).toBe(\n\t\t\t`# 初始文档结构\n\n## 第一节：引言\n\n这是引言部分的文字。\n\n### 本地新增：引言的扩展\n\n这里是本地在引言部分新增的大段内容。\n它详细地扩展了引言中的观点。\n可以包含多个小节和列表。\n- 扩展点1\n- 扩展点2\n\n## 第三节：核心论述\n\n这是核心论述部分。 (远程在此处可能有一些微小调整)`,\n\t\t)\n\t})\n\n\tit('情况 3.26: Markdown - 本地和远程在同一位置附近插入大段冲突文字 (DMP 失败)', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: `# 会议纪要\n\n## 议题一：项目进展\n\n主持人总结了上周的工作。\n\n## 议题二：后续计划`,\n\t\t\tlocalContentText: `# 会议纪要\n\n## 议题一：项目进展\n\n主持人总结了上周的工作。\n\n### 本地补充：关于A模块的详细讨论\n\n张三详细介绍了A模块的技术实现细节，遇到的问题以及解决方案。\n李四补充了A模块与B模块的集成方案。\n王五提出了关于A模块性能优化的建议。\n（此处省略数百字详细讨论记录）\n\n## 议题二：后续计划`,\n\t\t\tremoteContentText: `# 会议纪要\n\n## 议题一：项目进展\n\n主持人总结了上周的工作。\n\n### 远程补充：关于用户反馈的整理\n\n赵六整理了上周收集到的用户反馈，主要集中在C功能和D功能的体验问题。\n钱七分析了反馈产生的原因，并提出了初步的改进方向。\n（此处省略数百字用户反馈详情及分析）\n\n## 议题二：后续计划`,\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\t// --- 合并失败 ---\n\tit('情况 4.1: 真冲突，两种算法均无法解决', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'line1\\nconflicting_line_base\\nline3',\n\t\t\tlocalContentText: 'line1\\nconflicting_line_local_change_A\\nline3',\n\t\t\tremoteContentText: 'line1\\nconflicting_line_remote_change_B\\nline3',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\t// --- 内容边缘情况 ---\n\tit('情况 5.1: 基础内容为空，本地与远程冲突', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: '',\n\t\t\tlocalContentText: 'local only content',\n\t\t\tremoteContentText: 'remote only content',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 5.1b: 基础内容为空，本地与远程内容相同', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: '',\n\t\t\tlocalContentText: 'same content',\n\t\t\tremoteContentText: 'same content',\n\t\t}\n\t\t// local and remote are identical, so it's not a merge conflict, it's just identical.\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.isIdentical).toBe(true)\n\t})\n\n\tit('情况 5.2: 本地内容为空，基础和远程均有内容', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: 'some base content\\nshared line',\n\t\t\tlocalContentText: '', // Local deleted everything\n\t\t\tremoteContentText: 'some base content\\nshared line\\nremote additions', // Remote kept base and added\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(false)\n\t})\n\n\tit('情况 5.3: 所有内容均为空', async () => {\n\t\tconst params: IntelligentMergeParams = {\n\t\t\tbaseContentText: '',\n\t\t\tlocalContentText: '',\n\t\t\tremoteContentText: '',\n\t\t}\n\t\tconst result = await resolveByIntelligentMerge(params)\n\t\texpect(result.success).toBe(true)\n\t\texpect(result.isIdentical).toBe(true)\n\t})\n})\n"
  },
  {
    "path": "src/sync/core/merge-utils.ts",
    "content": "import { diff_match_patch } from 'diff-match-patch'\nimport { isEqual } from 'lodash-es'\nimport { diff3Merge as nodeDiff3Merge } from 'node-diff3'\nimport { BufferLike } from 'webdav'\n\n// --- Logic for Latest Timestamp Resolution ---\n\nexport enum LatestTimestampResolution {\n\tNoChange,\n\tUseRemote,\n\tUseLocal,\n}\n\nexport interface LatestTimestampParams {\n\tlocalMtime: number\n\tremoteMtime: number\n\tlocalContent: BufferLike\n\tremoteContent: BufferLike\n}\n\nexport type LatestTimestampResult =\n\t| { status: LatestTimestampResolution.NoChange }\n\t| { status: LatestTimestampResolution.UseRemote; content: BufferLike }\n\t| { status: LatestTimestampResolution.UseLocal; content: BufferLike }\n\nexport function resolveByLatestTimestamp(\n\tparams: LatestTimestampParams,\n): LatestTimestampResult {\n\tconst { localMtime, remoteMtime, localContent, remoteContent } = params\n\n\tif (remoteMtime === localMtime) {\n\t\treturn { status: LatestTimestampResolution.NoChange }\n\t}\n\n\tconst useRemote = remoteMtime > localMtime\n\n\tif (useRemote) {\n\t\t// Only return UseRemote if content is actually different\n\t\tif (!isEqual(localContent, remoteContent)) {\n\t\t\treturn {\n\t\t\t\tstatus: LatestTimestampResolution.UseRemote,\n\t\t\t\tcontent: remoteContent,\n\t\t\t}\n\t\t}\n\t\treturn { status: LatestTimestampResolution.NoChange }\n\t} else {\n\t\t// Local is newer (or same age but remote wasn't newer)\n\t\t// Only return UseLocal if content is actually different\n\t\tif (!isEqual(localContent, remoteContent)) {\n\t\t\treturn {\n\t\t\t\tstatus: LatestTimestampResolution.UseLocal,\n\t\t\t\tcontent: localContent,\n\t\t\t}\n\t\t}\n\t\treturn { status: LatestTimestampResolution.NoChange }\n\t}\n}\n\n// --- Logic for Intelligent Merge Resolution ---\n\nexport interface IntelligentMergeParams {\n\tlocalContentText: string\n\tremoteContentText: string\n\tbaseContentText: string\n}\n\nexport interface IntelligentMergeResult {\n\tsuccess: boolean\n\tmergedText?: string\n\terror?: string // Generic error message\n\tisIdentical?: boolean // Flag if contents were already identical\n}\n\n// Helper for diff3Merge logic, adapted from the original class method\nfunction diff3MergeStrings(\n\tbase: string | string[],\n\tlocal: string | string[],\n\tremote: string | string[],\n): string | false {\n\tconst regions = nodeDiff3Merge(local, base, remote, {\n\t\texcludeFalseConflicts: true,\n\t\tstringSeparator: '\\n',\n\t})\n\n\tif (regions.some((region) => !region.ok)) {\n\t\treturn false\n\t}\n\tconst result: string[][] = []\n\tfor (const region of regions) {\n\t\tif (region.ok) {\n\t\t\tresult.push(region.ok as string[])\n\t\t}\n\t}\n\treturn result.flat().join('\\n')\n}\n\nexport async function resolveByIntelligentMerge(\n\tparams: IntelligentMergeParams,\n): Promise<IntelligentMergeResult> {\n\tconst { localContentText, remoteContentText, baseContentText } = params\n\n\tif (localContentText === remoteContentText) {\n\t\treturn { success: true, isIdentical: true }\n\t}\n\n\tconst diff3MergedText = diff3MergeStrings(\n\t\tbaseContentText,\n\t\tlocalContentText,\n\t\tremoteContentText,\n\t)\n\n\tif (diff3MergedText !== false) {\n\t\treturn { success: true, mergedText: diff3MergedText }\n\t}\n\n\tconst dmp = new diff_match_patch()\n\tdmp.Match_Threshold = 0.2\n\tdmp.Patch_Margin = 2\n\n\tconst diffs = dmp.diff_main(baseContentText, remoteContentText)\n\tconst patches = dmp.patch_make(baseContentText, diffs)\n\tlet [mergedDmpText, solveResult] = dmp.patch_apply(patches, localContentText)\n\n\tif (solveResult.includes(false)) {\n\t\treturn { success: false }\n\t}\n\n\treturn { success: true, mergedText: mergedDmpText }\n}\n"
  },
  {
    "path": "src/sync/decision/base.decider.ts",
    "content": "import { SyncRecord } from '~/storage/sync-record'\nimport { MaybePromise } from '~/utils/types'\nimport { NutstoreSync } from '..'\nimport { BaseTask } from '../tasks/task.interface'\n\nexport default abstract class BaseSyncDecider {\n\tconstructor(\n\t\tprotected sync: NutstoreSync,\n\t\tprotected syncRecordStorage: SyncRecord,\n\t) {}\n\n\tabstract decide(): MaybePromise<BaseTask[]>\n\n\tprotected getSyncRecordStorage() {\n\t\treturn this.syncRecordStorage\n\t}\n\n\tget webdav() {\n\t\treturn this.sync.webdav\n\t}\n\n\tget settings() {\n\t\treturn this.sync.settings\n\t}\n\n\tget vault() {\n\t\treturn this.sync.vault\n\t}\n\n\tget remoteBaseDir() {\n\t\treturn this.sync.remoteBaseDir\n\t}\n}\n"
  },
  {
    "path": "src/sync/decision/has-folder-content-changed.ts",
    "content": "import { isSameTime } from '~/utils/is-same-time'\nimport { isSub } from '~/utils/is-sub'\n\n/**\n * Check if folder content has changed (based on sub-items check, not folder mtime)\n * @param folderPath folder path\n * @param stats file/folder stats list (localStats or remoteStats)\n * @param syncRecords sync records\n * @param side 'local' or 'remote', specifies which side's mtime to check\n * @returns true if changed, false if no changes\n */\nexport function hasFolderContentChanged(\n\tfolderPath: string,\n\tstats: Array<{ path: string; mtime?: number; isDir: boolean }>,\n\tsyncRecords: Map<string, any>,\n\tside: 'local' | 'remote',\n): boolean {\n\tfor (const sub of stats) {\n\t\t// Only check sub-items under this folder\n\t\tif (!isSub(folderPath, sub.path)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst subRecord = syncRecords.get(sub.path)\n\n\t\t// Case 1: sub-item has no sync record → new content\n\t\tif (!subRecord) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Case 2: sub-item has sync record, check if modified\n\t\t// Only check mtime for files, not folders (folder mtime is unreliable)\n\t\tif (!sub.isDir) {\n\t\t\tconst recordMtime =\n\t\t\t\tside === 'local' ? subRecord.local.mtime : subRecord.remote.mtime\n\t\t\tif (sub.mtime && recordMtime) {\n\t\t\t\tif (!isSameTime(sub.mtime, recordMtime)) {\n\t\t\t\t\treturn true // file modified\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false // all sub-items unchanged\n}\n"
  },
  {
    "path": "src/sync/decision/sync-decision.interface.ts",
    "content": "import { FsWalkResult } from '~/fs/fs.interface'\nimport { StatModel } from '~/model/stat.model'\nimport { SyncMode } from '~/settings'\nimport { ConflictStrategy } from '../tasks/conflict-resolve.task'\nimport { SkipReason } from '../tasks/skipped.task'\nimport { BaseTask } from '../tasks/task.interface'\n\nexport interface SyncDecisionSettings {\n\tskipLargeFiles: { maxSize: string }\n\tconflictStrategy: ConflictStrategy\n\tuseGitStyle: boolean\n\tsyncMode: SyncMode\n\tconfigDir: string\n}\n\nexport interface SyncRecordItem {\n\tremote: StatModel\n\tlocal: StatModel\n\tbase?: { key: string }\n}\n\nexport interface TaskOptions {\n\tremotePath: string\n\tlocalPath: string\n\tremoteBaseDir: string\n}\n\nexport interface ConflictTaskOptions extends TaskOptions {\n\trecord?: SyncRecordItem\n\tstrategy: ConflictStrategy\n\tlocalStat: StatModel\n\tremoteStat: StatModel\n\tuseGitStyle: boolean\n}\n\nexport interface PullTaskOptions extends TaskOptions {\n\tremoteSize: number\n}\n\nexport type SkippedTaskOptions = TaskOptions &\n\t(\n\t\t| {\n\t\t\t\treason: SkipReason.FileTooLarge\n\t\t\t\tmaxSize: number\n\t\t\t\tremoteSize: number\n\t\t\t\tlocalSize?: number\n\t\t  }\n\t\t| {\n\t\t\t\treason: SkipReason.FileTooLarge\n\t\t\t\tmaxSize: number\n\t\t\t\tremoteSize?: number\n\t\t\t\tlocalSize: number\n\t\t  }\n\t\t| {\n\t\t\t\treason: SkipReason.FileTooLarge\n\t\t\t\tmaxSize: number\n\t\t\t\tremoteSize: number\n\t\t\t\tlocalSize: number\n\t\t  }\n\t\t| {\n\t\t\t\treason: SkipReason.FolderContainsIgnoredItems\n\t\t\t\tignoredPaths: string[]\n\t\t  }\n\t)\n\nexport interface TaskFactory {\n\tcreatePullTask(options: PullTaskOptions): BaseTask\n\tcreatePushTask(options: TaskOptions): BaseTask\n\tcreateConflictResolveTask(options: ConflictTaskOptions): BaseTask\n\tcreateNoopTask(options: TaskOptions): BaseTask\n\tcreateRemoveLocalTask(options: TaskOptions): BaseTask\n\tcreateRemoveRemoteTask(options: TaskOptions): BaseTask\n\tcreateMkdirLocalTask(options: TaskOptions): BaseTask\n\tcreateMkdirRemoteTask(options: TaskOptions): BaseTask\n\tcreateCleanRecordTask(options: TaskOptions): BaseTask\n\tcreateFilenameErrorTask(options: TaskOptions): BaseTask\n\tcreateSkippedTask(options: SkippedTaskOptions): BaseTask\n}\n\nexport interface SyncDecisionInput {\n\tsettings: SyncDecisionSettings\n\tlocalStats: FsWalkResult[]\n\tremoteStats: FsWalkResult[]\n\tsyncRecords: Map<string, SyncRecordItem>\n\tremoteBaseDir: string\n\tgetBaseContent: (key: string) => Promise<ArrayBuffer | null>\n\tcompareFileContent: (\n\t\tfilePath: string,\n\t\tbaseContent: ArrayBuffer,\n\t) => Promise<boolean>\n\ttaskFactory: TaskFactory\n}\n"
  },
  {
    "path": "src/sync/decision/two-way.decider.function.ts",
    "content": "import { parse as bytesParse } from 'bytes-iec'\nimport { SyncMode } from '~/settings'\nimport { hasInvalidChar } from '~/utils/has-invalid-char'\nimport { isSameTime } from '~/utils/is-same-time'\nimport logger from '~/utils/logger'\nimport remotePathToAbsolute from '~/utils/remote-path-to-absolute'\nimport { remotePathToLocalPath } from '~/utils/remote-path-to-local-path'\nimport { ConflictStrategy } from '../tasks/conflict-resolve.task'\nimport { SkipReason } from '../tasks/skipped.task'\nimport { BaseTask } from '../tasks/task.interface'\nimport {\n\tgetIgnoredPathsInFolder,\n\thasIgnoredInFolder,\n} from '../utils/has-ignored-in-folder'\nimport { hasFolderContentChanged } from './has-folder-content-changed'\nimport { SyncDecisionInput } from './sync-decision.interface'\n\n/**\n * Files under configDir (.obsidian) must not be text-merged — they are JSON,\n * binary JS, or other non-markdown formats. Always use latest-timestamp for them.\n */\nfunction pickConflictStrategy(\n\tpath: string,\n\tconfigDir: string,\n\tuserStrategy: ConflictStrategy,\n): ConflictStrategy {\n\tif (path === configDir || path.startsWith(configDir + '/')) {\n\t\treturn ConflictStrategy.LatestTimeStamp\n\t}\n\treturn userStrategy\n}\n\nexport async function twoWayDecider(\n\tinput: SyncDecisionInput,\n): Promise<BaseTask[]> {\n\tconst {\n\t\tsettings,\n\t\tlocalStats,\n\t\tremoteStats,\n\t\tsyncRecords,\n\t\tremoteBaseDir,\n\t\tgetBaseContent,\n\t\tcompareFileContent,\n\t\ttaskFactory,\n\t} = input\n\n\tlet maxFileSize = Infinity\n\tconst maxFileSizeStr = settings.skipLargeFiles.maxSize.trim()\n\tif (maxFileSizeStr !== '') {\n\t\tmaxFileSize = bytesParse(maxFileSizeStr, { mode: 'jedec' }) ?? Infinity\n\t}\n\n\t// Filter out ignored files and extract StatModel from FsWalkResult\n\tconst localStatsFiltered = localStats\n\t\t.filter((item) => !item.ignored)\n\t\t.map((item) => item.stat)\n\tconst remoteStatsFiltered = remoteStats\n\t\t.filter((item) => !item.ignored)\n\t\t.map((item) => item.stat)\n\n\tconst localStatsMap = new Map(\n\t\tlocalStatsFiltered.map((item) => [item.path, item]),\n\t)\n\tconst remoteStatsMap = new Map(\n\t\tremoteStatsFiltered.map((item) => [item.path, item]),\n\t)\n\tconst mixedPath = new Set([...localStatsMap.keys(), ...remoteStatsMap.keys()])\n\n\tlogger.debug(\n\t\t'local Stats',\n\t\tlocalStatsFiltered.map((d) => ({\n\t\t\tpath: d.path,\n\t\t\tsize: d.isDir ? undefined : d.size,\n\t\t\tisDir: d.isDir,\n\t\t})),\n\t)\n\tlogger.debug(\n\t\t'remote Stats',\n\t\tremoteStatsFiltered.map((d) => ({\n\t\t\tpath: d.path,\n\t\t\tsize: d.isDir ? undefined : d.size,\n\t\t\tisDir: d.isDir,\n\t\t})),\n\t)\n\n\tconst tasks: BaseTask[] = []\n\tconst removeRemoteFolderTasks: BaseTask[] = []\n\tconst removeLocalFolderTasks: BaseTask[] = []\n\tconst mkdirLocalTasks: BaseTask[] = []\n\tconst mkdirRemoteTasks: BaseTask[] = []\n\tconst noopFolderTasks: BaseTask[] = []\n\n\t// * sync files\n\tfor (const p of mixedPath) {\n\t\tconst remote = remoteStatsMap.get(p)\n\t\tconst local = localStatsMap.get(p)\n\t\tconst record = syncRecords.get(p)\n\t\tconst options = {\n\t\t\tremotePath: p,\n\t\t\tlocalPath: p,\n\t\t\tremoteBaseDir,\n\t\t}\n\t\tif (local?.isDir || remote?.isDir) {\n\t\t\tcontinue\n\t\t}\n\t\tif (record) {\n\t\t\tif (remote) {\n\t\t\t\tconst remoteChanged = !isSameTime(remote.mtime, record.remote.mtime)\n\t\t\t\tif (local) {\n\t\t\t\t\tlet localChanged = !isSameTime(local.mtime, record.local.mtime)\n\t\t\t\t\tif (localChanged && record.base?.key) {\n\t\t\t\t\t\tconst baseContent = await getBaseContent(record.base.key)\n\t\t\t\t\t\tif (baseContent) {\n\t\t\t\t\t\t\tlocalChanged = !(await compareFileContent(\n\t\t\t\t\t\t\t\tlocal.path,\n\t\t\t\t\t\t\t\tbaseContent,\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (remoteChanged) {\n\t\t\t\t\t\tif (localChanged) {\n\t\t\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\t\t\treason: 'both local and remote files changed',\n\t\t\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\t\t\tremoteChanged,\n\t\t\t\t\t\t\t\t\tlocalChanged,\n\t\t\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (remote.size > maxFileSize || local.size > maxFileSize) {\n\t\t\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t\t\t\tlocalSize: local.size,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (hasInvalidChar(local.path)) {\n\t\t\t\t\t\t\t\ttasks.push(taskFactory.createFilenameErrorTask(options))\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\t\t\ttaskFactory.createConflictResolveTask({\n\t\t\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\t\t\trecord,\n\t\t\t\t\t\t\t\t\t\tstrategy: pickConflictStrategy(\n\t\t\t\t\t\t\t\t\t\t\tp,\n\t\t\t\t\t\t\t\t\t\t\tsettings.configDir,\n\t\t\t\t\t\t\t\t\t\t\tsettings.conflictStrategy,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tlocalStat: local,\n\t\t\t\t\t\t\t\t\t\tremoteStat: remote,\n\t\t\t\t\t\t\t\t\t\tuseGitStyle: settings.useGitStyle,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\t\t\treason: 'remote file changed',\n\t\t\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\t\t\tremoteChanged,\n\t\t\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (remote.size > maxFileSize) {\n\t\t\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t\t\t\tlocalSize: local.size,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\t\ttaskFactory.createPullTask({\n\t\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (localChanged) {\n\t\t\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\t\t\treason: 'local file changed',\n\t\t\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\t\t\tlocalChanged,\n\t\t\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (local.size > maxFileSize) {\n\t\t\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t\t\t\tlocalSize: local.size,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (hasInvalidChar(local.path)) {\n\t\t\t\t\t\t\t\ttasks.push(taskFactory.createFilenameErrorTask(options))\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttasks.push(taskFactory.createPushTask(options))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (remoteChanged) {\n\t\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\t\treason: 'remote file changed and local file does not exist',\n\t\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\t\tremoteChanged,\n\t\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif (remote.size > maxFileSize) {\n\t\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createPullTask({\n\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\t\treason: 'remote file is removable',\n\t\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttasks.push(taskFactory.createRemoveRemoteTask(options))\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (local) {\n\t\t\t\tconst localChanged = !isSameTime(local.mtime, record.local.mtime)\n\t\t\t\tif (localChanged) {\n\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\treason: 'local file changed and remote file does not exist',\n\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\tlocalChanged,\n\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (local.size > maxFileSize) {\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\tlocalSize: local.size,\n\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif (hasInvalidChar(local.path)) {\n\t\t\t\t\t\ttasks.push(taskFactory.createFilenameErrorTask(options))\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttasks.push(taskFactory.createPushTask(options))\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t} else {\n\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\treason: 'local file is removable',\n\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\ttasks.push(taskFactory.createRemoveLocalTask(options))\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (remote) {\n\t\t\t\tif (local) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tsettings.syncMode === SyncMode.LOOSE &&\n\t\t\t\t\t\t!remote.isDeleted &&\n\t\t\t\t\t\t!remote.isDir &&\n\t\t\t\t\t\tremote.size === local.size\n\t\t\t\t\t) {\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createNoopTask({\n\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\treason: 'both local and remote files exist without a record',\n\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (remote.size > maxFileSize || local.size > maxFileSize) {\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t\tlocalSize: local.size,\n\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tif (hasInvalidChar(local.path)) {\n\t\t\t\t\t\ttasks.push(taskFactory.createFilenameErrorTask(options))\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createConflictResolveTask({\n\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\tstrategy: pickConflictStrategy(\n\t\t\t\t\t\t\t\t\tp,\n\t\t\t\t\t\t\t\t\tsettings.configDir,\n\t\t\t\t\t\t\t\t\tsettings.conflictStrategy,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tlocalStat: local,\n\t\t\t\t\t\t\t\tremoteStat: remote,\n\t\t\t\t\t\t\t\tuseGitStyle: settings.useGitStyle,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue\n\t\t\t\t} else {\n\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\treason: 'remote file exists without a local file',\n\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (remote.size > maxFileSize) {\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\tremoteSize: remote.size,\n\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttasks.push(\n\t\t\t\t\t\ttaskFactory.createPullTask({ ...options, remoteSize: remote.size }),\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (local) {\n\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\treason: 'local file exists without a remote file',\n\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, p),\n\t\t\t\t\t\tlocalPath: p,\n\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (local.size > maxFileSize) {\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t\t\treason: SkipReason.FileTooLarge,\n\t\t\t\t\t\t\t\tlocalSize: local.size,\n\t\t\t\t\t\t\t\tmaxSize: maxFileSize,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif (hasInvalidChar(local.path)) {\n\t\t\t\t\t\ttasks.push(taskFactory.createFilenameErrorTask(options))\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttasks.push(taskFactory.createPushTask(options))\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// * clean orphaned records (both local and remote deleted)\n\tfor (const [recordPath, record] of syncRecords) {\n\t\tconst local = localStatsMap.get(recordPath)\n\t\tconst remote = remoteStatsMap.get(recordPath)\n\n\t\t// If both local and remote don't exist, but record exists, clean the record\n\t\tif (!local && !remote) {\n\t\t\tlogger.debug({\n\t\t\t\treason: 'cleaning orphaned sync record (both local and remote deleted)',\n\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, recordPath),\n\t\t\t\tlocalPath: recordPath,\n\t\t\t\tconditions: {\n\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\trecordExists: !!record,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\ttasks.push(\n\t\t\t\ttaskFactory.createCleanRecordTask({\n\t\t\t\t\tremotePath: recordPath,\n\t\t\t\t\tlocalPath: recordPath,\n\t\t\t\t\tremoteBaseDir,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t}\n\n\t// * sync folder: remote -> local\n\tfor (const remote of remoteStatsFiltered) {\n\t\tif (!remote.isDir) {\n\t\t\tcontinue\n\t\t}\n\t\tconst localPath = remotePathToLocalPath(remoteBaseDir, remote.path)\n\t\tconst local = localStatsMap.get(localPath)\n\t\tconst record = syncRecords.get(localPath)\n\t\tif (local) {\n\t\t\tif (!local.isDir) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Folder conflict: remote path ${remote.path} is a folder but local path ${localPath} is a file`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (!record) {\n\t\t\t\tnoopFolderTasks.push(\n\t\t\t\t\ttaskFactory.createNoopTask({\n\t\t\t\t\t\tlocalPath: localPath,\n\t\t\t\t\t\tremotePath: remote.path,\n\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else if (record) {\n\t\t\t// Use sub-items check instead of mtime check\n\t\t\tconst remoteChanged = hasFolderContentChanged(\n\t\t\t\tremote.path,\n\t\t\t\tremoteStatsFiltered,\n\t\t\t\tsyncRecords,\n\t\t\t\t'remote',\n\t\t\t)\n\n\t\t\tif (remoteChanged) {\n\t\t\t\tlogger.debug({\n\t\t\t\t\treason: 'remote folder content changed',\n\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, remote.path),\n\t\t\t\t\tlocalPath: localPath,\n\t\t\t\t\tconditions: {\n\t\t\t\t\t\tremoteChanged,\n\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tmkdirLocalTasks.push(\n\t\t\t\t\ttaskFactory.createMkdirLocalTask({\n\t\t\t\t\t\tlocalPath,\n\t\t\t\t\t\tremotePath: remote.path,\n\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (hasIgnoredInFolder(remote.path, remoteStats)) {\n\t\t\t\tconst ignoredPaths = getIgnoredPathsInFolder(remote.path, remoteStats)\n\t\t\t\tlogger.debug({\n\t\t\t\t\treason: 'skip removing remote folder (contains ignored items)',\n\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, remote.path),\n\t\t\t\t\tlocalPath: localPath,\n\t\t\t\t\tconditions: {\n\t\t\t\t\t\thasIgnoredItems: true,\n\t\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t},\n\t\t\t\t\tignoredPaths,\n\t\t\t\t})\n\t\t\t\ttasks.push(\n\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\tlocalPath,\n\t\t\t\t\t\tremotePath: remote.path,\n\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t\treason: SkipReason.FolderContainsIgnoredItems,\n\t\t\t\t\t\tignoredPaths,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlogger.debug({\n\t\t\t\treason: 'remote folder is removable (no content changes)',\n\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, remote.path),\n\t\t\t\tlocalPath: localPath,\n\t\t\t\tconditions: {\n\t\t\t\t\tremovable: true,\n\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\trecordExists: !!record,\n\t\t\t\t},\n\t\t\t})\n\t\t\tremoveRemoteFolderTasks.push(\n\t\t\t\ttaskFactory.createRemoveRemoteTask({\n\t\t\t\t\tlocalPath: remote.path,\n\t\t\t\t\tremotePath: remote.path,\n\t\t\t\t\tremoteBaseDir,\n\t\t\t\t}),\n\t\t\t)\n\t\t\tcontinue\n\t\t} else {\n\t\t\tlogger.debug({\n\t\t\t\treason: 'remote folder does not exist locally',\n\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, remote.path),\n\t\t\t\tlocalPath: localPath,\n\t\t\t\tconditions: {\n\t\t\t\t\tlocalExists: !!local,\n\t\t\t\t\trecordExists: !!record,\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tmkdirLocalTasks.push(\n\t\t\t\ttaskFactory.createMkdirLocalTask({\n\t\t\t\t\tlocalPath,\n\t\t\t\t\tremotePath: remote.path,\n\t\t\t\t\tremoteBaseDir,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tcontinue\n\t\t}\n\t}\n\n\t// * sync folder: local -> remote\n\tfor (const local of localStatsFiltered) {\n\t\tif (!local.isDir) {\n\t\t\tcontinue\n\t\t}\n\t\tconst remote = remoteStatsMap.get(local.path)\n\t\tconst record = syncRecords.get(local.path)\n\t\tif (remote) {\n\t\t\tif (!record) {\n\t\t\t\tnoopFolderTasks.push(\n\t\t\t\t\ttaskFactory.createNoopTask({\n\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\tremotePath: remote.path,\n\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else {\n\t\t\tif (record) {\n\t\t\t\t// Use sub-items check instead of mtime check\n\t\t\t\tconst localChanged = hasFolderContentChanged(\n\t\t\t\t\tlocal.path,\n\t\t\t\t\tlocalStatsFiltered,\n\t\t\t\t\tsyncRecords,\n\t\t\t\t\t'local',\n\t\t\t\t)\n\n\t\t\t\tif (localChanged) {\n\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\treason: 'local folder content changed',\n\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, local.path),\n\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\tlocalChanged,\n\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (hasInvalidChar(local.path)) {\n\t\t\t\t\t\ttasks.push(\n\t\t\t\t\t\t\ttaskFactory.createFilenameErrorTask({\n\t\t\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\t\t\tremotePath: local.path,\n\t\t\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmkdirRemoteTasks.push(\n\t\t\t\t\t\t\ttaskFactory.createMkdirRemoteTask({\n\t\t\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\t\t\tremotePath: local.path,\n\t\t\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif (hasIgnoredInFolder(local.path, localStats)) {\n\t\t\t\t\tconst ignoredPaths = getIgnoredPathsInFolder(local.path, localStats)\n\t\t\t\t\tlogger.debug({\n\t\t\t\t\t\treason: 'skip removing local folder (contains ignored items)',\n\t\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, local.path),\n\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\tconditions: {\n\t\t\t\t\t\t\thasIgnoredItems: true,\n\t\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tignoredPaths,\n\t\t\t\t\t})\n\t\t\t\t\ttasks.push(\n\t\t\t\t\t\ttaskFactory.createSkippedTask({\n\t\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\t\tremotePath: local.path,\n\t\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t\t\treason: SkipReason.FolderContainsIgnoredItems,\n\t\t\t\t\t\t\tignoredPaths,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tlogger.debug({\n\t\t\t\t\treason: 'local folder is removable (no content changes)',\n\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, local.path),\n\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\tconditions: {\n\t\t\t\t\t\tremovable: true,\n\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tremoveLocalFolderTasks.push(\n\t\t\t\t\ttaskFactory.createRemoveLocalTask({\n\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\tremotePath: local.path,\n\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tlogger.debug({\n\t\t\t\t\treason: 'local folder does not exist remotely',\n\t\t\t\t\tremotePath: remotePathToAbsolute(remoteBaseDir, local.path),\n\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\tconditions: {\n\t\t\t\t\t\tremoteExists: !!remote,\n\t\t\t\t\t\trecordExists: !!record,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tif (hasInvalidChar(local.path)) {\n\t\t\t\t\ttasks.push(\n\t\t\t\t\t\ttaskFactory.createFilenameErrorTask({\n\t\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\t\tremotePath: local.path,\n\t\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tmkdirRemoteTasks.push(\n\t\t\t\t\t\ttaskFactory.createMkdirRemoteTask({\n\t\t\t\t\t\t\tlocalPath: local.path,\n\t\t\t\t\t\t\tremotePath: local.path,\n\t\t\t\t\t\t\tremoteBaseDir,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif (!remote.isDir) {\n\t\t\tthrow new Error(\n\t\t\t\t`Folder conflict: local path ${local.path} is a folder but remote path ${remote.path} is a file`,\n\t\t\t)\n\t\t}\n\t}\n\n\t// Sort folder tasks to ensure correct execution order\n\tremoveRemoteFolderTasks.sort(\n\t\t(a, b) => b.remotePath.length - a.remotePath.length,\n\t)\n\tremoveLocalFolderTasks.sort((a, b) => b.localPath.length - a.localPath.length)\n\tconst allFolderTasks = [\n\t\t...removeRemoteFolderTasks,\n\t\t...removeLocalFolderTasks,\n\t\t...mkdirLocalTasks,\n\t\t...mkdirRemoteTasks,\n\t\t...noopFolderTasks,\n\t]\n\n\ttasks.splice(0, 0, ...allFolderTasks)\n\treturn tasks\n}\n"
  },
  {
    "path": "src/sync/decision/two-way.decider.ts",
    "content": "import { isEqual } from 'ohash'\nimport { blobStore } from '~/storage/blob'\nimport CleanRecordTask from '../tasks/clean-record.task'\nimport ConflictResolveTask from '../tasks/conflict-resolve.task'\nimport FilenameErrorTask from '../tasks/filename-error.task'\nimport MkdirLocalTask from '../tasks/mkdir-local.task'\nimport MkdirRemoteTask from '../tasks/mkdir-remote.task'\nimport NoopTask from '../tasks/noop.task'\nimport PullTask from '../tasks/pull.task'\nimport PushTask from '../tasks/push.task'\nimport RemoveLocalTask from '../tasks/remove-local.task'\nimport RemoveRemoteTask from '../tasks/remove-remote.task'\nimport SkippedTask from '../tasks/skipped.task'\nimport { BaseTask } from '../tasks/task.interface'\nimport BaseSyncDecider from './base.decider'\nimport {\n\tConflictTaskOptions,\n\tPullTaskOptions,\n\tSkippedTaskOptions,\n\tTaskFactory,\n\tTaskOptions,\n} from './sync-decision.interface'\nimport { twoWayDecider } from './two-way.decider.function'\n\nexport default class TwoWaySyncDecider extends BaseSyncDecider {\n\tasync decide(): Promise<BaseTask[]> {\n\t\tconst syncRecordStorage = this.getSyncRecordStorage()\n\t\tconst [records, localStats, remoteStats] = await Promise.all([\n\t\t\tsyncRecordStorage.getRecords(),\n\t\t\tthis.sync.localFS.walk(),\n\t\t\tthis.sync.remoteFs.walk(),\n\t\t])\n\n\t\t// 创建共用的task选项\n\t\tconst commonTaskOptions = {\n\t\t\twebdav: this.webdav,\n\t\t\tvault: this.vault,\n\t\t\tremoteBaseDir: this.remoteBaseDir,\n\t\t\tsyncRecord: syncRecordStorage,\n\t\t}\n\n\t\t// 创建Task工厂\n\t\tconst taskFactory: TaskFactory = {\n\t\t\tcreatePullTask: (options: PullTaskOptions) =>\n\t\t\t\tnew PullTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreatePushTask: (options: TaskOptions) =>\n\t\t\t\tnew PushTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateConflictResolveTask: (options: ConflictTaskOptions) =>\n\t\t\t\tnew ConflictResolveTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateNoopTask: (options: TaskOptions) =>\n\t\t\t\tnew NoopTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateRemoveLocalTask: (options: TaskOptions) =>\n\t\t\t\tnew RemoveLocalTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateRemoveRemoteTask: (options: TaskOptions) =>\n\t\t\t\tnew RemoveRemoteTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateMkdirLocalTask: (options: TaskOptions) =>\n\t\t\t\tnew MkdirLocalTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateMkdirRemoteTask: (options: TaskOptions) =>\n\t\t\t\tnew MkdirRemoteTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateCleanRecordTask: (options: TaskOptions) =>\n\t\t\t\tnew CleanRecordTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateFilenameErrorTask: (options: TaskOptions) =>\n\t\t\t\tnew FilenameErrorTask({ ...commonTaskOptions, ...options }),\n\t\t\tcreateSkippedTask: (options: SkippedTaskOptions) =>\n\t\t\t\tnew SkippedTask({ ...commonTaskOptions, ...options }),\n\t\t}\n\n\t\t// 文件内容比较函数\n\t\tconst compareFileContent = async (\n\t\t\tfilePath: string,\n\t\t\tbaseContent: ArrayBuffer,\n\t\t): Promise<boolean> => {\n\t\t\tconst exists = await this.vault.adapter.exists(filePath)\n\t\t\tif (!exists) return false\n\t\t\tconst currentContent = await this.vault.adapter.readBinary(filePath)\n\t\t\treturn isEqual(baseContent, currentContent)\n\t\t}\n\t\tconst getBaseContent = async (key: string): Promise<ArrayBuffer | null> => {\n\t\t\tconst blob = await blobStore.get(key)\n\t\t\tif (!blob) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn await blob.arrayBuffer()\n\t\t}\n\n\t\treturn await twoWayDecider({\n\t\t\tsettings: {\n\t\t\t\tskipLargeFiles: this.settings.skipLargeFiles,\n\t\t\t\tconflictStrategy: this.settings.conflictStrategy,\n\t\t\t\tuseGitStyle: this.settings.useGitStyle,\n\t\t\t\tsyncMode: this.settings.syncMode,\n\t\t\t\tconfigDir: this.vault.configDir,\n\t\t\t},\n\t\t\tlocalStats,\n\t\t\tremoteStats,\n\t\t\tsyncRecords: records,\n\t\t\tremoteBaseDir: this.remoteBaseDir,\n\t\t\tgetBaseContent,\n\t\t\tcompareFileContent,\n\t\t\ttaskFactory,\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "src/sync/index.ts",
    "content": "import { chunk } from 'lodash-es'\nimport { Notice, Platform, Vault, moment, normalizePath } from 'obsidian'\nimport { dirname } from 'path-browserify'\nimport { Subscription } from 'rxjs'\nimport { WebDAVClient } from 'webdav'\nimport DeleteConfirmModal from '~/components/DeleteConfirmModal'\nimport FailedTasksModal, { FailedTaskInfo } from '~/components/FailedTasksModal'\nimport TaskListConfirmModal from '~/components/TaskListConfirmModal'\nimport {\n\temitEndSync,\n\temitPreparingSync,\n\temitStartSync,\n\temitSyncError,\n\temitSyncProgress,\n\tonCancelSync,\n} from '~/events'\nimport IFileSystem from '~/fs/fs.interface'\nimport { LocalVaultFileSystem } from '~/fs/local-vault'\nimport { NutstoreFileSystem } from '~/fs/nutstore'\nimport i18n from '~/i18n'\nimport { syncRecordKV } from '~/storage'\nimport { SyncRecord } from '~/storage/sync-record'\nimport breakableSleep from '~/utils/breakable-sleep'\nimport { getDBKey } from '~/utils/get-db-key'\nimport getTaskName from '~/utils/get-task-name'\nimport { is503Error } from '~/utils/is-503-error'\nimport logger from '~/utils/logger'\nimport { statVaultItem } from '~/utils/stat-vault-item'\nimport { stdRemotePath } from '~/utils/std-remote-path'\nimport NutstorePlugin from '..'\nimport TwoWaySyncDecider from './decision/two-way.decider'\nimport CleanRecordTask from './tasks/clean-record.task'\nimport MkdirRemoteTask from './tasks/mkdir-remote.task'\nimport NoopTask from './tasks/noop.task'\nimport PushTask from './tasks/push.task'\nimport RemoveLocalTask from './tasks/remove-local.task'\nimport RemoveRemoteTask from './tasks/remove-remote.task'\nimport SkippedTask from './tasks/skipped.task'\nimport { BaseTask, TaskError, TaskResult } from './tasks/task.interface'\nimport { mergeMkdirTasks } from './utils/merge-mkdir-tasks'\nimport { mergeRemoveRemoteTasks } from './utils/merge-remove-remote-tasks'\nimport { updateMtimeInRecord as updateMtimeInRecordUtil } from './utils/update-records'\nimport { computeEffectiveFilterRules } from '~/utils/config-dir-rules'\n\nexport enum SyncStartMode {\n\tMANUAL_SYNC = 'manual_sync',\n\tAUTO_SYNC = 'auto_sync',\n}\n\nexport class NutstoreSync {\n\tremoteFs: IFileSystem\n\tlocalFS: IFileSystem\n\tisCancelled: boolean = false\n\n\tprivate subscriptions: Subscription[] = []\n\n\tconstructor(\n\t\tprivate plugin: NutstorePlugin,\n\t\tprivate options: {\n\t\t\tvault: Vault\n\t\t\ttoken: string\n\t\t\tremoteBaseDir: string\n\t\t\twebdav: WebDAVClient\n\t\t},\n\t) {\n\t\tthis.options = Object.freeze(this.options)\n\t\tconst filterRules = computeEffectiveFilterRules(plugin)\n\t\tthis.remoteFs = new NutstoreFileSystem({ ...this.options, filterRules })\n\t\tthis.localFS = new LocalVaultFileSystem({\n\t\t\tvault: this.options.vault,\n\t\t\tsyncRecord: new SyncRecord(\n\t\t\t\tgetDBKey(this.vault.getName(), this.remoteBaseDir),\n\t\t\t\tsyncRecordKV,\n\t\t\t),\n\t\t\tfilterRules,\n\t\t})\n\t\tthis.subscriptions.push(\n\t\t\tonCancelSync().subscribe(() => {\n\t\t\t\tthis.isCancelled = true\n\t\t\t}),\n\t\t)\n\t}\n\n\tasync start({ mode }: { mode: SyncStartMode }) {\n\t\ttry {\n\t\t\tconst showNotice = mode === SyncStartMode.MANUAL_SYNC\n\t\t\temitPreparingSync({ showNotice })\n\n\t\t\tconst settings = this.settings\n\t\t\tconst webdav = this.webdav\n\t\t\tconst remoteBaseDir = stdRemotePath(this.options.remoteBaseDir)\n\t\t\tconst syncRecord = new SyncRecord(\n\t\t\t\tgetDBKey(this.vault.getName(), this.remoteBaseDir),\n\t\t\t\tsyncRecordKV,\n\t\t\t)\n\n\t\t\tlet remoteBaseDirExits = await webdav.exists(remoteBaseDir)\n\n\t\t\tif (!remoteBaseDirExits) {\n\t\t\t\tawait syncRecord.drop()\n\t\t\t}\n\n\t\t\twhile (!remoteBaseDirExits) {\n\t\t\t\tif (this.isCancelled) {\n\t\t\t\t\temitSyncError(new Error(i18n.t('sync.cancelled')))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait webdav.createDirectory(this.options.remoteBaseDir, {\n\t\t\t\t\t\trecursive: true,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (is503Error(e)) {\n\t\t\t\t\t\tawait this.handle503Error(60000)\n\t\t\t\t\t\tif (this.isCancelled) {\n\t\t\t\t\t\t\temitSyncError(new Error(i18n.t('sync.cancelled')))\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremoteBaseDirExits = await webdav.exists(remoteBaseDir)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow e\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst tasks = await new TwoWaySyncDecider(this, syncRecord).decide()\n\n\t\t\tif (tasks.length === 0) {\n\t\t\t\temitEndSync({ showNotice, failedCount: 0 })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst noopTasks = tasks.filter((t) => t instanceof NoopTask)\n\t\t\tconst skippedTasks = tasks.filter((t) => t instanceof SkippedTask)\n\t\t\tlet confirmedTasks = tasks.filter(\n\t\t\t\t(t) => !(t instanceof NoopTask || t instanceof SkippedTask),\n\t\t\t)\n\n\t\t\tconst firstTaskIdxNeedingConfirmation = confirmedTasks.findIndex(\n\t\t\t\t(t) => !(t instanceof CleanRecordTask),\n\t\t\t)\n\n\t\t\tif (this.isCancelled) {\n\t\t\t\temitSyncError(new Error(i18n.t('sync.cancelled')))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tshowNotice &&\n\t\t\t\tsettings.confirmBeforeSync &&\n\t\t\t\tfirstTaskIdxNeedingConfirmation > -1\n\t\t\t) {\n\t\t\t\tconst confirmExec = await new TaskListConfirmModal(\n\t\t\t\t\tthis.app,\n\t\t\t\t\tconfirmedTasks,\n\t\t\t\t).open()\n\t\t\t\tif (confirmExec.confirm) {\n\t\t\t\t\tconfirmedTasks = confirmExec.tasks\n\t\t\t\t} else {\n\t\t\t\t\temitSyncError(new Error(i18n.t('sync.cancelled')))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for RemoveLocalTask during auto-sync and ask for confirmation\n\t\t\tif (\n\t\t\t\tmode === SyncStartMode.AUTO_SYNC &&\n\t\t\t\tsettings.confirmBeforeDeleteInAutoSync\n\t\t\t) {\n\t\t\t\tconst removeLocalTasks = confirmedTasks.filter(\n\t\t\t\t\t(t) => t instanceof RemoveLocalTask,\n\t\t\t\t) as RemoveLocalTask[]\n\t\t\t\tif (removeLocalTasks.length > 0) {\n\t\t\t\t\tnew Notice(i18n.t('deleteConfirm.warningNotice'), 3000)\n\t\t\t\t\tconst { tasksToDelete, tasksToReupload } =\n\t\t\t\t\t\tawait new DeleteConfirmModal(this.app, removeLocalTasks).open()\n\n\t\t\t\t\t// Create corresponding Push/Mkdir tasks for each task to reupload\n\t\t\t\t\tconst reuploadMap = new Map<\n\t\t\t\t\t\tRemoveLocalTask,\n\t\t\t\t\t\tPushTask | MkdirRemoteTask\n\t\t\t\t\t>()\n\t\t\t\t\tconst mkdirTasksMap = new Map<string, MkdirRemoteTask>()\n\t\t\t\t\tconst pushTasks: PushTask[] = []\n\t\t\t\t\t// Cache paths that we've confirmed exist remotely\n\t\t\t\t\tconst remoteExistsCache = new Set<string>()\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Helper function to mark a path and all its parents as existing\n\t\t\t\t\t */\n\t\t\t\t\tconst markPathAndParentsAsExisting = (remotePath: string) => {\n\t\t\t\t\t\tlet current = remotePath\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\tcurrent &&\n\t\t\t\t\t\t\tcurrent !== '.' &&\n\t\t\t\t\t\t\tcurrent !== '' &&\n\t\t\t\t\t\t\tcurrent !== '/'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (remoteExistsCache.has(current)) {\n\t\t\t\t\t\t\t\tbreak // Already marked, all parents must be marked too\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tremoteExistsCache.add(current)\n\t\t\t\t\t\t\tcurrent = stdRemotePath(dirname(current))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Helper function to ensure parent directory exists or create mkdir task\n\t\t\t\t\t */\n\t\t\t\t\tconst ensureParentDir = async (\n\t\t\t\t\t\tlocalPath: string,\n\t\t\t\t\t\tremotePath: string,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst parentLocalPath = normalizePath(dirname(localPath))\n\t\t\t\t\t\tconst parentRemotePath = stdRemotePath(dirname(remotePath))\n\n\t\t\t\t\t\t// Root path or vault root, no need to check\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tparentLocalPath === '.' ||\n\t\t\t\t\t\t\tparentLocalPath === '' ||\n\t\t\t\t\t\t\tparentLocalPath === '/'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Already collected in new tasks, no need to check remote\n\t\t\t\t\t\tif (mkdirTasksMap.has(parentRemotePath)) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if already exists in original tasks (from decider)\n\t\t\t\t\t\tconst existsInOriginalTasks = tasks.some(\n\t\t\t\t\t\t\t(t) =>\n\t\t\t\t\t\t\t\tt instanceof MkdirRemoteTask &&\n\t\t\t\t\t\t\t\tt.remotePath === parentRemotePath,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (existsInOriginalTasks) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Already exists in confirmed tasks, no need to check remote\n\t\t\t\t\t\tconst existsInConfirmedTasks = confirmedTasks.some(\n\t\t\t\t\t\t\t(t) =>\n\t\t\t\t\t\t\t\tt instanceof MkdirRemoteTask &&\n\t\t\t\t\t\t\t\tt.remotePath === parentRemotePath,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (existsInConfirmedTasks) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Already confirmed to exist remotely\n\t\t\t\t\t\tif (remoteExistsCache.has(parentRemotePath)) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if parent directory exists remotely using webdav.stat\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait webdav.stat(parentRemotePath)\n\t\t\t\t\t\t\t// Directory exists, mark it and all parents as existing\n\t\t\t\t\t\t\tmarkPathAndParentsAsExisting(parentRemotePath)\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// Directory doesn't exist, create mkdir task\n\t\t\t\t\t\t\t// No need to check parent's parent since createDirectory uses recursive: true\n\t\t\t\t\t\t\tconst mkdirTask = new MkdirRemoteTask({\n\t\t\t\t\t\t\t\tvault: this.vault,\n\t\t\t\t\t\t\t\twebdav: webdav,\n\t\t\t\t\t\t\t\tremoteBaseDir: this.remoteBaseDir,\n\t\t\t\t\t\t\t\tremotePath: parentRemotePath,\n\t\t\t\t\t\t\t\tlocalPath: parentLocalPath,\n\t\t\t\t\t\t\t\tsyncRecord: syncRecord,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tmkdirTasksMap.set(parentRemotePath, mkdirTask)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const task of tasksToReupload) {\n\t\t\t\t\t\tconst stat = await statVaultItem(this.vault, task.localPath)\n\t\t\t\t\t\tif (!stat) {\n\t\t\t\t\t\t\t// File doesn't exist, skip\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Ensure parent directory exists\n\t\t\t\t\t\tawait ensureParentDir(task.localPath, task.remotePath)\n\n\t\t\t\t\t\tif (stat.isDir) {\n\t\t\t\t\t\t\t// Directory → MkdirRemoteTask\n\t\t\t\t\t\t\tconst mkdirTask = new MkdirRemoteTask(task.options)\n\t\t\t\t\t\t\treuploadMap.set(task, mkdirTask)\n\t\t\t\t\t\t\tmkdirTasksMap.set(task.remotePath, mkdirTask)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// File → PushTask\n\t\t\t\t\t\t\tconst pushTask = new PushTask(task.options)\n\t\t\t\t\t\t\treuploadMap.set(task, pushTask)\n\t\t\t\t\t\t\tpushTasks.push(pushTask)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst mkdirTasks = Array.from(mkdirTasksMap.values())\n\n\t\t\t\t\t// Create set of tasks to delete\n\t\t\t\t\tconst deleteTaskSet = new Set(tasksToDelete)\n\n\t\t\t\t\t// Remove parent directory delete tasks for reupload files\n\t\t\t\t\t// If we reupload /a/b/c/file.png, we shouldn't delete /a, /a/b, or /a/b/c\n\t\t\t\t\tfor (const reuploadTask of tasksToReupload) {\n\t\t\t\t\t\tlet currentPath = normalizePath(reuploadTask.localPath)\n\t\t\t\t\t\t// Check all parent paths\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\tcurrentPath &&\n\t\t\t\t\t\t\tcurrentPath !== '.' &&\n\t\t\t\t\t\t\tcurrentPath !== '' &&\n\t\t\t\t\t\t\tcurrentPath !== '/'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcurrentPath = normalizePath(dirname(currentPath))\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcurrentPath === '.' ||\n\t\t\t\t\t\t\t\tcurrentPath === '' ||\n\t\t\t\t\t\t\t\tcurrentPath === '/'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Find and remove parent directory delete tasks\n\t\t\t\t\t\t\tfor (const deleteTask of deleteTaskSet) {\n\t\t\t\t\t\t\t\tif (deleteTask.localPath === currentPath) {\n\t\t\t\t\t\t\t\t\tdeleteTaskSet.delete(deleteTask)\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Replace task list, putting mkdir tasks first\n\t\t\t\t\tconst otherTasks: BaseTask[] = []\n\t\t\t\t\tconst deleteTasks: RemoveLocalTask[] = []\n\n\t\t\t\t\tfor (const t of confirmedTasks) {\n\t\t\t\t\t\tif (!(t instanceof RemoveLocalTask)) {\n\t\t\t\t\t\t\totherTasks.push(t)\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If in delete list, keep RemoveLocalTask\n\t\t\t\t\t\tif (deleteTaskSet.has(t)) {\n\t\t\t\t\t\t\tdeleteTasks.push(t)\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If in reupload list, already in mkdirTasks/pushTasks\n\t\t\t\t\t\t// If not in any list (user cancelled), skip\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reassemble task list: mkdir → other tasks → push → delete\n\t\t\t\t\tconfirmedTasks = [\n\t\t\t\t\t\t...mkdirTasks,\n\t\t\t\t\t\t...otherTasks,\n\t\t\t\t\t\t...pushTasks,\n\t\t\t\t\t\t...deleteTasks,\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst confirmedTasksUniq = Array.from(\n\t\t\t\tnew Set([...confirmedTasks, ...noopTasks, ...skippedTasks]),\n\t\t\t)\n\n\t\t\t// Merge mkdir tasks with parent-child relationships to reduce API calls\n\t\t\tconst mkdirTasks = confirmedTasksUniq.filter(\n\t\t\t\t(t) => t instanceof MkdirRemoteTask,\n\t\t\t)\n\t\t\tconst removeRemoteTasks = confirmedTasksUniq.filter(\n\t\t\t\t(t) => t instanceof RemoveRemoteTask,\n\t\t\t)\n\t\t\tconst otherTasks = confirmedTasksUniq.filter(\n\t\t\t\t(t) => !(t instanceof MkdirRemoteTask || t instanceof RemoveRemoteTask),\n\t\t\t)\n\t\t\tconst mergedMkdirTasks = mergeMkdirTasks(mkdirTasks)\n\t\t\tconst mergedRemoveRemoteTasks = mergeRemoveRemoteTasks(removeRemoteTasks)\n\t\t\tconst optimizedTasks = [\n\t\t\t\t...mergedRemoveRemoteTasks,\n\t\t\t\t...mergedMkdirTasks,\n\t\t\t\t...otherTasks,\n\t\t\t]\n\n\t\t\tif (confirmedTasks.length > 500 && Platform.isDesktopApp) {\n\t\t\t\tnew Notice(i18n.t('sync.suggestUseClientForManyTasks'), 5000)\n\t\t\t}\n\n\t\t\tconst hasSubstantialTask = optimizedTasks.some(\n\t\t\t\t(task) =>\n\t\t\t\t\t!(\n\t\t\t\t\t\ttask instanceof NoopTask ||\n\t\t\t\t\t\ttask instanceof CleanRecordTask ||\n\t\t\t\t\t\ttask instanceof SkippedTask\n\t\t\t\t\t),\n\t\t\t)\n\t\t\tif (showNotice && hasSubstantialTask) {\n\t\t\t\tthis.plugin.progressService.showProgressModal()\n\t\t\t}\n\n\t\t\t// Emit start sync event after all confirmations are done\n\t\t\temitStartSync({ showNotice })\n\n\t\t\tconst chunkSize = 200\n\t\t\tconst taskChunks = chunk(optimizedTasks, chunkSize)\n\t\t\tconst allTasksResult: TaskResult[] = []\n\n\t\t\tconst totalDisplayableTasks = optimizedTasks.filter(\n\t\t\t\t(t) => !(t instanceof NoopTask || t instanceof CleanRecordTask),\n\t\t\t)\n\n\t\t\t// Track all completed tasks across all chunks\n\t\t\tconst allCompletedTasks: BaseTask[] = []\n\n\t\t\tfor (const taskChunk of taskChunks) {\n\t\t\t\tconst chunkResult = await this.execTasks(\n\t\t\t\t\ttaskChunk,\n\t\t\t\t\ttotalDisplayableTasks,\n\t\t\t\t\tallCompletedTasks,\n\t\t\t\t)\n\t\t\t\tallTasksResult.push(...chunkResult)\n\t\t\t\tawait this.updateMtimeInRecord(taskChunk, chunkResult)\n\n\t\t\t\tif (this.isCancelled) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst failedCount = allTasksResult.filter((r) => !r.success).length\n\t\t\tlogger.debug('tasks result', allTasksResult, 'failed:', failedCount)\n\n\t\t\tif (mode === SyncStartMode.MANUAL_SYNC && failedCount > 0) {\n\t\t\t\tconst failedTasksInfo: FailedTaskInfo[] = []\n\t\t\t\tfor (let i = 0; i < allTasksResult.length; i++) {\n\t\t\t\t\tconst result = allTasksResult[i]\n\t\t\t\t\tif (!result.success && result.error) {\n\t\t\t\t\t\tconst task = result.error.task\n\t\t\t\t\t\tfailedTasksInfo.push({\n\t\t\t\t\t\t\ttaskName: getTaskName(task),\n\t\t\t\t\t\t\tlocalPath: task.options.localPath,\n\t\t\t\t\t\t\terrorMessage: result.error.message,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnew FailedTasksModal(this.app, failedTasksInfo).open()\n\t\t\t}\n\n\t\t\temitEndSync({ failedCount, showNotice })\n\t\t} catch (error) {\n\t\t\temitSyncError(error)\n\t\t\tlogger.error('Sync error:', error)\n\t\t} finally {\n\t\t\tthis.subscriptions.forEach((sub) => sub.unsubscribe())\n\t\t}\n\t}\n\n\tprivate async execTasks(\n\t\ttasks: BaseTask[],\n\t\ttotalDisplayableTasks: BaseTask[],\n\t\tallCompletedTasks: BaseTask[],\n\t) {\n\t\tconst res: TaskResult[] = []\n\t\t// Filter out NoopTask and CleanRecordTask from total count for progress display\n\t\tconst tasksToDisplay = tasks.filter(\n\t\t\t(t) => !(t instanceof NoopTask || t instanceof CleanRecordTask),\n\t\t)\n\n\t\tlogger.debug(`Starting to execute sync tasks`, {\n\t\t\ttotalTasks: tasks.length,\n\t\t\tdisplayedTasks: tasksToDisplay.length,\n\t\t\ttotalDisplayableTasks: totalDisplayableTasks.length,\n\t\t\talreadyCompleted: allCompletedTasks.length,\n\t\t})\n\n\t\tfor (let i = 0; i < tasks.length; ++i) {\n\t\t\tconst task = tasks[i]\n\t\t\tif (this.isCancelled) {\n\t\t\t\temitSyncError(new TaskError(i18n.t('sync.cancelled'), task))\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t`Executing task [${i + 1}/${tasks.length}] ${task.localPath}`,\n\t\t\t\t{\n\t\t\t\t\ttaskName: getTaskName(task),\n\t\t\t\t\ttaskPath: task.localPath,\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tconst taskResult = await this.executeWithRetry(task)\n\n\t\t\tlogger.debug(\n\t\t\t\t`Task completed [${i + 1}/${tasks.length}] ${task.localPath}`,\n\t\t\t\t{\n\t\t\t\t\ttaskName: getTaskName(task),\n\t\t\t\t\ttaskPath: task.localPath,\n\t\t\t\t\tresult: taskResult,\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tres[i] = taskResult\n\t\t\t// Only add substantial tasks to completed list for progress display\n\t\t\tif (!(task instanceof NoopTask || task instanceof CleanRecordTask)) {\n\t\t\t\tallCompletedTasks.push(task)\n\t\t\t\temitSyncProgress(totalDisplayableTasks.length, allCompletedTasks)\n\t\t\t}\n\t\t}\n\n\t\tconst successCount = res.filter((r) => r.success).length\n\t\tlogger.debug(`All tasks execution completed`, {\n\t\t\ttotalTasks: tasks.length,\n\t\t\tsuccessCount: successCount,\n\t\t\tfailedCount: tasks.length - successCount,\n\t\t})\n\n\t\treturn res\n\t}\n\n\t/**\n\t * Automatically handle 503 errors and retry task execution\n\t */\n\tprivate async executeWithRetry(task: BaseTask): Promise<TaskResult> {\n\t\twhile (true) {\n\t\t\tif (this.isCancelled) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: new TaskError(i18n.t('sync.cancelled'), task),\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst taskResult = await task.exec()\n\t\t\tif (!taskResult.success && is503Error(taskResult.error)) {\n\t\t\t\tawait this.handle503Error(60000)\n\t\t\t\tif (this.isCancelled) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: new TaskError(i18n.t('sync.cancelled'), task),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn taskResult\n\t\t}\n\t}\n\n\tasync updateMtimeInRecord(tasks: BaseTask[], results: TaskResult[]) {\n\t\treturn updateMtimeInRecordUtil(\n\t\t\tthis.plugin,\n\t\t\tthis.vault,\n\t\t\tthis.remoteBaseDir,\n\t\t\ttasks,\n\t\t\tresults,\n\t\t\t10,\n\t\t)\n\t}\n\n\tprivate async handle503Error(waitMs: number) {\n\t\tconst now = Date.now()\n\t\tconst startAt = now + waitMs\n\t\tnew Notice(\n\t\t\ti18n.t('sync.requestsTooFrequent', {\n\t\t\t\ttime: moment(startAt).format('HH:mm:ss'),\n\t\t\t}),\n\t\t)\n\t\tawait breakableSleep(onCancelSync(), startAt - now)\n\t}\n\n\tget app() {\n\t\treturn this.plugin.app\n\t}\n\n\tget webdav() {\n\t\treturn this.options.webdav\n\t}\n\n\tget vault() {\n\t\treturn this.options.vault\n\t}\n\n\tget remoteBaseDir() {\n\t\treturn this.options.remoteBaseDir\n\t}\n\n\tget settings() {\n\t\treturn this.plugin.settings\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/adapter-tasks.test.ts",
    "content": "import { Buffer } from 'buffer'\nimport type { Vault } from 'obsidian'\nimport { afterEach, describe, expect, it, vi } from 'vitest'\nimport type { WebDAVClient } from 'webdav'\n\nvi.mock('~/utils/get-task-name', () => ({\n\tdefault: () => 'task',\n}))\n\nimport ConflictResolveTask, { ConflictStrategy } from './conflict-resolve.task'\nimport PullTask from './pull.task'\nimport PushTask from './push.task'\n\nconst syncRecordStub = {} as never\n\nfunction createVault() {\n\treturn {\n\t\tadapter: {\n\t\t\texists: vi.fn(),\n\t\t\treadBinary: vi.fn(),\n\t\t\twriteBinary: vi.fn(),\n\t\t\twrite: vi.fn(),\n\t\t\tmkdir: vi.fn(),\n\t\t},\n\t} as unknown as Vault & {\n\t\tadapter: {\n\t\t\texists: ReturnType<typeof vi.fn>\n\t\t\treadBinary: ReturnType<typeof vi.fn>\n\t\t\twriteBinary: ReturnType<typeof vi.fn>\n\t\t\twrite: ReturnType<typeof vi.fn>\n\t\t\tmkdir: ReturnType<typeof vi.fn>\n\t\t}\n\t}\n}\n\nfunction createWebdav() {\n\treturn {\n\t\tgetFileContents: vi.fn(),\n\t\tputFileContents: vi.fn(),\n\t} as unknown as WebDAVClient & {\n\t\tgetFileContents: ReturnType<typeof vi.fn>\n\t\tputFileContents: ReturnType<typeof vi.fn>\n\t}\n}\n\nafterEach(() => {\n\tvi.restoreAllMocks()\n})\n\ndescribe('PullTask', () => {\n\tit('writes downloaded content through adapter.writeBinary after mkdirs', async () => {\n\t\tconst vault = createVault()\n\t\tvault.adapter.exists.mockResolvedValue(false)\n\t\tconst webdav = createWebdav()\n\t\tconst remoteBuffer = Uint8Array.from([1, 2, 3]).buffer\n\t\twebdav.getFileContents.mockResolvedValue(remoteBuffer)\n\n\t\tconst task = new PullTask({\n\t\t\tvault,\n\t\t\twebdav,\n\t\t\tremoteBaseDir: '/remote',\n\t\t\tremotePath: 'folder/file.bin',\n\t\t\tlocalPath: 'folder/file.bin',\n\t\t\tsyncRecord: syncRecordStub,\n\t\t\tremoteSize: 3,\n\t\t})\n\n\t\tawait expect(task.exec()).resolves.toEqual({ success: true })\n\t\texpect(vault.adapter.mkdir).toHaveBeenCalledWith('folder')\n\t\texpect(vault.adapter.writeBinary).toHaveBeenCalledWith(\n\t\t\t'folder/file.bin',\n\t\t\tremoteBuffer,\n\t\t)\n\t})\n})\n\ndescribe('PushTask', () => {\n\tit('reads local content through adapter before uploading', async () => {\n\t\tconst vault = createVault()\n\t\tconst localBuffer = Uint8Array.from([9, 8]).buffer\n\t\tvault.adapter.exists.mockResolvedValue(true)\n\t\tvault.adapter.readBinary.mockResolvedValue(localBuffer)\n\t\tconst webdav = createWebdav()\n\t\twebdav.putFileContents.mockResolvedValue(true)\n\n\t\tconst task = new PushTask({\n\t\t\tvault,\n\t\t\twebdav,\n\t\t\tremoteBaseDir: '/remote',\n\t\t\tremotePath: 'file.bin',\n\t\t\tlocalPath: 'file.bin',\n\t\t\tsyncRecord: syncRecordStub,\n\t\t})\n\n\t\tawait expect(task.exec()).resolves.toEqual({ success: true })\n\t\texpect(vault.adapter.readBinary).toHaveBeenCalledWith('file.bin')\n\t\texpect(webdav.putFileContents).toHaveBeenCalledWith(\n\t\t\t'/remote/file.bin',\n\t\t\tlocalBuffer,\n\t\t\t{\n\t\t\t\toverwrite: true,\n\t\t\t},\n\t\t)\n\t})\n})\n\ndescribe('ConflictResolveTask', () => {\n\tit('uses adapter.writeBinary when latest timestamp chooses remote content', async () => {\n\t\tconst vault = createVault()\n\t\tvault.adapter.exists.mockResolvedValue(true)\n\t\tvault.adapter.readBinary.mockResolvedValue(Buffer.from('local').buffer)\n\t\tconst webdav = createWebdav()\n\t\tconst remoteContent = Buffer.from('remote')\n\t\twebdav.getFileContents.mockResolvedValue(remoteContent)\n\n\t\tconst task = new ConflictResolveTask({\n\t\t\tvault,\n\t\t\twebdav,\n\t\t\tremoteBaseDir: '/remote',\n\t\t\tremotePath: 'note.md',\n\t\t\tlocalPath: 'note.md',\n\t\t\tsyncRecord: syncRecordStub,\n\t\t\tstrategy: ConflictStrategy.LatestTimeStamp,\n\t\t\tuseGitStyle: false,\n\t\t\tlocalStat: {\n\t\t\t\tpath: 'note.md',\n\t\t\t\tbasename: 'note.md',\n\t\t\t\tisDir: false,\n\t\t\t\tisDeleted: false,\n\t\t\t\tmtime: 1,\n\t\t\t\tsize: 5,\n\t\t\t},\n\t\t\tremoteStat: {\n\t\t\t\tpath: 'note.md',\n\t\t\t\tbasename: 'note.md',\n\t\t\t\tisDir: false,\n\t\t\t\tisDeleted: false,\n\t\t\t\tmtime: 2,\n\t\t\t\tsize: 6,\n\t\t\t},\n\t\t})\n\n\t\tawait expect(task.exec()).resolves.toEqual({ success: true })\n\t\texpect(vault.adapter.writeBinary).toHaveBeenCalledTimes(1)\n\t\texpect(vault.adapter.writeBinary.mock.calls[0]?.[0]).toBe('note.md')\n\t})\n\n\tit('uses adapter.write for merged text updates', async () => {\n\t\tconst vault = createVault()\n\t\tvault.adapter.exists.mockResolvedValue(true)\n\t\tvault.adapter.readBinary.mockResolvedValue(\n\t\t\tBuffer.from('hello world').buffer,\n\t\t)\n\t\tconst webdav = createWebdav()\n\t\twebdav.getFileContents.mockResolvedValue(Buffer.from('hello brave world'))\n\t\twebdav.putFileContents.mockResolvedValue(true)\n\n\t\tconst task = new ConflictResolveTask({\n\t\t\tvault,\n\t\t\twebdav,\n\t\t\tremoteBaseDir: '/remote',\n\t\t\tremotePath: 'note.md',\n\t\t\tlocalPath: 'note.md',\n\t\t\tsyncRecord: syncRecordStub,\n\t\t\tstrategy: ConflictStrategy.DiffMatchPatch,\n\t\t\tuseGitStyle: false,\n\t\t\trecord: {\n\t\t\t\tlocal: {\n\t\t\t\t\tpath: 'note.md',\n\t\t\t\t\tbasename: 'note.md',\n\t\t\t\t\tisDir: false,\n\t\t\t\t\tisDeleted: false,\n\t\t\t\t\tmtime: 1,\n\t\t\t\t\tsize: 11,\n\t\t\t\t},\n\t\t\t\tremote: {\n\t\t\t\t\tpath: 'note.md',\n\t\t\t\t\tbasename: 'note.md',\n\t\t\t\t\tisDir: false,\n\t\t\t\t\tisDeleted: false,\n\t\t\t\t\tmtime: 2,\n\t\t\t\t\tsize: 17,\n\t\t\t\t},\n\t\t\t},\n\t\t\tlocalStat: {\n\t\t\t\tpath: 'note.md',\n\t\t\t\tbasename: 'note.md',\n\t\t\t\tisDir: false,\n\t\t\t\tisDeleted: false,\n\t\t\t\tmtime: 1,\n\t\t\t\tsize: 11,\n\t\t\t},\n\t\t\tremoteStat: {\n\t\t\t\tpath: 'note.md',\n\t\t\t\tbasename: 'note.md',\n\t\t\t\tisDir: false,\n\t\t\t\tisDeleted: false,\n\t\t\t\tmtime: 2,\n\t\t\t\tsize: 17,\n\t\t\t},\n\t\t})\n\n\t\tawait expect(task.exec()).resolves.toEqual({ success: true })\n\t\texpect(vault.adapter.write).toHaveBeenCalledTimes(1)\n\t\texpect(vault.adapter.write.mock.calls[0]?.[0]).toBe('note.md')\n\t})\n})\n"
  },
  {
    "path": "src/sync/tasks/clean-record.task.ts",
    "content": "import logger from '~/utils/logger'\nimport { BaseTask, toTaskError } from './task.interface'\n\nexport default class CleanRecordTask extends BaseTask {\n\tasync exec() {\n\t\ttry {\n\t\t\tconst syncRecord = this.syncRecord\n\t\t\tawait syncRecord.deleteFileRecord(this.localPath)\n\n\t\t\treturn { success: true, skipRecord: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: toTaskError(e, this),\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/conflict-resolve.task.ts",
    "content": "import { isEqual, noop } from 'lodash-es'\nimport { BufferLike } from 'webdav'\nimport i18n from '~/i18n'\nimport { StatModel } from '~/model/stat.model'\nimport { SyncRecordModel } from '~/model/sync-record.model'\nimport { blobStore } from '~/storage/blob'\nimport { isMergeablePath } from '~/sync/utils/is-mergeable-path'\nimport logger from '~/utils/logger'\nimport { mergeDigIn } from '~/utils/merge-dig-in'\nimport { statVaultItem } from '~/utils/stat-vault-item'\nimport { statWebDAVItem } from '~/utils/stat-webdav-item'\nimport {\n\tLatestTimestampResolution,\n\tresolveByIntelligentMerge,\n\tresolveByLatestTimestamp,\n} from '../core/merge-utils'\nimport { BaseTask, BaseTaskOptions, toTaskError } from './task.interface'\n\nexport enum ConflictStrategy {\n\tDiffMatchPatch = 'diff-match-patch',\n\tLatestTimeStamp = 'latest-timestamp',\n\tSkip = 'skip',\n\tDiffMatchPatchOrSkip = 'diff-match-patch-or-skip',\n}\n\nexport default class ConflictResolveTask extends BaseTask {\n\tconstructor(\n\t\tpublic readonly options: BaseTaskOptions & {\n\t\t\trecord?: SyncRecordModel\n\t\t\tstrategy: ConflictStrategy\n\t\t\tremoteStat?: StatModel\n\t\t\tlocalStat?: StatModel\n\t\t\tuseGitStyle: boolean\n\t\t},\n\t) {\n\t\tsuper(options)\n\t}\n\n\tasync exec() {\n\t\ttry {\n\t\t\tconst local =\n\t\t\t\tthis.options.localStat ??\n\t\t\t\t(await statVaultItem(this.vault, this.localPath))\n\n\t\t\tif (!local) {\n\t\t\t\tthrow new Error('Local file not found: ' + this.localPath)\n\t\t\t}\n\n\t\t\tconst remote =\n\t\t\t\tthis.options.remoteStat ??\n\t\t\t\t(await statWebDAVItem(this.webdav, this.remotePath))\n\n\t\t\tif (remote.isDir) {\n\t\t\t\tthrow new Error('Remote path is a directory: ' + this.remotePath)\n\t\t\t}\n\n\t\t\tif (local.isDir) {\n\t\t\t\tthrow new Error('Local path is a directory: ' + this.localPath)\n\t\t\t}\n\n\t\t\tif (local.size === 0 && remote.size === 0) {\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\tswitch (this.options.strategy) {\n\t\t\t\tcase ConflictStrategy.DiffMatchPatch:\n\t\t\t\t\treturn await this.execIntelligentMerge()\n\t\t\t\tcase ConflictStrategy.LatestTimeStamp:\n\t\t\t\t\treturn await this.execLatestTimeStamp(local, remote)\n\t\t\t\tcase ConflictStrategy.Skip:\n\t\t\t\t\t// Skip conflict resolution - keep files as they are\n\t\t\t\t\t// Don't update record to preserve conflict state for next sync\n\t\t\t\t\treturn { success: true, skipRecord: true } as const\n\t\t\t\tcase ConflictStrategy.DiffMatchPatchOrSkip:\n\t\t\t\t\treturn await this.execIntelligentMergeOrSkip()\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: toTaskError(e, this),\n\t\t\t}\n\t\t}\n\t}\n\n\tasync execLatestTimeStamp(local: StatModel, remote: StatModel) {\n\t\ttry {\n\t\t\t// At this point we know both local and remote are files (not directories)\n\t\t\t// so mtime is guaranteed to exist\n\t\t\tconst localMtime = local.mtime!\n\t\t\tconst remoteMtime = remote.mtime!\n\n\t\t\tif (remoteMtime === localMtime) {\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\tconst exists = await this.vault.adapter.exists(this.localPath)\n\t\t\tif (!exists) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: toTaskError(\n\t\t\t\t\t\tnew Error('cannot find file in local fs: ' + this.localPath),\n\t\t\t\t\t\tthis,\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst localContent = await this.vault.adapter.readBinary(this.localPath)\n\t\t\tconst remoteContent = (await this.webdav.getFileContents(\n\t\t\t\tthis.remotePath,\n\t\t\t\t{\n\t\t\t\t\tdetails: false,\n\t\t\t\t\tformat: 'binary',\n\t\t\t\t},\n\t\t\t)) as BufferLike\n\n\t\t\tconst result = resolveByLatestTimestamp({\n\t\t\t\tlocalMtime,\n\t\t\t\tremoteMtime,\n\t\t\t\tlocalContent,\n\t\t\t\tremoteContent,\n\t\t\t})\n\n\t\t\tswitch (result.status) {\n\t\t\t\tcase LatestTimestampResolution.UseRemote:\n\t\t\t\t\tconst arrayBuffer =\n\t\t\t\t\t\tresult.content instanceof ArrayBuffer\n\t\t\t\t\t\t\t? result.content\n\t\t\t\t\t\t\t: new Uint8Array(result.content).buffer\n\t\t\t\t\tawait this.vault.adapter.writeBinary(this.localPath, arrayBuffer)\n\t\t\t\t\tbreak\n\t\t\t\tcase LatestTimestampResolution.UseLocal:\n\t\t\t\t\tawait this.webdav.putFileContents(this.remotePath, result.content, {\n\t\t\t\t\t\toverwrite: true,\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase LatestTimestampResolution.NoChange:\n\t\t\t\t\tnoop()\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n\n\tasync execIntelligentMergeOrSkip() {\n\t\ttry {\n\t\t\tconst exists = await this.vault.adapter.exists(this.localPath)\n\t\t\tif (!exists) {\n\t\t\t\tthrow new Error('cannot find file in local fs: ' + this.localPath)\n\t\t\t}\n\t\t\tconst localBuffer = await this.vault.adapter.readBinary(this.localPath)\n\t\t\tconst remoteBuffer = (await this.webdav.getFileContents(this.remotePath, {\n\t\t\t\tformat: 'binary',\n\t\t\t\tdetails: false,\n\t\t\t})) as BufferLike\n\n\t\t\tif (isEqual(localBuffer, remoteBuffer)) {\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\tconst { record } = this.options\n\t\t\tlet baseBlob: Blob | null = null\n\t\t\tconst baseKey = record?.base?.key\n\t\t\tif (baseKey) {\n\t\t\t\tbaseBlob = await blobStore.get(baseKey)\n\t\t\t}\n\n\t\t\tconst localIsMergeable = isMergeablePath(this.localPath)\n\t\t\tconst remoteIsMergeable = isMergeablePath(this.remotePath)\n\n\t\t\tif (!(localIsMergeable && remoteIsMergeable)) {\n\t\t\t\tthrow new Error(i18n.t('sync.error.mergeNotSupported'))\n\t\t\t}\n\n\t\t\tconst localText = await new Blob([new Uint8Array(localBuffer)]).text()\n\t\t\tconst remoteText = await new Blob([new Uint8Array(remoteBuffer)]).text()\n\t\t\tconst baseText = (await baseBlob?.text()) ?? localText\n\n\t\t\tconst mergeResult = await resolveByIntelligentMerge({\n\t\t\t\tlocalContentText: localText,\n\t\t\t\tremoteContentText: remoteText,\n\t\t\t\tbaseContentText: baseText,\n\t\t\t})\n\n\t\t\tif (!mergeResult.success) {\n\t\t\t\tthrow new Error(i18n.t('sync.error.failedToAutoMerge'))\n\t\t\t}\n\n\t\t\tif (mergeResult.isIdentical) {\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\tconst mergedText = mergeResult.mergedText!\n\n\t\t\tif (mergedText === remoteText) {\n\t\t\t\tif (mergedText !== localText) {\n\t\t\t\t\tawait this.vault.adapter.write(this.localPath, mergedText)\n\t\t\t\t}\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\tconst putResult = await this.webdav.putFileContents(\n\t\t\t\tthis.remotePath,\n\t\t\t\tmergedText,\n\t\t\t\t{ overwrite: true },\n\t\t\t)\n\n\t\t\tif (!putResult) {\n\t\t\t\tthrow new Error(i18n.t('sync.error.failedToUploadMerged'))\n\t\t\t}\n\n\t\t\tif (localText !== mergedText) {\n\t\t\t\tawait this.vault.adapter.write(this.localPath, mergedText)\n\t\t\t}\n\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n\n\tasync execIntelligentMerge() {\n\t\ttry {\n\t\t\tconst exists = await this.vault.adapter.exists(this.localPath)\n\t\t\tif (!exists) {\n\t\t\t\tthrow new Error('cannot find file in local fs: ' + this.localPath)\n\t\t\t}\n\t\t\tconst localBuffer = await this.vault.adapter.readBinary(this.localPath)\n\t\t\tconst remoteBuffer = (await this.webdav.getFileContents(this.remotePath, {\n\t\t\t\tformat: 'binary',\n\t\t\t\tdetails: false,\n\t\t\t})) as BufferLike\n\n\t\t\tif (isEqual(localBuffer, remoteBuffer)) {\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\tconst { record } = this.options\n\t\t\tlet baseBlob: Blob | null = null\n\t\t\tconst baseKey = record?.base?.key\n\t\t\tif (baseKey) {\n\t\t\t\tbaseBlob = await blobStore.get(baseKey)\n\t\t\t}\n\n\t\t\tconst localIsMergeable = isMergeablePath(this.localPath)\n\t\t\tconst remoteIsMergeable = isMergeablePath(this.remotePath)\n\n\t\t\tif (!(localIsMergeable && remoteIsMergeable)) {\n\t\t\t\tthrow new Error(i18n.t('sync.error.mergeNotSupported'))\n\t\t\t}\n\n\t\t\tconst localText = await new Blob([new Uint8Array(localBuffer)]).text()\n\t\t\tconst remoteText = await new Blob([new Uint8Array(remoteBuffer)]).text()\n\t\t\tconst baseText = (await baseBlob?.text()) ?? localText\n\n\t\t\tconst mergeResult = await resolveByIntelligentMerge({\n\t\t\t\tlocalContentText: localText,\n\t\t\t\tremoteContentText: remoteText,\n\t\t\t\tbaseContentText: baseText,\n\t\t\t})\n\n\t\t\tif (!mergeResult.success) {\n\t\t\t\t// If patch_apply fails to resolve all, use mergeDigIn as a further fallback\n\t\t\t\tconst mergeDigInResult = mergeDigIn(localText, baseText, remoteText, {\n\t\t\t\t\tstringSeparator: '\\n',\n\t\t\t\t\tuseGitStyle: this.options.useGitStyle,\n\t\t\t\t})\n\t\t\t\t// mergeDigIn itself might produce conflict markers if it can't fully resolve.\n\t\t\t\t// The task should handle this merged text (which might contain markers).\n\t\t\t\tconst mergedDmpText = mergeDigInResult.result.join('\\n')\n\n\t\t\t\tconst putResult = await this.webdav.putFileContents(\n\t\t\t\t\tthis.remotePath,\n\t\t\t\t\tmergedDmpText,\n\t\t\t\t\t{ overwrite: true },\n\t\t\t\t)\n\n\t\t\t\tif (putResult) {\n\t\t\t\t\tawait this.vault.adapter.write(this.localPath, mergedDmpText)\n\t\t\t\t\treturn { success: true } as const\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(i18n.t('sync.error.failedToUploadMerged'))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (mergeResult.isIdentical) {\n\t\t\t\t// This case should be caught by the isEqual(localBuffer, remoteBuffer) check earlier,\n\t\t\t\t// but resolveByIntelligentMerge also returns it.\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\tconst mergedText = mergeResult.mergedText!\n\n\t\t\t// If mergedText is the same as remoteText, we only need to update localText if it's different.\n\t\t\tif (mergedText === remoteText) {\n\t\t\t\tif (mergedText !== localText) {\n\t\t\t\t\tawait this.vault.adapter.write(this.localPath, mergedText)\n\t\t\t\t}\n\t\t\t\treturn { success: true } as const\n\t\t\t}\n\n\t\t\t// If mergedText is different from remoteText, then both remote and local need to be updated.\n\t\t\tconst putResult = await this.webdav.putFileContents(\n\t\t\t\tthis.remotePath,\n\t\t\t\tmergedText,\n\t\t\t\t{ overwrite: true },\n\t\t\t)\n\n\t\t\tif (!putResult) {\n\t\t\t\tthrow new Error(i18n.t('sync.error.failedToUploadMerged'))\n\t\t\t}\n\n\t\t\tif (localText !== mergedText) {\n\t\t\t\tawait this.vault.adapter.write(this.localPath, mergedText)\n\t\t\t}\n\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/filename-error.task.ts",
    "content": "import { getInvalidChars } from '../../utils/has-invalid-char'\nimport { BaseTask, toTaskError } from './task.interface'\n\nimport i18n from '~/i18n'\n\nexport class FilenameError extends Error {\n\tconstructor(\n\t\tpublic readonly invalidChars: string[],\n\t\tpublic readonly filePath: string,\n\t) {\n\t\tsuper()\n\t\tthis.name = 'FilenameError'\n\t\tObject.setPrototypeOf?.(this, new.target.prototype)\n\t\tObject.defineProperty(this, 'message', {\n\t\t\tconfigurable: true,\n\t\t\tget: () => FilenameError.format(this.invalidChars, this.filePath),\n\t\t})\n\t}\n\n\tprivate static format(invalidChars: string[], filePath: string) {\n\t\tconst unique = Array.from(new Set(invalidChars))\n\t\tconst charList = unique.map((c) => `'${c}'`).join(', ')\n\t\treturn i18n.t('errors.filenameUnsupportedChars', {\n\t\t\tchars: charList,\n\t\t\tpath: filePath,\n\t\t})\n\t}\n}\n\n/**\n * 如果文件名里存在坚果云不支持的特殊字符, 将无法上传.\n *\n * 此时可以创建该任务, 不做任何操作. 只在任务列表里告诉用户文件名有问题.\n */\nexport default class FilenameErrorTask extends BaseTask {\n\texec() {\n\t\tconst invalidChars = getInvalidChars(this.localPath)\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: toTaskError(new FilenameError(invalidChars, this.localPath), this),\n\t\t} as const\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/mkdir-local.task.ts",
    "content": "import logger from '~/utils/logger'\nimport { mkdirsVault } from '~/utils/mkdirs-vault'\nimport { BaseTask, toTaskError } from './task.interface'\n\nexport default class MkdirLocalTask extends BaseTask {\n\tasync exec() {\n\t\ttry {\n\t\t\tawait mkdirsVault(this.vault, this.localPath)\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/mkdir-remote.task.ts",
    "content": "import i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport { statVaultItem } from '~/utils/stat-vault-item'\nimport { BaseTask, toTaskError } from './task.interface'\n\nexport default class MkdirRemoteTask extends BaseTask {\n\tasync exec() {\n\t\ttry {\n\t\t\tconst localStat = await statVaultItem(this.vault, this.localPath)\n\t\t\tif (!localStat) {\n\t\t\t\tlogger.debug('PullTask: local path:', this.localPath)\n\t\t\t\tlogger.debug('PullTask: local stat is null')\n\t\t\t\tthrow new Error(\n\t\t\t\t\ti18n.t('sync.error.localPathNotFound', { path: this.localPath }),\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait this.webdav.createDirectory(this.remotePath, {\n\t\t\t\trecursive: true,\n\t\t\t})\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/mkdirs-remote.task.ts",
    "content": "import i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport { statVaultItem } from '~/utils/stat-vault-item'\nimport { BaseTask, BaseTaskOptions, toTaskError } from './task.interface'\n\ninterface MkdirsRemoteTaskOptions extends BaseTaskOptions {\n\t// Additional paths that will be created along with the main path\n\tadditionalPaths: Array<{ localPath: string; remotePath: string }>\n}\n\n/**\n * Task to create multiple directories in one operation.\n * Uses recursive: true so creating the deepest path will create all parents.\n * Stores all paths for sync record updates.\n */\nexport default class MkdirsRemoteTask extends BaseTask {\n\treadonly additionalPaths: Array<{ localPath: string; remotePath: string }>\n\n\tconstructor(options: MkdirsRemoteTaskOptions) {\n\t\tsuper(options)\n\t\tthis.additionalPaths = options.additionalPaths\n\t}\n\n\tasync exec() {\n\t\ttry {\n\t\t\tconst localStat = await statVaultItem(this.vault, this.localPath)\n\t\t\tif (!localStat) {\n\t\t\t\tlogger.debug('MkdirsRemoteTask: local path:', this.localPath)\n\t\t\t\tlogger.debug('MkdirsRemoteTask: local stat is null')\n\t\t\t\tthrow new Error(\n\t\t\t\t\ti18n.t('sync.error.localPathNotFound', { path: this.localPath }),\n\t\t\t\t)\n\t\t\t}\n\t\t\t// Create the deepest directory with recursive: true\n\t\t\t// This will automatically create all parent directories\n\t\t\tawait this.webdav.createDirectory(this.remotePath, {\n\t\t\t\trecursive: true,\n\t\t\t})\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n\n\t/**\n\t * Get all directory paths that will be created by this task\n\t */\n\tgetAllPaths(): Array<{ localPath: string; remotePath: string }> {\n\t\treturn [\n\t\t\t{ localPath: this.localPath, remotePath: this.remotePath },\n\t\t\t...this.additionalPaths,\n\t\t]\n\t}\n\n\ttoJSON() {\n\t\tconst base = super.toJSON()\n\t\treturn {\n\t\t\t...base,\n\t\t\tadditionalPaths: this.additionalPaths,\n\t\t\ttotalDirs: this.getAllPaths().length,\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/noop.task.ts",
    "content": "import { BaseTask } from './task.interface'\n\nexport default class NoopTask extends BaseTask {\n\texec() {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t} as const\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/pull.task.ts",
    "content": "import { dirname } from 'path-browserify'\nimport { BufferLike } from 'webdav'\nimport logger from '~/utils/logger'\nimport { mkdirsVault } from '~/utils/mkdirs-vault'\nimport { BaseTask, BaseTaskOptions, toTaskError } from './task.interface'\n\nexport default class PullTask extends BaseTask {\n\tconstructor(\n\t\treadonly options: BaseTaskOptions & {\n\t\t\tremoteSize: number\n\t\t},\n\t) {\n\t\tsuper(options)\n\t}\n\n\tget remoteSize() {\n\t\treturn this.options.remoteSize\n\t}\n\n\tasync exec() {\n\t\ttry {\n\t\t\tconst file = (await this.webdav.getFileContents(this.remotePath, {\n\t\t\t\tformat: 'binary',\n\t\t\t\tdetails: false,\n\t\t\t})) as BufferLike\n\t\t\tconst arrayBuffer = bufferLikeToArrayBuffer(file)\n\t\t\tif (arrayBuffer.byteLength !== this.remoteSize) {\n\t\t\t\tthrow new Error('Remote Size Not Match!')\n\t\t\t}\n\t\t\tawait mkdirsVault(this.vault, dirname(this.localPath))\n\t\t\tawait this.vault.adapter.writeBinary(this.localPath, arrayBuffer)\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n\nfunction bufferLikeToArrayBuffer(buffer: BufferLike): ArrayBuffer {\n\tif (buffer instanceof ArrayBuffer) {\n\t\treturn buffer\n\t} else {\n\t\treturn toArrayBuffer(buffer)\n\t}\n}\n\nfunction toArrayBuffer(buf: Buffer): ArrayBuffer {\n\tif (buf.buffer instanceof SharedArrayBuffer) {\n\t\tconst copy = new ArrayBuffer(buf.byteLength)\n\t\tnew Uint8Array(copy).set(buf)\n\t\treturn copy\n\t}\n\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)\n}\n"
  },
  {
    "path": "src/sync/tasks/push.task.ts",
    "content": "import logger from '~/utils/logger'\nimport { BaseTask, toTaskError } from './task.interface'\n\nexport default class PushTask extends BaseTask {\n\tasync exec() {\n\t\ttry {\n\t\t\tconst exists = await this.vault.adapter.exists(this.localPath)\n\t\t\tif (!exists) {\n\t\t\t\tthrow new Error('cannot find file in local fs: ' + this.localPath)\n\t\t\t}\n\n\t\t\tconst content = await this.vault.adapter.readBinary(this.localPath)\n\t\t\tconst res = await this.webdav.putFileContents(this.remotePath, content, {\n\t\t\t\toverwrite: true,\n\t\t\t})\n\t\t\tif (!res) {\n\t\t\t\tthrow new Error('Upload failed')\n\t\t\t}\n\t\t\treturn { success: res }\n\t\t} catch (e) {\n\t\t\tlogger.error(this, e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/remove-local.task.ts",
    "content": "import logger from '~/utils/logger'\nimport { statVaultItem } from '~/utils/stat-vault-item'\nimport { BaseTask, BaseTaskOptions, toTaskError } from './task.interface'\n\nexport default class RemoveLocalTask extends BaseTask {\n\tconstructor(\n\t\tpublic readonly options: BaseTaskOptions & {\n\t\t\trecursive?: boolean\n\t\t},\n\t) {\n\t\tsuper(options)\n\t}\n\n\tasync exec() {\n\t\ttry {\n\t\t\tconst stat = await statVaultItem(this.vault, this.localPath)\n\t\t\tif (!stat) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t} as const\n\t\t\t}\n\t\t\tconst file = this.vault.getAbstractFileByPath(this.localPath)\n\t\t\tif (!file) {\n\t\t\t\tthrow new Error('cannot find file in local fs: ' + this.localPath)\n\t\t\t}\n\t\t\tawait this.vault.trash(file, false)\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/remove-remote-recursively.task.ts",
    "content": "import logger from '~/utils/logger'\nimport { BaseTask, toTaskError } from './task.interface'\n\nexport default class RemoveRemoteRecursivelyTask extends BaseTask {\n\tasync exec() {\n\t\ttry {\n\t\t\tawait this.webdav.deleteFile(this.remotePath)\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/remove-remote.task.ts",
    "content": "import logger from '~/utils/logger'\nimport { BaseTask, toTaskError } from './task.interface'\n\nexport default class RemoveRemoteTask extends BaseTask {\n\tasync exec() {\n\t\ttry {\n\t\t\tawait this.webdav.deleteFile(this.remotePath)\n\t\t\treturn { success: true } as const\n\t\t} catch (e) {\n\t\t\tlogger.error(e)\n\t\t\treturn { success: false, error: toTaskError(e, this) }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/skipped.task.ts",
    "content": "import { BaseTask, BaseTaskOptions } from './task.interface'\n\nexport enum SkipReason {\n\tFileTooLarge = 'file-too-large',\n\tFolderContainsIgnoredItems = 'folder-contains-ignored-items',\n}\n\nexport type SkippedTaskOptions = BaseTaskOptions &\n\t(\n\t\t| {\n\t\t\t\treason: SkipReason.FileTooLarge\n\t\t\t\tmaxSize: number\n\t\t\t\tremoteSize: number\n\t\t\t\tlocalSize?: number\n\t\t  }\n\t\t| {\n\t\t\t\treason: SkipReason.FileTooLarge\n\t\t\t\tmaxSize: number\n\t\t\t\tremoteSize?: number\n\t\t\t\tlocalSize: number\n\t\t  }\n\t\t| {\n\t\t\t\treason: SkipReason.FileTooLarge\n\t\t\t\tmaxSize: number\n\t\t\t\tremoteSize: number\n\t\t\t\tlocalSize: number\n\t\t  }\n\t\t| {\n\t\t\t\treason: SkipReason.FolderContainsIgnoredItems\n\t\t\t\tignoredPaths: string[]\n\t\t  }\n\t)\n\nexport default class SkippedTask extends BaseTask {\n\tconstructor(readonly options: SkippedTaskOptions) {\n\t\tsuper(options)\n\t}\n\n\texec() {\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tskipRecord: true,\n\t\t} as const\n\t}\n}\n"
  },
  {
    "path": "src/sync/tasks/task.interface.ts",
    "content": "import { normalizePath, Vault } from 'obsidian'\nimport { isAbsolute, join } from 'path-browserify'\nimport { WebDAVClient } from 'webdav'\nimport { SyncRecord } from '~/storage/sync-record'\nimport getTaskName from '~/utils/get-task-name'\nimport { MaybePromise } from '~/utils/types'\n\nexport interface BaseTaskOptions {\n\tvault: Vault\n\twebdav: WebDAVClient\n\tremoteBaseDir: string\n\tremotePath: string\n\tlocalPath: string\n\tsyncRecord: SyncRecord\n}\n\ninterface TaskSuccessResult {\n\tsuccess: true\n\tskipRecord?: boolean\n}\n\ninterface TaskFailureResult {\n\tsuccess: false\n\terror: TaskError\n\tskipRecord?: boolean\n}\n\nexport type TaskResult = TaskSuccessResult | TaskFailureResult\n\nexport abstract class BaseTask {\n\tconstructor(readonly options: BaseTaskOptions) {}\n\n\tget vault() {\n\t\treturn this.options.vault\n\t}\n\n\tget syncRecord() {\n\t\treturn this.options.syncRecord\n\t}\n\n\tget webdav() {\n\t\treturn this.options.webdav\n\t}\n\n\tget remoteBaseDir() {\n\t\treturn this.options.remoteBaseDir\n\t}\n\n\tget remotePath() {\n\t\treturn isAbsolute(this.options.remotePath)\n\t\t\t? this.options.remotePath\n\t\t\t: join(this.remoteBaseDir, this.options.remotePath)\n\t}\n\n\tget localPath() {\n\t\treturn normalizePath(this.options.localPath)\n\t}\n\n\tabstract exec(): MaybePromise<TaskResult>\n\n\ttoJSON() {\n\t\tconst { localPath, remoteBaseDir, remotePath } = this\n\t\tconst taskName = getTaskName(this)\n\t\treturn {\n\t\t\ttaskName,\n\t\t\tlocalPath,\n\t\t\tremoteBaseDir,\n\t\t\tremotePath,\n\t\t}\n\t}\n}\n\nexport class TaskError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly task: BaseTask,\n\t\treadonly cause?: Error,\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'TaskError'\n\t}\n}\n\nexport function toTaskError(e: unknown, task: BaseTask): TaskError {\n\tif (e instanceof TaskError) {\n\t\treturn e\n\t}\n\tconst message = e instanceof Error ? e.message : String(e)\n\treturn new TaskError(message, task, e instanceof Error ? e : undefined)\n}\n"
  },
  {
    "path": "src/sync/utils/has-ignored-in-folder.ts",
    "content": "import { FsWalkResult } from '~/fs/fs.interface'\nimport { isSub } from '../../utils/is-sub'\n\n/**\n * Check if there are any ignored files/folders within a directory\n * @param dirPath directory path to check\n * @param stats FsWalkResult array from walk operation\n * @returns true if any ignored items exist in the directory, false otherwise\n */\nexport function hasIgnoredInFolder(\n\tdirPath: string,\n\tstats: FsWalkResult[],\n): boolean {\n\tfor (const item of stats) {\n\t\tif (isSub(dirPath, item.stat.path) || item.stat.path === dirPath) {\n\t\t\tif (item.ignored) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\n/**\n * Get all ignored file/folder paths within a directory\n * @param dirPath directory path to check\n * @param stats FsWalkResult array from walk operation\n * @returns array of ignored paths within the directory\n */\nexport function getIgnoredPathsInFolder(\n\tdirPath: string,\n\tstats: FsWalkResult[],\n): string[] {\n\tconst ignoredPaths: string[] = []\n\n\tfor (const item of stats) {\n\t\tif (isSub(dirPath, item.stat.path) || item.stat.path === dirPath) {\n\t\t\tif (item.ignored) {\n\t\t\t\tignoredPaths.push(item.stat.path)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ignoredPaths\n}\n"
  },
  {
    "path": "src/sync/utils/is-mergeable-path.ts",
    "content": "import { isMarkdownPath } from '../../utils/mime/is_markdown_path'\n\nexport function isMergeablePath(path: string): boolean {\n\treturn isMarkdownPath(path)\n}\n"
  },
  {
    "path": "src/sync/utils/merge-mkdir-tasks.ts",
    "content": "import MkdirRemoteTask from '../tasks/mkdir-remote.task'\nimport MkdirsRemoteTask from '../tasks/mkdirs-remote.task'\n\n/**\n * Merge mkdir tasks that have parent-child relationships into MkdirsRemoteTask.\n * All tasks are converted to MkdirsRemoteTask, with additionalPaths empty if no merge needed.\n *\n * @example\n * Given [/a, /a/b, /a/b/c] → MkdirsRemoteTask with /a/b/c as main path and additionalPaths: [/a, /a/b]\n *\n * @example\n * Given [/a, /x] → Two MkdirsRemoteTask with empty additionalPaths\n *\n * @param mkdirTasks - Array of MkdirRemoteTask to merge\n * @returns Array of MkdirsRemoteTask (additionalPaths may be empty)\n */\nexport function mergeMkdirTasks(\n\tmkdirTasks: MkdirRemoteTask[],\n): MkdirsRemoteTask[] {\n\tif (mkdirTasks.length === 0) {\n\t\treturn []\n\t}\n\n\t// Group mkdir tasks by their path hierarchy\n\t// Key: deepest path, Value: all paths in the hierarchy (including parents)\n\tconst hierarchyGroups = new Map<\n\t\tstring,\n\t\tArray<{ task: MkdirRemoteTask; remotePath: string }>\n\t>()\n\n\tfor (const task of mkdirTasks) {\n\t\tconst remotePath = task.remotePath\n\t\tlet foundParent = false\n\n\t\t// Check if this task is a child of any existing group\n\t\tfor (const [deepestPath, group] of hierarchyGroups.entries()) {\n\t\t\tif (remotePath.startsWith(deepestPath + '/')) {\n\t\t\t\t// This is a child, so deepestPath should be replaced with this path\n\t\t\t\thierarchyGroups.delete(deepestPath)\n\t\t\t\tgroup.push({ task, remotePath })\n\t\t\t\thierarchyGroups.set(remotePath, group)\n\t\t\t\tfoundParent = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (!foundParent) {\n\t\t\t// Check if any existing group is a child of this task\n\t\t\tlet childGroups: Array<{\n\t\t\t\ttask: MkdirRemoteTask\n\t\t\t\tremotePath: string\n\t\t\t}> = []\n\t\t\tconst groupsToDelete: string[] = []\n\n\t\t\tfor (const [deepestPath, group] of hierarchyGroups.entries()) {\n\t\t\t\tif (deepestPath.startsWith(remotePath + '/')) {\n\t\t\t\t\t// Existing group is a child of this task\n\t\t\t\t\tchildGroups = childGroups.concat(group)\n\t\t\t\t\tgroupsToDelete.push(deepestPath)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Delete child groups and create new group with this task\n\t\t\tfor (const key of groupsToDelete) {\n\t\t\t\thierarchyGroups.delete(key)\n\t\t\t}\n\n\t\t\tif (childGroups.length > 0) {\n\t\t\t\t// This task is a parent of existing groups\n\t\t\t\tchildGroups.push({ task, remotePath })\n\t\t\t\t// Find the deepest path among all\n\t\t\t\tconst deepest = childGroups.reduce((max, item) =>\n\t\t\t\t\titem.remotePath.length > max.remotePath.length ? item : max,\n\t\t\t\t)\n\t\t\t\thierarchyGroups.set(deepest.remotePath, childGroups)\n\t\t\t} else {\n\t\t\t\t// This task is independent\n\t\t\t\thierarchyGroups.set(remotePath, [{ task, remotePath }])\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create merged tasks - all converted to MkdirsRemoteTask\n\tconst mergedTasks: MkdirsRemoteTask[] = []\n\n\tfor (const group of hierarchyGroups.values()) {\n\t\t// Find the deepest path\n\t\tconst deepestItem = group.reduce((max, item) =>\n\t\t\titem.remotePath.length > max.remotePath.length ? item : max,\n\t\t)\n\n\t\t// All other paths are additional paths (empty if group.length === 1)\n\t\tconst additionalPaths = group\n\t\t\t.filter((item) => item !== deepestItem)\n\t\t\t.map((item) => ({\n\t\t\t\tlocalPath: item.task.localPath,\n\t\t\t\tremotePath: item.task.remotePath,\n\t\t\t}))\n\n\t\tconst mkdirsTask = new MkdirsRemoteTask({\n\t\t\t...deepestItem.task.options,\n\t\t\tadditionalPaths,\n\t\t})\n\n\t\tmergedTasks.push(mkdirsTask)\n\t}\n\n\treturn mergedTasks\n}\n"
  },
  {
    "path": "src/sync/utils/merge-remove-remote-tasks.ts",
    "content": "import { normalize } from 'path-browserify'\nimport { isSub } from '~/utils/is-sub'\nimport RemoveRemoteRecursivelyTask from '../tasks/remove-remote-recursively.task'\nimport RemoveRemoteTask from '../tasks/remove-remote.task'\n\nexport function mergeRemoveRemoteTasks(\n\ttasks: RemoveRemoteTask[],\n): RemoveRemoteRecursivelyTask[] {\n\tif (tasks.length === 0) return []\n\n\t// 过滤掉空路径或无效任务\n\tconst validTasks = tasks.filter((task) => {\n\t\tconst path = normalize(task.remotePath)\n\t\treturn path !== '' && path !== '.'\n\t})\n\n\tif (validTasks.length === 0) return []\n\n\t// 按路径长度排序，短的在前（父路径优先）\n\t// 如果长度相同，按字典序排序，保证结果稳定\n\tconst sortedTasks = [...validTasks].sort((a, b) => {\n\t\tconst pathA = normalize(a.remotePath)\n\t\tconst pathB = normalize(b.remotePath)\n\t\tif (pathA.length !== pathB.length) {\n\t\t\treturn pathA.length - pathB.length\n\t\t}\n\t\treturn pathA.localeCompare(pathB)\n\t})\n\n\tconst result: RemoveRemoteRecursivelyTask[] = []\n\tconst selectedPaths: string[] = []\n\n\tfor (const task of sortedTasks) {\n\t\tconst path = normalize(task.remotePath)\n\n\t\t// 检查当前路径是否是已选路径的子路径或重复路径\n\t\tconst shouldSkip = selectedPaths.some((parentPath) => {\n\t\t\tif (path === parentPath) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn isSub(parentPath, path)\n\t\t})\n\n\t\tif (!shouldSkip) {\n\t\t\tselectedPaths.push(path)\n\t\t\tresult.push(new RemoveRemoteRecursivelyTask(task.options))\n\t\t}\n\t}\n\n\treturn result\n}\n"
  },
  {
    "path": "src/sync/utils/update-records.test.ts",
    "content": "import { describe, expect, it, vi } from 'vitest'\nimport type { Vault } from 'obsidian'\n\nvi.mock('~/utils/get-task-name', () => ({\n\tdefault: () => 'task',\n}))\n\nimport { updateMtimeInRecord } from './update-records'\n\nconst { records, setRecords, getRecords, walk, blobStoreStore } = vi.hoisted(\n\t() => {\n\t\tconst records = new Map<string, unknown>()\n\t\treturn {\n\t\t\trecords,\n\t\t\tsetRecords: vi.fn(async () => undefined),\n\t\t\tgetRecords: vi.fn(async () => records),\n\t\t\twalk: vi.fn(async () => [\n\t\t\t\t{\n\t\t\t\t\tstat: {\n\t\t\t\t\t\tpath: 'folder/file.md',\n\t\t\t\t\t\tbasename: 'file.md',\n\t\t\t\t\t\tisDir: false,\n\t\t\t\t\t\tisDeleted: false,\n\t\t\t\t\t\tmtime: 20,\n\t\t\t\t\t\tsize: 10,\n\t\t\t\t\t},\n\t\t\t\t\tignored: false,\n\t\t\t\t},\n\t\t\t]),\n\t\t\tblobStoreStore: vi.fn(async () => ({\n\t\t\t\tkey: 'blob-key',\n\t\t\t\tvalue: undefined,\n\t\t\t})),\n\t\t}\n\t},\n)\n\nvi.mock('~/storage/sync-record', () => {\n\treturn {\n\t\tSyncRecord: vi.fn().mockImplementation(() => ({\n\t\t\tgetRecords,\n\t\t\tsetRecords,\n\t\t})),\n\t}\n})\n\nvi.mock('~/fs/nutstore', () => {\n\treturn {\n\t\tNutstoreFileSystem: vi.fn().mockImplementation(() => ({\n\t\t\twalk,\n\t\t})),\n\t}\n})\n\nvi.mock('~/storage/blob', () => {\n\treturn {\n\t\tblobStore: {\n\t\t\tstore: blobStoreStore,\n\t\t},\n\t}\n})\n\nvi.mock('~/events', () => {\n\treturn {\n\t\temitSyncUpdateMtimeProgress: vi.fn(),\n\t}\n})\n\nvi.mock('~/storage', () => {\n\treturn {\n\t\tsyncRecordKV: {},\n\t}\n})\n\ndescribe('updateMtimeInRecord', () => {\n\tit('uses adapter stat and readBinary to persist local metadata immediately after writes', async () => {\n\t\trecords.clear()\n\t\tsetRecords.mockClear()\n\t\tgetRecords.mockClear()\n\t\twalk.mockClear()\n\t\tblobStoreStore.mockClear()\n\n\t\tconst vault = {\n\t\t\tgetName: vi.fn(() => 'vault-name'),\n\t\t\tadapter: {\n\t\t\t\tstat: vi.fn(async (path: string) => {\n\t\t\t\t\tif (path === 'folder/file.md') {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\t\tmtime: 10,\n\t\t\t\t\t\t\tsize: 10,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn null\n\t\t\t\t}),\n\t\t\t\treadBinary: vi.fn(async () => Uint8Array.from([1, 2, 3]).buffer),\n\t\t\t},\n\t\t} as unknown as Vault & {\n\t\t\tadapter: {\n\t\t\t\tstat: ReturnType<typeof vi.fn>\n\t\t\t\treadBinary: ReturnType<typeof vi.fn>\n\t\t\t}\n\t\t\tgetName: ReturnType<typeof vi.fn>\n\t\t}\n\n\t\tconst task = {\n\t\t\tlocalPath: 'folder/file.md',\n\t\t\ttoJSON: () => ({ localPath: 'folder/file.md' }),\n\t\t}\n\n\t\tawait updateMtimeInRecord(\n\t\t\t{\n\t\t\t\tgetToken: vi.fn(async () => 'token'),\n\t\t\t} as never,\n\t\t\tvault,\n\t\t\t'/remote',\n\t\t\t[task as never],\n\t\t\t[{ success: true }],\n\t\t\t10,\n\t\t)\n\n\t\texpect(vault.adapter.stat).toHaveBeenCalledWith('folder/file.md')\n\t\texpect(vault.adapter.readBinary).toHaveBeenCalledWith('folder/file.md')\n\t\texpect(blobStoreStore).toHaveBeenCalledTimes(1)\n\t\texpect(records.get('folder/file.md')).toEqual({\n\t\t\tlocal: {\n\t\t\t\tpath: 'folder/file.md',\n\t\t\t\tbasename: 'file.md',\n\t\t\t\tisDir: false,\n\t\t\t\tisDeleted: false,\n\t\t\t\tmtime: 10,\n\t\t\t\tsize: 10,\n\t\t\t},\n\t\t\tremote: {\n\t\t\t\tpath: 'folder/file.md',\n\t\t\t\tbasename: 'file.md',\n\t\t\t\tisDir: false,\n\t\t\t\tisDeleted: false,\n\t\t\t\tmtime: 20,\n\t\t\t\tsize: 10,\n\t\t\t},\n\t\t\tbase: {\n\t\t\t\tkey: 'blob-key',\n\t\t\t},\n\t\t})\n\t\texpect(setRecords).toHaveBeenCalled()\n\t})\n})\n"
  },
  {
    "path": "src/sync/utils/update-records.ts",
    "content": "import { chunk, debounce, isNil } from 'lodash-es'\nimport { Vault } from 'obsidian'\nimport { emitSyncUpdateMtimeProgress } from '~/events'\nimport { NutstoreFileSystem } from '~/fs/nutstore'\nimport { syncRecordKV } from '~/storage'\nimport { blobStore } from '~/storage/blob'\nimport { SyncRecord } from '~/storage/sync-record'\nimport MkdirsRemoteTask from '~/sync/tasks/mkdirs-remote.task'\nimport type { BaseTask, TaskResult } from '~/sync/tasks/task.interface'\nimport { isMergeablePath } from '~/sync/utils/is-mergeable-path'\nimport { getDBKey } from '~/utils/get-db-key'\nimport { isSub } from '~/utils/is-sub'\nimport logger from '~/utils/logger'\nimport { statVaultItem } from '~/utils/stat-vault-item'\nimport { stdRemotePath } from '~/utils/std-remote-path'\nimport type NutstorePlugin from '../..'\nimport RemoveRemoteRecursivelyTask from '../tasks/remove-remote-recursively.task'\n\n/**\n * 批量更新同步记录的工具函数\n */\nexport async function updateMtimeInRecord(\n\tplugin: NutstorePlugin,\n\tvault: Vault,\n\tremoteBaseDir: string,\n\ttasks: BaseTask[],\n\tresults: TaskResult[],\n\tbatch_size: number,\n): Promise<void> {\n\tif (tasks.length === 0) {\n\t\treturn\n\t}\n\t// Filter out tasks that don't need record updates\n\tconst tasksNeedingUpdate = tasks.filter((task, idx) => {\n\t\treturn results[idx]?.success && !results[idx]?.skipRecord\n\t})\n\n\tif (tasksNeedingUpdate.length === 0) {\n\t\treturn\n\t}\n\n\tconst token = await plugin.getToken()\n\tconst remoteFs = new NutstoreFileSystem({\n\t\tvault,\n\t\ttoken,\n\t\tremoteBaseDir: stdRemotePath(remoteBaseDir),\n\t})\n\n\tconst latestRemoteEntities = await remoteFs.walk()\n\tconst remoteEntityMap = new Map(\n\t\tlatestRemoteEntities.map((e) => [e.stat.path, e]),\n\t)\n\tconst syncRecord = new SyncRecord(\n\t\tgetDBKey(vault.getName(), remoteBaseDir),\n\t\tsyncRecordKV,\n\t)\n\tconst records = await syncRecord.getRecords()\n\tconst startAt = Date.now()\n\tlet completedCount = 0\n\tlet successfulTasksCount = 0\n\n\tconst debouncedSetRecords = debounce(\n\t\t(records) => syncRecord.setRecords(records),\n\t\t3000,\n\t\t{\n\t\t\ttrailing: true,\n\t\t\tleading: false,\n\t\t},\n\t)\n\n\t// Expand MkdirsRemoteTask into multiple update operations\n\tconst expandedTasks: Array<{ task: BaseTask; localPath: string }> = []\n\tfor (const task of tasksNeedingUpdate) {\n\t\tif (task instanceof MkdirsRemoteTask) {\n\t\t\t// Add main path and all additional paths\n\t\t\tconst allPaths = task.getAllPaths()\n\t\t\tfor (const pathInfo of allPaths) {\n\t\t\t\texpandedTasks.push({ task, localPath: pathInfo.localPath })\n\t\t\t}\n\t\t} else {\n\t\t\texpandedTasks.push({ task, localPath: task.localPath })\n\t\t}\n\t}\n\n\tconst taskChunks = chunk(expandedTasks, batch_size)\n\n\tfor (const taskChunk of taskChunks) {\n\t\tconst batch = taskChunk.map(async ({ task, localPath }) => {\n\t\t\ttry {\n\t\t\t\tconst remote = remoteEntityMap.get(localPath)\n\t\t\t\tconst local = await statVaultItem(vault, localPath)\n\n\t\t\t\tif (task instanceof RemoveRemoteRecursivelyTask) {\n\t\t\t\t\tfor (const k of records.keys()) {\n\t\t\t\t\t\tif (isSub(localPath, k)) {\n\t\t\t\t\t\t\trecords.delete(k)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trecords.delete(localPath)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (!local && !remote) {\n\t\t\t\t\trecords.delete(localPath)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (!local || !remote) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Calculate base for file content\n\t\t\t\tlet base: { key: string } | undefined\n\t\t\t\tlet baseKey: string | undefined\n\t\t\t\tif (!local.isDir) {\n\t\t\t\t\tconst buffer = await vault.adapter.readBinary(localPath)\n\t\t\t\t\tconst isMergeable = isMergeablePath(localPath)\n\t\t\t\t\tif (!isMergeable) {\n\t\t\t\t\t\tbaseKey = undefined\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst { key } = await blobStore.store(buffer)\n\t\t\t\t\t\tbaseKey = key\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbase = isNil(baseKey) ? undefined : { key: baseKey }\n\n\t\t\t\trecords.set(localPath, {\n\t\t\t\t\tremote: remote.stat,\n\t\t\t\t\tlocal,\n\t\t\t\t\tbase,\n\t\t\t\t})\n\t\t\t\tsuccessfulTasksCount++\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t'updateMtimeInRecord',\n\t\t\t\t\t{\n\t\t\t\t\t\terrorName: e.name,\n\t\t\t\t\t\terrorMsg: e.message,\n\t\t\t\t\t},\n\t\t\t\t\ttask.toJSON(),\n\t\t\t\t)\n\t\t\t} finally {\n\t\t\t\tcompletedCount++\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(batch)\n\t\temitSyncUpdateMtimeProgress(expandedTasks.length, completedCount)\n\t\tdebouncedSetRecords(records)\n\t}\n\n\tawait debouncedSetRecords.flush()\n\n\tlogger.debug(`Records saving completed`, {\n\t\trecordsSize: records.size,\n\t\telapsedMs: Date.now() - startAt,\n\t})\n}\n"
  },
  {
    "path": "src/types/obsidian-extended.d.ts",
    "content": "/**\n * Extended type definitions for Obsidian API\n *\n * This file contains type definitions for undocumented/internal Obsidian APIs\n * that are not included in the official obsidian type definitions.\n *\n * Note: These are internal APIs that may change in future Obsidian versions.\n * Use with caution and proper error handling.\n */\n\nimport 'obsidian'\n\n/**\n * Obsidian's internal Setting object\n * Provides access to the settings modal and plugin tabs\n */\ninterface ObsidianSetting {\n\t/**\n\t * Opens the settings modal\n\t */\n\topen(): void\n\n\t/**\n\t * Opens a specific plugin's settings tab\n\t * @param pluginId - The plugin manifest ID\n\t */\n\topenTabById(pluginId: string): void\n}\n\ndeclare module 'obsidian' {\n\tinterface App {\n\t\t/**\n\t\t * Internal settings API (undocumented)\n\t\t * Used to programmatically open the settings modal and navigate to plugin tabs\n\t\t *\n\t\t * Warning: This is an internal API and may not be available in all Obsidian versions.\n\t\t * Always check for existence before using.\n\t\t */\n\t\tsetting?: ObsidianSetting\n\t}\n}\n"
  },
  {
    "path": "src/utils/api-limiter.ts",
    "content": "import Bottleneck from 'bottleneck'\n\nexport const apiLimiter = new Bottleneck({\n\tmaxConcurrent: 1,\n\tminTime: 200,\n})\n"
  },
  {
    "path": "src/utils/apply-deltas-to-stats.ts",
    "content": "import { basename } from 'path-browserify'\nimport { DeltaEntry } from '~/api/delta'\nimport { StatModel } from '~/model/stat.model'\n\n/**\n * Apply delta changes to a base file list\n */\nexport function applyDeltasToStats(\n\tstats: StatModel[],\n\tdeltas: DeltaEntry[],\n): StatModel[] {\n\tconst filesMap = new Map<string, StatModel>(stats.map((d) => [d.path, d]))\n\tconst deltasMap = new Map(deltas.map((d) => [d.path, d]))\n\n\t// Apply each delta\n\tfor (const delta of deltasMap.values()) {\n\t\tif (delta.isDeleted) {\n\t\t\tfilesMap.delete(delta.path)\n\t\t\tcontinue\n\t\t}\n\t\tfilesMap.set(delta.path, {\n\t\t\tpath: delta.path,\n\t\t\tbasename: basename(delta.path),\n\t\t\tisDir: delta.isDir,\n\t\t\tisDeleted: delta.isDeleted,\n\t\t\tmtime: new Date(delta.modified).valueOf(),\n\t\t\tsize: delta.size,\n\t\t})\n\t}\n\n\treturn Array.from(filesMap.values())\n}\n"
  },
  {
    "path": "src/utils/breakable-sleep.ts",
    "content": "import { Observable } from 'rxjs'\n\nexport default function <T>(ob: Observable<T>, ms: number) {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst sub = ob.subscribe({\n\t\t\tnext: () => finish(),\n\t\t\terror: (err) => {\n\t\t\t\twindow.clearTimeout(timer)\n\t\t\t\tsub.unsubscribe()\n\t\t\t\treject(err)\n\t\t\t},\n\t\t})\n\n\t\tfunction finish() {\n\t\t\twindow.clearTimeout(timer)\n\t\t\tsub.unsubscribe()\n\t\t\tresolve()\n\t\t}\n\n\t\tconst timer = window.setTimeout(() => {\n\t\t\tfinish()\n\t\t}, ms)\n\t})\n}\n"
  },
  {
    "path": "src/utils/config-dir-rules.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\nimport GlobMatch, { needIncludeFromGlobRules } from './glob-match'\nimport {\n\tcomputeEffectiveFilterRules,\n\tgetConfigDirSystemFilterRules,\n\tgetConfigDirSystemTraversalRules,\n} from './config-dir-rules'\n\nfunction createPluginMock(\n\tmode: 'none' | 'bookmarks' | 'all',\n\tfilterRules = {\n\t\texclusionRules: [] as {\n\t\t\texpr: string\n\t\t\toptions: { caseSensitive: boolean }\n\t\t}[],\n\t\tinclusionRules: [] as {\n\t\t\texpr: string\n\t\t\toptions: { caseSensitive: boolean }\n\t\t}[],\n\t},\n) {\n\treturn {\n\t\tapp: {\n\t\t\tvault: {\n\t\t\t\tconfigDir: '.obsidian',\n\t\t\t},\n\t\t},\n\t\tsettings: {\n\t\t\tconfigDirSyncMode: mode,\n\t\t\tfilterRules,\n\t\t},\n\t} as any\n}\n\ndescribe('computeEffectiveFilterRules', () => {\n\tit('generates traversal and filter rules from shared system source', () => {\n\t\tconst traversalRules = getConfigDirSystemTraversalRules('.obsidian')\n\t\tconst filterRules = getConfigDirSystemFilterRules('.obsidian')\n\n\t\texpect(traversalRules).toEqual([\n\t\t\t{\n\t\t\t\texpr: '.obsidian/plugins/**/node_modules',\n\t\t\t\toptions: { caseSensitive: true },\n\t\t\t},\n\t\t\t{ expr: '.obsidian/plugins/**/.git', options: { caseSensitive: true } },\n\t\t\t{\n\t\t\t\texpr: '.obsidian/plugins/**/.pnpm-store',\n\t\t\t\toptions: { caseSensitive: true },\n\t\t\t},\n\t\t\t{ expr: '.obsidian/workspace', options: { caseSensitive: true } },\n\t\t\t{ expr: '.obsidian/workspace.json', options: { caseSensitive: true } },\n\t\t])\n\t\texpect(filterRules).toEqual(\n\t\t\texpect.arrayContaining([\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/node_modules',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/node_modules/**',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{ expr: '.obsidian/plugins/**/.git', options: { caseSensitive: true } },\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/.git/**',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/.pnpm-store',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/.pnpm-store/**',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t]),\n\t\t)\n\t})\n\n\tit('keeps user configDir whitelist rules in all mode', () => {\n\t\tconst rules = computeEffectiveFilterRules(\n\t\t\tcreatePluginMock('all', {\n\t\t\t\texclusionRules: [\n\t\t\t\t\t{ expr: '.obsidian/**', options: { caseSensitive: false } },\n\t\t\t\t],\n\t\t\t\tinclusionRules: [\n\t\t\t\t\t{\n\t\t\t\t\t\texpr: '.obsidian/snippets/file-tree-colors.css',\n\t\t\t\t\t\toptions: { caseSensitive: false },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\texpr: '.obsidian/plugins/manual-sorting/data.json',\n\t\t\t\t\t\toptions: { caseSensitive: false },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t)\n\t\tconst exclusions = rules.exclusionRules.map(\n\t\t\t(rule) => new GlobMatch(rule.expr, rule.options),\n\t\t)\n\t\tconst inclusions = rules.inclusionRules.map(\n\t\t\t(rule) => new GlobMatch(rule.expr, rule.options),\n\t\t)\n\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules(\n\t\t\t\t'.obsidian/snippets/file-tree-colors.css',\n\t\t\t\tinclusions,\n\t\t\t\texclusions,\n\t\t\t),\n\t\t).toBe(true)\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules(\n\t\t\t\t'.obsidian/plugins/manual-sorting/data.json',\n\t\t\t\tinclusions,\n\t\t\t\texclusions,\n\t\t\t),\n\t\t).toBe(true)\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules('.obsidian/app.json', inclusions, exclusions),\n\t\t).toBe(false)\n\t})\n\n\tit('allows user inclusions to override mode-derived configDir exclusions', () => {\n\t\tconst rules = computeEffectiveFilterRules(\n\t\t\tcreatePluginMock('none', {\n\t\t\t\texclusionRules: [],\n\t\t\t\tinclusionRules: [\n\t\t\t\t\t{\n\t\t\t\t\t\texpr: '.obsidian/bookmarks.json',\n\t\t\t\t\t\toptions: { caseSensitive: false },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t)\n\t\tconst exclusions = rules.exclusionRules.map(\n\t\t\t(rule) => new GlobMatch(rule.expr, rule.options),\n\t\t)\n\t\tconst inclusions = rules.inclusionRules.map(\n\t\t\t(rule) => new GlobMatch(rule.expr, rule.options),\n\t\t)\n\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules(\n\t\t\t\t'.obsidian/bookmarks.json',\n\t\t\t\tinclusions,\n\t\t\t\texclusions,\n\t\t\t),\n\t\t).toBe(true)\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules('.obsidian/app.json', inclusions, exclusions),\n\t\t).toBe(false)\n\t})\n\n\tit('allows user inclusions to extend bookmarks mode', () => {\n\t\tconst rules = computeEffectiveFilterRules(\n\t\t\tcreatePluginMock('bookmarks', {\n\t\t\t\texclusionRules: [],\n\t\t\t\tinclusionRules: [\n\t\t\t\t\t{\n\t\t\t\t\t\texpr: '.obsidian/snippets/file-tree-colors.css',\n\t\t\t\t\t\toptions: { caseSensitive: false },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t)\n\t\tconst exclusions = rules.exclusionRules.map(\n\t\t\t(rule) => new GlobMatch(rule.expr, rule.options),\n\t\t)\n\t\tconst inclusions = rules.inclusionRules.map(\n\t\t\t(rule) => new GlobMatch(rule.expr, rule.options),\n\t\t)\n\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules(\n\t\t\t\t'.obsidian/bookmarks.json',\n\t\t\t\tinclusions,\n\t\t\t\texclusions,\n\t\t\t),\n\t\t).toBe(true)\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules(\n\t\t\t\t'.obsidian/snippets/file-tree-colors.css',\n\t\t\t\tinclusions,\n\t\t\t\texclusions,\n\t\t\t),\n\t\t).toBe(true)\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules('.obsidian/app.json', inclusions, exclusions),\n\t\t).toBe(false)\n\t})\n\n\tit('adds plugin dependency exclusions in all mode', () => {\n\t\tconst rules = computeEffectiveFilterRules(createPluginMock('all'))\n\t\texpect(rules.exclusionRules).toEqual(\n\t\t\texpect.arrayContaining([\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/node_modules',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{ expr: '.obsidian/plugins/**/.git', options: { caseSensitive: true } },\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/.git/**',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/.pnpm-store',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/.pnpm-store/**',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\texpr: '.obsidian/plugins/**/node_modules/**',\n\t\t\t\t\toptions: { caseSensitive: true },\n\t\t\t\t},\n\t\t\t]),\n\t\t)\n\t})\n\n\tit('uses mode-derived rules as normal glob rules', () => {\n\t\tconst inclusion = [new GlobMatch('**/*.json', { caseSensitive: false })]\n\t\tconst exclusion = [new GlobMatch('.obsidian', { caseSensitive: false })]\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules(\n\t\t\t\t'.obsidian/workspace.json',\n\t\t\t\tinclusion,\n\t\t\t\texclusion,\n\t\t\t),\n\t\t).toBe(true)\n\t})\n})\n"
  },
  {
    "path": "src/utils/config-dir-rules.ts",
    "content": "import type NutstorePlugin from '~/index'\nimport type { GlobMatchOptions } from './glob-match'\n\nexport type ConfigDirSyncMode = 'none' | 'bookmarks' | 'all'\n\nexport interface EffectiveFilterRules {\n\texclusionRules: GlobMatchOptions[]\n\tinclusionRules: GlobMatchOptions[]\n\tconfigDir: string\n\tconfigDirSyncMode: ConfigDirSyncMode\n}\n\nexport interface ConfigDirFilterRuleInput {\n\texclusionRules: GlobMatchOptions[]\n\tinclusionRules: GlobMatchOptions[]\n}\n\nconst CONFIG_DIR_SYSTEM_EXCLUSION_SUFFIXES = [\n\t'plugins/**/node_modules',\n\t'plugins/**/.git',\n\t'plugins/**/.pnpm-store',\n\t'workspace',\n\t'workspace.json',\n] as const\n\nfunction makeCaseSensitiveRule(expr: string): GlobMatchOptions {\n\treturn { expr, options: { caseSensitive: true } }\n}\n\nexport function getConfigDirSystemTraversalRules(\n\tconfigDir: string,\n): GlobMatchOptions[] {\n\treturn CONFIG_DIR_SYSTEM_EXCLUSION_SUFFIXES.map((suffix) =>\n\t\tmakeCaseSensitiveRule(`${configDir}/${suffix}`),\n\t)\n}\n\nexport function getConfigDirSystemFilterRules(\n\tconfigDir: string,\n): GlobMatchOptions[] {\n\treturn getConfigDirSystemTraversalRules(configDir).flatMap((rule) => [\n\t\tmakeCaseSensitiveRule(rule.expr),\n\t\tmakeCaseSensitiveRule(`${rule.expr}/**`),\n\t])\n}\n\nexport function computeEffectiveFilterRulesFromParts(\n\tconfigDir: string,\n\tmode: ConfigDirSyncMode,\n\tfilterRules: ConfigDirFilterRuleInput,\n): EffectiveFilterRules {\n\tconst exclusionRules = [...filterRules.exclusionRules]\n\tconst inclusionRules = [...filterRules.inclusionRules]\n\texclusionRules.push(...getConfigDirSystemFilterRules(configDir))\n\n\tif (mode === 'none') {\n\t\texclusionRules.push({ expr: configDir, options: { caseSensitive: false } })\n\t} else if (mode === 'bookmarks') {\n\t\texclusionRules.push({\n\t\t\texpr: `${configDir}/**`,\n\t\t\toptions: { caseSensitive: false },\n\t\t})\n\t\tinclusionRules.push({\n\t\t\texpr: `${configDir}/bookmarks.json`,\n\t\t\toptions: { caseSensitive: false },\n\t\t})\n\t}\n\t// mode === 'all': no additional rules — configDir traversed freely\n\n\treturn {\n\t\texclusionRules,\n\t\tinclusionRules,\n\t\tconfigDir,\n\t\tconfigDirSyncMode: mode,\n\t}\n}\n\n/**\n * Computes the effective exclusion/inclusion filter rules by merging the\n * user's stored rules with the system-managed configDir rules derived from\n * the current configDirSyncMode setting.\n *\n * Does NOT modify plugin.settings — returns a new rule set for use at\n * sync time only.\n */\nexport function computeEffectiveFilterRules(\n\tplugin: NutstorePlugin,\n): EffectiveFilterRules {\n\tconst configDir = plugin.app.vault.configDir\n\tconst mode: ConfigDirSyncMode = plugin.settings.configDirSyncMode ?? 'none'\n\treturn computeEffectiveFilterRulesFromParts(\n\t\tconfigDir,\n\t\tmode,\n\t\tplugin.settings.filterRules,\n\t)\n}\n"
  },
  {
    "path": "src/utils/create-id.ts",
    "content": "import { v7 as uuid } from 'uuid'\n\nexport default function createId(prefix: string) {\n\treturn `${prefix}-${uuid()}`\n}\n"
  },
  {
    "path": "src/utils/decrypt-ticket-response.ts",
    "content": "import { decryptSecret } from '@nutstore/sso-js'\n\nexport interface OAuthResponse {\n\tusername: string\n\tuserid: string\n\taccess_token: string\n}\n\nexport async function decryptOAuthResponse(cipherText: string) {\n\tconst json = await decryptSecret({\n\t\tapp: 'obsidian',\n\t\ts: cipherText,\n\t})\n\treturn JSON.parse(json) as OAuthResponse\n}\n"
  },
  {
    "path": "src/utils/deep-stringify.ts",
    "content": "import {\n\tisArray,\n\tisBoolean,\n\tisDate,\n\tisError,\n\tisFinite,\n\tisFunction,\n\tisNull,\n\tisNumber,\n\tisRegExp,\n\tisString,\n\tisSymbol,\n\tisUndefined,\n\tmap,\n} from 'lodash-es'\n// No need to import Set, use built-in TS Set type\n\n/**\n * Deeply stringifies a JavaScript value into a JSON string, similar to JSON.stringify,\n * leveraging lodash-es functions and written in TypeScript.\n * - Handles circular references by throwing an error.\n * - Handles getter errors by stringifying the error message as the property's value.\n * - Uses native JSON.stringify for robust string escaping.\n * - Handles Date objects by calling toISOString(), mimicking native behavior.\n *\n * @param value The value to stringify (typed as unknown for flexibility).\n * @param visited Used internally to track visited objects/arrays for circular reference detection.\n * @returns The JSON string representation, or undefined if the root value is invalid (function, symbol, undefined).\n */\nexport default function deepStringify(\n\tvalue: unknown,\n\tvisited: Set<object> = new Set(),\n): string | undefined {\n\t// 1. Handle primitives, null, and unsupported types first\n\tif (isNull(value)) {\n\t\treturn 'null'\n\t}\n\tif (isBoolean(value)) {\n\t\treturn String(value) // 'true' or 'false'\n\t}\n\tif (isString(value)) {\n\t\t// Use native JSON.stringify for robust escaping AND quoting\n\t\treturn JSON.stringify(value)\n\t}\n\tif (isNumber(value)) {\n\t\treturn isFinite(value) ? String(value) : 'null' // Handle NaN/Infinity\n\t}\n\tif (isUndefined(value) || isFunction(value) || isSymbol(value)) {\n\t\treturn undefined // Omitted in objects, null in arrays (handled by caller)\n\t}\n\tif (typeof value === 'bigint') {\n\t\tthrow new TypeError('Do not know how to serialize a BigInt')\n\t}\n\tif (isRegExp(value)) {\n\t\treturn JSON.stringify(String(value))\n\t}\n\t// Handle Date objects explicitly\n\tif (isDate(value)) {\n\t\tif (isFinite(value.getTime())) {\n\t\t\t// Stringify the ISO string to get the required quotes\n\t\t\treturn JSON.stringify(value.toISOString())\n\t\t} else {\n\t\t\treturn 'null' // Invalid date becomes null\n\t\t}\n\t}\n\tif (isError(value)) {\n\t\treturn JSON.stringify({\n\t\t\ttype: 'Error',\n\t\t\tvalue: value?.toString() ?? { name: value.name, message: value.message },\n\t\t})\n\t}\n\n\t// --- Value should be an Array or an Object-like entity ---\n\n\t// Ensure value is object type before circular check / adding to Set<object>\n\tif (typeof value !== 'object' || value === null) {\n\t\tthrow new Error(\n\t\t\t`Internal error: Unexpected non-object type: ${typeof value}`,\n\t\t)\n\t}\n\n\t// 2. Circular reference check\n\tif (visited.has(value)) {\n\t\tthrow new TypeError('Converting circular structure to JSON')\n\t}\n\tvisited.add(value) // Add current object/array *before* recursive calls\n\n\tlet result: string | undefined\n\n\ttry {\n\t\t// 3. Handle Arrays using _.map\n\t\tif (isArray(value)) {\n\t\t\tconst elements = map(value, (element: unknown): string => {\n\t\t\t\tconst stringifiedElement = deepStringify(element, visited)\n\t\t\t\t// JSON spec: undefined/function/symbol array elements become null\n\t\t\t\treturn stringifiedElement === undefined ? 'null' : stringifiedElement\n\t\t\t})\n\t\t\tresult = `[${elements.join(',')}]`\n\t\t}\n\t\t// 4. Handle Objects using Object.keys().forEach()\n\t\telse {\n\t\t\t// Should be an object type here\n\t\t\tconst keys = Object.keys(value) // Get own enumerable string keys\n\t\t\tconst properties: string[] = [] // Array to hold \"key:value\" strings\n\n\t\t\tkeys.forEach((key) => {\n\t\t\t\tlet stringifiedValue: string | undefined\n\t\t\t\ttry {\n\t\t\t\t\t// *** Access the property inside try block ***\n\t\t\t\t\t// Use Record<string, unknown> assertion as TS doesn't know about arbitrary keys/getters\n\t\t\t\t\tconst currentValue = (value as Record<string, unknown>)[key]\n\t\t\t\t\tstringifiedValue = deepStringify(currentValue, visited) // Recurse\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t// *** Handle getter error: stringify the error message ***\n\t\t\t\t\tlet errorMessage = 'Error accessing property'\n\t\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\t\terrorMessage = error.message\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof error === 'object' &&\n\t\t\t\t\t\terror !== null &&\n\t\t\t\t\t\t'message' in error &&\n\t\t\t\t\t\ttypeof error.message === 'string'\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Handle plain objects thrown with a message property\n\t\t\t\t\t\terrorMessage = error.message\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\terrorMessage = String(error)\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t/* ignore */\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Use native stringify to quote and escape the error message string\n\t\t\t\t\tstringifiedValue = JSON.stringify(errorMessage)\n\t\t\t\t}\n\n\t\t\t\t// Omit properties whose values stringify to undefined\n\t\t\t\tif (stringifiedValue !== undefined) {\n\t\t\t\t\t// Keys in JSON objects must be strings. Stringify ensures quotes.\n\t\t\t\t\tconst stringifiedKey = JSON.stringify(key)\n\t\t\t\t\tproperties.push(`${stringifiedKey}:${stringifiedValue}`)\n\t\t\t\t}\n\t\t\t}) // end forEach key\n\n\t\t\tresult = `{${properties.join(',')}}`\n\t\t}\n\t} finally {\n\t\t// 5. Crucial: Remove from visited set *after* processing children/throwing errors\n\t\tvisited.delete(value)\n\t}\n\n\treturn result\n}\n"
  },
  {
    "path": "src/utils/file-stat-to-stat-model.ts",
    "content": "import { FileStat } from 'webdav'\nimport { StatModel } from '~/model/stat.model'\n\nexport function fileStatToStatModel(from: FileStat): StatModel {\n\treturn {\n\t\tpath: from.filename,\n\t\tbasename: from.basename,\n\t\tisDir: from.type === 'directory',\n\t\tisDeleted: false,\n\t\tmtime: new Date(from.lastmod).valueOf(),\n\t\tsize: from.size,\n\t}\n}\n"
  },
  {
    "path": "src/utils/format-relative-time.ts",
    "content": "import i18n from '~/i18n'\n\nexport function formatRelativeTime(timestamp: number): string {\n\tconst now = Date.now()\n\tconst diffMs = now - timestamp\n\tconst diffSeconds = Math.floor(diffMs / 1000)\n\tconst diffMinutes = Math.floor(diffSeconds / 60)\n\tconst diffHours = Math.floor(diffMinutes / 60)\n\tconst diffDays = Math.floor(diffHours / 24)\n\n\tif (diffSeconds < 60) {\n\t\treturn i18n.t('time.justNow')\n\t} else if (diffMinutes < 60) {\n\t\treturn i18n.t('time.minutesAgo', { count: diffMinutes })\n\t} else if (diffHours < 24) {\n\t\treturn i18n.t('time.hoursAgo', { count: diffHours })\n\t} else if (diffDays < 30) {\n\t\treturn i18n.t('time.daysAgo', { count: diffDays })\n\t} else {\n\t\treturn i18n.t('time.longAgo')\n\t}\n}\n"
  },
  {
    "path": "src/utils/get-db-key.ts",
    "content": "import { sha256 } from 'hash-wasm'\nimport { normalizePath } from 'obsidian'\nimport { objectHash } from 'ohash'\nimport { stdRemotePath } from './std-remote-path'\n\nexport function getDBKey(vaultName: string, remoteBaseDir: string) {\n\treturn objectHash({\n\t\tvaultName,\n\t\tremoteBaseDir: stdRemotePath(remoteBaseDir),\n\t})\n}\n\nexport async function getTraversalWebDAVDBKey(\n\ttoken: string,\n\tremoteBaseDir: string,\n) {\n\tconst hash = await sha256(token)\n\tremoteBaseDir = normalizePath(remoteBaseDir)\n\treturn `${hash}:${remoteBaseDir}`\n}\n"
  },
  {
    "path": "src/utils/get-root-folder-name.ts",
    "content": "import { normalize } from 'path-browserify'\n\nexport function getRootFolderName(path: string) {\n\tpath = normalize(path)\n\tif (path.startsWith('/')) {\n\t\tpath = path.slice(1)\n\t}\n\treturn path.split('/')[0]\n}\n"
  },
  {
    "path": "src/utils/get-task-name.ts",
    "content": "import i18n from '~/i18n'\nimport CleanRecordTask from '~/sync/tasks/clean-record.task'\nimport ConflictResolveTask from '~/sync/tasks/conflict-resolve.task'\nimport FilenameErrorTask from '~/sync/tasks/filename-error.task'\nimport MkdirLocalTask from '~/sync/tasks/mkdir-local.task'\nimport MkdirRemoteTask from '~/sync/tasks/mkdir-remote.task'\nimport MkdirsRemoteTask from '~/sync/tasks/mkdirs-remote.task'\nimport NoopTask from '~/sync/tasks/noop.task'\nimport PullTask from '~/sync/tasks/pull.task'\nimport PushTask from '~/sync/tasks/push.task'\nimport RemoveLocalTask from '~/sync/tasks/remove-local.task'\nimport RemoveRemoteRecursivelyTask from '~/sync/tasks/remove-remote-recursively.task'\nimport RemoveRemoteTask from '~/sync/tasks/remove-remote.task'\nimport SkippedTask from '~/sync/tasks/skipped.task'\nimport { BaseTask } from '~/sync/tasks/task.interface'\n\nexport default function getTaskName(task: BaseTask) {\n\tif (task instanceof CleanRecordTask) {\n\t\treturn i18n.t('sync.fileOp.cleanRecord')\n\t}\n\tif (task instanceof ConflictResolveTask) {\n\t\treturn i18n.t('sync.fileOp.merge')\n\t}\n\tif (task instanceof FilenameErrorTask) {\n\t\treturn i18n.t('sync.fileOp.filenameError')\n\t}\n\tif (task instanceof MkdirLocalTask) {\n\t\treturn i18n.t('sync.fileOp.createLocalDir')\n\t}\n\tif (task instanceof MkdirRemoteTask) {\n\t\treturn i18n.t('sync.fileOp.createRemoteDir')\n\t}\n\tif (task instanceof MkdirsRemoteTask) {\n\t\treturn i18n.t('sync.fileOp.createRemoteDirs')\n\t}\n\tif (task instanceof NoopTask) {\n\t\treturn i18n.t('sync.fileOp.noop')\n\t}\n\tif (task instanceof PullTask) {\n\t\treturn i18n.t('sync.fileOp.download')\n\t}\n\tif (task instanceof PushTask) {\n\t\treturn i18n.t('sync.fileOp.upload')\n\t}\n\tif (task instanceof RemoveLocalTask) {\n\t\treturn i18n.t('sync.fileOp.removeLocal')\n\t}\n\tif (task instanceof RemoveRemoteTask) {\n\t\treturn i18n.t('sync.fileOp.removeRemote')\n\t}\n\tif (task instanceof RemoveRemoteRecursivelyTask) {\n\t\treturn i18n.t('sync.fileOp.removeRemoteRecursively')\n\t}\n\tif (task instanceof SkippedTask) {\n\t\tconst reasonText = i18n.t(`sync.skipReason.${task.options.reason}`)\n\t\treturn `${i18n.t('sync.fileOp.skip')}: ${reasonText}`\n\t}\n\treturn i18n.t('sync.fileOp.sync')\n}\n"
  },
  {
    "path": "src/utils/glob-match.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\nimport GlobMatch, { needIncludeFromGlobRules } from './glob-match'\n\nconst options = { caseSensitive: false }\n\nconst makeRules = (patterns: string[]) =>\n\tpatterns.map((pattern) => new GlobMatch(pattern, options))\n\ndescribe('needIncludeFromGlobRules', () => {\n\tit('默认情况：无规则时应包含所有文件', () => {\n\t\texpect(needIncludeFromGlobRules('some/file.txt', [], [])).toBe(true)\n\t\texpect(needIncludeFromGlobRules('some/../file.txt', [], [])).toBe(true)\n\t\texpect(needIncludeFromGlobRules('./some/file.txt', [], [])).toBe(true)\n\t\texpect(needIncludeFromGlobRules('some//file.txt', [], [])).toBe(true)\n\t\texpect(needIncludeFromGlobRules('/some/file.txt', [], [])).toBe(true)\n\t\texpect(needIncludeFromGlobRules('some/folder/..', [], [])).toBe(true)\n\t\texpect(needIncludeFromGlobRules('some/folder/../', [], [])).toBe(true)\n\t\texpect(needIncludeFromGlobRules('some/././file.txt', [], [])).toBe(true)\n\t})\n\n\tit('包含规则：匹配包含规则的文件应被包含', () => {\n\t\tconst inclusion = makeRules(['*.txt'])\n\t\tconst exclusion: GlobMatch[] = []\n\n\t\texpect(needIncludeFromGlobRules('document.txt', inclusion, exclusion)).toBe(\n\t\t\ttrue,\n\t\t)\n\t})\n\n\tit('排除规则：匹配排除规则的文件应被排除', () => {\n\t\tconst inclusion: GlobMatch[] = []\n\t\tconst exclusion = makeRules(['*.log'])\n\n\t\texpect(needIncludeFromGlobRules('debug.log', inclusion, exclusion)).toBe(\n\t\t\tfalse,\n\t\t)\n\t})\n\n\tit('优先级：包含规则优先于排除规则', () => {\n\t\tconst inclusion = makeRules(['important.log'])\n\t\tconst exclusion = makeRules(['*.log'])\n\n\t\texpect(\n\t\t\tneedIncludeFromGlobRules('important.log', inclusion, exclusion),\n\t\t).toBe(true)\n\t})\n\n\tdescribe('标准通配符', () => {\n\t\tit('* 匹配零个或多个字符，但不跨目录', () => {\n\t\t\tconst exclusion = makeRules(['*.txt'])\n\n\t\t\texpect(needIncludeFromGlobRules('readme.txt', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('readme.txt/', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('notes/readme.txt', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('notes/archive/readme.txt', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('notes/readme.txt.bak', [], exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('readme.md', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('readme', [], exclusion)).toBe(true)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('dir.with.dot/readme.txt', [], exclusion),\n\t\t\t).toBe(false)\n\t\t})\n\n\t\tit('? 匹配任意单个字符', () => {\n\t\t\tconst exclusion = makeRules(['debug?.log'])\n\n\t\t\texpect(needIncludeFromGlobRules('debug1.log', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('debugA.log', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('debug12.log', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('debug.log', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('debug/.log', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('debugä.log', [], exclusion)).toBe(false)\n\t\t})\n\n\t\tit('[] 匹配指定字符或范围', () => {\n\t\t\tconst exclusion = makeRules(['backup[0-9].sql'])\n\n\t\t\texpect(needIncludeFromGlobRules('backup0.sql', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('backup9.sql', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('backupA.sql', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('backup10.sql', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('backup-.sql', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('backup5.SQL', [], exclusion)).toBe(false)\n\t\t})\n\t})\n\n\tdescribe('路径分隔符规则', () => {\n\t\tit('模式中不包含 /：递归匹配所有目录', () => {\n\t\t\tconst exclusion = makeRules(['*.log', 'temp'])\n\n\t\t\texpect(needIncludeFromGlobRules('app.log', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('logs/app.log', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('logs/app.log/', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('temp', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/temp', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/temp/file.txt', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/temp/../temp/file.txt', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/./temp/file.txt', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('TEMP', [], exclusion)).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('temporary/file.txt', [], exclusion),\n\t\t\t).toBe(true)\n\t\t})\n\n\t\tit('模式以 / 开头：仅匹配根目录', () => {\n\t\t\tconst exclusion = makeRules(['/TODO'])\n\n\t\t\texpect(needIncludeFromGlobRules('TODO', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/TODO', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('TODO/readme.md', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('todo', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/../TODO', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('/TODO', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('nested/TODO', [], exclusion)).toBe(true)\n\t\t})\n\n\t\tit('模式以 / 结尾：仅匹配目录及其内容', () => {\n\t\t\tconst exclusion = makeRules(['build/'])\n\n\t\t\texpect(needIncludeFromGlobRules('build/', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('build/app.js', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('src/build/', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/build/app.js', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('build', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('buildfile/', [], exclusion)).toBe(true)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('build/../build/app.js', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('./build/app.js', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('build/.hidden', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\n\t\tit('父目录被忽略时子文件应直接被忽略', () => {\n\t\t\tconst exclusion = makeRules(['build/'])\n\n\t\t\texpect(needIncludeFromGlobRules('build/', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('build/app.js', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('build/sub/app.js', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('build/sub/', [], exclusion)).toBe(false)\n\t\t})\n\n\t\tit('父目录忽略可以被子文件白名单覆盖', () => {\n\t\t\tconst inclusion = makeRules(['build/keep.txt'])\n\t\t\tconst exclusion = makeRules(['build/'])\n\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('build/keep.txt', inclusion, exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('build/keep/more.txt', inclusion, exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('build/keep.txt/extra', inclusion, exclusion),\n\t\t\t).toBe(false)\n\t\t})\n\n\t\tit('包含普通路径默认不递归，子路径仍可被排除', () => {\n\t\t\tconst inclusion = makeRules(['aaa/bb'])\n\t\t\tconst exclusion = makeRules(['aaa/bb/cc'])\n\n\t\t\texpect(needIncludeFromGlobRules('aaa/bb', inclusion, exclusion)).toBe(\n\t\t\t\ttrue,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('aaa/bb/file.md', inclusion, exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('aaa/bb/cc', inclusion, exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('aaa/bb/cc/child.md', inclusion, exclusion),\n\t\t\t).toBe(false)\n\t\t})\n\n\t\tit('包含路径使用 /** 时递归包含，并继续优先于排除规则', () => {\n\t\t\tconst inclusion = makeRules(['aaa/bb/**'])\n\t\t\tconst exclusion = makeRules(['aaa/bb/cc/**'])\n\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('aaa/bb/file.md', inclusion, exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('aaa/bb/deep/note.md', inclusion, exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('aaa/bb/cc/file.md', inclusion, exclusion),\n\t\t\t).toBe(true)\n\t\t})\n\n\t\tit('模式中间包含 /：相对路径匹配', () => {\n\t\t\tconst exclusion = makeRules(['doc/*.txt'])\n\n\t\t\texpect(needIncludeFromGlobRules('doc/a.txt', [], exclusion)).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('doc/server/arch.txt', [], exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('docs/a.txt', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('doc/a.txt/', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('doc/a.tx', [], exclusion)).toBe(true)\n\t\t})\n\t})\n\n\tdescribe('双星号 ** 深度匹配', () => {\n\t\tit('**/pattern：任意深度匹配文件名', () => {\n\t\t\tconst exclusion = makeRules(['**/__pycache__'])\n\n\t\t\texpect(needIncludeFromGlobRules('__pycache__', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/__pycache__', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/utils/__pycache__', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/utils/__pycache__/', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/utils/__pycache__x', [], exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/__pycache__/file.py', [], exclusion),\n\t\t\t).toBe(false)\n\t\t})\n\n\t\tit('pattern/**：匹配该目录下所有内容', () => {\n\t\t\tconst exclusion = makeRules(['assets/**'])\n\n\t\t\texpect(needIncludeFromGlobRules('assets/logo.png', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('assets/icons/icon.svg', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('assets', [], exclusion)).toBe(true)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/assets/logo.png', [], exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('assets/.keep', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\n\t\tit('pattern/**/pattern：跨层级匹配', () => {\n\t\t\tconst exclusion = makeRules(['foo/**/bar'])\n\n\t\t\texpect(needIncludeFromGlobRules('foo/bar', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('foo/x/bar', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('foo/x/y/bar', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('x/foo/bar', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('foo/bar/baz', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('foo/.hidden/bar', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\t})\n\n\tdescribe('综合示例规则', () => {\n\t\tconst exclusion = makeRules([\n\t\t\t'*.a',\n\t\t\t'bin/',\n\t\t\t'/vendor/',\n\t\t\t'logs/*.txt',\n\t\t\t'core/**/*.out',\n\t\t\t'test[0-9].js',\n\t\t])\n\n\t\tit('*.a：匹配所有目录下的 .a 文件', () => {\n\t\t\texpect(needIncludeFromGlobRules('lib.a', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/lib.a', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/lib.so', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('src/lib.a/', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/lib.a.bak', [], exclusion)).toBe(\n\t\t\t\ttrue,\n\t\t\t)\n\t\t})\n\n\t\tit('bin/：忽略任意位置的 bin 目录', () => {\n\t\t\texpect(needIncludeFromGlobRules('bin/tool', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/bin/tool', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('binfile', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('src/binfile/tool', [], exclusion)).toBe(\n\t\t\t\ttrue,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('bin/../bin/tool', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t})\n\n\t\tit('/vendor/：仅忽略根目录的 vendor', () => {\n\t\t\texpect(needIncludeFromGlobRules('vendor/lib.js', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('src/vendor/lib.js', [], exclusion)).toBe(\n\t\t\t\ttrue,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('vendor', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('vendor/', [], exclusion)).toBe(false)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('src/../vendor/lib.js', [], exclusion),\n\t\t\t).toBe(false)\n\t\t})\n\n\t\tit('logs/*.txt：仅匹配 logs 下一级 .txt', () => {\n\t\t\texpect(needIncludeFromGlobRules('logs/app.txt', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('logs/history/2023.txt', [], exclusion),\n\t\t\t).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('logs/app.txt/', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('logs/app.tx', [], exclusion)).toBe(true)\n\t\t})\n\n\t\tit('core/**/*.out：匹配 core 下任意深度 .out', () => {\n\t\t\texpect(needIncludeFromGlobRules('core/main.out', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(\n\t\t\t\tneedIncludeFromGlobRules('core/a/b/c/test.out', [], exclusion),\n\t\t\t).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('src/core/test.out', [], exclusion)).toBe(\n\t\t\t\ttrue,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('core/test.out/', [], exclusion)).toBe(\n\t\t\t\tfalse,\n\t\t\t)\n\t\t\texpect(needIncludeFromGlobRules('core/test.output', [], exclusion)).toBe(\n\t\t\t\ttrue,\n\t\t\t)\n\t\t})\n\n\t\tit('test[0-9].js：匹配 test0.js ~ test9.js', () => {\n\t\t\texpect(needIncludeFromGlobRules('test0.js', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('test9.js', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('test10.js', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('testA.js', [], exclusion)).toBe(true)\n\t\t\texpect(needIncludeFromGlobRules('test0.js/', [], exclusion)).toBe(false)\n\t\t\texpect(needIncludeFromGlobRules('test5.js.map', [], exclusion)).toBe(true)\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "src/utils/glob-match.ts",
    "content": "import GlobToRegExp from 'glob-to-regexp'\nimport { cloneDeep } from 'lodash-es'\nimport path from 'path-browserify'\n\nexport interface GlobMatchUserOptions {\n\tcaseSensitive: boolean\n}\n\nexport interface GlobMatchOptions {\n\texpr: string\n\toptions: GlobMatchUserOptions\n}\n\nconst DEFAULT_USER_OPTIONS: GlobMatchUserOptions = {\n\tcaseSensitive: false,\n}\n\nexport function isVoidGlobMatchOptions(options: GlobMatchOptions): boolean {\n\treturn options.expr.trim() === ''\n}\n\nfunction generateFlags(options: GlobMatchUserOptions) {\n\tlet flags = ''\n\tif (!options.caseSensitive) {\n\t\tflags += 'i'\n\t}\n\treturn flags\n}\n\nfunction normalizePath(rawPath: string) {\n\tconst normalized = path.normalize(rawPath)\n\tconst trimmed = normalized.replace(/^\\.+\\//, '').replace(/^\\/+/, '')\n\tconst isDirPath = trimmed.endsWith('/')\n\tconst withoutTrailing = isDirPath ? trimmed.slice(0, -1) : trimmed\n\tconst segments = withoutTrailing\n\t\t? withoutTrailing.split('/').filter(Boolean)\n\t\t: []\n\treturn {\n\t\tnormalized: segments.join('/'),\n\t\tsegments,\n\t\tisDirPath,\n\t}\n}\n\nfunction buildRegExp(expr: string, options: GlobMatchUserOptions) {\n\treturn GlobToRegExp(expr, {\n\t\tflags: generateFlags(options),\n\t\textended: true,\n\t\tglobstar: true,\n\t})\n}\n\nexport default class GlobMatch {\n\tre: RegExp\n\tprivate readonly isRooted: boolean\n\tprivate readonly isDirOnly: boolean\n\tprivate readonly hasSlash: boolean\n\tprivate readonly patternBody: string\n\tprivate readonly pathRegex?: RegExp\n\tprivate readonly segmentRegex?: RegExp\n\n\tconstructor(\n\t\tpublic expr: string,\n\t\tpublic options: GlobMatchUserOptions,\n\t) {\n\t\tconst trimmed = expr.trim()\n\t\tthis.isRooted = trimmed.startsWith('/')\n\t\tthis.isDirOnly = trimmed.endsWith('/')\n\t\tthis.patternBody = trimmed.slice(\n\t\t\tthis.isRooted ? 1 : 0,\n\t\t\tthis.isDirOnly ? -1 : undefined,\n\t\t)\n\t\tthis.hasSlash = this.patternBody.includes('/')\n\t\tif (this.patternBody !== '') {\n\t\t\tif (this.isRooted || this.hasSlash) {\n\t\t\t\tthis.pathRegex = buildRegExp(this.patternBody, options)\n\t\t\t\tthis.re = this.pathRegex\n\t\t\t} else {\n\t\t\t\tthis.segmentRegex = buildRegExp(this.patternBody, options)\n\t\t\t\tthis.re = this.segmentRegex\n\t\t\t}\n\t\t} else {\n\t\t\tthis.re = /^$/\n\t\t}\n\t}\n\n\tprivate matchDirectoryBySegments(segments: string[], isDirPath: boolean) {\n\t\tfor (let i = 0; i < segments.length; i += 1) {\n\t\t\tconst isSegmentDir = i < segments.length - 1 || isDirPath\n\t\t\tif (!isSegmentDir) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (this.segmentRegex?.test(segments[i])) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\tprivate matchDirectoryByPrefix(segments: string[], isDirPath: boolean) {\n\t\tfor (let i = 1; i <= segments.length; i += 1) {\n\t\t\tconst isSegmentDir = i < segments.length || isDirPath\n\t\t\tif (!isSegmentDir) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst prefix = segments.slice(0, i).join('/')\n\t\t\tif (this.pathRegex?.test(prefix)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\ttest(path: string) {\n\t\tif (this.patternBody === '') {\n\t\t\treturn false\n\t\t}\n\t\tconst { normalized, segments, isDirPath } = normalizePath(path)\n\t\tif (this.isDirOnly) {\n\t\t\tif (this.isRooted || this.hasSlash) {\n\t\t\t\treturn this.matchDirectoryByPrefix(segments, isDirPath)\n\t\t\t}\n\t\t\treturn this.matchDirectoryBySegments(segments, isDirPath)\n\t\t}\n\t\tif (this.isRooted || this.hasSlash) {\n\t\t\treturn this.pathRegex?.test(normalized) ?? false\n\t\t}\n\t\treturn segments.some((segment) => this.segmentRegex?.test(segment))\n\t}\n}\n\nexport function getUserOptions(\n\topt: GlobMatchOptions | string,\n): GlobMatchUserOptions {\n\tif (typeof opt === 'string') {\n\t\treturn cloneDeep(DEFAULT_USER_OPTIONS)\n\t}\n\treturn opt.options ?? cloneDeep(DEFAULT_USER_OPTIONS)\n}\n\nexport function needIncludeFromGlobRules(\n\tpath: string,\n\tinclusion: GlobMatch[],\n\texclusion: GlobMatch[],\n) {\n\tfor (const rule of inclusion) {\n\t\tif (rule.test(path)) {\n\t\t\treturn true\n\t\t}\n\t}\n\tfor (const rule of exclusion) {\n\t\tif (rule.test(path)) {\n\t\t\treturn false\n\t\t}\n\t}\n\tconst { segments } = normalizePath(path)\n\tconst parentCount = Math.max(segments.length - 1, 0)\n\tfor (let i = 1; i <= parentCount; i += 1) {\n\t\tconst parentPath = `${segments.slice(0, i).join('/')}/`\n\t\tfor (const rule of exclusion) {\n\t\t\tif (rule.test(parentPath)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "src/utils/has-invalid-char.ts",
    "content": "const INVALID_CHARS = ':*?\"<>|'\nconst INVALID_CHARS_LIST = INVALID_CHARS.split('')\n\nexport function hasInvalidChar(str: string) {\n\treturn INVALID_CHARS_LIST.some((c) => str.includes(c))\n}\n\nexport function getInvalidChars(str: string): string[] {\n\treturn INVALID_CHARS_LIST.filter((c) => str.includes(c))\n}\n"
  },
  {
    "path": "src/utils/is-503-error.ts",
    "content": "const ERROR_MESSAGE = 'Invalid response: 503 Service Unavailable'\n\nexport function is503Error(err: Error | string) {\n\tif (err instanceof Error) {\n\t\treturn err.message === ERROR_MESSAGE\n\t}\n\treturn err === ERROR_MESSAGE\n}\n"
  },
  {
    "path": "src/utils/is-numeric.ts",
    "content": "import { isFinite } from 'lodash-es'\n\nexport function isNumeric(val: any) {\n\treturn !isNaN(parseFloat(val)) && isFinite(Number(val))\n}\n"
  },
  {
    "path": "src/utils/is-same-time.ts",
    "content": "export function isSameTime(\n\ttimestamp1: Date | number | undefined,\n\ttimestamp2: Date | number | undefined,\n): boolean {\n\t// If either timestamp is undefined, they are not the same\n\tif (timestamp1 === undefined || timestamp2 === undefined) {\n\t\treturn false\n\t}\n\n\tconst time1 =\n\t\ttypeof timestamp1 === 'number' ? timestamp1 : timestamp1.getTime()\n\tconst time2 =\n\t\ttypeof timestamp2 === 'number' ? timestamp2 : timestamp2.getTime()\n\n\treturn time1 === time2\n}\n"
  },
  {
    "path": "src/utils/is-sub.ts",
    "content": "import { normalize } from 'path-browserify'\n\nexport function isSub(parent: string, sub: string) {\n\tparent = normalize(parent)\n\tsub = normalize(sub)\n\tif (!parent.endsWith('/')) {\n\t\tparent += '/'\n\t}\n\tif (!sub.endsWith('/')) {\n\t\tsub += '/'\n\t}\n\tif (sub === parent) {\n\t\treturn false\n\t}\n\treturn sub.startsWith(parent)\n}\n"
  },
  {
    "path": "src/utils/logger.ts",
    "content": "import { createConsola, LogLevels } from 'consola'\n\nconst logger = createConsola({\n\tlevel: LogLevels.verbose,\n\tformatOptions: {\n\t\tdate: true,\n\t\tcolors: false,\n\t},\n})\n\nexport default logger\n"
  },
  {
    "path": "src/utils/logs-stringify.ts",
    "content": "import deepStringify from './deep-stringify'\n\nexport default function (logs: any) {\n\tif (typeof logs === 'string') {\n\t\treturn logs\n\t}\n\ttry {\n\t\treturn JSON.stringify(logs)\n\t} catch {\n\t\ttry {\n\t\t\treturn deepStringify(logs)\n\t\t} catch {}\n\t}\n}\n"
  },
  {
    "path": "src/utils/merge-dig-in.ts",
    "content": "// @ts-nocheck\n\nimport { diff3Merge, diffComm } from 'node-diff3'\n\n/**\n * https://github.com/bhousel/node-diff3/blob/39c04c024620d3971010abf4ba3e2cbdba2f3f81/index.mjs#L464\n */\nexport function mergeDigIn(\n\ta: string[] | string,\n\to: string[] | string,\n\tb: string[] | string,\n\toptions: {\n\t\texcludeFalseConflicts?: boolean\n\t\tstringSeparator?: string | RegExp\n\t\tuseGitStyle?: boolean\n\t},\n) {\n\tconst defaults = {\n\t\texcludeFalseConflicts: true,\n\t\tstringSeparator: /\\s+/,\n\t\tlabel: {},\n\t\tuseGitStyle: false,\n\t}\n\toptions = Object.assign(defaults, options)\n\n\tconst aSection = options.useGitStyle\n\t\t? '<<<<<<<'\n\t\t: `<mark class=\"conflict ours\">`\n\tconst xSection = options.useGitStyle\n\t\t? '======='\n\t\t: '</mark><mark class=\"conflict theirs\">'\n\tconst bSection = options.useGitStyle ? '>>>>>>>' : `</mark>`\n\n\tconst regions = diff3Merge(a, o, b, options)\n\tlet conflict = false\n\tlet result: string[] = []\n\n\tregions.forEach((region) => {\n\t\tif (region.ok) {\n\t\t\tresult = result.concat(region.ok)\n\t\t} else {\n\t\t\tconst c = diffComm(region.conflict!.a, region.conflict!.b)\n\t\t\tfor (let j = 0; j < c.length; j++) {\n\t\t\t\tlet inner = c[j]\n\t\t\t\tif (inner.common) {\n\t\t\t\t\tresult = result.concat(inner.common)\n\t\t\t\t} else {\n\t\t\t\t\tconflict = true\n\t\t\t\t\tresult = result.concat(\n\t\t\t\t\t\t[aSection],\n\t\t\t\t\t\tinner.buffer1,\n\t\t\t\t\t\t[xSection],\n\t\t\t\t\t\tinner.buffer2,\n\t\t\t\t\t\t[bSection],\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\treturn {\n\t\tconflict: conflict,\n\t\tresult: result,\n\t}\n}\n"
  },
  {
    "path": "src/utils/mime/is_markdown_path.ts",
    "content": "export function isMarkdownPath(path: string) {\n\tpath = path.trim().toLowerCase()\n\treturn path.endsWith('.md') || path.endsWith('.markdown')\n}\n"
  },
  {
    "path": "src/utils/mkdirs-vault.ts",
    "content": "import { Vault } from 'obsidian'\nimport { dirname, normalize } from 'path-browserify'\n\nexport async function mkdirsVault(vault: Vault, path: string) {\n\tconst stack: string[] = []\n\tlet currentPath = normalize(path)\n\tif (currentPath === '/' || currentPath === '.') {\n\t\treturn\n\t}\n\tif (await vault.adapter.exists(currentPath)) {\n\t\treturn\n\t}\n\twhile (\n\t\tcurrentPath !== '' &&\n\t\tcurrentPath !== '/' &&\n\t\tcurrentPath !== '.' &&\n\t\t!(await vault.adapter.exists(currentPath))\n\t) {\n\t\tstack.push(currentPath)\n\t\tcurrentPath = dirname(currentPath)\n\t}\n\twhile (stack.length) {\n\t\tconst pop = stack.pop()\n\t\tif (!pop) {\n\t\t\tcontinue\n\t\t}\n\t\tif (await vault.adapter.exists(pop)) {\n\t\t\tcontinue\n\t\t}\n\t\tawait vault.adapter.mkdir(pop)\n\t}\n}\n"
  },
  {
    "path": "src/utils/mkdirs-webdav.ts",
    "content": "import { WebDAVClient } from 'webdav'\n\nexport function mkdirsWebDAV(client: WebDAVClient, path: string) {\n\treturn client.createDirectory(path, {\n\t\trecursive: true,\n\t})\n}\n"
  },
  {
    "path": "src/utils/ns-api.ts",
    "content": "import { NS_NSDAV_ENDPOINT } from '~/consts'\n\nexport function NSAPI(name: 'delta' | 'latestDeltaCursor') {\n\treturn `${NS_NSDAV_ENDPOINT}/${name}`\n}\n"
  },
  {
    "path": "src/utils/rate-limited-client.ts",
    "content": "import { WebDAVClient } from 'webdav'\nimport { apiLimiter } from './api-limiter'\n\nexport function createRateLimitedWebDAVClient(\n\tclient: WebDAVClient,\n): WebDAVClient {\n\treturn new Proxy(client, {\n\t\tget(target, prop, receiver) {\n\t\t\tconst value = Reflect.get(target, prop, receiver)\n\t\t\tif (typeof value === 'function') {\n\t\t\t\treturn (...args: any[]) => {\n\t\t\t\t\treturn apiLimiter.schedule(() => value.apply(target, args))\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value\n\t\t},\n\t})\n}\n"
  },
  {
    "path": "src/utils/remote-path-to-absolute.ts",
    "content": "import { isAbsolute, join } from 'path-browserify'\n\nexport default function remotePathToAbsolute(\n\tremoteBaseDir: string,\n\tremotePath: string,\n): string {\n\treturn isAbsolute(remotePath) ? remotePath : join(remoteBaseDir, remotePath)\n}\n"
  },
  {
    "path": "src/utils/remote-path-to-local-path.ts",
    "content": "import { isAbsolute, normalize } from 'path-browserify'\n\nexport function remotePathToLocalPath(\n\tremoteBaseDir: string,\n\tremotePath: string,\n) {\n\tremoteBaseDir = normalize(remoteBaseDir)\n\tremotePath = normalize(remotePath)\n\tremotePath =\n\t\tisAbsolute(remotePath) && remotePath.startsWith(remoteBaseDir)\n\t\t\t? remotePath.replace(remoteBaseDir, '')\n\t\t\t: remotePath\n\treturn normalize(remotePath)\n}\n"
  },
  {
    "path": "src/utils/request-url.ts",
    "content": "import {\n\tPlatform,\n\trequestUrl as req,\n\tRequestUrlParam,\n\tRequestUrlResponse,\n} from 'obsidian'\nimport { PLUGIN_VERSION } from '~/consts'\nimport logger from './logger'\n\nconst getOS = () => {\n\tif (Platform.isWin) return 'Windows'\n\tif (Platform.isMacOS) return 'macOS'\n\tif (Platform.isLinux) return 'Linux'\n\tif (Platform.isAndroidApp) return 'Android'\n\tif (Platform.isIosApp) return 'iOS'\n\treturn 'Unknown'\n}\n\nconst getDevice = () => {\n\tif (Platform.isTablet) return 'Tablet'\n\tif (Platform.isPhone) return 'Phone'\n\tif (Platform.isDesktopApp) return 'Desktop'\n\tif (Platform.isMobileApp) return 'Mobile'\n\treturn 'Unknown'\n}\n\nconst USER_AGENT = `Obsidian (${getOS()}; ${getDevice()}; ObsidianNutstoreSync/${PLUGIN_VERSION})`\n\nclass RequestUrlError extends Error {\n\tconstructor(public res: RequestUrlResponse) {\n\t\tsuper(`${res.status}: ${res.text}`)\n\t}\n}\n\nexport default async function requestUrl(p: RequestUrlParam | string) {\n\tconst params: RequestUrlParam =\n\t\ttypeof p === 'string'\n\t\t\t? {\n\t\t\t\t\turl: p,\n\t\t\t\t\tthrow: false,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t...p,\n\t\t\t\t\tthrow: false,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t...(p.headers || {}),\n\t\t\t\t\t},\n\t\t\t\t}\n\n\tconst res = await req(params)\n\n\tif (res.status >= 400) {\n\t\tlogger.error(res)\n\t\tif (typeof p === 'string' || p.throw !== false) {\n\t\t\tthrow new RequestUrlError(res)\n\t\t}\n\t}\n\n\treturn res\n}\n"
  },
  {
    "path": "src/utils/sha256.ts",
    "content": "import { fromUint8Array } from 'js-base64'\n\nexport async function sha256(data: ArrayBuffer) {\n\treturn crypto.subtle.digest('SHA-256', data)\n}\n\nexport async function sha256Hex(data: ArrayBuffer) {\n\tconst hashBuffer = await sha256(data)\n\tconst hashArray = Array.from(new Uint8Array(hashBuffer))\n\tconst hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n\treturn hashHex\n}\n\nexport async function sha256Base64(data: ArrayBuffer) {\n\tconst hashBuffer = await sha256(data)\n\tconst hashBase64 = fromUint8Array(new Uint8Array(hashBuffer), false)\n\treturn hashBase64\n}\n"
  },
  {
    "path": "src/utils/sleep.ts",
    "content": "export default async function sleep(ms: number) {\n\tawait new Promise((resolve) => window.setTimeout(resolve, ms))\n}\n"
  },
  {
    "path": "src/utils/stat-vault-item.ts",
    "content": "import { normalizePath, Vault } from 'obsidian'\nimport { basename } from 'path-browserify'\nimport { StatModel } from '~/model/stat.model'\n\nexport async function statVaultItem(\n\tvault: Vault,\n\tpath: string,\n): Promise<StatModel | undefined> {\n\tpath = normalizePath(path)\n\tconst stat = await vault.adapter.stat(path)\n\tif (!stat) {\n\t\treturn undefined\n\t}\n\tif (stat.type === 'folder') {\n\t\treturn {\n\t\t\tpath,\n\t\t\tbasename: basename(path),\n\t\t\tisDir: true,\n\t\t\tisDeleted: false,\n\t\t\tmtime: stat.mtime,\n\t\t}\n\t}\n\tif (stat.type === 'file') {\n\t\treturn {\n\t\t\tpath,\n\t\t\tbasename: basename(path),\n\t\t\tisDir: false,\n\t\t\tisDeleted: false,\n\t\t\tmtime: stat.mtime,\n\t\t\tsize: stat.size,\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/utils/stat-webdav-item.ts",
    "content": "import { isAbsolute } from 'path-browserify'\nimport { FileStat, WebDAVClient } from 'webdav'\nimport { fileStatToStatModel } from './file-stat-to-stat-model'\n\nexport async function statWebDAVItem(client: WebDAVClient, path: string) {\n\tif (!isAbsolute(path)) {\n\t\tthrow new Error('stat WebDAV item, path must be absolute: ' + path)\n\t}\n\tconst stat = (await client.stat(path, {\n\t\tdetails: false,\n\t})) as FileStat\n\treturn fileStatToStatModel(stat)\n}\n"
  },
  {
    "path": "src/utils/std-remote-path.ts",
    "content": "import { normalize } from 'path-browserify'\n\nexport function stdRemotePath(remotePath: string): `/${string}/` {\n\tif (!remotePath.startsWith('/')) {\n\t\tremotePath = `/${remotePath}`\n\t}\n\tif (!remotePath.endsWith('/')) {\n\t\tremotePath = `${remotePath}/`\n\t}\n\treturn normalize(remotePath) as `/${string}/`\n}\n"
  },
  {
    "path": "src/utils/traverse-local-vault.ts",
    "content": "import { normalizePath, Vault } from 'obsidian'\nimport { StatModel } from '~/model/stat.model'\nimport { getConfigDirSystemTraversalRules } from './config-dir-rules'\nimport GlobMatch from './glob-match'\nimport { statVaultItem } from './stat-vault-item'\n\nexport async function traverseLocalVault(vault: Vault, from: string) {\n\tconst res: StatModel[] = []\n\tconst q = [from]\n\tconst ignores = getConfigDirSystemTraversalRules(vault.configDir).map(\n\t\t(rule) => new GlobMatch(rule.expr, rule.options),\n\t)\n\tfunction folderFilter(path: string) {\n\t\tpath = normalizePath(path)\n\t\tif (ignores.some((rule) => rule.test(path))) {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}\n\n\twhile (q.length > 0) {\n\t\tconst current = q.shift()\n\t\tif (current === undefined) {\n\t\t\tcontinue\n\t\t}\n\t\tconst folderPath = normalizePath(current)\n\t\tconst folderStat = await vault.adapter.stat(folderPath)\n\t\tif (!folderStat || folderStat.type !== 'folder') {\n\t\t\tcontinue\n\t\t}\n\t\tconst { files, folders } = await vault.adapter.list(folderPath)\n\t\tconst normalizedFiles = files.map((path) => normalizePath(path))\n\t\tconst normalizedFolders = folders\n\t\t\t.map((path) => normalizePath(path))\n\t\t\t.filter(folderFilter)\n\t\tq.push(...normalizedFolders)\n\t\tconst contents = (\n\t\t\tawait Promise.all(\n\t\t\t\t[...normalizedFiles, ...normalizedFolders].map((path) =>\n\t\t\t\t\tstatVaultItem(vault, path),\n\t\t\t\t),\n\t\t\t)\n\t\t).filter((item): item is StatModel => item !== undefined)\n\t\tres.push(...contents)\n\t}\n\treturn res\n}\n"
  },
  {
    "path": "src/utils/traverse-webdav.ts",
    "content": "import { Mutex } from 'async-mutex'\nimport { dirname, normalize } from 'path-browserify'\nimport { DeltaEntry, getDelta } from '~/api/delta'\nimport { getLatestDeltaCursor } from '~/api/latestDeltaCursor'\nimport { getDirectoryContents } from '~/api/webdav'\nimport { StatModel } from '~/model/stat.model'\nimport { traverseWebDAVKV } from '~/storage'\nimport { apiLimiter } from './api-limiter'\nimport { fileStatToStatModel } from './file-stat-to-stat-model'\nimport { getRootFolderName } from './get-root-folder-name'\nimport { is503Error } from './is-503-error'\nimport logger from './logger'\nimport sleep from './sleep'\nimport { stdRemotePath } from './std-remote-path'\nimport { MaybePromise } from './types'\n\nconst getContents = apiLimiter.wrap(getDirectoryContents)\n\n// Global mutex map: one lock per kvKey\nconst traversalLocks = new Map<string, Mutex>()\n\nfunction getTraversalLock(kvKey: string): Mutex {\n\tif (!traversalLocks.has(kvKey)) {\n\t\ttraversalLocks.set(kvKey, new Mutex())\n\t}\n\treturn traversalLocks.get(kvKey)!\n}\n\nasync function executeWithRetry<T>(func: () => MaybePromise<T>): Promise<T> {\n\twhile (true) {\n\t\ttry {\n\t\t\treturn await func()\n\t\t} catch (err) {\n\t\t\tif (is503Error(err)) {\n\t\t\t\tawait sleep(30_000)\n\t\t\t} else {\n\t\t\t\tthrow err\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class ResumableWebDAVTraversal {\n\tprivate token: string\n\tprivate remoteBaseDir: string\n\tprivate kvKey: string\n\tprivate saveInterval: number\n\n\tprivate rootCursor: string = ''\n\tprivate queue: string[] = []\n\tprivate nodes: Record<string, StatModel[]> = {}\n\tprivate processedCount: number = 0\n\n\t/**\n\t * Normalize directory path for use as nodes key\n\t */\n\tprivate normalizeDirPath(path: string): string {\n\t\treturn stdRemotePath(path)\n\t}\n\n\t/**\n\t * Normalize file/directory path for comparison\n\t * Uses normalize to handle //, ./, etc, then removes trailing slash for consistent comparison\n\t */\n\tprivate normalizeForComparison(path: string): string {\n\t\tlet normalized = normalize(path)\n\t\tif (normalized.endsWith('/') && normalized.length > 1) {\n\t\t\tnormalized = normalized.slice(0, -1)\n\t\t}\n\t\treturn normalized\n\t}\n\n\tconstructor(options: {\n\t\ttoken: string\n\t\tremoteBaseDir: string\n\t\tkvKey: string\n\t\tsaveInterval?: number\n\t}) {\n\t\tthis.token = options.token\n\t\tthis.remoteBaseDir = options.remoteBaseDir\n\t\tthis.kvKey = options.kvKey\n\t\tthis.saveInterval = Math.max(options.saveInterval || 1, 1)\n\t}\n\n\tget lock() {\n\t\treturn getTraversalLock(this.kvKey)\n\t}\n\n\tget cursor(): string {\n\t\treturn this.rootCursor\n\t}\n\n\tasync traverse(): Promise<StatModel[]> {\n\t\treturn await this.lock.runExclusive(async () => {\n\t\t\tawait this.loadState()\n\n\t\t\t// Use incremental scan if already traversed once\n\t\t\tconst isIncrementalScan =\n\t\t\t\tthis.queue.length === 0 && Object.keys(this.nodes).length > 0\n\n\t\t\tif (isIncrementalScan) {\n\t\t\t\tawait this.incrementalScan()\n\t\t\t} else {\n\t\t\t\t// Initial scan or resume: BFS traversal\n\t\t\t\tif (this.queue.length === 0) {\n\t\t\t\t\tconst { response } = await executeWithRetry(() =>\n\t\t\t\t\t\tgetLatestDeltaCursor({\n\t\t\t\t\t\t\ttoken: this.token,\n\t\t\t\t\t\t\tfolderName: getRootFolderName(this.remoteBaseDir),\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\tthis.rootCursor = response.cursor\n\t\t\t\t\tthis.queue = [this.remoteBaseDir]\n\t\t\t\t}\n\n\t\t\t\tawait this.bfsTraverse()\n\t\t\t}\n\n\t\t\tawait this.saveState()\n\n\t\t\treturn this.getAllFromCache()\n\t\t})\n\t}\n\n\t/**\n\t * BFS traversal (initial scan or resume)\n\t */\n\tprivate async bfsTraverse(): Promise<StatModel[]> {\n\t\t// Outer loop to handle reset scenarios without recursion\n\t\twhile (true) {\n\t\t\tconst traverseStartCursor = this.rootCursor\n\t\t\tconst results: StatModel[] = []\n\n\t\t\twhile (this.queue.length > 0) {\n\t\t\t\tconst currentPath = this.queue[0]\n\t\t\t\tconst normalizedPath = this.normalizeDirPath(currentPath)\n\t\t\t\tconst resultItems: StatModel[] = []\n\n\t\t\t\ttry {\n\t\t\t\t\tconst cachedItems = this.nodes[normalizedPath]\n\n\t\t\t\t\tif (cachedItems) {\n\t\t\t\t\t\tresultItems.push(...cachedItems)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst contents = await executeWithRetry(() =>\n\t\t\t\t\t\t\tgetContents(this.token, currentPath),\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tfor (const item of contents) {\n\t\t\t\t\t\t\tconst stat = fileStatToStatModel(item)\n\t\t\t\t\t\t\tresultItems.push(stat)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tresults.push(...resultItems)\n\n\t\t\t\t\tfor (const item of resultItems) {\n\t\t\t\t\t\tif (item.isDir) {\n\t\t\t\t\t\t\tthis.queue.push(item.path)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.nodes[normalizedPath] = resultItems\n\n\t\t\t\t\tthis.queue.shift()\n\t\t\t\t\tthis.processedCount++\n\n\t\t\t\t\tif (this.processedCount % this.saveInterval === 0) {\n\t\t\t\t\t\tawait this.saveState()\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger.error(`Error processing ${currentPath}`, err)\n\t\t\t\t\tawait this.saveState()\n\t\t\t\t\tthrow err\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { response: endResponse } = await executeWithRetry(() =>\n\t\t\t\tgetLatestDeltaCursor({\n\t\t\t\t\ttoken: this.token,\n\t\t\t\t\tfolderName: getRootFolderName(this.remoteBaseDir),\n\t\t\t\t}),\n\t\t\t)\n\t\t\tconst traverseEndCursor = endResponse.cursor\n\n\t\t\tif (traverseStartCursor && traverseStartCursor !== traverseEndCursor) {\n\t\t\t\tlogger.info('Changes detected during traversal, applying delta')\n\t\t\t\tconst newCursor =\n\t\t\t\t\tawait this.applyDeltaDuringTraversal(traverseStartCursor)\n\t\t\t\tthis.rootCursor = newCursor\n\n\t\t\t\t// If reset occurred, queue is non-empty, need to re-traverse\n\t\t\t\tif (this.queue.length > 0) {\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t'Reset detected during delta apply, performing full re-scan',\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\treturn this.getAllFromCache()\n\t\t\t}\n\n\t\t\tthis.rootCursor = traverseEndCursor\n\n\t\t\treturn results\n\t\t}\n\t}\n\n\t/**\n\t * Fetch all delta changes by paginating through hasMore\n\t * Yields batches of delta entries as they are fetched\n\t */\n\tprivate async *fetchAllDelta(startCursor: string): AsyncGenerator<{\n\t\tentries: DeltaEntry[]\n\t\tcursor: string\n\t\treset: boolean\n\t\thasMore: boolean\n\t}> {\n\t\tlet currentCursor = startCursor\n\n\t\twhile (true) {\n\t\t\tconst { response } = await executeWithRetry(() =>\n\t\t\t\tgetDelta({\n\t\t\t\t\ttoken: this.token,\n\t\t\t\t\tfolderName: getRootFolderName(this.remoteBaseDir),\n\t\t\t\t\tcursor: currentCursor,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (response.reset) {\n\t\t\t\tyield {\n\t\t\t\t\tentries: [],\n\t\t\t\t\tcursor: response.cursor,\n\t\t\t\t\treset: true,\n\t\t\t\t\thasMore: false,\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tcurrentCursor = response.cursor\n\n\t\t\tyield {\n\t\t\t\tentries: response.delta.entry,\n\t\t\t\tcursor: currentCursor,\n\t\t\t\treset: false,\n\t\t\t\thasMore: response.hasMore,\n\t\t\t}\n\n\t\t\tif (!response.hasMore) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply changes during traversal without re-scanning\n\t * Returns the new cursor. If reset occurred, clears cache and sets queue for re-scan.\n\t */\n\tprivate async applyDeltaDuringTraversal(\n\t\tstartCursor: string,\n\t): Promise<string> {\n\t\tlet finalCursor = startCursor\n\t\tlet processedEntries = 0\n\n\t\tfor await (const { entries, cursor, reset } of this.fetchAllDelta(\n\t\t\tstartCursor,\n\t\t)) {\n\t\t\tif (reset) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'Delta reset during traversal, clearing cache and will trigger full re-scan',\n\t\t\t\t)\n\t\t\t\tthis.nodes = {}\n\t\t\t\tthis.queue = [this.remoteBaseDir]\n\t\t\t\tthis.processedCount = 0\n\t\t\t\tconst { response: cursorResponse } = await executeWithRetry(() =>\n\t\t\t\t\tgetLatestDeltaCursor({\n\t\t\t\t\t\ttoken: this.token,\n\t\t\t\t\t\tfolderName: getRootFolderName(this.remoteBaseDir),\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\treturn cursorResponse.cursor\n\t\t\t}\n\n\t\t\tif (entries.length > 0) {\n\t\t\t\tthis.applyDeltaToNodes(entries)\n\t\t\t\tprocessedEntries += entries.length\n\n\t\t\t\t// Save state periodically based on number of processed entries\n\t\t\t\tif (processedEntries >= this.saveInterval) {\n\t\t\t\t\tawait this.saveState()\n\t\t\t\t\tprocessedEntries = 0\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfinalCursor = cursor\n\t\t}\n\n\t\tawait this.saveState()\n\n\t\treturn finalCursor\n\t}\n\n\t/**\n\t * Incremental scan using fetchAllDelta\n\t */\n\tprivate async incrementalScan(): Promise<StatModel[]> {\n\t\tlet hasAnyEntries = false\n\t\tlet processedEntries = 0\n\n\t\tfor await (const deltas of this.fetchAllDelta(this.rootCursor)) {\n\t\t\tconst { entries, cursor, reset } = deltas\n\n\t\t\tthis.rootCursor = cursor\n\n\t\t\tif (reset) {\n\t\t\t\tlogger.info('Delta reset, performing full scan')\n\t\t\t\tthis.queue = [this.remoteBaseDir]\n\t\t\t\tthis.nodes = {}\n\t\t\t\tthis.processedCount = 0\n\t\t\t\treturn await this.bfsTraverse()\n\t\t\t}\n\n\t\t\tif (entries.length > 0) {\n\t\t\t\thasAnyEntries = true\n\t\t\t\tthis.applyDeltaToNodes(entries)\n\t\t\t\tprocessedEntries += entries.length\n\n\t\t\t\t// Save state periodically based on number of processed entries\n\t\t\t\tif (processedEntries >= this.saveInterval) {\n\t\t\t\t\tawait this.saveState()\n\t\t\t\t\tprocessedEntries = 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tawait this.saveState()\n\n\t\tif (!hasAnyEntries) {\n\t\t\tlogger.info('No changes detected, returning from cache')\n\t\t}\n\n\t\treturn this.getAllFromCache()\n\t}\n\n\t/**\n\t * Apply delta changes to nodes\n\t */\n\tprivate applyDeltaToNodes(entries: Array<DeltaEntry>): void {\n\t\t// Prepare baseDir prefix for filtering\n\t\tconst baseDirPrefix = this.remoteBaseDir.endsWith('/')\n\t\t\t? this.remoteBaseDir\n\t\t\t: this.remoteBaseDir + '/'\n\n\t\t// Sort by path length to process parents first\n\t\tconst sortedEntries = [...entries].sort(\n\t\t\t(a, b) => a.path.length - b.path.length,\n\t\t)\n\n\t\tfor (const entry of sortedEntries) {\n\t\t\t// Filter out changes that don't belong to remoteBaseDir scope\n\t\t\tconst normalizedBaseDir = this.normalizeDirPath(this.remoteBaseDir)\n\t\t\tconst normalizedEntryPath = this.normalizeDirPath(entry.path)\n\t\t\tconst isSelf = normalizedEntryPath === normalizedBaseDir\n\t\t\tconst isChild = entry.path.startsWith(baseDirPrefix)\n\n\t\t\tif (!isSelf && !isChild) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (entry.isDir) {\n\t\t\t\tif (entry.isDeleted) {\n\t\t\t\t\tconst parentPath = dirname(entry.path)\n\t\t\t\t\tif (parentPath) {\n\t\t\t\t\t\tconst normalizedParentPath = this.normalizeDirPath(parentPath)\n\t\t\t\t\t\tconst parentItems = this.nodes[normalizedParentPath]\n\t\t\t\t\t\tif (parentItems) {\n\t\t\t\t\t\t\tconst normalizedEntryPathForCmp = this.normalizeForComparison(\n\t\t\t\t\t\t\t\tentry.path,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthis.nodes[normalizedParentPath] = parentItems.filter(\n\t\t\t\t\t\t\t\t(item) =>\n\t\t\t\t\t\t\t\t\tthis.normalizeForComparison(item.path) !==\n\t\t\t\t\t\t\t\t\tnormalizedEntryPathForCmp,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const nodePath in this.nodes) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnodePath === normalizedEntryPath ||\n\t\t\t\t\t\t\tnodePath.startsWith(normalizedEntryPath)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tdelete this.nodes[nodePath]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst parentPath = dirname(entry.path)\n\n\t\t\t\t\t// Only update parent's children list if parent already exists\n\t\t\t\t\t// (Avoid creating incomplete parent records)\n\t\t\t\t\tif (parentPath) {\n\t\t\t\t\t\tconst normalizedParentPath = this.normalizeDirPath(parentPath)\n\t\t\t\t\t\tconst parentItems = this.nodes[normalizedParentPath]\n\n\t\t\t\t\t\tif (parentItems) {\n\t\t\t\t\t\t\tconst dirStat: StatModel = {\n\t\t\t\t\t\t\t\tpath: entry.path,\n\t\t\t\t\t\t\t\tbasename: entry.path.split('/').pop() || '',\n\t\t\t\t\t\t\t\tisDir: true,\n\t\t\t\t\t\t\t\tisDeleted: false,\n\t\t\t\t\t\t\t\tmtime: entry.modified\n\t\t\t\t\t\t\t\t\t? new Date(entry.modified).getTime()\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst normalizedEntryPathForCmp = this.normalizeForComparison(\n\t\t\t\t\t\t\t\tentry.path,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthis.nodes[normalizedParentPath] = [\n\t\t\t\t\t\t\t\t...parentItems.filter(\n\t\t\t\t\t\t\t\t\t(item) =>\n\t\t\t\t\t\t\t\t\t\tthis.normalizeForComparison(item.path) !==\n\t\t\t\t\t\t\t\t\t\tnormalizedEntryPathForCmp,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tdirStat,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this.nodes[normalizedEntryPath]) {\n\t\t\t\t\t\tthis.nodes[normalizedEntryPath] = []\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// is file\n\t\t\t\tconst parentPath = dirname(entry.path)\n\n\t\t\t\t// Only update parent's children list if parent exists\n\t\t\t\tif (parentPath) {\n\t\t\t\t\tconst normalizedParentPath = this.normalizeDirPath(parentPath)\n\t\t\t\t\tif (entry.isDeleted) {\n\t\t\t\t\t\tconst parentItems = this.nodes[normalizedParentPath]\n\t\t\t\t\t\tif (parentItems) {\n\t\t\t\t\t\t\tconst normalizedEntryPathForCmp = this.normalizeForComparison(\n\t\t\t\t\t\t\t\tentry.path,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthis.nodes[normalizedParentPath] = parentItems.filter(\n\t\t\t\t\t\t\t\t(item) =>\n\t\t\t\t\t\t\t\t\tthis.normalizeForComparison(item.path) !==\n\t\t\t\t\t\t\t\t\tnormalizedEntryPathForCmp,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Only update if parent directory already exists in cache\n\t\t\t\t\t\t// (Avoid creating incomplete parent records that would hide other files)\n\t\t\t\t\t\tconst parentItems = this.nodes[normalizedParentPath]\n\n\t\t\t\t\t\tif (parentItems) {\n\t\t\t\t\t\t\tconst stat: StatModel = {\n\t\t\t\t\t\t\t\tpath: entry.path,\n\t\t\t\t\t\t\t\tbasename: entry.path.split('/').pop() || '',\n\t\t\t\t\t\t\t\tisDir: false,\n\t\t\t\t\t\t\t\tisDeleted: false,\n\t\t\t\t\t\t\t\tmtime: new Date(entry.modified).getTime(),\n\t\t\t\t\t\t\t\tsize: entry.size,\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst normalizedEntryPathForCmp = this.normalizeForComparison(\n\t\t\t\t\t\t\t\tentry.path,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthis.nodes[normalizedParentPath] = [\n\t\t\t\t\t\t\t\t...parentItems.filter(\n\t\t\t\t\t\t\t\t\t(item) =>\n\t\t\t\t\t\t\t\t\t\tthis.normalizeForComparison(item.path) !==\n\t\t\t\t\t\t\t\t\t\tnormalizedEntryPathForCmp,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tstat,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get all results from cache\n\t */\n\tprivate getAllFromCache(): StatModel[] {\n\t\tconst results: StatModel[] = []\n\t\tfor (const items of Object.values(this.nodes)) {\n\t\t\tresults.push(...items)\n\t\t}\n\t\treturn results\n\t}\n\n\t/**\n\t * Load state\n\t */\n\tprivate async loadState(): Promise<void> {\n\t\tconst cache = await traverseWebDAVKV.get(this.kvKey)\n\t\tif (cache) {\n\t\t\tthis.rootCursor = cache.rootCursor || ''\n\t\t\tthis.queue = cache.queue || []\n\t\t\tthis.nodes = cache.nodes || {}\n\t\t}\n\t}\n\n\t/**\n\t * Save current state\n\t */\n\tprivate async saveState(): Promise<void> {\n\t\tawait traverseWebDAVKV.set(this.kvKey, {\n\t\t\trootCursor: this.rootCursor,\n\t\t\tqueue: this.queue,\n\t\t\tnodes: this.nodes,\n\t\t})\n\t}\n\n\t/**\n\t * Clear cache (force re-traversal)\n\t */\n\tasync clearCache(): Promise<void> {\n\t\tawait traverseWebDAVKV.unset(this.kvKey)\n\t\tthis.rootCursor = ''\n\t\tthis.queue = []\n\t\tthis.nodes = {}\n\t\tthis.processedCount = 0\n\t}\n\n\t/**\n\t * Check if cache is valid\n\t */\n\tasync isCacheValid(): Promise<boolean> {\n\t\tconst cache = await traverseWebDAVKV.get(this.kvKey)\n\t\tif (!cache) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Cache is valid if queue is empty (traversal completed)\n\t\treturn cache.queue.length === 0\n\t}\n}\n"
  },
  {
    "path": "src/utils/types.ts",
    "content": "export type MaybePromise<T> = Promise<T> | T\n"
  },
  {
    "path": "src/utils/uint8array-to-arraybuffer.ts",
    "content": "export function uint8ArrayToArrayBuffer(data: Uint8Array<ArrayBuffer>) {\n\tif (data.buffer.byteLength === data.byteLength && data.byteOffset === 0) {\n\t\treturn data.buffer\n\t}\n\treturn data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)\n}\n"
  },
  {
    "path": "src/utils/vault-adapter-utils.test.ts",
    "content": "import { describe, expect, it, vi } from 'vitest'\nimport type { Vault } from 'obsidian'\nimport { mkdirsVault } from './mkdirs-vault'\nimport { statVaultItem } from './stat-vault-item'\nimport { traverseLocalVault } from './traverse-local-vault'\n\ntype AdapterMock = {\n\tstat: ReturnType<typeof vi.fn>\n\texists: ReturnType<typeof vi.fn>\n\tlist: ReturnType<typeof vi.fn>\n\tmkdir: ReturnType<typeof vi.fn>\n}\n\nfunction createVault(adapterOverrides: Partial<AdapterMock> = {}) {\n\tconst adapter: AdapterMock = {\n\t\tstat: vi.fn(),\n\t\texists: vi.fn(),\n\t\tlist: vi.fn(),\n\t\tmkdir: vi.fn(),\n\t\t...adapterOverrides,\n\t}\n\n\treturn {\n\t\tadapter,\n\t\tconfigDir: '.obsidian',\n\t} as unknown as Vault & { adapter: AdapterMock; configDir: string }\n}\n\ndescribe('statVaultItem', () => {\n\tit('reads file metadata from adapter.stat', async () => {\n\t\tconst vault = createVault({\n\t\t\tstat: vi.fn().mockResolvedValue({\n\t\t\t\ttype: 'file',\n\t\t\t\tmtime: 123,\n\t\t\t\tsize: 456,\n\t\t\t}),\n\t\t})\n\n\t\tawait expect(statVaultItem(vault, 'folder/note.md')).resolves.toEqual({\n\t\t\tpath: 'folder/note.md',\n\t\t\tbasename: 'note.md',\n\t\t\tisDir: false,\n\t\t\tisDeleted: false,\n\t\t\tmtime: 123,\n\t\t\tsize: 456,\n\t\t})\n\t})\n\n\tit('returns directory metadata from adapter.stat', async () => {\n\t\tconst vault = createVault({\n\t\t\tstat: vi.fn().mockResolvedValue({\n\t\t\t\ttype: 'folder',\n\t\t\t\tmtime: 99,\n\t\t\t\tsize: 0,\n\t\t\t}),\n\t\t})\n\n\t\tawait expect(statVaultItem(vault, 'folder')).resolves.toEqual({\n\t\t\tpath: 'folder',\n\t\t\tbasename: 'folder',\n\t\t\tisDir: true,\n\t\t\tisDeleted: false,\n\t\t\tmtime: 99,\n\t\t})\n\t})\n\n\tit('returns undefined when the path is missing', async () => {\n\t\tconst vault = createVault({\n\t\t\tstat: vi.fn().mockResolvedValue(null),\n\t\t})\n\n\t\tawait expect(statVaultItem(vault, 'missing.md')).resolves.toBeUndefined()\n\t})\n})\n\ndescribe('mkdirsVault', () => {\n\tit('creates missing parent directories from top to bottom', async () => {\n\t\tconst existing = new Set<string>()\n\t\tconst mkdir = vi.fn(async (path: string) => {\n\t\t\texisting.add(path)\n\t\t})\n\t\tconst vault = createVault({\n\t\t\texists: vi.fn(async (path: string) => existing.has(path)),\n\t\t\tmkdir,\n\t\t})\n\n\t\tawait mkdirsVault(vault, 'a/b/c')\n\n\t\texpect(mkdir.mock.calls.map(([path]) => path)).toEqual([\n\t\t\t'a',\n\t\t\t'a/b',\n\t\t\t'a/b/c',\n\t\t])\n\t})\n\n\tit('skips work for root-like paths and existing directories', async () => {\n\t\tconst mkdir = vi.fn()\n\t\tconst vault = createVault({\n\t\t\texists: vi.fn(async (path: string) => path === 'exists'),\n\t\t\tmkdir,\n\t\t})\n\n\t\tawait mkdirsVault(vault, '.')\n\t\tawait mkdirsVault(vault, '/')\n\t\tawait mkdirsVault(vault, 'exists')\n\n\t\texpect(mkdir).not.toHaveBeenCalled()\n\t})\n})\n\ndescribe('traverseLocalVault', () => {\n\tit('walks adapter.list recursively and ignores config node_modules', async () => {\n\t\tconst vault = createVault({\n\t\t\tstat: vi.fn(async (path: string) => {\n\t\t\t\tconst folders = new Set([\n\t\t\t\t\t'',\n\t\t\t\t\t'docs',\n\t\t\t\t\t'.obsidian',\n\t\t\t\t\t'.obsidian/plugins',\n\t\t\t\t\t'.obsidian/plugins/test',\n\t\t\t\t\t'.obsidian/plugins/test/node_modules',\n\t\t\t\t])\n\t\t\t\tif (folders.has(path)) {\n\t\t\t\t\treturn { type: 'folder', mtime: 1, size: 0 }\n\t\t\t\t}\n\t\t\t\tif (path === 'readme.md' || path === 'docs/file.md') {\n\t\t\t\t\treturn { type: 'file', mtime: 2, size: 3 }\n\t\t\t\t}\n\t\t\t\tif (path === '.obsidian/plugins/test/node_modules/dep.js') {\n\t\t\t\t\treturn { type: 'file', mtime: 4, size: 5 }\n\t\t\t\t}\n\t\t\t\treturn null\n\t\t\t}),\n\t\t\tlist: vi.fn(async (path: string) => {\n\t\t\t\tif (path === '') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfiles: ['readme.md'],\n\t\t\t\t\t\tfolders: ['docs', '.obsidian'],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (path === 'docs') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfiles: ['docs/file.md'],\n\t\t\t\t\t\tfolders: [],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (path === '.obsidian') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfiles: [],\n\t\t\t\t\t\tfolders: ['.obsidian/plugins'],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (path === '.obsidian/plugins') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfiles: [],\n\t\t\t\t\t\tfolders: ['.obsidian/plugins/test'],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (path === '.obsidian/plugins/test') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfiles: [],\n\t\t\t\t\t\tfolders: ['.obsidian/plugins/test/node_modules'],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (path === '.obsidian/plugins/test/node_modules') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfiles: ['.obsidian/plugins/test/node_modules/dep.js'],\n\t\t\t\t\t\tfolders: [],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { files: [], folders: [] }\n\t\t\t}),\n\t\t})\n\n\t\tconst results = await traverseLocalVault(vault, '')\n\n\t\texpect(results.map((item) => item.path)).toEqual([\n\t\t\t'readme.md',\n\t\t\t'docs',\n\t\t\t'.obsidian',\n\t\t\t'docs/file.md',\n\t\t\t'.obsidian/plugins',\n\t\t\t'.obsidian/plugins/test',\n\t\t])\n\t})\n\n\tit('returns an empty array when the start path is not a folder', async () => {\n\t\tconst vault = createVault({\n\t\t\tstat: vi.fn().mockResolvedValue(null),\n\t\t\tlist: vi.fn(),\n\t\t})\n\n\t\tawait expect(traverseLocalVault(vault, 'missing')).resolves.toEqual([])\n\t\texpect(vault.adapter.list).not.toHaveBeenCalled()\n\t})\n})\n"
  },
  {
    "path": "src/utils/wait-until.ts",
    "content": "import sleep from './sleep'\n\nexport default async function waitUntil<T>(condition: () => T, duration = 100) {\n\twhile (true) {\n\t\tconst result = await Promise.resolve(condition())\n\t\tif (result) {\n\t\t\treturn result\n\t\t}\n\t\tawait sleep(duration)\n\t}\n}\n"
  },
  {
    "path": "src/views/chatbox.view.ts",
    "content": "import { mount as mountChatbox } from 'chatbox'\nimport { Component, ItemView, MarkdownRenderer, WorkspaceLeaf } from 'obsidian'\nimport type { ChatboxController, ChatboxProps } from '~/chatbox/types'\nimport i18n from '~/i18n'\nimport logger from '~/utils/logger'\nimport type NutstorePlugin from '..'\n\nexport const CHATBOX_VIEW_TYPE = 'nutstore-sync-chatbox'\n\nexport default class ChatboxView extends ItemView {\n\tprivate rootEl!: HTMLDivElement\n\tprivate controller?: ChatboxController\n\tprivate unsub?: () => void\n\tprivate readonly renderMarkdown: NonNullable<ChatboxProps['renderMarkdown']> =\n\t\tasync (el: HTMLElement, markdown: string) => {\n\t\t\tconst component = new Component()\n\t\t\tthis.addChild(component)\n\t\t\tcomponent.load()\n\n\t\t\tconst fallbackText = markdown\n\t\t\tconst renderedEl = document.createElement('div')\n\n\t\t\ttry {\n\t\t\t\tawait MarkdownRenderer.render(\n\t\t\t\t\tthis.app,\n\t\t\t\t\tmarkdown,\n\t\t\t\t\trenderedEl,\n\t\t\t\t\t'',\n\t\t\t\t\tcomponent,\n\t\t\t\t)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error rendering chat markdown:', error)\n\t\t\t\tcomponent.unload()\n\t\t\t\tel.replaceChildren()\n\t\t\t\tel.textContent = fallbackText\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tel.replaceChildren(...Array.from(renderedEl.childNodes))\n\t\t\tif (!el.childNodes.length) {\n\t\t\t\tel.textContent = fallbackText\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tcomponent.unload()\n\t\t\t\tel.replaceChildren()\n\t\t\t}\n\t\t}\n\n\tconstructor(\n\t\tleaf: WorkspaceLeaf,\n\t\tprivate plugin: NutstorePlugin,\n\t) {\n\t\tsuper(leaf)\n\t}\n\n\tgetViewType() {\n\t\treturn CHATBOX_VIEW_TYPE\n\t}\n\n\tgetDisplayText() {\n\t\treturn i18n.t('chatbox.title')\n\t}\n\n\tgetIcon() {\n\t\treturn 'bot'\n\t}\n\n\tprivate getChatboxProps(): ChatboxProps {\n\t\treturn {\n\t\t\t...this.plugin.chatService.getViewProps(),\n\t\t\trenderMarkdown: this.renderMarkdown,\n\t\t}\n\t}\n\n\tasync onOpen() {\n\t\tthis.contentEl.empty()\n\t\tthis.rootEl = this.contentEl.createDiv({\n\t\t\tcls: 'nutstore-chatbox-view h-full',\n\t\t})\n\t\tawait this.plugin.chatService.ensureSession()\n\t\tthis.controller = mountChatbox(this.rootEl, this.getChatboxProps())\n\t\tthis.unsub = this.plugin.chatService.subscribe(() => {\n\t\t\tthis.controller?.update(this.getChatboxProps())\n\t\t})\n\t}\n\n\tasync onClose() {\n\t\tthis.unsub?.()\n\t\tthis.controller?.destroy()\n\t\tthis.contentEl.empty()\n\t}\n}\n"
  },
  {
    "path": "src/webdav-patch.ts",
    "content": "/**\n * Patch webdav request to use obsidian's requestUrl\n *\n * reference: https://github.com/remotely-save/remotely-save/blob/34db181af002f8d71ea0a87e7965abc57b294914/src/fsWebdav.ts#L25\n */\nimport { getReasonPhrase } from 'http-status-codes/build/cjs/utils-functions'\nimport { Platform, RequestUrlParam } from 'obsidian'\nimport { RequestOptionsWithState } from 'webdav'\nimport requestUrl from './utils/request-url'\nimport { getPatcher } from 'webdav'\nimport { VALID_REQURL } from '~/consts'\n\n/**\n * https://stackoverflow.com/questions/12539574/\n * @param obj\n * @returns\n */\nfunction objKeyToLower(obj: Record<string, string>) {\n\treturn Object.fromEntries(\n\t\tObject.entries(obj).map(([k, v]) => [k.toLowerCase(), v]),\n\t)\n}\n\n/**\n * https://stackoverflow.com/questions/32850898/how-to-check-if-a-string-has-any-non-iso-8859-1-characters-with-javascript\n * @param str\n * @returns true if all are iso 8859 1 chars\n */\nfunction onlyAscii(str: string) {\n\treturn !/[^\\u0000-\\u00ff]/g.test(str)\n}\n\nif (VALID_REQURL) {\n\tgetPatcher().patch(\n\t\t'request',\n\t\tasync (options: RequestOptionsWithState): Promise<Response> => {\n\t\t\tconst transformedHeaders = objKeyToLower({ ...options.headers })\n\t\t\tdelete transformedHeaders['host']\n\t\t\tdelete transformedHeaders['content-length']\n\n\t\t\tconst reqContentType =\n\t\t\t\ttransformedHeaders['accept'] ?? transformedHeaders['content-type']\n\n\t\t\tconst retractedHeaders = { ...transformedHeaders }\n\t\t\tif (retractedHeaders.hasOwnProperty('authorization')) {\n\t\t\t\tretractedHeaders['authorization'] = '<retracted>'\n\t\t\t}\n\n\t\t\tconst p: RequestUrlParam = {\n\t\t\t\turl: options.url,\n\t\t\t\tmethod: options.method,\n\t\t\t\tbody: options.data as string | ArrayBuffer,\n\t\t\t\theaders: transformedHeaders,\n\t\t\t\tcontentType: reqContentType,\n\t\t\t\tthrow: false,\n\t\t\t}\n\n\t\t\tlet r = await requestUrl(p)\n\n\t\t\tif (\n\t\t\t\tr.status === 401 &&\n\t\t\t\tPlatform.isIosApp &&\n\t\t\t\t!options.url.endsWith('/') &&\n\t\t\t\t!options.url.endsWith('.md') &&\n\t\t\t\toptions.method.toUpperCase() === 'PROPFIND'\n\t\t\t) {\n\t\t\t\tp.url = `${options.url}/`\n\t\t\t\tr = await requestUrl(p)\n\t\t\t}\n\t\t\tconst rspHeaders = objKeyToLower({ ...r.headers })\n\t\t\tfor (const key in rspHeaders) {\n\t\t\t\tif (rspHeaders.hasOwnProperty(key)) {\n\t\t\t\t\tif (!onlyAscii(rspHeaders[key])) {\n\t\t\t\t\t\trspHeaders[key] = encodeURIComponent(rspHeaders[key])\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet r2: Response | undefined = undefined\n\t\t\tconst statusText = getReasonPhrase(r.status)\n\t\t\tif ([101, 103, 204, 205, 304].includes(r.status)) {\n\t\t\t\tr2 = new Response(null, {\n\t\t\t\t\tstatus: r.status,\n\t\t\t\t\tstatusText: statusText,\n\t\t\t\t\theaders: rspHeaders,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tr2 = new Response(r.arrayBuffer, {\n\t\t\t\t\tstatus: r.status,\n\t\t\t\t\tstatusText: statusText,\n\t\t\t\t\theaders: rspHeaders,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn r2\n\t\t},\n\t)\n}\n"
  },
  {
    "path": "test/mocks/obsidian.ts",
    "content": "export class Notice {\n\tconstructor(_message: string, _timeout?: number) {}\n}\n\nexport class App {}\nexport class Modal {\n\tcontentEl = {\n\t\tempty() {},\n\t\tcreateEl(_tag: string, _attrs?: { text?: string }) {\n\t\t\treturn {\n\t\t\t\tstyle: {},\n\t\t\t}\n\t\t},\n\t}\n\n\tconstructor(_app: App) {}\n\n\tsetTitle(_title: string) {}\n\topen() {}\n\tclose() {}\n}\n\nexport class Setting {\n\tconstructor(_containerEl: unknown) {}\n\n\taddButton(\n\t\tcallback: (button: {\n\t\t\tsetButtonText(text: string): any\n\t\t\tsetWarning(): any\n\t\t\tsetCta(): any\n\t\t\tonClick(handler: () => void): any\n\t\t}) => void,\n\t) {\n\t\tconst button = {\n\t\t\tsetButtonText(_text: string) {\n\t\t\t\treturn button\n\t\t\t},\n\t\t\tsetWarning() {\n\t\t\t\treturn button\n\t\t\t},\n\t\t\tsetCta() {\n\t\t\t\treturn button\n\t\t\t},\n\t\t\tonClick(_handler: () => void) {\n\t\t\t\treturn button\n\t\t\t},\n\t\t}\n\t\tcallback(button)\n\t\treturn this\n\t}\n}\nexport class TFile {}\nexport class TFolder {}\nexport class Component {\n\tload() {}\n\tunload() {}\n}\nexport class ItemView {}\nexport class WorkspaceLeaf {}\n\nexport const MarkdownRenderer = {\n\tasync render() {},\n}\n\nexport function normalizePath(path: string) {\n\treturn path\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"baseUrl\": \".\",\n\t\t\"paths\": {\n\t\t\t\"~/*\": [\"./src/*\"],\n\t\t\t\"~\": [\"./src\"]\n\t\t},\n\t\t\"inlineSourceMap\": true,\n\t\t\"inlineSources\": true,\n\t\t\"module\": \"ESNext\",\n\t\t\"target\": \"ES6\",\n\t\t\"allowJs\": true,\n\t\t\"noImplicitAny\": true,\n\t\t\"moduleResolution\": \"bundler\",\n\t\t\"importHelpers\": true,\n\t\t\"isolatedModules\": true,\n\t\t\"strictNullChecks\": true,\n\t\t\"allowSyntheticDefaultImports\": true,\n\t\t\"lib\": [\"DOM\", \"ES5\", \"ES6\", \"ES7\"]\n\t},\n\t\"include\": [\"**/*.ts\"]\n}\n"
  },
  {
    "path": "uno.config.ts",
    "content": "import { defineConfig, presetUno } from 'unocss'\n\nexport default defineConfig({\n\tcontent: {\n\t\tfilesystem: ['src/**/*.{html,js,ts,jsx,tsx,vue,svelte,astro}'],\n\t},\n\trules: [[/^background-none$/, () => ({ background: 'none' })]],\n\tpresets: [presetUno()],\n})\n"
  },
  {
    "path": "version-bump.mjs",
    "content": "import { readFileSync, writeFileSync } from 'fs'\n\nconst targetVersion = process.env.npm_package_version\n\n// read minAppVersion from manifest.json and bump version to target version\nlet manifest = JSON.parse(readFileSync('manifest.json', 'utf8'))\nconst { minAppVersion } = manifest\nmanifest.version = targetVersion\nwriteFileSync('manifest.json', JSON.stringify(manifest, null, '\\t'))\n\n// update versions.json with target version and minAppVersion from manifest.json\nlet versions = JSON.parse(readFileSync('versions.json', 'utf8'))\nversions[targetVersion] = minAppVersion\nwriteFileSync('versions.json', JSON.stringify(versions, null, '\\t'))\n"
  },
  {
    "path": "versions.json",
    "content": "{\n\t\"1.0.0\": \"0.15.0\"\n}\n"
  },
  {
    "path": "vitest.config.ts",
    "content": "import { resolve } from 'node:path'\nimport { defineConfig } from 'vitest/config'\n\nexport default defineConfig({\n\tresolve: {\n\t\talias: {\n\t\t\tobsidian: resolve(__dirname, 'test/mocks/obsidian.ts'),\n\t\t\t'~': resolve(__dirname, 'src'),\n\t\t},\n\t},\n\ttest: {\n\t\tenvironment: 'node',\n\t},\n})\n"
  }
]