diff --git a/.gitignore b/.gitignore index 4f3f6059..5009e41a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ /config.yaml src/ui/out/ src/ui/.next/ +src/ui/test-results/ src/ui/mcp-admin-flow.mjs src/ui/composio-nav.mjs diff --git a/AGENTS.md b/AGENTS.md index 54ba5a47..dc9f6c88 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,25 @@ The pre-commit hook keeps `model_prices_backup.json` in sync with the upstream litellm JSON on every commit. It warns and skips silently if the network is unavailable — it never blocks a commit. +## codexgui production deployment + +For the deployed topology, initial server setup, PostgreSQL integration, +future-release procedure, acceptance tests, and rollback steps, follow +[`docs/engineering/codexgui-deployment.mdx`](./docs/engineering/codexgui-deployment.mdx). + +Treat the environment files and persistent-state paths named in that runbook as +production data. Never commit their contents or replace stable encryption keys +during a routine release. + +## Future upstream releases + +Before adopting a newer upstream release or commit, follow +[`docs/engineering/upstream-release-reconciliation.md`](./docs/engineering/upstream-release-reconciliation.md). +It inventories the downstream fixes and behavioral invariants that must be +preserved, defines how to classify upstream equivalents, and lists the required +code, database, runtime, MCP, browser, orchestration, artifact, delivery, +deployment, and rollback validation. + ## MCP integration invariants `mcp_server_ids` (in `AgentDraft`) is the **sole source of truth** for which diff --git a/Dockerfile b/Dockerfile index aabc146b..32c0035d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,14 +16,17 @@ RUN cargo build --release --bin lite FROM debian:bookworm-slim AS runtime RUN apt-get update \ - && apt-get install -y --no-install-recommends ca-certificates \ - && rm -rf /var/lib/apt/lists/* + && apt-get install -y --no-install-recommends ca-certificates curl \ + && rm -rf /var/lib/apt/lists/* \ + && groupadd --gid 10001 app \ + && useradd --uid 10001 --gid 10001 --no-create-home --shell /usr/sbin/nologin app WORKDIR /app COPY --from=rust-builder /build/target/release/lite /usr/local/bin/lite COPY --from=ui-builder /build/src/ui/out /app/ui COPY config.yaml.example /app/config.yaml.example COPY deploy/render.config.yaml /app/deploy.config.yaml +RUN chmod -R a=rX /app ENV HOST=0.0.0.0 ENV PORT=4000 @@ -31,4 +34,5 @@ ENV LITELLM_CONFIG=/app/deploy.config.yaml ENV LITELLM_UI_DIR=/app/ui EXPOSE 4000 +USER 10001:10001 CMD ["lite", "serve"] diff --git a/compose.yaml b/compose.yaml index d940cbf1..2a7710d5 100644 --- a/compose.yaml +++ b/compose.yaml @@ -13,9 +13,16 @@ x-runtime-registration: &runtime-registration until curl -fsS "$$LAP_URL/health" >/dev/null; do sleep 1 done - until curl -fsS "$$RUNTIME_API_BASE/health" >/dev/null; do - sleep 1 - done + runtime_health_url="$${RUNTIME_HEALTH_URL:-$$RUNTIME_API_BASE/health}" + if [ -n "$${RUNTIME_HEALTH_API_KEY:-}" ]; then + until curl -fsS -H "X-API-Key: $$RUNTIME_HEALTH_API_KEY" "$$runtime_health_url" >/dev/null; do + sleep 1 + done + else + until curl -fsS "$$runtime_health_url" >/dev/null; do + sleep 1 + done + fi create_payload=$$(printf '{"alias":"%s","api_spec":"%s","api_base":"%s","api_key":"%s"}' "$$RUNTIME_ALIAS" "$$RUNTIME_API_SPEC" "$$RUNTIME_API_BASE" "$$RUNTIME_API_KEY") update_payload=$$(printf '{"api_base":"%s","api_key":"%s"}' "$$RUNTIME_API_BASE" "$$RUNTIME_API_KEY") @@ -84,6 +91,35 @@ services: - lap - opencode + codex: + profiles: ["codex"] + build: ./templates/codex + environment: + MODEL_BASE_URL: ${CODEX_MODEL_BASE_URL:-https://api.openai.com/v1} + MODEL_API_KEY: ${CODEX_MODEL_API_KEY:-} + DEFAULT_MODEL: ${CODEX_MODEL:-gpt-5.6-sol-high} + MODEL_MODELS: ${CODEX_MODELS:-gpt-5.6-sol-high} + RUNTIME_API_KEY: ${CODEX_RUNTIME_API_KEY:-local-codex-key} + volumes: + - codex-data:/data + - codex-home:/codex-home + + register-codex: + <<: *runtime-registration + profiles: ["codex"] + environment: + LAP_URL: http://lap:4000 + LAP_MASTER_KEY: ${LITELLM_MASTER_KEY:-sk-local} + RUNTIME_ALIAS: local-codex + RUNTIME_API_SPEC: claude_managed_agents + RUNTIME_API_BASE: http://codex:8080 + RUNTIME_API_KEY: ${CODEX_RUNTIME_API_KEY:-local-codex-key} + RUNTIME_HEALTH_URL: http://codex:8080/control/health + RUNTIME_HEALTH_API_KEY: ${CODEX_RUNTIME_API_KEY:-local-codex-key} + depends_on: + - lap + - codex + deepagents: profiles: ["deepagents"] build: ./templates/deepagents @@ -172,3 +208,5 @@ volumes: deepagents-data: hermes-data: openclaw-data: + codex-data: + codex-home: diff --git a/deploy/codexgui-operations.md b/deploy/codexgui-operations.md new file mode 100644 index 00000000..7e90baae --- /dev/null +++ b/deploy/codexgui-operations.md @@ -0,0 +1,60 @@ +# codexgui production operations + +The complete deployment, upgrade, acceptance, and rollback runbook is +[`docs/engineering/codexgui-deployment.mdx`](../docs/engineering/codexgui-deployment.mdx). +This file remains a compact command reference for operators already familiar +with that runbook. + +This deployment uses the host PostgreSQL service, the external Docker network +`edge`, and the environment files below: + +- `/etc/litellm-agent-control-plane/deploy.env` +- `/etc/litellm-agent-control-plane/runtime.env` +- `/var/lib/litellm-agent-control-plane/` + +The environment files must remain owned by root with mode `0600`. The Compose +stack does not publish host ports; Caddy reaches the `lap` service through the +`edge` network as `litellm-agent-control-plane:4000`. + +## Start and verify + +```bash +systemctl start litellm-agent-control-plane.service +systemctl is-active litellm-agent-control-plane.service + +for service in lap codex opencode deepagents hermes openclaw; do + docker inspect "litellm-agent-control-plane-${service}-1" \ + --format '{{.Name}} {{.State.Health.Status}}' +done +``` + +Each registration container must finish with exit code zero. A private edge +network check can be made without publishing a port: + +```bash +docker run --rm --network edge curlimages/curl:8.11.1 \ + --fail --silent --show-error \ + http://litellm-agent-control-plane:4000/health +``` + +## Back up before changes + +Back up the database, both environment files, the state directory, the Caddy +configuration, and the current DNS record before a release. Store database and +environment backups with mode `0600`. + +## Roll back + +1. Restore the previous Cloudflare DNS record from the pre-change API response. +2. Restore the previous Caddy configuration. When the Caddyfile is a read-only + file bind mount, replacing the host file changes its inode; recreate only + the Caddy service so the container mounts the restored inode. +3. Stop this stack with `systemctl stop litellm-agent-control-plane.service`. +4. Restore the previous database and state snapshot if the rollback stays on + this host, or start the preserved source deployment if the release was a + cross-host migration. +5. Verify public health, the session list, an existing session with assistant + messages, and one new Codex ChatGPT session. + +Do not remove the previous deployment, its tunnel, or its database until the +rollback retention window has elapsed. diff --git a/deploy/codexgui.compose.yaml b/deploy/codexgui.compose.yaml new file mode 100644 index 00000000..4b2633a0 --- /dev/null +++ b/deploy/codexgui.compose.yaml @@ -0,0 +1,326 @@ +x-runtime-registration: &runtime-registration + image: ${CURL_IMAGE:?set CURL_IMAGE} + init: true + read_only: true + cap_drop: + - ALL + security_opt: + - no-new-privileges:true + tmpfs: + - /tmp:rw,nosuid,nodev,size=8m + entrypoint: ["/bin/sh"] + environment: + LAP_URL: http://lap:4000 + LAP_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + RUNTIME_API_SPEC: claude_managed_agents + command: + - -c + - | + set -eu + + until curl -fsS "$$LAP_URL/health" >/dev/null; do + sleep 1 + done + + runtime_health_url="$${RUNTIME_HEALTH_URL:-$$RUNTIME_API_BASE/health}" + if [ -n "$${RUNTIME_HEALTH_API_KEY:-}" ]; then + until curl -fsS -H "X-API-Key: $$RUNTIME_HEALTH_API_KEY" "$$runtime_health_url" >/dev/null; do + sleep 1 + done + else + until curl -fsS "$$runtime_health_url" >/dev/null; do + sleep 1 + done + fi + + create_payload=$$(printf '{"alias":"%s","api_spec":"%s","api_base":"%s","api_key":"%s"}' "$$RUNTIME_ALIAS" "$$RUNTIME_API_SPEC" "$$RUNTIME_API_BASE" "$$RUNTIME_API_KEY") + update_payload=$$(printf '{"api_base":"%s","api_key":"%s"}' "$$RUNTIME_API_BASE" "$$RUNTIME_API_KEY") + + curl -fsS -X POST "$$LAP_URL/api/runtime-harnesses" \ + -H "Authorization: Bearer $$LAP_MASTER_KEY" \ + -H "Content-Type: application/json" \ + -d "$$create_payload" \ + || curl -fsS -X PUT "$$LAP_URL/api/runtime-harnesses/$$RUNTIME_ALIAS" \ + -H "Authorization: Bearer $$LAP_MASTER_KEY" \ + -H "Content-Type: application/json" \ + -d "$$update_payload" + networks: + - backend + +x-runtime: &runtime + init: true + restart: unless-stopped + read_only: true + cap_drop: + - ALL + security_opt: + - no-new-privileges:true + tmpfs: + - /tmp:rw,nosuid,nodev,size=256m + expose: + - "8080" + networks: + - backend + +services: + lap: + image: ${LAP_IMAGE:?set LAP_IMAGE} + init: true + restart: unless-stopped + read_only: true + cap_drop: + - ALL + security_opt: + - no-new-privileges:true + tmpfs: + - /tmp:rw,nosuid,nodev,size=64m + environment: + LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + DATABASE_URL: ${DATABASE_URL:?set DATABASE_URL} + ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} + extra_hosts: + - host.docker.internal:host-gateway + expose: + - "4000" + networks: + backend: + edge: + aliases: + - litellm-agent-control-plane + healthcheck: + test: ["CMD", "curl", "--fail", "--silent", "--show-error", "http://127.0.0.1:4000/health"] + interval: 10s + timeout: 5s + retries: 18 + start_period: 10s + mem_limit: 1g + pids_limit: 512 + + codex: + <<: *runtime + image: ${CODEX_IMAGE:?set CODEX_IMAGE} + environment: + MODEL_BASE_URL: ${CODEX_MODEL_BASE_URL:-https://api.openai.com/v1} + MODEL_API_KEY: ${CODEX_MODEL_API_KEY:-} + DEFAULT_MODEL: ${CODEX_MODEL:-gpt-5.6-sol-high} + MODEL_MODELS: ${CODEX_MODELS:-gpt-5.6-sol-high} + RUNTIME_API_KEY: ${CODEX_RUNTIME_API_KEY:?set CODEX_RUNTIME_API_KEY} + PROFILE_ENCRYPTION_KEY: ${CODEX_PROFILE_ENCRYPTION_KEY:?set CODEX_PROFILE_ENCRYPTION_KEY} + LAP_GATEWAY_API_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + LAP_GATEWAY_MCP_BASE_URL: ${LAP_GATEWAY_MCP_BASE_URL:-} + LAP_GATEWAY_MCP_INTERNAL_BASE_URL: ${LAP_GATEWAY_MCP_INTERNAL_BASE_URL:-http://lap:4000} + CODEX_COMMAND_TIMEOUT_SEC: ${CODEX_COMMAND_TIMEOUT_SEC:-600} + volumes: + - ${STATE_ROOT:-/var/lib/litellm-agent-control-plane}/codex-data:/data + - ${STATE_ROOT:-/var/lib/litellm-agent-control-plane}/codex-home:/codex-home + - ${STATE_ROOT:-/var/lib/litellm-agent-control-plane}/codex-workspace:/workspace + healthcheck: + test: + [ + "CMD-SHELL", + "node -e \"fetch('http://127.0.0.1:8080/control/health',{headers:{'x-api-key':process.env.RUNTIME_API_KEY}}).then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))\"", + ] + interval: 10s + timeout: 5s + retries: 18 + start_period: 15s + mem_limit: 2g + pids_limit: 1024 + + register-codex: + <<: *runtime-registration + environment: + LAP_URL: http://lap:4000 + LAP_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + RUNTIME_ALIAS: local-codex + RUNTIME_API_SPEC: claude_managed_agents + RUNTIME_API_BASE: http://codex:8080 + RUNTIME_API_KEY: ${CODEX_RUNTIME_API_KEY:?set CODEX_RUNTIME_API_KEY} + RUNTIME_HEALTH_URL: http://codex:8080/control/health + RUNTIME_HEALTH_API_KEY: ${CODEX_RUNTIME_API_KEY:?set CODEX_RUNTIME_API_KEY} + depends_on: + lap: + condition: service_healthy + codex: + condition: service_healthy + + opencode: + <<: *runtime + image: ${OPENCODE_IMAGE:?set OPENCODE_IMAGE} + environment: + LITELLM_BASE_URL: http://lap:4000/v1 + LITELLM_API_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + LITELLM_MODELS: ${OPENCODE_MODELS:-} + LITELLM_DEFAULT_MODEL: ${OPENCODE_DEFAULT_MODEL:-} + RUNTIME_API_KEY: ${OPENCODE_RUNTIME_API_KEY:?set OPENCODE_RUNTIME_API_KEY} + WORKDIR: /data/workspace + volumes: + - ${STATE_ROOT:-/var/lib/litellm-agent-control-plane}/opencode-data:/data + healthcheck: + test: + [ + "CMD", + "node", + "-e", + "fetch('http://127.0.0.1:8080/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))", + ] + interval: 10s + timeout: 5s + retries: 18 + start_period: 20s + mem_limit: 1536m + pids_limit: 768 + depends_on: + lap: + condition: service_healthy + + register-opencode: + <<: *runtime-registration + environment: + LAP_URL: http://lap:4000 + LAP_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + RUNTIME_ALIAS: local-opencode + RUNTIME_API_SPEC: claude_managed_agents + RUNTIME_API_BASE: http://opencode:8080 + RUNTIME_API_KEY: ${OPENCODE_RUNTIME_API_KEY:?set OPENCODE_RUNTIME_API_KEY} + depends_on: + lap: + condition: service_healthy + opencode: + condition: service_healthy + + deepagents: + <<: *runtime + image: ${DEEPAGENTS_IMAGE:?set DEEPAGENTS_IMAGE} + environment: + DEFAULT_MODEL: ${DEEPAGENTS_MODEL:-anthropic:claude-sonnet-4-5} + RUNTIME_API_KEY: ${DEEPAGENTS_RUNTIME_API_KEY:?set DEEPAGENTS_RUNTIME_API_KEY} + ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} + volumes: + - ${STATE_ROOT:-/var/lib/litellm-agent-control-plane}/deepagents-data:/data + healthcheck: + test: + [ + "CMD", + "python", + "-c", + "import urllib.request; assert urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=3).status == 200", + ] + interval: 10s + timeout: 5s + retries: 18 + start_period: 15s + mem_limit: 1g + pids_limit: 512 + + register-deepagents: + <<: *runtime-registration + environment: + LAP_URL: http://lap:4000 + LAP_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + RUNTIME_ALIAS: local-deepagents + RUNTIME_API_SPEC: claude_managed_agents + RUNTIME_API_BASE: http://deepagents:8080 + RUNTIME_API_KEY: ${DEEPAGENTS_RUNTIME_API_KEY:?set DEEPAGENTS_RUNTIME_API_KEY} + depends_on: + lap: + condition: service_healthy + deepagents: + condition: service_healthy + + hermes: + <<: *runtime + image: ${HERMES_IMAGE:?set HERMES_IMAGE} + environment: + DEFAULT_MODEL: ${HERMES_MODEL:-anthropic/claude-sonnet-4-5} + RUNTIME_API_KEY: ${HERMES_RUNTIME_API_KEY:?set HERMES_RUNTIME_API_KEY} + LAP_BASE_URL: http://lap:4000 + LAP_API_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + HERMES_WORKDIR: /data/workspace + volumes: + - ${STATE_ROOT:-/var/lib/litellm-agent-control-plane}/hermes-data:/data + healthcheck: + test: + [ + "CMD", + "python", + "-c", + "import urllib.request; assert urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=3).status == 200", + ] + interval: 10s + timeout: 5s + retries: 18 + start_period: 30s + mem_limit: 1536m + pids_limit: 768 + depends_on: + lap: + condition: service_healthy + + register-hermes: + <<: *runtime-registration + environment: + LAP_URL: http://lap:4000 + LAP_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + RUNTIME_ALIAS: local-hermes + RUNTIME_API_SPEC: claude_managed_agents + RUNTIME_API_BASE: http://hermes:8080 + RUNTIME_API_KEY: ${HERMES_RUNTIME_API_KEY:?set HERMES_RUNTIME_API_KEY} + depends_on: + lap: + condition: service_healthy + hermes: + condition: service_healthy + + openclaw: + <<: *runtime + image: ${OPENCLAW_IMAGE:?set OPENCLAW_IMAGE} + environment: + DEFAULT_MODEL: ${OPENCLAW_MODEL:-openclaw/default} + LITELLM_BASE_URL: http://lap:4000/v1 + LITELLM_API_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + LITELLM_MODELS: ${OPENCLAW_MODELS:-claude-sonnet-4-6} + OPENCLAW_AGENT_MODEL: ${OPENCLAW_AGENT_MODEL:-litellm/claude-sonnet-4-6} + OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN:?set OPENCLAW_GATEWAY_TOKEN} + RUNTIME_API_KEY: ${OPENCLAW_RUNTIME_API_KEY:?set OPENCLAW_RUNTIME_API_KEY} + volumes: + - ${STATE_ROOT:-/var/lib/litellm-agent-control-plane}/openclaw-data:/data + healthcheck: + test: + [ + "CMD", + "python3", + "-c", + "import json,os,urllib.request; req=urllib.request.Request('http://127.0.0.1:8080/ready',headers={'X-API-Key':os.environ['RUNTIME_API_KEY']}); data=json.load(urllib.request.urlopen(req, timeout=3)); assert data.get('openclaw') is True", + ] + interval: 10s + timeout: 5s + retries: 24 + start_period: 45s + mem_limit: 2g + pids_limit: 1024 + depends_on: + lap: + condition: service_healthy + + register-openclaw: + <<: *runtime-registration + environment: + LAP_URL: http://lap:4000 + LAP_MASTER_KEY: ${LITELLM_MASTER_KEY:?set LITELLM_MASTER_KEY} + RUNTIME_ALIAS: local-openclaw + RUNTIME_API_SPEC: claude_managed_agents + RUNTIME_API_BASE: http://openclaw:8080 + RUNTIME_API_KEY: ${OPENCLAW_RUNTIME_API_KEY:?set OPENCLAW_RUNTIME_API_KEY} + depends_on: + lap: + condition: service_healthy + openclaw: + condition: service_healthy + +networks: + backend: + driver: bridge + edge: + name: edge + external: true diff --git a/deploy/litellm-agent-control-plane.service b/deploy/litellm-agent-control-plane.service new file mode 100644 index 00000000..388c1715 --- /dev/null +++ b/deploy/litellm-agent-control-plane.service @@ -0,0 +1,18 @@ +[Unit] +Description=LiteLLM Agent Control Plane containers +Requires=docker.service +After=docker.service network-online.target postgresql.service +Wants=network-online.target + +[Service] +Type=oneshot +RemainAfterExit=yes +WorkingDirectory=/opt/services/litellm-agent-control-plane +ExecStart=/usr/bin/docker compose --project-name litellm-agent-control-plane --env-file /etc/litellm-agent-control-plane/deploy.env --env-file /etc/litellm-agent-control-plane/runtime.env -f deploy/codexgui.compose.yaml up -d --remove-orphans +ExecStartPost=/bin/sh -c 'for attempt in $(seq 1 60); do ready=1; for service in lap codex opencode deepagents hermes openclaw; do test "$(docker inspect litellm-agent-control-plane-$service-1 --format="{{if .State.Health}}{{.State.Health.Status}}{{end}}" 2>/dev/null)" = healthy || ready=0; done; test "$ready" = 1 && exit 0; sleep 5; done; exit 1' +ExecStop=/usr/bin/docker compose --project-name litellm-agent-control-plane --env-file /etc/litellm-agent-control-plane/deploy.env --env-file /etc/litellm-agent-control-plane/runtime.env -f deploy/codexgui.compose.yaml stop +TimeoutStartSec=600 +TimeoutStopSec=120 + +[Install] +WantedBy=multi-user.target diff --git a/docs/docs.json b/docs/docs.json index 27a962be..1f785d07 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -139,6 +139,7 @@ "pages": [ "engineering/debugging", "engineering/contributing", + "engineering/managed-agent-orchestration", "engineering/sdk-api-contract" ] } diff --git a/docs/engineering/codexgui-deployment.mdx b/docs/engineering/codexgui-deployment.mdx new file mode 100644 index 00000000..23cb74b4 --- /dev/null +++ b/docs/engineering/codexgui-deployment.mdx @@ -0,0 +1,583 @@ +--- +title: "codexgui deployment runbook" +description: "Production topology, first deployment, upgrades, verification, and rollback for agents.eladrave.com." +--- + +# codexgui deployment runbook + +This runbook describes the production deployment at +`https://agents.eladrave.com` and the procedure for deploying later versions. +It is intentionally server-specific. Do not copy its hostnames, paths, or +network assumptions to another environment without reviewing them first. + +Never commit or print the contents of either production environment file. + +## Current production topology + +The deployment verified on 2026-08-06 has this shape: + +```text +Cloudflare DNS + -> Caddy on codexgui ports 80/443 + -> Docker external network: edge + -> litellm-agent-control-plane:4000 + -> native host PostgreSQL 16 on host.docker.internal:5432 + -> runtime containers on litellm-agent-control-plane_backend +``` + +The permanent production endpoint uses Cloudflare DNS and Caddy. It does not +depend on a Cloudflare Quick Tunnel or a `trycloudflare.com` URL. + +The production resources are: + +| Resource | Production value | +| --- | --- | +| SSH host alias | `codexgui` | +| Repository checkout | `/opt/services/litellm-agent-control-plane` | +| Git remote | `https://github.com/eladrave/litellm-agent-control-plane.git` | +| Compose project | `litellm-agent-control-plane` | +| Compose definition | `deploy/codexgui.compose.yaml` | +| systemd unit | `litellm-agent-control-plane.service` | +| Non-secret image configuration | `/etc/litellm-agent-control-plane/deploy.env` | +| Secrets and runtime configuration | `/etc/litellm-agent-control-plane/runtime.env` | +| Persistent runtime state | `/var/lib/litellm-agent-control-plane` | +| PostgreSQL database | `litellm_agent_control_plane` | +| PostgreSQL owner role | `lap_service` | +| Caddy configuration | `/opt/edge/Caddyfile` | +| External proxy network | `edge` | +| Public URL | `https://agents.eladrave.com` | + +The checkout is detached at an exact commit. Image tags identify the source +commit used to build each component; the LAP and runtime images can therefore +point to different commits when only one component was rebuilt. + +The Compose stack runs these long-lived services: + +- `lap` +- `codex` +- `opencode` +- `deepagents` +- `hermes` +- `openclaw` + +The `register-*` services are one-shot, idempotent registration jobs. They are +expected to finish with exit code zero rather than remain running. + +For parent/child design, runtime tool dependencies, timeout ownership, and +end-to-end acceptance, see +[Managed agent orchestration](/engineering/managed-agent-orchestration). + +## Security and persistence invariants + +- The LAP service publishes no host port. Only Caddy can reach it, through the + external `edge` network and the alias `litellm-agent-control-plane`. +- PostgreSQL is the existing native service on `codexgui`; there is no + PostgreSQL container in this stack. +- PostgreSQL must allow the Compose backend subnet with `scram-sha-256`, but + TCP port 5432 must not be opened by the cloud firewall to the public Internet. +- `/etc/litellm-agent-control-plane` is root-owned with mode `0700`. +- Both environment files are root-owned with mode `0600`. +- Runtime state is owned numerically by container UID/GID `10001:10001` and is + not deleted during an image upgrade. +- `LITELLM_MASTER_KEY` must remain stable because it protects gateway access + and encrypted database credentials. +- `CODEX_PROFILE_ENCRYPTION_KEY` must remain stable because it encrypts saved + Codex API, ChatGPT, and remote-SSH profiles. +- Runtime API keys and the OpenClaw gateway token must be random, distinct, + and stable across ordinary releases. +- Never run `docker compose down -v` in production. The state is bind-mounted, + but destructive volume or network cleanup is still outside the release + procedure. + +## How the first deployment was performed + +The initial cutover preserved the existing agents, sessions, event history, +Codex profiles, and runtime SQLite state. It did not start a new Compose +PostgreSQL service. + +### 1. Prepare the checkout and shared network + +From the machine with the configured SSH alias: + +```bash +ssh codexgui +``` + +On `codexgui`: + +```bash +install -d -m 0755 /opt/services +git clone https://github.com/eladrave/litellm-agent-control-plane.git \ + /opt/services/litellm-agent-control-plane +cd /opt/services/litellm-agent-control-plane +git config core.hooksPath .githooks +git fetch --prune origin +release_ref=0123456789abcdef0123456789abcdef01234567 +git cat-file -e "${release_ref}^{commit}" +git checkout --detach "$release_ref" + +docker network inspect edge >/dev/null 2>&1 || docker network create edge +``` + +Do not deploy a moving branch name. Resolve and record the tested commit SHA, +then check out that immutable commit. + +### 2. Create a dedicated database in the existing PostgreSQL service + +PostgreSQL 16 was already installed and managed by systemd. The deployment +created only a dedicated login role and database: + +```bash +sudo -u postgres createuser --login --pwprompt lap_service +sudo -u postgres createdb \ + --owner=lap_service \ + --encoding=UTF8 \ + litellm_agent_control_plane +``` + +The production connection string uses this form. URL-encode the password: + +```text +postgresql://lap_service:@host.docker.internal:5432/litellm_agent_control_plane?sslmode=require +``` + +### 3. Migrate the previous database and runtime state + +For a migration, dump the old LAP PostgreSQL database in custom format and +copy the dump to a root-only staging directory on `codexgui`: + +```bash +pg_dump --format=custom --file=lap-before-migration.dump "$OLD_DATABASE_URL" +chmod 0600 lap-before-migration.dump +scp lap-before-migration.dump codexgui:/root/ +``` + +Restore into the new, empty native PostgreSQL database: + +```bash +sudo -u postgres pg_restore \ + --exit-on-error \ + --no-owner \ + --no-privileges \ + --role=lap_service \ + --dbname=litellm_agent_control_plane \ + /root/lap-before-migration.dump +``` + +The runtime directories contain SQLite state, Codex authentication data, and +workspaces. Stop the source runtimes before archiving these directories, copy +the archive to `codexgui`, then restore it while the new stack is stopped: + +```bash +install -d -m 0750 -o 10001 -g 10001 \ + /var/lib/litellm-agent-control-plane + +tar --extract --gzip --numeric-owner \ + --file=/root/lap-runtime-state.tar.gz \ + --directory=/var/lib/litellm-agent-control-plane + +chown -R 10001:10001 /var/lib/litellm-agent-control-plane +chmod 0750 /var/lib/litellm-agent-control-plane +``` + +The archive layout must place `codex-data`, `codex-home`, `codex-workspace`, +`opencode-data`, `deepagents-data`, `hermes-data`, and `openclaw-data` directly +under `/var/lib/litellm-agent-control-plane`. + +For a fresh installation, create those directories instead of restoring them: + +```bash +for state_dir in \ + codex-data codex-home codex-workspace opencode-data \ + deepagents-data hermes-data openclaw-data; do + install -d -m 0750 -o 10001 -g 10001 \ + "/var/lib/litellm-agent-control-plane/${state_dir}" +done +``` + +### 4. Build immutable images + +Build from the detached, tested commit. A complete release uses the same tag +for all images: + +```bash +cd /opt/services/litellm-agent-control-plane +release_sha=$(git rev-parse --short=12 HEAD) + +docker build --pull \ + --tag "litellm-agent-control-plane:${release_sha}" . +docker build --pull \ + --tag "lap-codex-runtime:${release_sha}" templates/codex +docker build --pull \ + --tag "lap-opencode-runtime:${release_sha}" templates/opencode +docker build --pull \ + --tag "lap-deepagents-runtime:${release_sha}" templates/deepagents +docker build --pull \ + --tag "lap-hermes-runtime:${release_sha}" templates/hermes +docker build --pull \ + --tag "lap-openclaw-runtime:${release_sha}" templates/openclaw +``` + +Do not use `latest` in production. Record the resulting tags in `deploy.env`. + +### 5. Create the environment files + +Create the protected configuration directory: + +```bash +install -d -m 0700 -o root -g root /etc/litellm-agent-control-plane +install -m 0600 -o root -g root /dev/null \ + /etc/litellm-agent-control-plane/deploy.env +install -m 0600 -o root -g root /dev/null \ + /etc/litellm-agent-control-plane/runtime.env +``` + +`deploy.env` contains only image and state locations: + +```dotenv +LAP_IMAGE=litellm-agent-control-plane: +CODEX_IMAGE=lap-codex-runtime: +OPENCODE_IMAGE=lap-opencode-runtime: +DEEPAGENTS_IMAGE=lap-deepagents-runtime: +HERMES_IMAGE=lap-hermes-runtime: +OPENCLAW_IMAGE=lap-openclaw-runtime: +CURL_IMAGE=curlimages/curl@sha256: +STATE_ROOT=/var/lib/litellm-agent-control-plane +``` + +`runtime.env` contains the following keys. Generate new secrets with a CSPRNG, +for example `openssl rand -hex 32`, and never paste real values into Git: + +```dotenv +LITELLM_MASTER_KEY= +DATABASE_URL=postgresql://lap_service:@host.docker.internal:5432/litellm_agent_control_plane?sslmode=require +ANTHROPIC_API_KEY= + +CODEX_MODEL_BASE_URL= +CODEX_MODEL_API_KEY= +CODEX_MODEL=gpt-5.6-sol-high +CODEX_MODELS=gpt-5.6-sol-high +CODEX_PROFILE_ENCRYPTION_KEY= +CODEX_RUNTIME_API_KEY= + +OPENCODE_RUNTIME_API_KEY= +DEEPAGENTS_RUNTIME_API_KEY= +HERMES_RUNTIME_API_KEY= +OPENCLAW_RUNTIME_API_KEY= +OPENCLAW_GATEWAY_TOKEN= +``` + +The Codex API profile currently points at +`https://litellm-chatgpt-144701547770.us-central1.run.app`. Codex ChatGPT +profiles authenticate separately through Codex's ChatGPT login flow and do not +use `CODEX_MODEL_API_KEY`. + +Validate Compose interpolation without rendering the resolved configuration, +which would print secrets: + +```bash +docker compose \ + --project-name litellm-agent-control-plane \ + --env-file /etc/litellm-agent-control-plane/deploy.env \ + --env-file /etc/litellm-agent-control-plane/runtime.env \ + -f deploy/codexgui.compose.yaml \ + config --quiet +``` + +Create the Compose resources without starting them, then inspect the backend +subnet that must be permitted by PostgreSQL: + +```bash +docker compose \ + --project-name litellm-agent-control-plane \ + --env-file /etc/litellm-agent-control-plane/deploy.env \ + --env-file /etc/litellm-agent-control-plane/runtime.env \ + -f deploy/codexgui.compose.yaml \ + create + +docker network inspect litellm-agent-control-plane_backend \ + --format '{{(index .IPAM.Config 0).Subnet}}' +``` + +Add a narrowly scoped rule to PostgreSQL's `pg_hba.conf`, substituting the +reported subnet: + +```text +hostssl litellm_agent_control_plane lap_service scram-sha-256 +``` + +PostgreSQL must listen on an address reachable through Docker's host gateway, +must have TLS enabled, and must be restarted after configuration changes: + +```bash +sudo -u postgres psql -Atqc "show listen_addresses; show ssl; show hba_file;" +systemctl restart postgresql +systemctl is-active postgresql +``` + +If the backend Docker network is ever deleted and recreated, compare its new +subnet with `pg_hba.conf` before restarting LAP. + +### 6. Connect Caddy and install the systemd unit + +The LAP service joins the existing external `edge` network with the alias +`litellm-agent-control-plane`. The Caddy route is: + +```caddyfile +http://agents.eladrave.com { + handle /health { + reverse_proxy litellm-agent-control-plane:4000 + } + handle { + redir https://agents.eladrave.com{uri} permanent + } +} + +agents.eladrave.com { + reverse_proxy litellm-agent-control-plane:4000 +} +``` + +Validate Caddy configuration before installing it. Because the Caddyfile is a +read-only file bind mount, replacing the host file changes its inode; recreate +only the Caddy container so it mounts the new file. Do not restart unrelated +services on the `edge` network. + +Install and start the LAP unit: + +```bash +install -m 0644 deploy/litellm-agent-control-plane.service \ + /etc/systemd/system/litellm-agent-control-plane.service +systemctl daemon-reload +systemctl enable --now litellm-agent-control-plane.service +``` + +The Cloudflare proxied DNS record for `agents.eladrave.com` points to the +server. DNS and Caddy were cut over only after private health and agent +acceptance checks passed. + +## Deploy a future version + +### 1. Test and choose an immutable release + +Run the relevant local tests before touching production. For a change that can +affect the portal or Codex runtime, the minimum set is: + +```bash +cargo test +npm ci --prefix src/ui +npm run lint --prefix src/ui +npm run build --prefix src/ui +npm ci --prefix templates/codex +npm test --prefix templates/codex +npm ci --prefix templates/opencode +npm test --prefix templates/opencode +``` + +Build and smoke-test the changed images locally. Record the full commit SHA +that passed. Do not deploy from an uncommitted working tree. + +### 2. Fetch and build on `codexgui` + +Building before the maintenance window minimizes downtime: + +```bash +ssh codexgui +cd /opt/services/litellm-agent-control-plane + +git status --short +git fetch --prune origin +release_ref=0123456789abcdef0123456789abcdef01234567 +git cat-file -e "${release_ref}^{commit}" +git checkout --detach "$release_ref" + +release_sha=$(git rev-parse --short=12 HEAD) +``` + +The status output must be empty before checkout. Build every image whose source +changed, using the commands from the initial deployment section. Keeping the +old images provides the fastest application rollback. + +### 3. Back up production + +Create a root-only release backup before changing image tags: + +```bash +backup_stamp=$(date -u +%Y%m%dT%H%M%SZ) +backup_dir="/var/backups/litellm-agent-control-plane/${backup_stamp}" +install -d -m 0700 "$backup_dir" + +sudo -u postgres pg_dump \ + --format=custom \ + litellm_agent_control_plane >"$backup_dir/postgres.dump" +chmod 0600 "$backup_dir/postgres.dump" + +install -m 0600 /etc/litellm-agent-control-plane/deploy.env \ + "$backup_dir/deploy.env" +install -m 0600 /etc/litellm-agent-control-plane/runtime.env \ + "$backup_dir/runtime.env" +install -m 0600 /opt/edge/Caddyfile "$backup_dir/Caddyfile" +``` + +Stop LAP briefly to take a consistent snapshot of the runtime SQLite files and +Codex authentication state: + +```bash +systemctl stop litellm-agent-control-plane.service +tar --create --gzip --numeric-owner \ + --file="$backup_dir/runtime-state.tar.gz" \ + --directory=/var/lib \ + litellm-agent-control-plane +chmod 0600 "$backup_dir/runtime-state.tar.gz" +sha256sum "$backup_dir"/* >"$backup_dir/SHA256SUMS" +chmod 0600 "$backup_dir/SHA256SUMS" +``` + +### 4. Activate the new images + +Edit only the intended image tags in +`/etc/litellm-agent-control-plane/deploy.env`. Keep all secret values and +persistent paths unchanged. + +If the committed systemd unit changed, reinstall it and reload systemd: + +```bash +install -m 0644 deploy/litellm-agent-control-plane.service \ + /etc/systemd/system/litellm-agent-control-plane.service +systemctl daemon-reload +``` + +Validate interpolation and start the release: + +```bash +docker compose \ + --project-name litellm-agent-control-plane \ + --env-file /etc/litellm-agent-control-plane/deploy.env \ + --env-file /etc/litellm-agent-control-plane/runtime.env \ + -f deploy/codexgui.compose.yaml \ + config --quiet + +systemctl start litellm-agent-control-plane.service +systemctl is-active litellm-agent-control-plane.service +``` + +If a release changes a registration alias, API base, or API key, remove only +the affected exited registration container before starting the unit so Compose +recreates the idempotent job: + +```bash +docker compose \ + --project-name litellm-agent-control-plane \ + --env-file /etc/litellm-agent-control-plane/deploy.env \ + --env-file /etc/litellm-agent-control-plane/runtime.env \ + -f deploy/codexgui.compose.yaml \ + rm --stop --force register-codex +``` + +### 5. Verify the release + +First verify systemd, PostgreSQL, long-lived containers, and registration jobs: + +```bash +systemctl is-active postgresql +systemctl is-active litellm-agent-control-plane.service + +for service in lap codex opencode deepagents hermes openclaw; do + docker inspect "litellm-agent-control-plane-${service}-1" \ + --format '{{.Name}} {{.Config.Image}} {{.State.Health.Status}}' +done + +for service in codex opencode deepagents hermes openclaw; do + docker inspect "litellm-agent-control-plane-register-${service}-1" \ + --format '{{.Name}} exit={{.State.ExitCode}}' +done + +docker run --rm --network edge curlimages/curl:8.11.1 \ + --fail --silent --show-error \ + http://litellm-agent-control-plane:4000/health + +curl --fail --silent --show-error \ + https://agents.eladrave.com/health +``` + +Then perform browser acceptance at `https://agents.eladrave.com`: + +1. Confirm the runtimes page shows the expected Codex controller and saved + Codex ChatGPT profile. +2. Open an existing migrated session and confirm its user and assistant + messages render after a full page reload. +3. Create a new session using an agent attached to the Codex ChatGPT profile. +4. Prompt it to research a subject and include at least one source URL. +5. Confirm the complete assistant response and clickable source link render. +6. Confirm the new session appears in the session list, remains visible after + reload, and its runtime event stream ends in an idle/completed state. + +Container health alone is not release acceptance. At least one real agent turn +through the production browser path is required. + +For workflows that use shell tools, verify the required executables inside the +runtime container before starting acceptance. The Codex runtime image carries +the supported baseline; do not install packages during an agent session: + +```bash +docker exec litellm-agent-control-plane-codex-1 sh -lc \ + 'command -v curl git jq rg file pdfinfo pdftotext pdftoppm python3' + +docker exec litellm-agent-control-plane-codex-1 python3 -c \ + 'import pymupdf, reportlab' +``` + +The command watchdog defaults to 600 seconds. Override it only through the +non-secret deployment environment and keep it below the 30-minute LAP +sub-agent deadline: + +```text +CODEX_COMMAND_TIMEOUT_SEC=600 +``` + +## Roll back + +Keep the failed release stopped while restoring state: + +```bash +systemctl stop litellm-agent-control-plane.service +``` + +1. Restore the previous `deploy.env` from the release backup. +2. If the new application ran database migrations, restore the matching + database dump. Do not run old application code against a potentially + incompatible migrated schema. +3. Replace `/var/lib/litellm-agent-control-plane` with the matching runtime + state snapshot and restore ownership to `10001:10001`. +4. Restore the prior systemd unit if it changed, then run + `systemctl daemon-reload`. +5. Start the service and repeat every verification step, including a real + Codex ChatGPT agent turn. + +Example database restore into an empty recreated database: + +```bash +sudo -u postgres dropdb litellm_agent_control_plane +sudo -u postgres createdb \ + --owner=lap_service \ + --encoding=UTF8 \ + litellm_agent_control_plane +sudo -u postgres pg_restore \ + --exit-on-error \ + --no-owner \ + --no-privileges \ + --role=lap_service \ + --dbname=litellm_agent_control_plane \ + "$backup_dir/postgres.dump" +``` + +Dropping the database is destructive. Resolve and verify the exact backup and +target database before running those commands. + +Caddy and Cloudflare DNS do not change during an ordinary image release. If a +release also changed either one, restore their separately captured pre-change +state. Recreate only the Caddy container after replacing a bind-mounted +Caddyfile so the container sees the restored inode. + +Do not delete the previous images or release backup until the rollback window +has elapsed and production agent acceptance has passed. diff --git a/docs/engineering/managed-agent-orchestration.mdx b/docs/engineering/managed-agent-orchestration.mdx new file mode 100644 index 00000000..5be11df5 --- /dev/null +++ b/docs/engineering/managed-agent-orchestration.mdx @@ -0,0 +1,147 @@ +--- +title: "Managed agent orchestration" +description: "Design, create, and validate parent agents and platform-managed sub-agents." +--- + +# Managed agent orchestration + +Use a parent agent for workflow decisions and small, specialized child agents +for integrations or artifact production. A child runs as its own managed +session with its own system instructions, runtime, tools, MCP integrations, and +audit trail. + +## Create the children before the parent + +Create each child through `POST /api/agents`. Give it only the integrations it +needs and an explicit input/output contract. Then create or update the parent +with the child IDs in `config.sub_agents` and `run_sub_agent` in +`config.platform_mcp_ids`. + +```json +{ + "name": "Report orchestrator", + "owner_id": "operator", + "runtime": "CodexChargpt", + "model": "gpt-5.6-sol", + "system": "Coordinate the attached managed agents and validate every result.", + "tools": [], + "config": { + "runtime": "CodexChargpt", + "platform_mcp_ids": ["run_sub_agent"], + "sub_agents": [ + { "agent_id": "agent_data_child" }, + { "agent_id": "agent_report_child" }, + { "agent_id": "agent_delivery_child" } + ], + "mcp_server_ids": [] + } +} +``` + +`mcp_server_ids` is the source of truth for an agent's MCP integrations. Do +not copy a child's MCP tool definition into the parent. The platform projects +each child's configured integrations when it creates that child's session. + +The parent should call `list_sub_agents` when it needs discovery and +`run_sub_agent` for execution. It must inspect the returned `status` before +using the output. Valid terminal statuses are `completed`, `failed`, and +`timed_out`. + +## Start a parent manually + +Use `POST /api/agents/{agent_id}/run` with an optional `prompt`. For an agent +whose configuration selects a managed runtime, this endpoint creates a real +runtime session and returns its `session_id`, runtime event stream URL, and +runtime-event log URL. It does not execute the legacy local harness in the LAP +API container. The web UI's session flow reaches the same managed runtime. + +Agents without a configured managed runtime continue to use the legacy harness +run path. Do not fix a managed-runtime launch failure by adding Node, npm, or an +agent SDK to the LAP API image; route the run to its configured runtime instead. + +## Prefer file-based contracts for large results + +Large inline child responses are expensive and can be truncated or duplicated +by streaming transports. For structured workflows: + +1. The parent creates one request-scoped artifact directory. +2. It passes absolute input and output paths to each child. +3. The child writes the authoritative artifact atomically and parses it again. +4. The child returns a compact envelope containing status, path, size, and + checksum. +5. The parent independently validates the artifact before dispatching the next + child. + +Use an idempotency key for every external side effect. A delivery child should +search for an existing matching result before sending and must never retry an +ambiguous send outcome. + +## Runtime tools belong in the runtime image + +Agent shell commands run inside the selected runtime container, not in the LAP +API container. Install deterministic dependencies in the runtime image before +an agent starts. Production agents should not run `apt`, `pip install`, or +`npm install` during a workflow. + +The Codex runtime image includes this baseline: + +- shell and diagnostics: Bash, `curl`, `file`, `git`, `jq`, `procps`, and + `ripgrep` +- archives: `unzip` and `zip` +- Python: Python 3 and an isolated `/opt/codex-tools` environment +- document generation and QA: ReportLab, PyMuPDF, Poppler utilities, + Fontconfig, and DejaVu fonts + +Add a pinned build-time dependency to `templates/codex/Dockerfile` when a +repeatable workflow needs more. Rebuild the immutable runtime image and test +the import or executable during the image build. + +## Timeout ownership + +Timeout layers must be ordered so the inner layer produces the useful error: + +1. Codex local command watchdog: 600 seconds by default, configured with + `CODEX_COMMAND_TIMEOUT_SEC` +2. LAP `run_sub_agent`: 30 minutes +3. Codex platform-MCP client: 31 minutes + +When a local command never completes, the Codex runtime emits a terminal error +and interrupts the turn. If a child exceeds the platform deadline, LAP +interrupts it and returns `status: "timed_out"` with the child session ID and +error instead of leaving the parent with an opaque transport failure. + +## Parent and child instruction checklist + +For every child, define: + +- exact input fields and validation rules +- the authoritative output path or compact response schema +- which tools and MCP integrations it may use +- retry limits and which failures are safe to retry +- forbidden actions and side effects +- terminal success, partial, blocked, and failed conditions + +For the parent, define: + +- child order and any concurrency constraints +- validation between stages +- behavior for `failed` and `timed_out` child results +- whether a valid artifact may be salvaged after a child failure +- side-effect authorization, recipient or target defaults, and idempotency +- the final user-visible workflow status + +## End-to-end acceptance + +Unit tests and container health are necessary but not sufficient. Run a real +parent session and verify: + +1. Every intended child was invoked exactly as expected. +2. Every child reached a terminal event with no unresolved tool call. +3. The parent received each child result and reached its own terminal event. +4. Structured artifacts parse and binary artifacts render successfully. +5. Any external side effect is confirmed by the provider's returned ID. +6. A second invocation with the same idempotency key does not duplicate the + side effect. + +Keep the session IDs and sanitized event counts as acceptance evidence. A +terminal child without successful parent handoff is not a passing test. diff --git a/docs/engineering/upstream-release-reconciliation.md b/docs/engineering/upstream-release-reconciliation.md new file mode 100644 index 00000000..a27d8108 --- /dev/null +++ b/docs/engineering/upstream-release-reconciliation.md @@ -0,0 +1,620 @@ +# Reconcile a future upstream LACP release + +This is the mandatory procedure for adopting a newer upstream LiteLLM Agent +Control Plane (LACP) release or commit when some downstream fixes may not yet +be present upstream. It is written for a coding agent. Follow it together with +[`codexgui-deployment.mdx`](./codexgui-deployment.mdx), which covers the actual +production deployment, backup, acceptance, and rollback procedure. + +The goal is to take upstream bug fixes and improvements without losing any +behavior listed in this document. Do not merge an old downstream branch over a +new upstream tree wholesale. Start from the chosen upstream commit, determine +which behaviors it already implements, and port only what is still missing. + +## Non-negotiable rules + +- Work from an exact upstream commit SHA, never a floating tag or `latest` + image. +- Use a fresh branch and worktree. Do not reconcile a release in the production + checkout. +- Treat tests and observable behavior as authoritative. A matching commit + title, file name, HTTP 200, healthy container, or completed parent session is + not proof of equivalence. +- Preserve production database data, runtime state, environment files, + encryption keys, browser profiles, and Caddy configuration. +- Never commit credentials, production environment contents, authentication + state, private host keys, or a real delivery recipient. +- Keep provider-specific behavior behind its provider/runtime boundary. Follow + [`CODING_STANDARDS.md`](../../CODING_STANDARDS.md). +- Do not declare a release ready while a required test is skipped. Record the + skip as a blocker or run it in an environment that has the dependency. +- Do not send a real email or cause another external side effect during routine + pre-production testing. Use a sink, dry-run mode, or a dedicated controlled + acceptance recipient. Production side-effect acceptance must be intentional + and exactly once. + +## Required inputs and final evidence + +Before editing, obtain and record: + +1. The exact upstream repository URL, release/tag name, and full commit SHA. +2. The current downstream and production full commit SHAs and immutable image + tags or digests. +3. The current status and head SHA of every pull request in the fix inventory + below. Pull request heads can move; the SHAs in this document are the + reviewed baseline as of 2026-08-10, not permanent aliases. +4. A disposable PostgreSQL connection for integration tests. Never point + `TEST_DATABASE_URL` at production. +5. The test credentials and non-production endpoints needed for real Codex, + MCP, browser, finance, PDF, and email-sink acceptance. + +The completed release record must contain: + +- upstream release name and full SHA +- reconciled downstream full SHA +- a disposition and evidence row for every fix in this document +- all test commands and pass/fail counts +- built image tags and digests +- sanitized end-to-end session IDs and provider delivery ID, when applicable +- known deviations, with an owner and explicit acceptance decision +- the production backup path, checksum verification, prior image tags, and + rollback result after deployment + +## Create an isolated reconciliation branch + +Confirm remote ownership rather than assuming that `origin` means upstream: + +```bash +git remote -v +git fetch origin --prune --tags +git fetch fork --prune +git status --short +git rev-parse HEAD +git rev-parse ^{commit} +``` + +The status must be clean. Create a separate worktree from the exact upstream +SHA, then enable the committed hooks: + +```bash +git worktree add \ + -b codex/reconcile- \ + /root/git/litellm-agent-control-plane-reconcile- \ + + +cd /root/git/litellm-agent-control-plane-reconcile- +git config core.hooksPath .githooks +git rev-parse HEAD +``` + +Do not begin with a merge of a previous integration branch. The new upstream +tree is the base. + +## Fix inventory and behavioral contracts + +Refresh each linked pull request before using this inventory. A fix can be +marked absorbed only after inspecting the new upstream implementation and +running the corresponding regression and acceptance tests. + +### PR 493: large managed-runtime session replay + +- Pull request: [#493](https://github.com/LiteLLM-Labs/litellm-agent-control-plane/pull/493) +- Reviewed head: `600cc239` (`Fix large runtime session replay`) +- Principal files: + `src/db/managed_agents/runtime_events/repository.rs`, + `src/http/sessions/runtime_events_api.rs`, + `src/http/sessions/runtime_events_reconcile.rs`, + `src/ui/src/app/chat/page.tsx`, `src/ui/src/components/sidebar.tsx`, and + `src/ui/e2e/runtime-history-replay.spec.ts` + +Behavior that must survive: + +- Runtime-event history is loaded in a bounded bulk database operation rather + than one decrypt/query operation per event. +- A completed history is stable: UI loading is deterministic, the provider is + not fetched repeatedly, callbacks are not replayed, and each message is + rendered once. +- A large response split across at least 1,100 fragments reconstructs exactly + once after a full reload. +- Runtime aliases remain correct in the session list. +- Recent sessions and the completed response remain accessible on a narrow + mobile viewport. + +Required regression: + +```bash +( + cd src/ui + npx playwright test e2e/runtime-history-replay.spec.ts +) +``` + +Both `replays a large completed runtime history exactly once` and `makes +recent sessions accessible in the mobile sidebar` must pass. Also inspect the +browser network log and confirm the history endpoint is requested once during +the tested load. + +### PR 494: Codex API, ChatGPT, and remote SSH runtimes + +- Pull request: [#494](https://github.com/LiteLLM-Labs/litellm-agent-control-plane/pull/494) +- Reviewed head: `ded09ead` +- Reviewed stack, oldest first: `816bb17b`, `20d4f1bd`, `c8fc56ad`, + `0acec55e`, `2afc5177`, `c9755187`, `91d826c6`, `ce501946`, `ded09ead` +- Principal areas: `templates/codex/`, runtime-controller HTTP routes, + runtime-profile UI and E2E tests, `deploy/codexgui.compose.yaml`, + `deploy/litellm-agent-control-plane.service`, and + `docs/engineering/codexgui-deployment.mdx` + +Behavior that must survive: + +- Codex is a first-class `claude_managed_agents` compatible runtime, with API, + ChatGPT-account, and remote-SSH profiles selected through a controller. +- Runtime resolution goes through the configured controller/profile. It must + not hardcode one Codex profile into provider-generic code. +- Profile APIs return masked metadata, never stored secrets. Sensitive profile + values are encrypted at rest with authenticated encryption and use the + stable production master key. +- ChatGPT mode uses the native account/model RPCs and persists its Codex + authentication under the bind-mounted runtime state. Recreating a container + must not silently sign the account out. +- Remote SSH validates the executable name, pins/verifies the host key, and + does not convert an untrusted string into a shell command. +- Streamed Codex deltas have unique runtime event IDs while preserving their + Codex item ID for correlation. Replay must not duplicate the final message. +- The runtime image runs as a non-root user and contains its required tools at + build time. Agents must not install packages during a run. +- The Codex image baseline includes Bash, `curl`, `file`, `git`, `jq`, + `procps`, `rg`, `unzip`, `zip`, Python 3, ReportLab, PyMuPDF, Poppler, + Fontconfig, and DejaVu fonts. +- Production uses immutable image tags, persistent state mounts, supervised + health, scoped registration jobs, root-only backups, and a data-preserving + rollback. `docker compose down -v` is forbidden. + +Minimum targeted checks: + +```bash +npm ci --prefix templates/codex --no-audit --no-fund +npm test --prefix templates/codex + +npm ci --prefix src/ui --no-audit --no-fund +( + cd src/ui + npx playwright test \ + e2e/codex-runtime-profiles.spec.ts \ + e2e/runtime-dropdown.spec.ts \ + e2e/runtime-session-reply.spec.ts +) +``` + +Build the Codex image as well. The build must validate its pinned Python +imports and must not rely on packages installed on the developer host. + +### PR 495: stateful MCP tool discovery + +- Pull request: [#495](https://github.com/LiteLLM-Labs/litellm-agent-control-plane/pull/495) +- Reviewed head: `82606b51` (`Fix stateful MCP tool discovery`) +- Principal files: `src/http/mcp_registry/discover.rs` and + `src/http/mcp_registry/tools.rs` + +Behavior that must survive: + +- Discovery performs the complete Streamable HTTP MCP lifecycle: + `initialize`, the `notifications/initialized` notification, `tools/list`, + and session termination. +- The client carries the returned MCP session ID and negotiated protocol + version on subsequent requests. +- Both JSON and SSE responses work. +- Configured authentication and static headers reach the MCP server without + leaking into logs or error bodies. +- Discovery returns the actual tool list. An initialize-only HTTP 200 is not a + passing result. + +Required regression: + +```bash +cargo test --locked discovers_tools_with_a_stateful_mcp_session +``` + +For every production MCP used by the workflow, also perform a real discovery +and one harmless tool call. Parse the JSON-RPC result and fail acceptance when +the response contains `isError: true`, even if the HTTP status is 200. + +### PR 496: Codex MCP bridge and authoritative managed orchestration + +- Pull request: [#496](https://github.com/LiteLLM-Labs/litellm-agent-control-plane/pull/496) +- Reviewed head: `6e9a8a75` +- Apply/port after PR 494 because it extends that Codex runtime. +- Reviewed stack after PR 494, oldest first: `f18aafbd`, `6d20ddba`, + `a576e500`, `17b0f7ab`, `9f3caf61`, `53de509d`, `825bf94c`, + `fb84e875`, `2e4cd9e6`, `9b1cc850`, `6e9a8a75` +- Principal files: `templates/codex/src/codex-app-server.mjs`, + `templates/codex/scripts/verify-platform-routing.mjs`, + `src/http/platform_mcps/`, `src/sdk/agents/events.rs`, + `src/http/managed_agents/runs/create.rs`, and + [`managed-agent-orchestration.mdx`](./managed-agent-orchestration.mdx) + +Behavior that must survive: + +- An agent's resolved MCP definitions are forwarded in Codex `thread/start`. +- The gateway credential is supplied by environment variable only to the + trusted platform MCP definition after validating its expected origin and + route. Platform traffic is rewritten to the private control-plane network; + arbitrary external MCP definitions never receive the credential. +- MCP notifications are accepted without a JSON-RPC response; HTTP 202 is a + valid notification result. +- Platform-managed Codex threads use LAP's `list_sub_agents` and + `run_sub_agent` as the sole delegation mechanism. Native Codex collaboration + is disabled only for those platform-managed threads, not for ordinary Codex + use. +- Managed MCP threads set account apps off so a connected ChatGPT account + cannot expose a second, ungoverned tool path. +- The LAP child timeout is 30 minutes and the Codex platform-MCP client timeout + is 31 minutes. The local Codex command watchdog defaults to 600 seconds and + must remain below the LAP deadline. +- SSE parsing buffers raw bytes across transport chunks. A multibyte UTF-8 + character split between chunks must decode without replacement or failure. +- A stalled Codex command is interrupted and produces a terminal error rather + than leaving the child and parent indefinitely active. +- Manual `POST /api/agents/{agent_id}/run` launches the agent's configured + managed runtime. It does not fall back to a legacy local harness merely + because the run was started manually. +- `run_sub_agent` returns the child session ID, terminal status, and only the + final assistant item selected by item ID. Streaming commentary fragments or + earlier messages must not be presented as the final child result. +- A child stream ending unexpectedly, an error event, `failed`, or `timed_out` + must not be converted into successful parent completion. +- The Codex image build runs the platform-routing verifier. The verifier proves + that an ordinary thread retains native collaboration while a managed thread + exposes only the governed platform path and has account apps disabled. + +Minimum targeted checks: + +```bash +cargo test --locked streaming_parser_buffers_split_utf8_code_points +cargo test --locked returns_structured_timeout_for_a_stalled_child +cargo test --locked preserves_child_text_and_terminal_failure +cargo test --locked rejects_a_stream_that_ends_without_a_terminal_event +cargo test --locked returns_only_the_final_agent_message_item + +npm ci --prefix templates/codex --no-audit --no-fund +npm test --prefix templates/codex +``` + +The following Codex tests are especially important and must remain present or +be replaced by equivalent coverage: + +- forwards the stored agent MCP servers when creating a Codex thread +- authenticates only the trusted platform MCP with the gateway credential +- routes a trusted platform MCP over the private control-plane network +- disables native Codex collaboration for LAP platform MCP threads +- refuses to expose the gateway credential to an untrusted platform MCP +- rejects invalid MCP definitions before starting a Codex thread +- interrupts a command that never emits `item/completed` +- clears the command watchdog after `item/completed` +- ChatGPT mode uses native account and model RPCs without an API provider + +Do not run `verify-platform-routing.mjs` against an arbitrary host Codex +binary. Build `templates/codex/Dockerfile`; the build runs it against the +pinned runtime binary and fails if its assumptions no longer hold. + +### PR 497: concurrent managed-runtime event sequencing + +- Pull request: [#497](https://github.com/LiteLLM-Labs/litellm-agent-control-plane/pull/497) +- Reviewed head: `caca7217` (`Serialize managed runtime event sequences`) +- Principal files: + `src/db/managed_agents/runtime_events/repository.rs` and + `tests/managed_agents_api.rs` + +Behavior that must survive: + +- Allocating the next per-session event sequence is serialized inside the + PostgreSQL transaction. Concurrent writers for one session cannot choose the + same `MAX(seq) + 1` value. +- The lock is scoped to one session and one transaction; it must not globally + serialize unrelated sessions. +- A burst of at least 32 concurrent appends succeeds, persists 32 distinct + ordered events, and does not raise + `LiteLLM_ManagedAgentRuntimeEventsTable_session_id_seq_key`. + +Required regression against a disposable PostgreSQL database: + +```bash +TEST_DATABASE_URL= \ + cargo test --locked --test managed_agents_api \ + runtime_event_appends_are_serialized_per_session -- --exact +``` + +SQLite, a mocked repository, or a sequential test is not an acceptable +substitute for this concurrency regression. + +### Repository MCP attachment invariant + +This invariant is also mandatory even if its implementation is reorganized: + +- `mcp_server_ids` in `AgentDraft` is the sole source of truth. +- `createInputFromDraft` removes stale `mcp_toolset` entries from + `draft.tools`, resolves the selected server IDs, and appends only fresh + toolsets for known integrations. +- Backend `integration_mcp_toolsets` drops any toolset whose + `mcp_server_name` is absent from the resolved `mcp_servers` list. + +Run the focused frontend and backend tests for these functions, then create an +agent in the UI, add and remove an MCP, save it, reload it, and confirm that +the persisted MCP servers and toolsets exactly match the final selection. If +the future upstream tree does not contain direct unit coverage for this source +of truth, add it as part of reconciliation; UI acceptance alone is not enough. + +## Classify each fix before porting code + +Create a release ledger with one row for each PR and each repository invariant: + +| Fix | Upstream evidence | Classification | Action | Regression | Result | +| --- | --- | --- | --- | --- | --- | +| #493 | files and tests | missing | port | replay E2E | pass | + +Use these classifications: + +- **Absorbed:** the reviewed change or a direct descendant is upstream and the + regression passes. +- **Equivalent:** upstream uses a different implementation but every listed + behavioral contract and regression passes. Cite the replacement files and + tests. +- **Missing:** the behavior or its regression is absent. Port the smallest + coherent change. +- **Obsolete:** upstream intentionally removed or replaced the feature. This + requires written evidence, an updated acceptance contract, and explicit + operator approval; lack of a merge is not evidence of obsolescence. + +Useful comparisons: + +```bash +git branch -r --contains +git log --cherry-pick --right-only --no-merges \ + ... +git range-diff \ + .. \ + .. +git show | git patch-id --stable +``` + +Patch IDs help find exact or rebased patches, but they do not recognize a +different implementation with equivalent behavior. Conversely, a matching +test name does not prove the test still asserts the required failure mode. +Read both implementation and assertions. + +## Porting order and conflict policy + +Use this dependency order unless new upstream architecture requires a smaller +equivalent port: + +1. Start from the exact new upstream commit. +2. Reconcile independent data/protocol fixes: PR 493, PR 495, and PR 497. +3. Reconcile the Codex runtime/controller and deployment base from PR 494. +4. Reconcile the Codex platform-MCP/orchestration extensions from PR 496. +5. Reconcile the MCP attachment invariant and any upstream changes that touch + the same UI/backend boundary. +6. Run the full validation matrix before creating or updating a pull request. + +When a cherry-pick conflicts: + +- Keep the new upstream structure and reimplement the behavioral contract at + the new owner. Do not preserve dead architecture merely to make a patch + apply. +- Inspect schema and migration changes before adapting repository code. Never + assume a table, unique index, or JSON column retained its old name. +- Keep HTTP handlers limited to protocol work and place provider-specific + behavior in the provider/runtime implementation. +- Revalidate credential boundaries after any change to URL resolution, + proxies, headers, or MCP configuration. +- Preserve stable encrypted state and profile compatibility or provide an + explicit, tested migration and rollback path. +- Keep each port focused. Do not mix generated model-price changes with a + behavioral fix unless the hook updates them during commit; review that diff + separately. +- If a regression no longer fits the architecture, rewrite it before marking + the behavior equivalent. Do not delete it without replacement. + +## Full pre-merge validation matrix + +Run from a clean reconciliation worktree. Use the toolchain pinned by the +repository or its containers. The Codex package requires Node 20 or newer; +native dependencies such as `better-sqlite3` can fail under the wrong ABI. + +### Repository and diff hygiene + +```bash +git status --short +git diff --check ...HEAD +git diff --stat ...HEAD +git log --oneline --decorate ..HEAD +``` + +Review every changed environment, Compose, Caddy, profile, authentication, and +deployment file for embedded secrets and environment-specific values. Confirm +that only placeholders and variable names are committed. The final status must +be clean and the reviewed full SHA must equal the built SHA. + +### Rust gateway + +```bash +cargo fmt --check +cargo clippy --all-targets --locked -- -D warnings +cargo test --release --locked +``` + +Then run the PR 495, PR 496, and PR 497 focused tests listed above. PR 497 must +use disposable PostgreSQL 16 or the production major version, not an implicit +skip. If the host lacks Rust, use a pinned Rust builder container and preserve +the exact command and image digest in the release record. + +### UI + +```bash +npm ci --prefix src/ui --no-audit --no-fund +npm run lint --prefix src/ui +npm run build --prefix src/ui +( + cd src/ui + npx playwright test +) +``` + +At minimum, retain explicit coverage for large history replay, mobile session +access, runtime profile creation, connected-runtime selection, disconnected +runtime fallback, and managed-runtime replies. Playwright requires a started +test UI. Use its default `http://localhost:3210` or set +`PLAYWRIGHT_BASE_URL` to the isolated test deployment; never aim E2E tests that +mutate state at production. + +### Runtime packages and images + +Run every runtime package's committed tests, including at least: + +```bash +npm ci --prefix templates/codex --no-audit --no-fund +npm test --prefix templates/codex +npm ci --prefix templates/opencode --no-audit --no-fund +npm test --prefix templates/opencode +``` + +Build every changed image using the commands and immutable tags in +[`codexgui-deployment.mdx`](./codexgui-deployment.mdx). Build Codex without +bypassing its routing verifier. After starting the test stack, check the +runtime contents rather than assuming Dockerfile steps succeeded: + +```bash +docker exec sh -lc \ + 'command -v curl git jq rg file pdfinfo pdftotext pdftoppm python3 unzip zip' +docker exec python3 -c 'import pymupdf, reportlab' +``` + +Verify that containers run as the intended non-root user, persistent mounts +resolve to the intended test paths, health checks pass, and registration jobs +exit successfully. Render the Compose configuration with test placeholder +values and inspect it before starting anything. + +## Protocol and end-to-end acceptance + +Unit tests are necessary but do not cover the production boundaries that +failed previously. Perform these checks before deployment against a test stack +and repeat the production-safe subset after deployment. + +### Stateful MCP and remote browser + +For each stateful MCP, especially the remote browser: + +1. Execute `initialize` and record the negotiated protocol version and session + header without recording credentials. +2. Send `notifications/initialized` using the same session. +3. Call `tools/list` and assert that the expected browser tools are present. +4. Call a harmless tool such as a page snapshot against a deterministic test + page. +5. Inspect the JSON-RPC tool result and require `isError` to be absent or + false. HTTP 200 alone is insufficient. +6. Terminate the MCP session and confirm the server releases it. +7. Repeat through the public proxied route and, where available, directly + through the origin/private route. A difference isolates proxy/CDN behavior + from the MCP container and browser lifecycle. + +Also verify the external remote-browser service's own functional health check. +A TCP check, MCP initialize response, container health, or browser process +alone does not prove that a browser tool can create/use a page successfully. + +### Parent/child orchestration + +Create or use a non-production parent with at least two children and the same +runtime/MCP topology as the real workflow: + +1. Start the parent manually through `POST /api/agents/{agent_id}/run` and + capture its session ID. +2. Confirm it discovers children through `list_sub_agents` and invokes only + governed `run_sub_agent` tools. +3. Run two children concurrently to exercise per-session event allocation. +4. Include a browser child, a data/finance child, and an artifact/PDF child if + those exist in the production workflow. +5. Include non-ASCII text whose UTF-8 bytes can cross SSE chunks. +6. Confirm every child has a distinct session, reaches a real terminal status, + has no unresolved tool call, and returns the final assistant item rather + than commentary. +7. Confirm the parent receives each terminal result, rejects `failed` and + `timed_out` children, and reaches its own terminal event only after required + children succeed. +8. Query durable runtime events by the event JSON `type` as well as any + denormalized column; do not assume the denormalized value is populated for + every historical producer. +9. Confirm no duplicate `(session_id, seq)` values and no duplicate final + message are present. + +There is no guaranteed durable parent-child foreign key in older deployments. +Correlate using the `run_sub_agent` tool event, child session ID returned by +the tool, agent ID, and timestamps. Parent completion alone is not success. + +### Artifact and delivery acceptance + +For a report workflow: + +1. Verify every required source/reconciliation section independently. Do not + silently substitute amount similarity for missing merchant evidence. +2. Open the generated PDF, render its pages, and inspect content and page + count. File existence and a successful PDF library call are insufficient. +3. Validate the parent consumed the final artifact, not a stale path or an + earlier draft. +4. In pre-production, deliver to a sink and assert one message, the intended + subject/body, and the exact attachment checksum. +5. For controlled production acceptance, use one explicit recipient and an + idempotency key. Before retrying an ambiguous send, search the provider for + the existing message. Record the provider message ID and prove that a second + invocation with the same key does not send a duplicate. + +The user-facing result must say whether all source reconciliations succeeded, +whether delivery was attempted, and whether the provider confirmed it. A +generated PDF is not proof of delivery, and a parent marked completed is not +proof that either happened. + +## Production release and rollback gates + +Only after the reconciliation ledger and all applicable tests pass: + +1. Commit the reviewed tree and push the reconciliation branch. +2. Open a pull request whose body includes the ledger, test evidence, upstream + and downstream full SHAs, schema/migration impact, deployment order, and + rollback plan. +3. Require review of security-sensitive credential, MCP, SSH, Compose, and + persistence changes. +4. Build immutable images from the reviewed commit and record their digests. +5. Follow every backup, activation, real-browser acceptance, and rollback step + in [`codexgui-deployment.mdx`](./codexgui-deployment.mdx). + +Stop and roll back when any of these occurs: + +- a required migration fails or old data cannot be read +- a runtime profile or persistent ChatGPT authentication disappears +- any required container restarts repeatedly or a registration job fails +- stateful MCP discovery or a real browser tool call fails +- a child fails while the parent reports success +- runtime event sequence uniqueness is violated +- the final report is incomplete, duplicated, or not renderable +- delivery is missing, ambiguous, or duplicated + +Do not delete prior images or the release backup until the rollback window has +elapsed and a complete production workflow has passed. + +## Definition of done + +A future upstream release is reconciled only when all of the following are +true: + +- Every fix and invariant in this document has an evidence-backed disposition. +- Missing behavior was ported as focused commits onto the new upstream base. +- Full Rust, UI, runtime, image-build, PostgreSQL-concurrency, MCP protocol, + browser, parent/child, artifact, and controlled delivery checks applicable to + the release passed. +- No required check was silently skipped and no real secret entered the diff or + logs. +- The reconciled commit and image digests are immutable and recorded. +- Production backup and rollback artifacts were verified before activation. +- Production acceptance inspected every required child and actual tool result, + not only the parent status and health endpoints. +- The worktree is clean, the pushed SHA matches the reviewed SHA, and the + release record contains enough sanitized evidence for another operator to + reproduce the decision. diff --git a/readme.md b/readme.md index d0c8935b..8d05bff1 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # LiteLLM Agent Control Plane -1 place to call all your agents - OpenCode, Hermes, Claude +1 place to call all your agents - Codex, OpenCode, Hermes, Claude Managed Agents, Cursor Agents API, Deep Agents. [![Discord](https://img.shields.io/badge/Discord-Chat-5865F2?logo=discord&logoColor=white)](https://discord.gg/Nkxw3rm3EE) @@ -45,11 +45,12 @@ To start other template runtime profiles and add them to the UI automatically: docker compose --profile deepagents up docker compose --profile hermes up docker compose --profile openclaw up +docker compose --profile codex up docker compose --profile opencode --profile deepagents up ``` -Profiles register `local-opencode`, `local-deepagents`, `local-hermes`, and -`local-openclaw` +Profiles register `local-codex`, `local-opencode`, `local-deepagents`, +`local-hermes`, and `local-openclaw` through the LAP API after the services are healthy. Add provider credentials in Settings before running agents against a hosted model provider. @@ -73,6 +74,7 @@ Select your agent and the runtime you want to run it on. - Claude Managed Agents - Cursor Agents API +- Codex app-server - OpenCode Agents - OpenClaw Agents - Deep Agents diff --git a/src/http/managed_agents/runs/create.rs b/src/http/managed_agents/runs/create.rs index 9c7dd315..366cf464 100644 --- a/src/http/managed_agents/runs/create.rs +++ b/src/http/managed_agents/runs/create.rs @@ -8,11 +8,14 @@ use axum::{ use crate::{ db::managed_agents::{ - registry, + registry::{self, schema::ManagedAgentRow}, runs::{repository, schema::CreateRun}, }, errors::GatewayError, - http::agents::{has_configured_agent, parse_run_agent_request, start_configured_agent_run}, + http::{ + agents::{has_configured_agent, parse_run_agent_request, start_configured_agent_run}, + sessions::{create_runtime_session_for_agent_without_prompt, enqueue_prompt_text}, + }, proxy::{auth::master_key::require_any_gateway_key, state::AppState}, }; @@ -47,6 +50,17 @@ pub async fn create( .or_else(|| agent.prompt.clone()) .filter(|prompt| !prompt.trim().is_empty()) .unwrap_or_else(|| "Proceed with your task.".to_owned()); + if let Some(runtime) = runtime_from_agent(&agent) { + return start_runtime_session( + state.clone(), + pool.clone(), + agent_id, + agent, + prompt, + runtime, + ) + .await; + } let run = repository::create(pool, &agent_id, agent.session_id.clone(), input).await?; state.agent_runs.track_run(&agent_id, &run.id); spawn_managed_agent_run( @@ -74,3 +88,62 @@ pub async fn create( })?), )) } + +async fn start_runtime_session( + state: Arc, + pool: sqlx::PgPool, + agent_id: String, + agent: ManagedAgentRow, + prompt: String, + runtime: String, +) -> Result<(StatusCode, Json), GatewayError> { + let session_id = create_runtime_session_for_agent_without_prompt( + state.clone(), + &pool, + agent_id.clone(), + runtime, + format!("{} run", agent.name), + serde_json::json!({}), + ) + .await?; + let prompt_session_id = session_id.clone(); + let prompt_agent_id = agent_id.clone(); + tokio::spawn(async move { + if let Err(error) = + enqueue_prompt_text(state, pool, &prompt_session_id, prompt, agent.model).await + { + tracing::warn!( + agent_id = %prompt_agent_id, + session_id = %prompt_session_id, + "manual managed-agent runtime prompt failed: {error}" + ); + } + }); + Ok(( + StatusCode::ACCEPTED, + Json(serde_json::to_value(RunCreateResponse { + run_id: session_id.clone(), + agent_id, + session_id: session_id.clone(), + status: "starting".to_owned(), + event_url: format!("/v1/sessions/{session_id}/events/stream"), + logs_url: format!("/session/{session_id}/runtime_events/list"), + })?), + )) +} + +fn runtime_from_agent(agent: &ManagedAgentRow) -> Option { + agent + .config + .get("runtime") + .and_then(serde_json::Value::as_str) + .map(str::trim) + .filter(|runtime| !runtime.is_empty()) + .map(str::to_owned) + .or_else(|| { + let harness = agent.harness.trim(); + crate::sdk::providers::runtime_registry() + .entry_for_id(harness) + .map(|_| harness.to_owned()) + }) +} diff --git a/src/http/platform_mcps/definitions.rs b/src/http/platform_mcps/definitions.rs index c3724229..0b993fbe 100644 --- a/src/http/platform_mcps/definitions.rs +++ b/src/http/platform_mcps/definitions.rs @@ -82,7 +82,7 @@ fn list_sub_agents_tool() -> Value { fn run_sub_agent_tool() -> Value { json!({ "name": RUN_SUB_AGENT_MCP_ID, - "description": "Run one of this agent's configured LAP sub-agents. Only agent IDs attached to this parent agent are allowed. Use list_sub_agents first when you need the attached agents' names.", + "description": "Run one of this agent's configured LAP sub-agents and wait for its terminal result. Only agent IDs attached to this parent agent are allowed. Use list_sub_agents first when you need the attached agents' names. The returned status is completed, failed, or timed_out; inspect it and the error field before using output. A run can take up to 30 minutes; do not retry while this call is still in progress.", "inputSchema": { "type": "object", "properties": { diff --git a/src/http/platform_mcps/mod.rs b/src/http/platform_mcps/mod.rs index 6fb85731..6c1e9a82 100644 --- a/src/http/platform_mcps/mod.rs +++ b/src/http/platform_mcps/mod.rs @@ -2,7 +2,8 @@ use std::sync::Arc; use axum::{ extract::{Path, Query, State}, - http::HeaderMap, + http::{HeaderMap, StatusCode}, + response::{IntoResponse, Response}, Json, }; use serde::Deserialize; @@ -112,8 +113,11 @@ pub async fn serve( Path(agent_id): Path, Query(query): Query, Json(request): Json, -) -> Result, GatewayError> { +) -> Result { require_any_gateway_key(&headers, &state).await?; + if let Some(status) = notification_status(&request) { + return Ok(status.into_response()); + } let pool = state.db.as_ref().ok_or(GatewayError::MissingDatabase)?; let response = match request.method.as_str() { "initialize" => initialize_response(request.id), @@ -124,7 +128,9 @@ pub async fn serve( }), "tools/call" => { let Some(params) = request.params else { - return Ok(Json(rpc_error(request.id, -32602, "params are required"))); + return Ok( + Json(rpc_error(request.id, -32602, "params are required")).into_response() + ); }; let result = call_tool( state.clone(), @@ -136,14 +142,13 @@ pub async fn serve( .await?; json!({ "jsonrpc": "2.0", "id": request.id, "result": result }) } - "notifications/initialized" => json!({ - "jsonrpc": "2.0", - "id": request.id, - "result": {} - }), _ => rpc_error(request.id, -32601, "method not found"), }; - Ok(Json(response)) + Ok(Json(response).into_response()) +} + +fn notification_status(request: &JsonRpcRequest) -> Option { + request.id.is_none().then_some(StatusCode::ACCEPTED) } async fn call_tool( @@ -259,3 +264,30 @@ pub struct JsonRpcRequest { pub struct PlatformMcpQuery { pub session_id: Option, } + +#[cfg(test)] +mod tests { + use super::{notification_status, JsonRpcRequest}; + use axum::http::StatusCode; + + #[test] + fn accepts_json_rpc_notifications_without_a_response_body() { + let notification: JsonRpcRequest = serde_json::from_value(serde_json::json!({ + "jsonrpc": "2.0", + "method": "notifications/initialized" + })) + .unwrap(); + let request: JsonRpcRequest = serde_json::from_value(serde_json::json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize" + })) + .unwrap(); + + assert_eq!( + notification_status(¬ification), + Some(StatusCode::ACCEPTED) + ); + assert_eq!(notification_status(&request), None); + } +} diff --git a/src/http/platform_mcps/tools.rs b/src/http/platform_mcps/tools.rs index 43ee15eb..35587311 100644 --- a/src/http/platform_mcps/tools.rs +++ b/src/http/platform_mcps/tools.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::{sync::Arc, time::Duration}; use futures_util::StreamExt; use serde_json::{json, Value}; @@ -8,11 +8,15 @@ use crate::{ db::managed_agents::{memory, registry}, errors::GatewayError, proxy::state::AppState, - sdk::agents::{AgentEvent, AgentEventKind, AgentEventPayload}, + sdk::agents::{AgentEvent, AgentEventKind, AgentEventPayload, AgentEventStream}, }; use super::{required_str, sub_agent_ids}; +const SUB_AGENT_RUN_TIMEOUT: Duration = Duration::from_secs(30 * 60); +const SUB_AGENT_STREAM_CONNECT_TIMEOUT: Duration = Duration::from_secs(30); +const SUB_AGENT_INTERRUPT_TIMEOUT: Duration = Duration::from_secs(10); + pub async fn agent_memory( pool: &PgPool, agent_id: &str, @@ -95,7 +99,8 @@ pub async fn run_sub_agent( "runtime": runtime, "session_id": session_id, "status": output.status, - "output": output.text + "output": output.text, + "error": output.error })) } @@ -148,6 +153,7 @@ fn child_runtime(agent: ®istry::schema::ManagedAgentRow) -> String { struct SubAgentOutput { status: &'static str, text: String, + error: Option, } async fn collect_sub_agent_output( @@ -155,26 +161,83 @@ async fn collect_sub_agent_output( pool: &PgPool, session_id: &str, ) -> Result { - let mut stream = - crate::http::sessions::runtime_event_stream_for_session(state, pool, session_id).await?; + let stream = tokio::time::timeout( + SUB_AGENT_STREAM_CONNECT_TIMEOUT, + crate::http::sessions::runtime_event_stream_for_session(state, pool, session_id), + ) + .await; + let output = match stream { + Ok(stream) => collect_sub_agent_stream(stream?, SUB_AGENT_RUN_TIMEOUT).await?, + Err(_) => SubAgentOutput { + status: "timed_out", + text: String::new(), + error: Some(format!( + "sub-agent event stream did not connect within {} seconds", + SUB_AGENT_STREAM_CONNECT_TIMEOUT.as_secs() + )), + }, + }; + if output.status == "timed_out" { + let _ = tokio::time::timeout( + SUB_AGENT_INTERRUPT_TIMEOUT, + crate::http::sessions::interrupt_runtime_session(state, pool, session_id), + ) + .await; + } + Ok(output) +} + +async fn collect_sub_agent_stream( + mut stream: AgentEventStream, + timeout: Duration, +) -> Result { let mut text = String::new(); - let status: Result<&'static str, GatewayError> = - tokio::time::timeout(std::time::Duration::from_secs(300), async { - while let Some(event) = stream.next().await { - let event = event.map_err(|error| GatewayError::SandboxError(error.to_string()))?; - match event.kind() { - AgentEventKind::AgentMessage => text.push_str(&message_text(&event)), - AgentEventKind::SessionStatusIdle => return Ok("completed"), - AgentEventKind::SessionError => return Ok("failed"), - _ => {} + let mut message_item_id: Option = None; + let terminal = tokio::time::timeout(timeout, async { + while let Some(event) = stream.next().await { + let event = event.map_err(|error| GatewayError::SandboxError(error.to_string()))?; + match event.kind() { + AgentEventKind::AgentMessage => { + let next_item_id = agent_message_item_id(&event); + if next_item_id != message_item_id { + text.clear(); + message_item_id = next_item_id; + } + text.push_str(&message_text(&event)); + } + AgentEventKind::SessionStatusIdle => { + return Ok::<(&'static str, Option), GatewayError>(("completed", None)) } + AgentEventKind::SessionError => { + return Ok(("failed", Some(session_error_message(&event)))) + } + _ => {} } - Ok("completed") - }) - .await - .map_err(|_| GatewayError::SandboxError("sub-agent run timed out".to_owned()))?; - let status = status?; - Ok(SubAgentOutput { status, text }) + } + Ok(( + "failed", + Some("sub-agent event stream ended without a terminal event".to_owned()), + )) + }) + .await; + match terminal { + Ok(result) => { + let (status, error) = result?; + Ok(SubAgentOutput { + status, + text, + error, + }) + } + Err(_) => Ok(SubAgentOutput { + status: "timed_out", + text, + error: Some(format!( + "sub-agent run timed out after {} seconds", + timeout.as_secs() + )), + }), + } } fn message_text(event: &AgentEvent) -> String { @@ -188,3 +251,132 @@ fn message_text(event: &AgentEvent) -> String { .collect::>() .join("") } + +fn agent_message_item_id(event: &AgentEvent) -> Option { + event + .data + .get("item_id") + .and_then(Value::as_str) + .map(str::trim) + .filter(|item_id| !item_id.is_empty()) + .map(str::to_owned) +} + +fn session_error_message(event: &AgentEvent) -> String { + event + .data + .get("error") + .and_then(|error| { + error + .get("message") + .and_then(Value::as_str) + .or_else(|| error.as_str()) + }) + .unwrap_or("sub-agent run failed") + .to_owned() +} + +#[cfg(test)] +mod tests { + use futures_util::stream; + use serde_json::{json, Map}; + + use crate::sdk::agents::{AgentEvent, AgentSdkError}; + + use super::*; + + fn event(event_type: &str, data: Value) -> AgentEvent { + AgentEvent::new( + event_type, + data.as_object().cloned().unwrap_or_else(Map::new), + ) + } + + #[tokio::test] + async fn returns_structured_timeout_for_a_stalled_child() { + let pending = stream::pending::>(); + let output = collect_sub_agent_stream(Box::pin(pending), Duration::from_millis(10)) + .await + .unwrap(); + + assert_eq!(output.status, "timed_out"); + assert_eq!(output.text, ""); + assert_eq!( + output.error.as_deref(), + Some("sub-agent run timed out after 0 seconds") + ); + } + + #[tokio::test] + async fn preserves_child_text_and_terminal_failure() { + let events = stream::iter(vec![ + Ok(event( + "agent.message", + json!({"content": [{"type": "text", "text": "partial result"}]}), + )), + Ok(event( + "session.error", + json!({"error": {"message": "command timed out"}}), + )), + ]); + let output = collect_sub_agent_stream(Box::pin(events), Duration::from_secs(1)) + .await + .unwrap(); + + assert_eq!(output.status, "failed"); + assert_eq!(output.text, "partial result"); + assert_eq!(output.error.as_deref(), Some("command timed out")); + } + + #[tokio::test] + async fn returns_only_the_final_agent_message_item() { + let events = stream::iter(vec![ + Ok(event( + "agent.message", + json!({ + "item_id": "commentary-1", + "content": [{"type": "text", "text": "Checking the source now."}] + }), + )), + Ok(event( + "agent.message", + json!({ + "item_id": "final-1", + "content": [{"type": "text", "text": "{\"status\":"}] + }), + )), + Ok(event( + "agent.message", + json!({ + "item_id": "final-1", + "content": [{"type": "text", "text": "\"complete\"}"}] + }), + )), + Ok(event( + "session.status_idle", + json!({"stop_reason": {"type": "end_turn"}}), + )), + ]); + let output = collect_sub_agent_stream(Box::pin(events), Duration::from_secs(1)) + .await + .unwrap(); + + assert_eq!(output.status, "completed"); + assert_eq!(output.text, "{\"status\":\"complete\"}"); + assert_eq!(output.error, None); + } + + #[tokio::test] + async fn rejects_a_stream_that_ends_without_a_terminal_event() { + let events = stream::iter(Vec::>::new()); + let output = collect_sub_agent_stream(Box::pin(events), Duration::from_secs(1)) + .await + .unwrap(); + + assert_eq!(output.status, "failed"); + assert_eq!( + output.error.as_deref(), + Some("sub-agent event stream ended without a terminal event") + ); + } +} diff --git a/src/http/routes.rs b/src/http/routes.rs index 211c7d95..5329dcd1 100644 --- a/src/http/routes.rs +++ b/src/http/routes.rs @@ -86,6 +86,34 @@ fn api_routes() -> Router> { put(crate::http::runtime_harnesses::update) .delete(crate::http::runtime_harnesses::delete_harness), ) + .route( + "/api/codex-connections", + post(crate::http::runtime_harnesses::create_codex_connection), + ) + .route( + "/api/codex-connections/{controller_alias}", + get(crate::http::runtime_harnesses::list_codex_connections), + ) + .route( + "/api/codex-connections/{controller_alias}/{alias}", + delete(crate::http::runtime_harnesses::delete_codex_connection), + ) + .route( + "/api/codex-connections/{controller_alias}/{alias}/account", + get(crate::http::runtime_harnesses::read_codex_account), + ) + .route( + "/api/codex-connections/{controller_alias}/{alias}/login/start", + post(crate::http::runtime_harnesses::start_codex_login), + ) + .route( + "/api/codex-connections/{controller_alias}/{alias}/login/cancel", + post(crate::http::runtime_harnesses::cancel_codex_login), + ) + .route( + "/api/codex-connections/{controller_alias}/{alias}/logout", + post(crate::http::runtime_harnesses::logout_codex_connection), + ) .route( "/api/providers", get(crate::http::provider_credentials::list), diff --git a/src/http/runtime_harnesses/codex.rs b/src/http/runtime_harnesses/codex.rs new file mode 100644 index 00000000..48ea614f --- /dev/null +++ b/src/http/runtime_harnesses/codex.rs @@ -0,0 +1,362 @@ +use std::sync::Arc; + +use axum::{ + extract::{Path, State}, + http::HeaderMap, + Json, +}; +use serde::Deserialize; +use serde_json::{json, Map, Value}; + +use crate::{ + db::{credentials, managed_agents::harnesses}, + errors::GatewayError, + http::runtime_resolution::harness_credential_name, + proxy::{auth::master_key::require_any_gateway_key, credential_crypto, state::AppState}, + sdk::agents::CLAUDE_MANAGED_AGENTS, +}; + +use super::{build_harnesses_list, helpers, validate_alias, HarnessesResponse}; + +#[derive(Debug, Deserialize)] +pub struct CreateRequest { + controller_alias: String, + #[serde(flatten)] + profile: Map, +} + +#[derive(Debug, Deserialize)] +pub struct CancelLoginRequest { + #[serde(rename = "loginId")] + login_id: String, +} + +pub async fn create( + State(state): State>, + headers: HeaderMap, + Json(mut input): Json, +) -> Result, GatewayError> { + require_any_gateway_key(&headers, &state).await?; + let pool = state.db.as_ref().ok_or(GatewayError::MissingDatabase)?; + let alias = input + .profile + .get("alias") + .and_then(Value::as_str) + .unwrap_or_default() + .to_owned(); + validate_alias(&alias)?; + if harnesses::repository::get_by_alias(pool, &alias) + .await? + .is_some() + { + return Err(GatewayError::InvalidJsonMessage(format!( + "harness alias already exists: {alias}" + ))); + } + let profile_type = input + .profile + .get("type") + .and_then(Value::as_str) + .ok_or_else(|| { + GatewayError::InvalidJsonMessage("Codex profile type is required".to_owned()) + })? + .to_owned(); + if !matches!(profile_type.as_str(), "api" | "chatgpt" | "remote_ssh") { + return Err(GatewayError::InvalidJsonMessage( + "unknown Codex profile type".to_owned(), + )); + } + + let (controller_key, controller_base) = + controller_credential(&state, pool, &input.controller_alias).await?; + input.profile.remove("controller_alias"); + let upstream = send_control( + &state, + reqwest::Method::POST, + &controller_base, + "profiles", + &controller_key, + Some(Value::Object(input.profile)), + ) + .await?; + let created = upstream + .get("profile") + .and_then(Value::as_object) + .ok_or_else(|| { + GatewayError::InvalidJsonMessage( + "Codex controller returned an invalid profile".to_owned(), + ) + })?; + if created.get("alias").and_then(Value::as_str) != Some(alias.as_str()) { + return Err(GatewayError::InvalidJsonMessage( + "Codex controller returned the wrong profile alias".to_owned(), + )); + } + + let child_base = format!( + "{}/profiles/{}", + controller_base.trim_end_matches('/'), + alias + ); + if let Err(error) = + harnesses::repository::create(pool, &alias, CLAUDE_MANAGED_AGENTS, &child_base).await + { + let _ = send_control( + &state, + reqwest::Method::DELETE, + &controller_base, + &format!("profiles/{alias}"), + &controller_key, + None, + ) + .await; + return Err(error); + } + let encryption_key = + credential_crypto::encryption_key(state.config.general_settings.master_key.as_deref())?; + let values = json!({ + "api_key": credential_crypto::encrypt_value(&controller_key, &encryption_key)?, + "api_base": credential_crypto::encrypt_value(&child_base, &encryption_key)?, + "codex_profile_type": profile_type, + "codex_controller_alias": input.controller_alias, + }); + if let Err(error) = credentials::upsert( + pool, + &harness_credential_name(&alias), + values, + json!({}), + "ui", + ) + .await + { + let _ = harnesses::repository::delete(pool, &alias).await; + let _ = send_control( + &state, + reqwest::Method::DELETE, + &controller_base, + &format!("profiles/{alias}"), + &controller_key, + None, + ) + .await; + return Err(error); + } + + Ok(Json(HarnessesResponse { + harnesses: build_harnesses_list(&state, pool).await?, + })) +} + +pub async fn list( + State(state): State>, + headers: HeaderMap, + Path(controller_alias): Path, +) -> Result, GatewayError> { + require_any_gateway_key(&headers, &state).await?; + let pool = state.db.as_ref().ok_or(GatewayError::MissingDatabase)?; + let (key, base) = controller_credential(&state, pool, &controller_alias).await?; + Ok(Json( + send_control(&state, reqwest::Method::GET, &base, "profiles", &key, None).await?, + )) +} + +pub async fn delete( + State(state): State>, + headers: HeaderMap, + Path((controller_alias, alias)): Path<(String, String)>, +) -> Result, GatewayError> { + require_any_gateway_key(&headers, &state).await?; + let pool = state.db.as_ref().ok_or(GatewayError::MissingDatabase)?; + let child_credential = credentials::get_by_name(pool, &harness_credential_name(&alias)) + .await? + .ok_or_else(|| { + GatewayError::NotFound(format!("Codex profile runtime not found: {alias}")) + })?; + let child_values = child_credential + .credential_values + .as_object() + .ok_or_else(|| { + GatewayError::InvalidConfig("harness credential_values must be an object".to_owned()) + })?; + let (_, stored_controller) = + helpers::codex_profile_metadata(child_values).ok_or_else(|| { + GatewayError::InvalidJsonMessage(format!("runtime {alias} is not a Codex profile")) + })?; + if stored_controller != controller_alias { + return Err(GatewayError::InvalidJsonMessage(format!( + "Codex profile {alias} belongs to controller {stored_controller}" + ))); + } + let (key, base) = controller_credential(&state, pool, &controller_alias).await?; + match send_control( + &state, + reqwest::Method::DELETE, + &base, + &format!("profiles/{alias}"), + &key, + None, + ) + .await + { + Ok(_) | Err(GatewayError::NotFound(_)) => {} + Err(error) => return Err(error), + } + harnesses::repository::delete(pool, &alias).await?; + let _ = credentials::delete_by_name(pool, &harness_credential_name(&alias)).await; + Ok(Json(json!({ "ok": true }))) +} + +pub async fn read_account( + State(state): State>, + headers: HeaderMap, + Path((controller_alias, alias)): Path<(String, String)>, +) -> Result, GatewayError> { + proxy_profile_action( + &state, + &headers, + &controller_alias, + &alias, + "account", + reqwest::Method::GET, + None, + ) + .await +} + +pub async fn login_start( + State(state): State>, + headers: HeaderMap, + Path((controller_alias, alias)): Path<(String, String)>, +) -> Result, GatewayError> { + proxy_profile_action( + &state, + &headers, + &controller_alias, + &alias, + "login/start", + reqwest::Method::POST, + Some(json!({})), + ) + .await +} + +pub async fn cancel_login( + State(state): State>, + headers: HeaderMap, + Path((controller_alias, alias)): Path<(String, String)>, + Json(input): Json, +) -> Result, GatewayError> { + proxy_profile_action( + &state, + &headers, + &controller_alias, + &alias, + "login/cancel", + reqwest::Method::POST, + Some(json!({ "loginId": input.login_id })), + ) + .await +} + +pub async fn logout( + State(state): State>, + headers: HeaderMap, + Path((controller_alias, alias)): Path<(String, String)>, +) -> Result, GatewayError> { + proxy_profile_action( + &state, + &headers, + &controller_alias, + &alias, + "logout", + reqwest::Method::POST, + Some(json!({})), + ) + .await +} + +async fn proxy_profile_action( + state: &AppState, + headers: &HeaderMap, + controller_alias: &str, + alias: &str, + action: &str, + method: reqwest::Method, + body: Option, +) -> Result, GatewayError> { + require_any_gateway_key(headers, state).await?; + let pool = state.db.as_ref().ok_or(GatewayError::MissingDatabase)?; + let (key, base) = controller_credential(state, pool, controller_alias).await?; + Ok(Json( + send_control( + state, + method, + &base, + &format!("profiles/{alias}/{action}"), + &key, + body, + ) + .await?, + )) +} + +async fn controller_credential( + state: &AppState, + pool: &sqlx::PgPool, + alias: &str, +) -> Result<(String, String), GatewayError> { + let row = harnesses::repository::get_by_alias(pool, alias) + .await? + .ok_or_else(|| { + GatewayError::NotFound(format!("Codex controller runtime not found: {alias}")) + })?; + let encryption_key = + credential_crypto::encryption_key(state.config.general_settings.master_key.as_deref())?; + let (api_key, api_base, _, _) = + helpers::load_harness_api_key(pool, alias, &encryption_key).await?; + if api_base.contains("/profiles/") { + return Err(GatewayError::InvalidJsonMessage(format!( + "runtime {alias} is a Codex profile, not a controller" + ))); + } + if row.api_spec != CLAUDE_MANAGED_AGENTS { + return Err(GatewayError::InvalidJsonMessage(format!( + "runtime {alias} does not use the Managed Agents API" + ))); + } + Ok((api_key, api_base)) +} + +async fn send_control( + state: &AppState, + method: reqwest::Method, + base: &str, + path: &str, + key: &str, + body: Option, +) -> Result { + let url = format!( + "{}/control/{}", + base.trim_end_matches('/'), + path.trim_start_matches('/') + ); + let mut request = state.http.request(method, url).header("x-api-key", key); + if let Some(body) = body { + request = request.json(&body); + } + let response = request.send().await.map_err(GatewayError::Upstream)?; + let status = response.status(); + let payload: Value = response.json().await.map_err(GatewayError::Upstream)?; + if !status.is_success() { + let message = payload + .get("error") + .and_then(Value::as_str) + .unwrap_or("Codex controller request failed"); + return Err(if status == reqwest::StatusCode::NOT_FOUND { + GatewayError::NotFound(message.to_owned()) + } else { + GatewayError::InvalidJsonMessage(message.to_owned()) + }); + } + Ok(payload) +} diff --git a/src/http/runtime_harnesses/helpers.rs b/src/http/runtime_harnesses/helpers.rs index 17b060b3..33345eb4 100644 --- a/src/http/runtime_harnesses/helpers.rs +++ b/src/http/runtime_harnesses/helpers.rs @@ -42,6 +42,8 @@ async fn default_harnesses(state: &AppState) -> Result, Gat connected: credential.is_some(), masked_api_key: credential.map(|c| mask_api_key(&c.api_key)), tools: runtime_tools(entry.id).to_vec(), + codex_profile_type: None, + codex_controller_alias: None, }); } Ok(result) @@ -56,16 +58,22 @@ async fn custom_harnesses( let enc_key = credential_crypto::encryption_key(state.config.general_settings.master_key.as_deref()).ok(); for harness in custom { - let (connected, masked_api_key, resolved_api_base) = if let Some(ref key) = enc_key { + let ( + connected, + masked_api_key, + resolved_api_base, + codex_profile_type, + codex_controller_alias, + ) = if let Some(ref key) = enc_key { match load_harness_api_key(pool, &harness.alias, key).await { - Ok((api_key, api_base)) => { + Ok((api_key, api_base, profile_type, controller_alias)) => { let masked = mask_api_key(&api_key); - (true, Some(masked), api_base) + (true, Some(masked), api_base, profile_type, controller_alias) } - Err(_) => (false, None, harness.api_base.clone()), + Err(_) => (false, None, harness.api_base.clone(), None, None), } } else { - (false, None, harness.api_base.clone()) + (false, None, harness.api_base.clone(), None, None) }; result.push(HarnessResponse { @@ -77,6 +85,8 @@ async fn custom_harnesses( connected, masked_api_key, tools: runtime_tools(&harness.api_spec).to_vec(), + codex_profile_type, + codex_controller_alias, }); } Ok(result) @@ -99,15 +109,17 @@ fn append_import_providers(result: &mut Vec) { connected: false, masked_api_key: None, tools: runtime_tools(provider.api_spec).to_vec(), + codex_profile_type: None, + codex_controller_alias: None, }); } } -async fn load_harness_api_key( +pub(crate) async fn load_harness_api_key( pool: &sqlx::PgPool, alias: &str, enc_key: &str, -) -> Result<(String, String), GatewayError> { +) -> Result<(String, String, Option, Option), GatewayError> { let cred_name = harness_credential_name(alias); let row = credentials::get_by_name(pool, &cred_name) .await? @@ -117,9 +129,43 @@ async fn load_harness_api_key( let vals = row.credential_values.as_object().ok_or_else(|| { GatewayError::InvalidConfig("harness credential_values must be an object".to_owned()) })?; - let api_key = decrypt_field(vals, "api_key", enc_key)?; - let api_base = decrypt_field(vals, "api_base", enc_key)?; - Ok((api_key, api_base)) + if let Some((profile_type, controller_alias)) = codex_profile_metadata(vals) { + let controller_credential = + credentials::get_by_name(pool, &harness_credential_name(controller_alias)) + .await? + .ok_or_else(|| { + GatewayError::InvalidJsonMessage(format!( + "no credential for Codex controller: {controller_alias}" + )) + })?; + let controller_values = controller_credential + .credential_values + .as_object() + .ok_or_else(|| { + GatewayError::InvalidConfig( + "Codex controller credential_values must be an object".to_owned(), + ) + })?; + let api_key = decrypt_field(controller_values, "api_key", enc_key)?; + let controller_base = decrypt_field(controller_values, "api_base", enc_key)?; + return Ok(( + api_key, + codex_profile_api_base(&controller_base, alias), + Some(profile_type.to_owned()), + Some(controller_alias.to_owned()), + )); + } + + Ok(( + decrypt_field(vals, "api_key", enc_key)?, + decrypt_field(vals, "api_base", enc_key)?, + None, + None, + )) +} + +fn codex_profile_api_base(controller_base: &str, alias: &str) -> String { + format!("{}/profiles/{alias}", controller_base.trim_end_matches('/')) } pub(super) fn decrypt_field( @@ -133,6 +179,15 @@ pub(super) fn decrypt_field( credential_crypto::decrypt_value(enc, key) } +pub(super) fn codex_profile_metadata( + values: &serde_json::Map, +) -> Option<(&str, &str)> { + Some(( + values.get("codex_profile_type")?.as_str()?, + values.get("codex_controller_alias")?.as_str()?, + )) +} + #[cfg(test)] mod tests { use super::*; @@ -148,6 +203,8 @@ mod tests { connected: false, masked_api_key: None, tools: Vec::new(), + codex_profile_type: None, + codex_controller_alias: None, }]; append_import_providers(&mut harnesses); @@ -155,4 +212,32 @@ mod tests { assert_eq!(harnesses.len(), 1); assert_eq!(harnesses[0].alias, "elastic_agent_builder"); } + + #[test] + fn reads_codex_profile_metadata_only_when_complete() { + let complete = serde_json::json!({ + "codex_profile_type": "chatgpt", + "codex_controller_alias": "Codex-app-server", + }); + assert_eq!( + codex_profile_metadata(complete.as_object().unwrap()), + Some(("chatgpt", "Codex-app-server")) + ); + assert_eq!( + codex_profile_metadata( + serde_json::json!({ "codex_profile_type": "chatgpt" }) + .as_object() + .unwrap() + ), + None + ); + } + + #[test] + fn codex_profile_base_follows_controller_base() { + assert_eq!( + codex_profile_api_base("http://codex:8080/", "CodexChargpt"), + "http://codex:8080/profiles/CodexChargpt" + ); + } } diff --git a/src/http/runtime_harnesses/mod.rs b/src/http/runtime_harnesses/mod.rs index 081cfae4..c18293af 100644 --- a/src/http/runtime_harnesses/mod.rs +++ b/src/http/runtime_harnesses/mod.rs @@ -1,4 +1,11 @@ -pub(super) mod helpers; +mod codex; +pub(crate) mod helpers; +pub use codex::{ + cancel_login as cancel_codex_login, create as create_codex_connection, + delete as delete_codex_connection, list as list_codex_connections, + login_start as start_codex_login, logout as logout_codex_connection, + read_account as read_codex_account, +}; pub(super) use helpers::build_harnesses_list; use std::sync::Arc; @@ -33,6 +40,10 @@ pub struct HarnessResponse { pub connected: bool, pub masked_api_key: Option, pub tools: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub codex_profile_type: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub codex_controller_alias: Option, } #[derive(Debug, Serialize)] @@ -164,6 +175,18 @@ pub async fn update( let cred_name = harness_credential_name(&alias); let existing = credentials::get_by_name(pool, &cred_name).await?; + if existing.as_ref().is_some_and(|credential| { + credential + .credential_values + .as_object() + .and_then(helpers::codex_profile_metadata) + .is_some() + }) { + return Err(GatewayError::InvalidJsonMessage( + "Codex profile runtimes must be updated through the Codex connection API".to_owned(), + )); + } + let (current_api_key, current_api_base) = if let Some(ref cred_row) = existing { let vals = cred_row.credential_values.as_object().ok_or_else(|| { GatewayError::InvalidConfig("harness credential_values must be an object".to_owned()) @@ -224,12 +247,28 @@ pub async fn delete_harness( let pool = state.db.as_ref().ok_or(GatewayError::MissingDatabase)?; + let cred_name = harness_credential_name(&alias); + if credentials::get_by_name(pool, &cred_name) + .await? + .as_ref() + .is_some_and(|credential| { + credential + .credential_values + .as_object() + .and_then(helpers::codex_profile_metadata) + .is_some() + }) + { + return Err(GatewayError::InvalidJsonMessage( + "Codex profile runtimes must be deleted through the Codex connection API".to_owned(), + )); + } + // Delete row first; if credential delete fails the harness is gone and won't be listed. // Credential orphan is harmless (no alias to resolve it). Reverse order risks a // listed harness with no credential — sessions would fail with a confusing error. harnesses::repository::delete(pool, &alias).await?; - let cred_name = harness_credential_name(&alias); let _ = credentials::delete_by_name(pool, &cred_name).await; Ok((StatusCode::OK, Json(DeleteHarnessResponse { ok: true }))) diff --git a/src/http/runtime_resolution.rs b/src/http/runtime_resolution.rs index 1ef0c438..d59864af 100644 --- a/src/http/runtime_resolution.rs +++ b/src/http/runtime_resolution.rs @@ -3,9 +3,12 @@ use std::sync::Arc; use sqlx::PgPool; use crate::{ - db::{credentials, managed_agents::harnesses}, + db::managed_agents::harnesses, errors::GatewayError, - http::agent_runtimes::{load_credential, RuntimeCredential}, + http::{ + agent_runtimes::{load_credential, RuntimeCredential}, + runtime_harnesses::helpers::load_harness_api_key, + }, proxy::{credential_crypto, state::AppState}, sdk::{ agents::AgentRuntime, @@ -49,21 +52,9 @@ pub(crate) async fn resolve_runtime( GatewayError::InvalidConfig(format!("unknown api_spec: {}", harness.api_spec)) })?; - // Load credential from credentials table - let cred_name = harness_credential_name(alias); - let row = credentials::get_by_name(pool, &cred_name) - .await? - .ok_or_else(|| { - GatewayError::InvalidJsonMessage(format!("no credential for harness: {alias}")) - })?; - let key = credential_crypto::encryption_key(state.config.general_settings.master_key.as_deref())?; - let values = row.credential_values.as_object().ok_or_else(|| { - GatewayError::InvalidConfig("harness credential_values must be an object".to_owned()) - })?; - let api_key = decrypt_field(values, "api_key", &key)?; - let api_base = decrypt_field(values, "api_base", &key)?; + let (api_key, api_base, _, _) = load_harness_api_key(pool, alias, &key).await?; Ok(ResolvedRuntime { alias: alias.to_owned(), @@ -76,14 +67,3 @@ pub(crate) async fn resolve_runtime( pub(crate) fn harness_credential_name(alias: &str) -> String { format!("runtime-harness:{alias}") } - -fn decrypt_field( - values: &serde_json::Map, - field: &str, - key: &str, -) -> Result { - let enc = values.get(field).and_then(|v| v.as_str()).ok_or_else(|| { - GatewayError::InvalidConfig(format!("harness credential missing field: {field}")) - })?; - credential_crypto::decrypt_value(enc, key) -} diff --git a/src/http/sessions.rs b/src/http/sessions.rs index 8632efe7..c7aeabbe 100644 --- a/src/http/sessions.rs +++ b/src/http/sessions.rs @@ -6,6 +6,7 @@ use axum::{ Json, }; use serde_json::json; +use sqlx::PgPool; use crate::{ agents::events, @@ -187,27 +188,7 @@ pub async fn abort( Path(session_id): Path, ) -> Result { let pool = db(&state, &headers).await?; - if let Ok(Some(row)) = sessions::repository::get(pool, &session_id).await { - if let Some(runtime) = row.runtime.as_deref() { - if let Ok(resolved) = - crate::http::runtime_resolution::resolve_runtime(pool, &state, runtime).await - { - if let Ok(client) = runtime_sdk_client(&resolved) { - if register_runtime_session(&client, pool, &row, &resolved) - .await - .is_ok() - { - let _ = client - .beta() - .sessions() - .events() - .interrupt(&session_id) - .await; - } - } - } - } - } + let _ = interrupt_runtime_session(&state, pool, &session_id).await; state .agent_runs .set_error(&session_id, "aborted".to_owned()); @@ -228,32 +209,31 @@ pub async fn interrupt( Path(session_id): Path, ) -> Result { let pool = db(&state, &headers).await?; - let Ok(Some(row)) = sessions::repository::get(pool, &session_id).await else { - return Ok(StatusCode::NO_CONTENT); + let _ = interrupt_runtime_session(&state, pool, &session_id).await; + Ok(StatusCode::NO_CONTENT) +} + +pub(crate) async fn interrupt_runtime_session( + state: &AppState, + pool: &PgPool, + session_id: &str, +) -> Result<(), GatewayError> { + let Some(row) = sessions::repository::get(pool, session_id).await? else { + return Ok(()); }; let Some(runtime) = row.runtime.as_deref() else { - return Ok(StatusCode::NO_CONTENT); - }; - let Ok(resolved) = - crate::http::runtime_resolution::resolve_runtime(pool, &state, runtime).await - else { - return Ok(StatusCode::NO_CONTENT); - }; - let Ok(client) = runtime_sdk_client(&resolved) else { - return Ok(StatusCode::NO_CONTENT); + return Ok(()); }; - if register_runtime_session(&client, pool, &row, &resolved) + let resolved = crate::http::runtime_resolution::resolve_runtime(pool, state, runtime).await?; + let client = runtime_sdk_client(&resolved)?; + register_runtime_session(&client, pool, &row, &resolved).await?; + client + .beta() + .sessions() + .events() + .interrupt(session_id) .await - .is_ok() - { - let _ = client - .beta() - .sessions() - .events() - .interrupt(&session_id) - .await; - } - Ok(StatusCode::NO_CONTENT) + .map_err(runtime_sdk::agent_sdk_error) } fn record_prompt_error(state: &AppState, session_id: &str, error: GatewayError) { diff --git a/src/http/sessions/runtime_provision/mcp_vault.rs b/src/http/sessions/runtime_provision/mcp_vault.rs index 48bfd1e4..7ebb1a2b 100644 --- a/src/http/sessions/runtime_provision/mcp_vault.rs +++ b/src/http/sessions/runtime_provision/mcp_vault.rs @@ -23,7 +23,9 @@ pub(super) async fn vault_ids( created: &CreatedRuntimeSession, mcp_servers: &[Value], ) -> Result>, GatewayError> { - if created.resolved.agent_runtime != AgentRuntime::ClaudeManagedAgents { + if created.resolved.agent_runtime != AgentRuntime::ClaudeManagedAgents + || is_codex_profile_api_base(&created.resolved.credential.api_base) + { return Ok(None); } @@ -83,6 +85,19 @@ pub(super) async fn vault_ids( Ok(Some(vec![vault_id])) } +fn is_codex_profile_api_base(api_base: &str) -> bool { + let Ok(url) = reqwest::Url::parse(api_base) else { + return false; + }; + let Some(segments) = url.path_segments() else { + return false; + }; + let segments = segments.collect::>(); + segments + .windows(2) + .any(|pair| pair[0] == "profiles" && !pair[1].is_empty()) +} + async fn create_vault( state: &AppState, created: &CreatedRuntimeSession, diff --git a/src/http/sessions/runtime_provision/mcp_vault/tests.rs b/src/http/sessions/runtime_provision/mcp_vault/tests.rs index bfe3012d..33fc2a08 100644 --- a/src/http/sessions/runtime_provision/mcp_vault/tests.rs +++ b/src/http/sessions/runtime_provision/mcp_vault/tests.rs @@ -7,6 +7,7 @@ use super::{ gateway_mcp_credentials, is_environment_variable_name, EnvironmentVaultCredential, VaultCredential, }, + is_codex_profile_api_base, store::{ stored_credential_changed, stored_credential_fingerprints, stored_credential_keys, StoredVault, @@ -69,6 +70,20 @@ fn normalizes_anthropic_v1_base() { ); } +#[test] +fn identifies_codex_profile_api_bases_without_matching_controllers() { + assert!(is_codex_profile_api_base( + "http://codex:8080/profiles/CodexChargpt" + )); + assert!(is_codex_profile_api_base( + "https://runtime.example.test/prefix/profiles/codex/" + )); + assert!(!is_codex_profile_api_base("https://api.anthropic.com")); + assert!(!is_codex_profile_api_base( + "http://codex:8080/control/profiles" + )); +} + #[test] fn builds_environment_variable_credential_body() { let credential = VaultCredential::EnvironmentVariable(EnvironmentVaultCredential { diff --git a/src/model_prices_backup.json b/src/model_prices_backup.json index d6ab0e10..8982b4f2 100644 --- a/src/model_prices_backup.json +++ b/src/model_prices_backup.json @@ -273,6 +273,19 @@ "/v1/images/generations" ] }, + "aiml/openai/gpt-image-2": { + "litellm_provider": "aiml", + "metadata": { + "notes": "OpenAI gpt-image-2 via AI/ML API - flagship multimodal image generation and editing model with reasoning and 2K output. output_cost_per_image is AI/ML's published medium-quality rate; like the other aiml image entries it is billed as a flat per-image price" + }, + "mode": "image_generation", + "output_cost_per_image": 0.054, + "source": "https://docs.aimlapi.com/api-references/image-models/openai/gpt-image-2", + "supported_endpoints": [ + "/v1/images/generations" + ], + "supports_vision": true + }, "amazon.nova-canvas-v1:0": { "litellm_provider": "bedrock", "max_input_tokens": 2600, @@ -536,12 +549,9 @@ "input_cost_per_query": 0.001, "input_cost_per_token": 0.0, "litellm_provider": "bedrock", - "max_document_chunks_per_query": 100, "max_input_tokens": 32000, "max_output_tokens": 32000, - "max_query_tokens": 32000, "max_tokens": 32000, - "max_tokens_per_document_chunk": 512, "mode": "rerank", "output_cost_per_token": 0.0 }, @@ -570,8 +580,17 @@ "output_cost_per_token": 0.0, "output_vector_size": 1536 }, + "amazon.titan-embed-g1-text-02": { + "input_cost_per_token": 1e-07, + "litellm_provider": "bedrock", + "max_input_tokens": 8192, + "max_tokens": 8192, + "mode": "embedding", + "output_cost_per_token": 0.0, + "output_vector_size": 1536 + }, "amazon.titan-embed-text-v2:0": { - "input_cost_per_token": 2e-07, + "input_cost_per_token": 2e-08, "litellm_provider": "bedrock", "max_input_tokens": 8192, "max_tokens": 8192, @@ -585,27 +604,18 @@ "amazon.titan-image-generator-v1": { "input_cost_per_image": 0.0, "output_cost_per_image": 0.008, - "output_cost_per_image_premium_image": 0.01, - "output_cost_per_image_above_512_and_512_pixels": 0.01, - "output_cost_per_image_above_512_and_512_pixels_and_premium_image": 0.012, "litellm_provider": "bedrock", "mode": "image_generation" }, "amazon.titan-image-generator-v2": { "input_cost_per_image": 0.0, "output_cost_per_image": 0.008, - "output_cost_per_image_premium_image": 0.01, - "output_cost_per_image_above_1024_and_1024_pixels": 0.01, - "output_cost_per_image_above_1024_and_1024_pixels_and_premium_image": 0.012, "litellm_provider": "bedrock", "mode": "image_generation" }, "amazon.titan-image-generator-v2:0": { "input_cost_per_image": 0.0, "output_cost_per_image": 0.008, - "output_cost_per_image_premium_image": 0.01, - "output_cost_per_image_above_1024_and_1024_pixels": 0.01, - "output_cost_per_image_above_1024_and_1024_pixels_and_premium_image": 0.012, "litellm_provider": "bedrock", "mode": "image_generation" }, @@ -711,7 +721,8 @@ "supports_pdf_input": true, "supports_prompt_caching": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "prompt_cache_min_tokens": 2048 }, "anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.25e-06, @@ -734,7 +745,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-haiku-4-5@20251001": { "cache_creation_input_token_cost": 1.25e-06, @@ -758,7 +771,9 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_streaming": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-3-5-sonnet-20240620-v1:0": { "input_cost_per_token": 3e-06, @@ -777,8 +792,6 @@ "output_cost_per_token_above_200k_tokens": 3e-05, "cache_creation_input_token_cost_above_200k_tokens": 7.5e-06, "cache_read_input_token_cost_above_200k_tokens": 6e-07, - "cache_creation_input_token_cost_above_1hr": 7.5e-06, - "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 1.5e-05, "cache_creation_input_token_cost": 3.75e-06, "cache_read_input_token_cost": 3e-07 }, @@ -803,9 +816,7 @@ "input_cost_per_token_above_200k_tokens": 6e-06, "output_cost_per_token_above_200k_tokens": 3e-05, "cache_creation_input_token_cost_above_200k_tokens": 7.5e-06, - "cache_read_input_token_cost_above_200k_tokens": 6e-07, - "cache_creation_input_token_cost_above_1hr": 7.5e-06, - "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 1.5e-05 + "cache_read_input_token_cost_above_200k_tokens": 6e-07 }, "anthropic.claude-3-7-sonnet-20240620-v1:0": { "cache_creation_input_token_cost": 4.5e-06, @@ -927,7 +938,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-opus-4-20250514-v1:0": { "cache_creation_input_token_cost": 1.875e-05, @@ -952,7 +964,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 6.25e-06, @@ -981,9 +994,12 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -1011,9 +1027,12 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "global.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -1041,9 +1060,12 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "us.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1071,9 +1093,12 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "eu.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1101,9 +1126,12 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "au.anthropic.claude-opus-4-6-v1": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1131,9 +1159,13 @@ "supports_native_structured_output": true, "supports_output_config": true, "supports_max_reasoning_effort": true, - "bedrock_output_config_effort_ceiling": "max" + "bedrock_output_config_effort_ceiling": "max", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -1163,7 +1195,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "anthropic.claude-mythos-preview": { "input_cost_per_token": 0, @@ -1181,6 +1215,8 @@ "supports_output_config": true }, "global.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -1210,9 +1246,13 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "us.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1242,9 +1282,13 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "eu.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1274,9 +1318,13 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "au.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1306,7 +1354,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 }, "anthropic.claude-fable-5": { "cache_creation_input_token_cost": 1.25e-05, @@ -1325,6 +1375,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1339,7 +1390,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "global.anthropic.claude-fable-5": { "cache_creation_input_token_cost": 1.25e-05, @@ -1358,6 +1411,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1372,7 +1426,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-fable-5": { "cache_creation_input_token_cost": 1.375e-05, @@ -1391,6 +1447,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1405,7 +1462,9 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-fable-5": { "cache_creation_input_token_cost": 1.375e-05, @@ -1424,6 +1483,7 @@ "search_context_size_medium": 0.01 }, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1438,9 +1498,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, - "anthropic.claude-opus-4-8": { + "anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -1456,7 +1521,42 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 + }, + "global.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_1hr": 1e-05, + "cache_read_input_token_cost": 5e-07, + "input_cost_per_token": 5e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.5e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1471,9 +1571,157 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 }, - "global.anthropic.claude-opus-4-8": { + "us.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "input_cost_per_token": 5.5e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 + }, + "eu.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "input_cost_per_token": 5.5e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 + }, + "au.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "input_cost_per_token": 5.5e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 + }, + "jp.anthropic.claude-opus-5": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "input_cost_per_token": 5.5e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 512 + }, + "anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -1489,7 +1737,43 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "global.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_1hr": 1e-05, + "cache_read_input_token_cost": 5e-07, + "input_cost_per_token": 5e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.5e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1504,9 +1788,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1522,7 +1811,6 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_adaptive_thinking": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1537,9 +1825,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1555,7 +1848,6 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_adaptive_thinking": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1570,9 +1862,14 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "au.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 6.875e-06, "cache_creation_input_token_cost_above_1hr": 1.1e-05, "cache_read_input_token_cost": 5.5e-07, @@ -1588,7 +1885,43 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "jp.anthropic.claude-opus-4-8": { + "bedrock_converse_supports_strict_tools": false, "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 6.875e-06, + "cache_creation_input_token_cost_above_1hr": 1.1e-05, + "cache_read_input_token_cost": 5.5e-07, + "input_cost_per_token": 5.5e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.75e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1603,9 +1936,12 @@ "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "xhigh" + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "jp.anthropic.claude-opus-4-7": { + "bedrock_converse_supports_strict_tools": false, "cache_creation_input_token_cost": 6.875e-06, "cache_read_input_token_cost": 5.5e-07, "input_cost_per_token": 5.5e-06, @@ -1620,6 +1956,7 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_adaptive_thinking": true, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -1631,12 +1968,236 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "tool_use_system_prompt_tokens": 346, "supports_native_structured_output": true, "supports_max_reasoning_effort": true, - "supports_minimal_reasoning_effort": true + "supports_minimal_reasoning_effort": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 2048 + }, + "anthropic.claude-sonnet-5": { + "bedrock_converse_supports_strict_tools": false, + "cache_creation_input_token_cost": 2.5e-06, + "cache_creation_input_token_cost_above_1hr": 4e-06, + "cache_read_input_token_cost": 2e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "global.anthropic.claude-sonnet-5": { + "bedrock_converse_supports_strict_tools": false, + "cache_creation_input_token_cost": 2.5e-06, + "cache_creation_input_token_cost_above_1hr": 4e-06, + "cache_read_input_token_cost": 2e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "us.anthropic.claude-sonnet-5": { + "bedrock_converse_supports_strict_tools": false, + "cache_creation_input_token_cost": 2.75e-06, + "cache_creation_input_token_cost_above_1hr": 4.4e-06, + "cache_read_input_token_cost": 2.2e-07, + "input_cost_per_token": 2.2e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "eu.anthropic.claude-sonnet-5": { + "bedrock_converse_supports_strict_tools": false, + "cache_creation_input_token_cost": 2.75e-06, + "cache_creation_input_token_cost_above_1hr": 4.4e-06, + "cache_read_input_token_cost": 2.2e-07, + "input_cost_per_token": 2.2e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "au.anthropic.claude-sonnet-5": { + "bedrock_converse_supports_strict_tools": false, + "cache_creation_input_token_cost": 2.75e-06, + "cache_creation_input_token_cost_above_1hr": 4.4e-06, + "cache_read_input_token_cost": 2.2e-07, + "input_cost_per_token": 2.2e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 + }, + "jp.anthropic.claude-sonnet-5": { + "bedrock_converse_supports_strict_tools": false, + "cache_creation_input_token_cost": 2.75e-06, + "cache_creation_input_token_cost_above_1hr": 4.4e-06, + "cache_read_input_token_cost": 2.2e-07, + "input_cost_per_token": 2.2e-06, + "litellm_provider": "bedrock_converse", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_mid_conversation_system": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_native_structured_output": true, + "supports_max_reasoning_effort": true, + "supports_output_config": true, + "bedrock_output_config_effort_ceiling": "xhigh", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 3.75e-06, "cache_creation_input_token_cost_above_1hr": 6e-06, "cache_read_input_token_cost": 3e-07, @@ -1663,9 +2224,12 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "global.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 3.75e-06, "cache_creation_input_token_cost_above_1hr": 6e-06, "cache_read_input_token_cost": 3e-07, @@ -1692,9 +2256,12 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 4.125e-06, "cache_creation_input_token_cost_above_1hr": 6.6e-06, "cache_read_input_token_cost": 3.3e-07, @@ -1721,9 +2288,12 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 4.125e-06, "cache_creation_input_token_cost_above_1hr": 6.6e-06, "cache_read_input_token_cost": 3.3e-07, @@ -1750,9 +2320,12 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "au.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 4.125e-06, "cache_creation_input_token_cost_above_1hr": 6.6e-06, "cache_read_input_token_cost": 3.3e-07, @@ -1779,9 +2352,12 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "jp.anthropic.claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 4.125e-06, "cache_creation_input_token_cost_above_1hr": 6.6e-06, "cache_read_input_token_cost": 3.3e-07, @@ -1808,7 +2384,9 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_output_config": true + "supports_output_config": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 3.75e-06, @@ -1837,7 +2415,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 3.75e-06, @@ -1869,7 +2449,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "anthropic.claude-v1": { "input_cost_per_token": 8e-06, @@ -2119,7 +2701,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "apac.anthropic.claude-3-sonnet-20240229-v1:0": { "input_cost_per_token": 3e-06, @@ -2164,7 +2748,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "assemblyai/best": { "input_cost_per_second": 3.333e-05, @@ -2208,7 +2794,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "azure/ada": { "input_cost_per_token": 1e-07, @@ -2301,10 +2889,11 @@ "supports_output_config": true }, "azure_ai/claude-opus-4-6": { + "supports_adaptive_thinking": true, "input_cost_per_token": 5e-06, "output_cost_per_token": 2.5e-05, "litellm_provider": "azure_ai", - "max_input_tokens": 200000, + "max_input_tokens": 1000000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -2329,10 +2918,11 @@ "supports_max_reasoning_effort": true }, "azure_ai/claude-opus-4-7": { + "supports_adaptive_thinking": true, "input_cost_per_token": 5e-06, "output_cost_per_token": 2.5e-05, "litellm_provider": "azure_ai", - "max_input_tokens": 200000, + "max_input_tokens": 1000000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -2358,6 +2948,7 @@ "supports_max_reasoning_effort": true }, "azure_ai/claude-fable-5": { + "supports_mid_conversation_system": true, "input_cost_per_token": 1e-05, "output_cost_per_token": 5e-05, "litellm_provider": "azure_ai", @@ -2387,11 +2978,13 @@ "supports_xhigh_reasoning_effort": true, "supports_max_reasoning_effort": true }, - "azure_ai/claude-opus-4-8": { + "azure_ai/claude-opus-5": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, "input_cost_per_token": 5e-06, "output_cost_per_token": 2.5e-05, "litellm_provider": "azure_ai", - "max_input_tokens": 200000, + "max_input_tokens": 1000000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -2403,7 +2996,38 @@ "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 512 + }, + "azure_ai/claude-opus-4-8": { + "supports_mid_conversation_system": true, "supports_adaptive_thinking": true, + "input_cost_per_token": 5e-06, + "output_cost_per_token": 2.5e-05, + "litellm_provider": "azure_ai", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_1hr": 1e-05, + "cache_read_input_token_cost": 5e-07, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -2459,7 +3083,39 @@ "supports_tool_choice": true, "supports_vision": true }, + "azure_ai/claude-sonnet-5": { + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 2.5e-06, + "cache_creation_input_token_cost_above_1hr": 4e-06, + "cache_read_input_token_cost": 2e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "azure_ai", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true + }, "azure_ai/claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 3.75e-06, "cache_creation_input_token_cost_above_1hr": 6e-06, "cache_read_input_token_cost": 3e-07, @@ -2568,7 +3224,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -2615,7 +3270,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -2662,7 +3316,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -2709,7 +3362,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -2755,7 +3407,6 @@ "supports_response_schema": false, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -2801,7 +3452,6 @@ "supports_response_schema": false, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -2810,22 +3460,16 @@ }, "azure_ai/gpt-5.4-mini": { "cache_read_input_token_cost": 7.5e-08, - "cache_read_input_token_cost_above_272k_tokens": 1.5e-07, "cache_read_input_token_cost_priority": 1.5e-07, - "cache_read_input_token_cost_above_272k_tokens_priority": 3e-07, "input_cost_per_token": 7.5e-07, - "input_cost_per_token_above_272k_tokens": 1.5e-06, "input_cost_per_token_priority": 1.5e-06, - "input_cost_per_token_above_272k_tokens_priority": 3e-06, "litellm_provider": "azure_ai", - "max_input_tokens": 400000, + "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", "output_cost_per_token": 4.5e-06, - "output_cost_per_token_above_272k_tokens": 6.75e-06, "output_cost_per_token_priority": 9e-06, - "output_cost_per_token_above_272k_tokens_priority": 1.35e-05, "source": "https://ai.azure.com/catalog/models/gpt-5.4-mini", "supported_endpoints": [ "/v1/chat/completions", @@ -2848,7 +3492,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -2857,22 +3500,16 @@ }, "azure_ai/gpt-5.4-mini-2026-03-17": { "cache_read_input_token_cost": 7.5e-08, - "cache_read_input_token_cost_above_272k_tokens": 1.5e-07, "cache_read_input_token_cost_priority": 1.5e-07, - "cache_read_input_token_cost_above_272k_tokens_priority": 3e-07, "input_cost_per_token": 7.5e-07, - "input_cost_per_token_above_272k_tokens": 1.5e-06, "input_cost_per_token_priority": 1.5e-06, - "input_cost_per_token_above_272k_tokens_priority": 3e-06, "litellm_provider": "azure_ai", - "max_input_tokens": 400000, + "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", "output_cost_per_token": 4.5e-06, - "output_cost_per_token_above_272k_tokens": 6.75e-06, "output_cost_per_token_priority": 9e-06, - "output_cost_per_token_above_272k_tokens_priority": 1.35e-05, "source": "https://ai.azure.com/catalog/models/gpt-5.4-mini", "supported_endpoints": [ "/v1/chat/completions", @@ -2895,7 +3532,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -2904,22 +3540,16 @@ }, "azure_ai/gpt-5.4-nano": { "cache_read_input_token_cost": 2e-08, - "cache_read_input_token_cost_above_272k_tokens": 4e-08, "cache_read_input_token_cost_priority": 4e-08, - "cache_read_input_token_cost_above_272k_tokens_priority": 8e-08, "input_cost_per_token": 2e-07, - "input_cost_per_token_above_272k_tokens": 4e-07, "input_cost_per_token_priority": 4e-07, - "input_cost_per_token_above_272k_tokens_priority": 8e-07, "litellm_provider": "azure_ai", - "max_input_tokens": 400000, + "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", "output_cost_per_token": 1.25e-06, - "output_cost_per_token_above_272k_tokens": 1.875e-06, "output_cost_per_token_priority": 2.5e-06, - "output_cost_per_token_above_272k_tokens_priority": 3.75e-06, "source": "https://ai.azure.com/catalog/models/gpt-5.4-nano", "supported_endpoints": [ "/v1/chat/completions", @@ -2942,7 +3572,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -2951,22 +3580,16 @@ }, "azure_ai/gpt-5.4-nano-2026-03-17": { "cache_read_input_token_cost": 2e-08, - "cache_read_input_token_cost_above_272k_tokens": 4e-08, "cache_read_input_token_cost_priority": 4e-08, - "cache_read_input_token_cost_above_272k_tokens_priority": 8e-08, "input_cost_per_token": 2e-07, - "input_cost_per_token_above_272k_tokens": 4e-07, "input_cost_per_token_priority": 4e-07, - "input_cost_per_token_above_272k_tokens_priority": 8e-07, "litellm_provider": "azure_ai", - "max_input_tokens": 400000, + "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", "output_cost_per_token": 1.25e-06, - "output_cost_per_token_above_272k_tokens": 1.875e-06, "output_cost_per_token_priority": 2.5e-06, - "output_cost_per_token_above_272k_tokens_priority": 3.75e-06, "source": "https://ai.azure.com/catalog/models/gpt-5.4-nano", "supported_endpoints": [ "/v1/chat/completions", @@ -2989,7 +3612,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -3062,7 +3684,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2.2e-05, "output_cost_per_token": 2.64e-06, "supports_audio_input": true, @@ -3081,7 +3703,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 0.00022, "output_cost_per_token": 2.2e-05, "supports_audio_input": true, @@ -3100,7 +3722,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 8e-05, "output_cost_per_token": 2.2e-05, "supported_modalities": [ @@ -4298,7 +4920,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2e-05, "output_cost_per_token": 2.4e-06, "supports_audio_input": true, @@ -4318,7 +4940,7 @@ "max_input_tokens": 32000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 6.4e-05, "output_cost_per_token": 1.6e-05, "supported_endpoints": [ @@ -4350,7 +4972,7 @@ "max_input_tokens": 32000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 6.4e-05, "output_cost_per_token": 1.6e-05, "supported_endpoints": [ @@ -4382,7 +5004,7 @@ "max_input_tokens": 32000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2e-05, "output_cost_per_token": 2.4e-06, "supported_endpoints": [ @@ -4443,7 +5065,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 0.0002, "output_cost_per_token": 2e-05, "supports_audio_input": true, @@ -4461,7 +5083,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 8e-05, "output_cost_per_token": 2e-05, "supported_modalities": [ @@ -4553,7 +5175,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_none_reasoning_effort": true, "supports_minimal_reasoning_effort": true @@ -5201,7 +5822,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "azure/gpt-5.2-chat": { @@ -5334,7 +5954,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "azure/gpt-5.3-codex": { @@ -5468,27 +6087,20 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, - "azure/gpt-5.4-2026-03-05": { - "cache_read_input_token_cost": 2.5e-07, - "cache_read_input_token_cost_above_272k_tokens": 5e-07, - "cache_read_input_token_cost_priority": 5e-07, - "cache_read_input_token_cost_above_272k_tokens_priority": 1e-06, - "input_cost_per_token": 2.5e-06, - "input_cost_per_token_above_272k_tokens": 5e-06, - "input_cost_per_token_priority": 5e-06, - "input_cost_per_token_above_272k_tokens_priority": 1e-05, + "azure/us/gpt-5.4": { + "cache_read_input_token_cost": 2.8e-07, + "cache_read_input_token_cost_priority": 5.5e-07, + "input_cost_per_token": 2.75e-06, + "input_cost_per_token_priority": 5.5e-06, + "output_cost_per_token": 1.65e-05, + "output_cost_per_token_priority": 3.3e-05, "litellm_provider": "azure", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 1.5e-05, - "output_cost_per_token_above_272k_tokens": 2.25e-05, - "output_cost_per_token_priority": 3e-05, - "output_cost_per_token_above_272k_tokens_priority": 4.5e-05, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -5510,97 +6122,20 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, - "azure/gpt-5.4-pro": { - "cache_read_input_token_cost": 3e-06, - "cache_read_input_token_cost_above_272k_tokens": 6e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_272k_tokens": 6e-05, - "litellm_provider": "azure", - "max_input_tokens": 1050000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "responses", - "output_cost_per_token": 0.00018, - "output_cost_per_token_above_272k_tokens": 0.00027, - "supported_endpoints": [ - "/v1/batch", - "/v1/responses" - ], - "supported_modalities": [ - "text", - "image" - ], - "supported_output_modalities": [ - "text" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_parallel_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": false, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true, - "supports_web_search": true - }, - "azure/gpt-5.4-pro-2026-03-05": { - "cache_read_input_token_cost": 3e-06, - "cache_read_input_token_cost_above_272k_tokens": 6e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_272k_tokens": 6e-05, - "litellm_provider": "azure", - "max_input_tokens": 1050000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "responses", - "output_cost_per_token": 0.00018, - "output_cost_per_token_above_272k_tokens": 0.00027, - "supported_endpoints": [ - "/v1/batch", - "/v1/responses" - ], - "supported_modalities": [ - "text", - "image" - ], - "supported_output_modalities": [ - "text" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_parallel_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": false, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true, - "supports_web_search": true - }, - "azure/gpt-5.5": { - "cache_read_input_token_cost": 5e-07, - "cache_read_input_token_cost_above_272k_tokens": 1e-06, - "cache_read_input_token_cost_priority": 1e-06, - "cache_read_input_token_cost_above_272k_tokens_priority": 2e-06, - "input_cost_per_token": 5e-06, - "input_cost_per_token_above_272k_tokens": 1e-05, - "input_cost_per_token_priority": 1e-05, - "input_cost_per_token_above_272k_tokens_priority": 2e-05, + "azure/eu/gpt-5.4": { + "cache_read_input_token_cost": 2.8e-07, + "cache_read_input_token_cost_priority": 5.5e-07, + "input_cost_per_token": 2.75e-06, + "input_cost_per_token_priority": 5.5e-06, + "output_cost_per_token": 1.65e-05, + "output_cost_per_token_priority": 3.3e-05, "litellm_provider": "azure", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 3e-05, - "output_cost_per_token_above_272k_tokens": 4.5e-05, - "output_cost_per_token_priority": 6e-05, - "output_cost_per_token_above_272k_tokens_priority": 9e-05, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -5622,31 +6157,26 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, - "supports_vision": true, - "supports_web_search": true, - "supports_none_reasoning_effort": true, - "supports_xhigh_reasoning_effort": true, - "supports_minimal_reasoning_effort": false + "supports_vision": true }, - "azure/gpt-5.5-2026-04-23": { - "cache_read_input_token_cost": 5e-07, - "cache_read_input_token_cost_above_272k_tokens": 1e-06, - "cache_read_input_token_cost_priority": 1e-06, - "cache_read_input_token_cost_above_272k_tokens_priority": 2e-06, - "input_cost_per_token": 5e-06, - "input_cost_per_token_above_272k_tokens": 1e-05, - "input_cost_per_token_priority": 1e-05, - "input_cost_per_token_above_272k_tokens_priority": 2e-05, + "azure/gpt-5.4-2026-03-05": { + "cache_read_input_token_cost": 2.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 5e-07, + "cache_read_input_token_cost_priority": 5e-07, + "cache_read_input_token_cost_above_272k_tokens_priority": 1e-06, + "input_cost_per_token": 2.5e-06, + "input_cost_per_token_above_272k_tokens": 5e-06, + "input_cost_per_token_priority": 5e-06, + "input_cost_per_token_above_272k_tokens_priority": 1e-05, "litellm_provider": "azure", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 3e-05, - "output_cost_per_token_above_272k_tokens": 4.5e-05, - "output_cost_per_token_priority": 6e-05, - "output_cost_per_token_above_272k_tokens_priority": 9e-05, + "output_cost_per_token": 1.5e-05, + "output_cost_per_token_above_272k_tokens": 2.25e-05, + "output_cost_per_token_priority": 3e-05, + "output_cost_per_token_above_272k_tokens_priority": 4.5e-05, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -5668,93 +6198,20 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, - "supports_vision": true, - "supports_web_search": true - }, - "azure/gpt-5.5-pro": { - "cache_read_input_token_cost": 3e-06, - "cache_read_input_token_cost_above_272k_tokens": 6e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_272k_tokens": 6e-05, - "litellm_provider": "azure", - "max_input_tokens": 1050000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "responses", - "output_cost_per_token": 0.00018, - "output_cost_per_token_above_272k_tokens": 0.00027, - "supported_endpoints": [ - "/v1/batch", - "/v1/responses" - ], - "supported_modalities": [ - "text", - "image" - ], - "supported_output_modalities": [ - "text" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_parallel_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": false, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true, - "supports_web_search": true, - "supports_none_reasoning_effort": false, - "supports_xhigh_reasoning_effort": true, - "supports_minimal_reasoning_effort": false, - "supports_low_reasoning_effort": false - }, - "azure/gpt-5.5-pro-2026-04-23": { - "cache_read_input_token_cost": 3e-06, - "cache_read_input_token_cost_above_272k_tokens": 6e-06, - "input_cost_per_token": 3e-05, - "input_cost_per_token_above_272k_tokens": 6e-05, - "litellm_provider": "azure", - "max_input_tokens": 1050000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "responses", - "output_cost_per_token": 0.00018, - "output_cost_per_token_above_272k_tokens": 0.00027, - "supported_endpoints": [ - "/v1/batch", - "/v1/responses" - ], - "supported_modalities": [ - "text", - "image" - ], - "supported_output_modalities": [ - "text" - ], - "supports_function_calling": true, - "supports_native_streaming": true, - "supports_parallel_function_calling": true, - "supports_pdf_input": true, - "supports_prompt_caching": true, - "supports_reasoning": true, - "supports_response_schema": false, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true, - "supports_web_search": true + "supports_vision": true }, - "azure/gpt-5.4-mini": { - "cache_read_input_token_cost": 7.5e-08, - "input_cost_per_token": 7.5e-07, + "azure/us/gpt-5.4-2026-03-05": { + "cache_read_input_token_cost": 2.8e-07, + "cache_read_input_token_cost_priority": 5.5e-07, + "input_cost_per_token": 2.75e-06, + "input_cost_per_token_priority": 5.5e-06, + "output_cost_per_token": 1.65e-05, + "output_cost_per_token_priority": 3.3e-05, "litellm_provider": "azure", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 4.5e-06, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -5776,21 +6233,20 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, - "supports_vision": true, - "supports_web_search": true, - "supports_none_reasoning_effort": false, - "supports_xhigh_reasoning_effort": false + "supports_vision": true }, - "azure/gpt-5.4-mini-2026-03-17": { - "cache_read_input_token_cost": 7.5e-08, - "input_cost_per_token": 7.5e-07, + "azure/eu/gpt-5.4-2026-03-05": { + "cache_read_input_token_cost": 2.8e-07, + "cache_read_input_token_cost_priority": 5.5e-07, + "input_cost_per_token": 2.75e-06, + "input_cost_per_token_priority": 5.5e-06, + "output_cost_per_token": 1.65e-05, + "output_cost_per_token_priority": 3.3e-05, "litellm_provider": "azure", "max_input_tokens": 1050000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 4.5e-06, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -5812,7 +6268,982 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, + "supports_vision": true + }, + "azure/gpt-5.4-pro": { + "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, + "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "responses", + "output_cost_per_token": 0.00018, + "output_cost_per_token_above_272k_tokens": 0.00027, + "supported_endpoints": [ + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": false, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/gpt-5.4-pro-2026-03-05": { + "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, + "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "responses", + "output_cost_per_token": 0.00018, + "output_cost_per_token_above_272k_tokens": 0.00027, + "supported_endpoints": [ + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": false, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/gpt-5.6": { + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1e-06, + "cache_read_input_token_cost_priority": 1e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 2e-06, + "input_cost_per_token": 5e-06, + "input_cost_per_token_above_272k_tokens": 1e-05, + "input_cost_per_token_priority": 1e-05, + "input_cost_per_token_above_272k_tokens_priority": 2e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-05, + "output_cost_per_token_above_272k_tokens": 4.5e-05, + "output_cost_per_token_priority": 6e-05, + "output_cost_per_token_above_272k_tokens_priority": 9e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/gpt-5.6-sol": { + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1e-06, + "cache_read_input_token_cost_priority": 1e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 2e-06, + "input_cost_per_token": 5e-06, + "input_cost_per_token_above_272k_tokens": 1e-05, + "input_cost_per_token_priority": 1e-05, + "input_cost_per_token_above_272k_tokens_priority": 2e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-05, + "output_cost_per_token_above_272k_tokens": 4.5e-05, + "output_cost_per_token_priority": 6e-05, + "output_cost_per_token_above_272k_tokens_priority": 9e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/gpt-5.6-terra": { + "cache_read_input_token_cost": 2e-07, + "cache_read_input_token_cost_above_272k_tokens": 4e-07, + "cache_read_input_token_cost_priority": 4e-07, + "cache_read_input_token_cost_above_272k_tokens_priority": 8e-07, + "input_cost_per_token": 2e-06, + "input_cost_per_token_above_272k_tokens": 4e-06, + "input_cost_per_token_priority": 4e-06, + "input_cost_per_token_above_272k_tokens_priority": 8e-06, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.2e-05, + "output_cost_per_token_above_272k_tokens": 1.8e-05, + "output_cost_per_token_priority": 2.4e-05, + "output_cost_per_token_above_272k_tokens_priority": 3.6e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/gpt-5.6-luna": { + "cache_read_input_token_cost": 2e-08, + "cache_read_input_token_cost_above_272k_tokens": 4e-08, + "cache_read_input_token_cost_priority": 4e-08, + "cache_read_input_token_cost_above_272k_tokens_priority": 8e-08, + "input_cost_per_token": 2e-07, + "input_cost_per_token_above_272k_tokens": 4e-07, + "input_cost_per_token_priority": 4e-07, + "input_cost_per_token_above_272k_tokens_priority": 8e-07, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.2e-06, + "output_cost_per_token_above_272k_tokens": 1.8e-06, + "output_cost_per_token_priority": 2.4e-06, + "output_cost_per_token_above_272k_tokens_priority": 3.6e-06, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.6": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.375e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.6-sol": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.375e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.6-terra": { + "cache_read_input_token_cost": 2.2e-07, + "cache_read_input_token_cost_above_272k_tokens": 4.4e-07, + "cache_read_input_token_cost_priority": 5.5e-07, + "input_cost_per_token": 2.2e-06, + "input_cost_per_token_above_272k_tokens": 4.4e-06, + "input_cost_per_token_priority": 5.5e-06, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.32e-05, + "output_cost_per_token_above_272k_tokens": 1.98e-05, + "output_cost_per_token_priority": 3.3e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.6-luna": { + "cache_read_input_token_cost": 2.2e-08, + "cache_read_input_token_cost_above_272k_tokens": 4.4e-08, + "cache_read_input_token_cost_priority": 5.5e-08, + "input_cost_per_token": 2.2e-07, + "input_cost_per_token_above_272k_tokens": 4.4e-07, + "input_cost_per_token_priority": 5.5e-07, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.32e-06, + "output_cost_per_token_above_272k_tokens": 1.98e-06, + "output_cost_per_token_priority": 3.3e-06, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.6": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.375e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.6-sol": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.375e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.6-terra": { + "cache_read_input_token_cost": 2.2e-07, + "cache_read_input_token_cost_above_272k_tokens": 4.4e-07, + "cache_read_input_token_cost_priority": 5.5e-07, + "input_cost_per_token": 2.2e-06, + "input_cost_per_token_above_272k_tokens": 4.4e-06, + "input_cost_per_token_priority": 5.5e-06, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.32e-05, + "output_cost_per_token_above_272k_tokens": 1.98e-05, + "output_cost_per_token_priority": 3.3e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.6-luna": { + "cache_read_input_token_cost": 2.2e-08, + "cache_read_input_token_cost_above_272k_tokens": 4.4e-08, + "cache_read_input_token_cost_priority": 5.5e-08, + "input_cost_per_token": 2.2e-07, + "input_cost_per_token_above_272k_tokens": 4.4e-07, + "input_cost_per_token_priority": 5.5e-07, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.32e-06, + "output_cost_per_token_above_272k_tokens": 1.98e-06, + "output_cost_per_token_priority": 3.3e-06, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/gpt-5.5": { + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1e-06, + "cache_read_input_token_cost_priority": 1e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 2e-06, + "input_cost_per_token": 5e-06, + "input_cost_per_token_above_272k_tokens": 1e-05, + "input_cost_per_token_priority": 1e-05, + "input_cost_per_token_above_272k_tokens_priority": 2e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-05, + "output_cost_per_token_above_272k_tokens": 4.5e-05, + "output_cost_per_token_priority": 6e-05, + "output_cost_per_token_above_272k_tokens_priority": 9e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/us/gpt-5.5": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.38e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/eu/gpt-5.5": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.38e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false + }, + "azure/gpt-5.5-2026-04-23": { + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1e-06, + "cache_read_input_token_cost_priority": 1e-06, + "cache_read_input_token_cost_above_272k_tokens_priority": 2e-06, + "input_cost_per_token": 5e-06, + "input_cost_per_token_above_272k_tokens": 1e-05, + "input_cost_per_token_priority": 1e-05, + "input_cost_per_token_above_272k_tokens_priority": 2e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-05, + "output_cost_per_token_above_272k_tokens": 4.5e-05, + "output_cost_per_token_priority": 6e-05, + "output_cost_per_token_above_272k_tokens_priority": 9e-05, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/us/gpt-5.5-2026-04-23": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.38e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/eu/gpt-5.5-2026-04-23": { + "cache_read_input_token_cost": 5.5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1.1e-06, + "cache_read_input_token_cost_priority": 1.38e-06, + "input_cost_per_token": 5.5e-06, + "input_cost_per_token_above_272k_tokens": 1.1e-05, + "input_cost_per_token_priority": 1.375e-05, + "output_cost_per_token": 3.3e-05, + "output_cost_per_token_above_272k_tokens": 4.95e-05, + "output_cost_per_token_priority": 8.25e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/gpt-5.5-pro": { + "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, + "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "responses", + "output_cost_per_token": 0.00018, + "output_cost_per_token_above_272k_tokens": 0.00027, + "supported_endpoints": [ + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": false, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": false, + "supports_xhigh_reasoning_effort": true, + "supports_minimal_reasoning_effort": false, + "supports_low_reasoning_effort": false + }, + "azure/gpt-5.5-pro-2026-04-23": { + "cache_read_input_token_cost": 3e-06, + "cache_read_input_token_cost_above_272k_tokens": 6e-06, + "input_cost_per_token": 3e-05, + "input_cost_per_token_above_272k_tokens": 6e-05, + "litellm_provider": "azure", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "responses", + "output_cost_per_token": 0.00018, + "output_cost_per_token_above_272k_tokens": 0.00027, + "supported_endpoints": [ + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": false, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "azure/gpt-5.4-mini": { + "cache_read_input_token_cost": 7.5e-08, + "input_cost_per_token": 7.5e-07, + "litellm_provider": "azure", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 4.5e-06, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": false, + "supports_xhigh_reasoning_effort": false + }, + "azure/gpt-5.4-mini-2026-03-17": { + "cache_read_input_token_cost": 7.5e-08, + "input_cost_per_token": 7.5e-07, + "litellm_provider": "azure", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 4.5e-06, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -5822,7 +7253,7 @@ "cache_read_input_token_cost": 2e-08, "input_cost_per_token": 2e-07, "litellm_provider": "azure", - "max_input_tokens": 1050000, + "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -5848,7 +7279,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -5858,7 +7288,7 @@ "cache_read_input_token_cost": 2e-08, "input_cost_per_token": 2e-07, "litellm_provider": "azure", - "max_input_tokens": 1050000, + "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", @@ -5884,14 +7314,12 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, "supports_xhigh_reasoning_effort": false }, "azure/gpt-image-1": { - "cache_read_input_image_token_cost": 2.5e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_image_token": 1e-05, "input_cost_per_token": 5e-06, @@ -6003,7 +7431,6 @@ ] }, "azure/gpt-image-1-mini": { - "cache_read_input_image_token_cost": 2.5e-07, "cache_read_input_token_cost": 2e-07, "input_cost_per_image_token": 2.5e-06, "input_cost_per_token": 2e-06, @@ -6016,7 +7443,6 @@ ] }, "azure/gpt-image-1.5": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "input_cost_per_image_token": 8e-06, @@ -6029,7 +7455,6 @@ ] }, "azure/gpt-image-1.5-2025-12-16": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "input_cost_per_image_token": 8e-06, @@ -6042,7 +7467,6 @@ ] }, "azure/gpt-image-2": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "input_cost_per_image_token": 8e-06, @@ -6058,7 +7482,6 @@ "supports_pdf_input": true }, "azure/gpt-image-2-2026-04-21": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "input_cost_per_image_token": 8e-06, @@ -6732,7 +8155,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2.2e-05, "output_cost_per_token": 2.64e-06, "supports_audio_input": true, @@ -6751,7 +8174,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 0.00022, "output_cost_per_token": 2.2e-05, "supports_audio_input": true, @@ -6770,7 +8193,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 8e-05, "output_cost_per_token": 2.2e-05, "supported_modalities": [ @@ -7552,7 +8975,6 @@ "litellm_provider": "azure_ai", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -7563,7 +8985,6 @@ "litellm_provider": "azure_ai", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -7574,7 +8995,6 @@ "litellm_provider": "azure_ai", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -7585,7 +9005,6 @@ "litellm_provider": "azure_ai", "max_input_tokens": 32768, "max_output_tokens": 32768, - "max_query_tokens": 4096, "max_tokens": 32768, "mode": "rerank", "output_cost_per_token": 0.0, @@ -7597,7 +9016,6 @@ "litellm_provider": "azure_ai", "max_input_tokens": 32768, "max_output_tokens": 32768, - "max_query_tokens": 4096, "max_tokens": 32768, "mode": "rerank", "output_cost_per_token": 0.0, @@ -9110,17 +10528,16 @@ }, "bedrock/us-east-1/minimax.minimax-m2.5": { "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.2e-06, "litellm_provider": "bedrock", "max_input_tokens": 1000000, "max_output_tokens": 8192, "max_tokens": 8192, "mode": "chat", - "source": "https://aws.amazon.com/bedrock/pricing/", "supports_function_calling": true, - "supports_reasoning": true, "supports_system_messages": true, "supports_tool_choice": true, - "output_cost_per_token": 1.2e-06 + "source": "https://aws.amazon.com/bedrock/pricing/" }, "bedrock/us-east-1/moonshotai.kimi-k2-thinking": { "input_cost_per_token": 6e-07, @@ -9349,7 +10766,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-east-1/claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 4.5e-06, @@ -9371,7 +10790,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-east-1/meta.llama3-70b-instruct-v1:0": { "input_cost_per_token": 2.65e-06, @@ -9524,7 +10945,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-west-1/claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 4.5e-06, @@ -9546,7 +10969,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "bedrock/us-gov-west-1/meta.llama3-70b-instruct-v1:0": { "input_cost_per_token": 2.65e-06, @@ -9732,17 +11157,16 @@ }, "bedrock/us-west-2/minimax.minimax-m2.5": { "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.2e-06, "litellm_provider": "bedrock", "max_input_tokens": 1000000, "max_output_tokens": 8192, "max_tokens": 8192, "mode": "chat", - "source": "https://aws.amazon.com/bedrock/pricing/", "supports_function_calling": true, - "supports_reasoning": true, "supports_system_messages": true, "supports_tool_choice": true, - "output_cost_per_token": 1.2e-06 + "source": "https://aws.amazon.com/bedrock/pricing/" }, "bedrock/us-west-2/moonshotai.kimi-k2-thinking": { "input_cost_per_token": 6e-07, @@ -9797,7 +11221,8 @@ "supports_pdf_input": true, "supports_prompt_caching": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "prompt_cache_min_tokens": 2048 }, "black_forest_labs/flux-kontext-pro": { "litellm_provider": "black_forest_labs", @@ -10017,7 +11442,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "claude-haiku-4-5": { "cache_creation_input_token_cost": 1.25e-06, @@ -10038,7 +11464,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "claude-3-7-sonnet-20250219": { "cache_creation_input_token_cost": 3.75e-06, @@ -10128,7 +11555,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-4-sonnet-20250514": { "cache_creation_input_token_cost": 3.75e-06, @@ -10158,7 +11586,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-5": { "cache_creation_input_token_cost": 3.75e-06, @@ -10188,8 +11617,10 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-5-20250929": { "cache_creation_input_token_cost": 3.75e-06, @@ -10219,9 +11650,46 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "prompt_cache_min_tokens": 1024 + }, + "claude-sonnet-5": { + "cache_creation_input_token_cost": 2.5e-06, + "cache_creation_input_token_cost_above_1hr": 4e-06, + "cache_read_input_token_cost": 2e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "anthropic", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "provider_specific_entry": { + "us": 1.1 + }, + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-6": { "cache_creation_input_token_cost": 3.75e-06, @@ -10247,10 +11715,12 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_max_reasoning_effort": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 3.75e-06, @@ -10276,7 +11746,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "claude-opus-4-1": { "cache_creation_input_token_cost": 1.875e-05, @@ -10301,8 +11773,10 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-opus-4-1-20250805": { "cache_creation_input_token_cost": 1.875e-05, @@ -10328,8 +11802,10 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-opus-4-20250514": { "cache_creation_input_token_cost": 1.875e-05, @@ -10356,7 +11832,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "claude-opus-4-5-20251101": { "cache_creation_input_token_cost": 6.25e-06, @@ -10381,9 +11858,11 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-5": { "cache_creation_input_token_cost": 6.25e-06, @@ -10408,9 +11887,11 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-6": { "cache_creation_input_token_cost": 6.25e-06, @@ -10436,6 +11917,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, "provider_specific_entry": { @@ -10443,7 +11925,9 @@ "fast": 6.0 }, "supports_output_config": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "supports_speed": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-6-20260205": { "cache_creation_input_token_cost": 6.25e-06, @@ -10469,6 +11953,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_tool_choice": true, "supports_vision": true, "provider_specific_entry": { @@ -10476,7 +11961,9 @@ "fast": 6.0 }, "supports_max_reasoning_effort": true, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 4096 }, "claude-opus-4-7": { "cache_creation_input_token_cost": 6.25e-06, @@ -10502,6 +11989,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_sampling_params": false, "supports_tool_choice": true, "supports_vision": true, @@ -10511,7 +11999,9 @@ "us": 1.1, "fast": 6.0 }, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 2048 }, "claude-opus-4-7-20260416": { "cache_creation_input_token_cost": 6.25e-06, @@ -10537,6 +12027,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_sampling_params": false, "supports_tool_choice": true, "supports_vision": true, @@ -10546,7 +12037,9 @@ "us": 1.1, "fast": 6.0 }, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 2048 }, "claude-fable-5": { "cache_creation_input_token_cost": 1.25e-05, @@ -10580,7 +12073,46 @@ "provider_specific_entry": { "us": 1.1 }, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 512 + }, + "claude-opus-5": { + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_1hr": 1e-05, + "cache_read_input_token_cost": 5e-07, + "input_cost_per_token": 5e-06, + "litellm_provider": "anthropic", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.5e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_native_structured_output": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "provider_specific_entry": { + "us": 1.1, + "fast": 2.0 + }, + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 512 }, "claude-opus-4-8": { "cache_creation_input_token_cost": 6.25e-06, @@ -10606,6 +12138,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_native_structured_output": true, "supports_sampling_params": false, "supports_tool_choice": true, "supports_vision": true, @@ -10615,7 +12148,9 @@ "us": 1.1, "fast": 2.0 }, - "supports_output_config": true + "supports_output_config": true, + "supports_speed": true, + "prompt_cache_min_tokens": 1024 }, "claude-sonnet-4-20250514": { "deprecation_date": "2026-05-14", @@ -10646,7 +12181,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "cloudflare/@cf/meta/llama-2-7b-chat-fp16": { "input_cost_per_token": 1.923e-06, @@ -10684,6 +12220,268 @@ "mode": "chat", "output_cost_per_token": 1.923e-06 }, + "cloudflare/@cf/openai/gpt-oss-120b": { + "input_cost_per_token": 3.5e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 7.5e-07, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/google/gemma-2b-it-lora": { + "input_cost_per_token": 0.0, + "litellm_provider": "cloudflare", + "max_input_tokens": 8192, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 0.0 + }, + "cloudflare/@cf/meta/llama-3.2-3b-instruct": { + "input_cost_per_token": 5.09e-08, + "litellm_provider": "cloudflare", + "max_input_tokens": 80000, + "max_output_tokens": 80000, + "max_tokens": 80000, + "mode": "chat", + "output_cost_per_token": 3.35e-07 + }, + "cloudflare/@cf/meta/llama-guard-3-8b": { + "input_cost_per_token": 4.84e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 3e-08 + }, + "cloudflare/@cf/mistral/mistral-7b-instruct-v0.2-lora": { + "input_cost_per_token": 0.0, + "litellm_provider": "cloudflare", + "max_input_tokens": 15000, + "max_output_tokens": 15000, + "max_tokens": 15000, + "mode": "chat", + "output_cost_per_token": 0.0 + }, + "cloudflare/@cf/moonshotai/kimi-k2.7-code": { + "cache_read_input_token_cost": 1.9e-07, + "input_cost_per_token": 9.5e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 4e-06, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": { + "input_cost_per_token": 4.97e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 80000, + "max_output_tokens": 80000, + "max_tokens": 80000, + "mode": "chat", + "output_cost_per_token": 4.881e-06, + "supports_reasoning": true + }, + "cloudflare/@cf/meta/llama-3.1-8b-instruct-fp8": { + "input_cost_per_token": 1.52e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 32000, + "max_output_tokens": 32000, + "max_tokens": 32000, + "mode": "chat", + "output_cost_per_token": 2.87e-07 + }, + "cloudflare/@cf/meta/llama-3.2-1b-instruct": { + "input_cost_per_token": 2.7e-08, + "litellm_provider": "cloudflare", + "max_input_tokens": 60000, + "max_output_tokens": 60000, + "max_tokens": 60000, + "mode": "chat", + "output_cost_per_token": 2.01e-07 + }, + "cloudflare/@cf/moonshotai/kimi-k2.6": { + "cache_read_input_token_cost": 1.6e-07, + "input_cost_per_token": 9.5e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 4e-06, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/zai-org/glm-4.7-flash": { + "input_cost_per_token": 6.05e-08, + "litellm_provider": "cloudflare", + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4e-07, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/meta-llama/llama-2-7b-chat-hf-lora": { + "input_cost_per_token": 0.0, + "litellm_provider": "cloudflare", + "max_input_tokens": 8192, + "max_output_tokens": 8192, + "max_tokens": 8192, + "mode": "chat", + "output_cost_per_token": 0.0 + }, + "cloudflare/@cf/meta/llama-3.3-70b-instruct-fp8-fast": { + "input_cost_per_token": 2.93e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 24000, + "max_output_tokens": 24000, + "max_tokens": 24000, + "mode": "chat", + "output_cost_per_token": 2.253e-06, + "supports_function_calling": true + }, + "cloudflare/@cf/ibm-granite/granite-4.0-h-micro": { + "input_cost_per_token": 1.7e-08, + "litellm_provider": "cloudflare", + "max_input_tokens": 131000, + "max_output_tokens": 131000, + "max_tokens": 131000, + "mode": "chat", + "output_cost_per_token": 1.12e-07, + "supports_function_calling": true + }, + "cloudflare/@cf/qwen/qwen2.5-coder-32b-instruct": { + "input_cost_per_token": 6.6e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 32768, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 1e-06 + }, + "cloudflare/@cf/zai-org/glm-5.2": { + "cache_read_input_token_cost": 2.6e-07, + "input_cost_per_token": 1.4e-06, + "litellm_provider": "cloudflare", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 4.4e-06, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/nvidia/nemotron-3-120b-a12b": { + "input_cost_per_token": 5e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 256000, + "max_output_tokens": 256000, + "max_tokens": 256000, + "mode": "chat", + "output_cost_per_token": 1.5e-06, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/aisingapore/gemma-sea-lion-v4-27b-it": { + "input_cost_per_token": 3.51e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 5.55e-07 + }, + "cloudflare/@cf/qwen/qwen3-30b-a3b-fp8": { + "input_cost_per_token": 5.09e-08, + "litellm_provider": "cloudflare", + "max_input_tokens": 32768, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 3.35e-07, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/google/gemma-7b-it-lora": { + "input_cost_per_token": 0.0, + "litellm_provider": "cloudflare", + "max_input_tokens": 3500, + "max_output_tokens": 3500, + "max_tokens": 3500, + "mode": "chat", + "output_cost_per_token": 0.0 + }, + "cloudflare/@cf/google/gemma-4-26b-a4b-it": { + "input_cost_per_token": 1e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 256000, + "max_output_tokens": 256000, + "max_tokens": 256000, + "mode": "chat", + "output_cost_per_token": 3e-07, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/mistralai/mistral-small-3.1-24b-instruct": { + "input_cost_per_token": 3.51e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 5.55e-07, + "supports_function_calling": true + }, + "cloudflare/@cf/meta/llama-3.2-11b-vision-instruct": { + "input_cost_per_token": 4.85e-08, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 6.76e-07, + "supports_vision": true + }, + "cloudflare/@cf/openai/gpt-oss-20b": { + "input_cost_per_token": 2e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-07, + "supports_function_calling": true, + "supports_reasoning": true + }, + "cloudflare/@cf/meta/llama-4-scout-17b-16e-instruct": { + "input_cost_per_token": 2.7e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 131000, + "max_output_tokens": 131000, + "max_tokens": 131000, + "mode": "chat", + "output_cost_per_token": 8.5e-07, + "supports_function_calling": true + }, + "cloudflare/@cf/qwen/qwq-32b": { + "input_cost_per_token": 6.6e-07, + "litellm_provider": "cloudflare", + "max_input_tokens": 24000, + "max_output_tokens": 24000, + "max_tokens": 24000, + "mode": "chat", + "output_cost_per_token": 1e-06, + "supports_reasoning": true + }, "codestral/codestral-2405": { "input_cost_per_token": 0.0, "litellm_provider": "codestral", @@ -10819,12 +12617,9 @@ "input_cost_per_query": 0.002, "input_cost_per_token": 0.0, "litellm_provider": "bedrock", - "max_document_chunks_per_query": 100, "max_input_tokens": 32000, "max_output_tokens": 32000, - "max_query_tokens": 32000, "max_tokens": 32000, - "max_tokens_per_document_chunk": 512, "mode": "rerank", "output_cost_per_token": 0.0 }, @@ -10912,13 +12707,13 @@ "supports_tool_choice": true }, "command-r7b-12-2024": { - "input_cost_per_token": 1.5e-07, + "input_cost_per_token": 3.75e-08, "litellm_provider": "cohere_chat", "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, "mode": "chat", - "output_cost_per_token": 3.75e-08, + "output_cost_per_token": 1.5e-07, "source": "https://docs.cohere.com/v2/docs/command-r7b", "supports_function_calling": true, "supports_tool_choice": true @@ -11754,6 +13549,56 @@ } ] }, + "dashscope/qwen3.7-max": { + "cache_read_input_token_cost": 5e-07, + "input_cost_per_token": 2.5e-06, + "litellm_provider": "dashscope", + "max_input_tokens": 991808, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_token": 7.5e-06, + "source": "https://www.alibabacloud.com/help/en/model-studio/models", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true + }, + "dashscope/qwen3.7-plus": { + "litellm_provider": "dashscope", + "max_input_tokens": 991808, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "source": "https://www.alibabacloud.com/help/en/model-studio/models", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "tiered_pricing": [ + { + "cache_read_input_token_cost": 8e-08, + "input_cost_per_token": 4e-07, + "output_cost_per_token": 1.6e-06, + "range": [ + 0, + 256000.0 + ] + }, + { + "cache_read_input_token_cost": 2.4e-07, + "input_cost_per_token": 1.2e-06, + "output_cost_per_token": 4.8e-06, + "range": [ + 256000.0, + 1000000.0 + ] + } + ] + }, "dashscope/qwq-plus": { "input_cost_per_token": 8e-07, "litellm_provider": "dashscope", @@ -13876,6 +15721,14 @@ "notes": "APISerpent deep search (/api/search), multi-engine (Google, Bing, Yahoo, DuckDuckGo). Pricing: $0.60/1k searches." } }, + "tinyfish/search": { + "input_cost_per_query": 0.0, + "litellm_provider": "tinyfish", + "mode": "search", + "metadata": { + "notes": "TinyFish Search API" + } + }, "elevenlabs/scribe_v1": { "input_cost_per_second": 6.11e-05, "litellm_provider": "elevenlabs", @@ -14052,7 +15905,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "cache_read_input_token_cost": 2.5e-08, - "cache_creation_input_token_cost": 3.125e-07 + "cache_creation_input_token_cost": 3.125e-07, + "prompt_cache_min_tokens": 2048 }, "eu.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.375e-06, @@ -14076,7 +15930,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "eu.anthropic.claude-3-5-sonnet-20240620-v1:0": { "input_cost_per_token": 3e-06, @@ -14203,7 +16059,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-opus-4-20250514-v1:0": { "cache_creation_input_token_cost": 1.875e-05, @@ -14228,7 +16085,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 3.75e-06, @@ -14257,7 +16115,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "eu.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 4.125e-06, @@ -14289,7 +16149,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "eu.meta.llama3-2-1b-instruct-v1:0": { "input_cost_per_token": 1.3e-07, @@ -14612,6 +16474,38 @@ "supports_response_schema": true, "supports_tool_choice": true }, + "fireworks_ai/accounts/fireworks/models/deepseek-v4-flash": { + "cache_read_input_token_cost": 2.8e-08, + "input_cost_per_token": 1.4e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 2.8e-07, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/accounts/fireworks/models/deepseek-v4-pro": { + "cache_read_input_token_cost": 1.45e-07, + "input_cost_per_token": 1.74e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 3.48e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, "fireworks_ai/accounts/fireworks/models/firefunction-v2": { "input_cost_per_token": 9e-07, "litellm_provider": "fireworks_ai", @@ -14687,43 +16581,64 @@ "input_cost_per_token": 1.4e-06, "litellm_provider": "fireworks_ai", "max_input_tokens": 202800, - "max_output_tokens": 202800, - "max_tokens": 202800, + "max_output_tokens": 131072, + "max_tokens": 131072, "mode": "chat", "output_cost_per_token": 4.4e-06, - "source": "https://fireworks.ai/models/fireworks/glm-5p1", + "source": "https://docs.fireworks.ai/serverless/pricing", "supports_function_calling": true, "supports_reasoning": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/accounts/fireworks/models/glm-5p2": { + "cache_read_input_token_cost": 1.4e-07, + "input_cost_per_token": 1.4e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4.4e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false }, "fireworks_ai/accounts/fireworks/models/gpt-oss-120b": { + "cache_read_input_token_cost": 1.5e-08, "input_cost_per_token": 1.5e-07, "litellm_provider": "fireworks_ai", "max_input_tokens": 131072, - "max_output_tokens": 131072, - "max_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, "mode": "chat", "output_cost_per_token": 6e-07, - "source": "https://fireworks.ai/pricing", + "source": "https://docs.fireworks.ai/serverless/pricing", "supports_function_calling": true, "supports_reasoning": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, "fireworks_ai/accounts/fireworks/models/gpt-oss-20b": { - "input_cost_per_token": 5e-08, + "cache_read_input_token_cost": 3.5e-08, + "input_cost_per_token": 7e-08, "litellm_provider": "fireworks_ai", "max_input_tokens": 131072, - "max_output_tokens": 131072, - "max_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, "mode": "chat", - "output_cost_per_token": 2e-07, - "source": "https://fireworks.ai/pricing", + "output_cost_per_token": 3e-07, + "source": "https://docs.fireworks.ai/serverless/pricing", "supports_function_calling": true, "supports_reasoning": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false }, "fireworks_ai/accounts/fireworks/models/kimi-k2-instruct": { "input_cost_per_token": 6e-07, @@ -14770,8 +16685,8 @@ "input_cost_per_token": 6e-07, "litellm_provider": "fireworks_ai", "max_input_tokens": 262144, - "max_output_tokens": 262144, - "max_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, "mode": "chat", "output_cost_per_token": 3e-06, "source": "https://fireworks.ai/pricing", @@ -14779,6 +16694,38 @@ "supports_response_schema": true, "supports_tool_choice": true }, + "fireworks_ai/accounts/fireworks/models/kimi-k2p6": { + "cache_read_input_token_cost": 1.6e-07, + "input_cost_per_token": 9.5e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 4e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "fireworks_ai/accounts/fireworks/models/kimi-k2p7-code": { + "cache_read_input_token_cost": 1.9e-07, + "input_cost_per_token": 9.5e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 4e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct": { "input_cost_per_token": 3e-06, "litellm_provider": "fireworks_ai", @@ -14896,6 +16843,38 @@ "supports_response_schema": true, "supports_tool_choice": true }, + "fireworks_ai/accounts/fireworks/models/minimax-m2p7": { + "cache_read_input_token_cost": 6e-08, + "input_cost_per_token": 3e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 196608, + "max_output_tokens": 196608, + "max_tokens": 196608, + "mode": "chat", + "output_cost_per_token": 1.2e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/accounts/fireworks/models/minimax-m3": { + "cache_read_input_token_cost": 6e-08, + "input_cost_per_token": 3e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 512000, + "max_output_tokens": 512000, + "max_tokens": 512000, + "mode": "chat", + "output_cost_per_token": 1.2e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct-hf": { "input_cost_per_token": 1.2e-06, "litellm_provider": "fireworks_ai", @@ -14948,6 +16927,38 @@ "supports_response_schema": true, "supports_tool_choice": false }, + "fireworks_ai/deepseek-v4-flash": { + "cache_read_input_token_cost": 2.8e-08, + "input_cost_per_token": 1.4e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 2.8e-07, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/deepseek-v4-pro": { + "cache_read_input_token_cost": 1.45e-07, + "input_cost_per_token": 1.74e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 3.48e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, "fireworks_ai/glm-4p7": { "cache_read_input_token_cost": 3e-07, "input_cost_per_token": 6e-07, @@ -14968,23 +16979,88 @@ "input_cost_per_token": 1.4e-06, "litellm_provider": "fireworks_ai", "max_input_tokens": 202800, - "max_output_tokens": 202800, - "max_tokens": 202800, + "max_output_tokens": 131072, + "max_tokens": 131072, "mode": "chat", "output_cost_per_token": 4.4e-06, - "source": "https://fireworks.ai/models/fireworks/glm-5p1", + "source": "https://docs.fireworks.ai/serverless/pricing", "supports_function_calling": true, "supports_reasoning": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/glm-5p1-fast": { + "cache_read_input_token_cost": 5.2e-07, + "input_cost_per_token": 2.8e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 202800, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 8.8e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/glm-5p2": { + "cache_read_input_token_cost": 1.4e-07, + "input_cost_per_token": 1.4e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4.4e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/gpt-oss-120b": { + "cache_read_input_token_cost": 1.5e-08, + "input_cost_per_token": 1.5e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 6e-07, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/gpt-oss-20b": { + "cache_read_input_token_cost": 3.5e-08, + "input_cost_per_token": 7e-08, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 3e-07, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false }, "fireworks_ai/kimi-k2p5": { "cache_read_input_token_cost": 1e-07, "input_cost_per_token": 6e-07, "litellm_provider": "fireworks_ai", "max_input_tokens": 262144, - "max_output_tokens": 262144, - "max_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, "mode": "chat", "output_cost_per_token": 3e-06, "source": "https://fireworks.ai/pricing", @@ -14992,6 +17068,70 @@ "supports_response_schema": true, "supports_tool_choice": true }, + "fireworks_ai/kimi-k2p6": { + "cache_read_input_token_cost": 1.6e-07, + "input_cost_per_token": 9.5e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 4e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "fireworks_ai/kimi-k2p6-fast": { + "cache_read_input_token_cost": 3e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 8e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "fireworks_ai/kimi-k2p7-code": { + "cache_read_input_token_cost": 1.9e-07, + "input_cost_per_token": 9.5e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 4e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "fireworks_ai/kimi-k2p7-code-fast": { + "cache_read_input_token_cost": 3.8e-07, + "input_cost_per_token": 1.9e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 8e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "fireworks_ai/minimax-m2p1": { "cache_read_input_token_cost": 3e-08, "input_cost_per_token": 3e-07, @@ -15006,6 +17146,54 @@ "supports_response_schema": true, "supports_tool_choice": true }, + "fireworks_ai/minimax-m2p7": { + "cache_read_input_token_cost": 6e-08, + "input_cost_per_token": 3e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 196608, + "max_output_tokens": 196608, + "max_tokens": 196608, + "mode": "chat", + "output_cost_per_token": 1.2e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/minimax-m3": { + "cache_read_input_token_cost": 6e-08, + "input_cost_per_token": 3e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 512000, + "max_output_tokens": 512000, + "max_tokens": 512000, + "mode": "chat", + "output_cost_per_token": 1.2e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "fireworks_ai/qwen3p7-plus": { + "cache_read_input_token_cost": 8e-08, + "input_cost_per_token": 4e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_token": 1.6e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "fireworks_ai/nomic-ai/nomic-embed-text-v1": { "input_cost_per_token": 8e-09, "litellm_provider": "fireworks_ai-embedding-models", @@ -15285,15 +17473,9 @@ "input_cost_per_audio_token": 7e-07, "input_cost_per_token": 1e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-07, "source": "https://ai.google.dev/pricing#2_0flash", @@ -15330,15 +17512,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 1.5e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 6e-07, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", @@ -15373,14 +17549,8 @@ "input_cost_per_audio_token": 7.5e-08, "input_cost_per_token": 7.5e-08, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-07, "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash", @@ -15414,14 +17584,8 @@ "input_cost_per_audio_token": 7.5e-08, "input_cost_per_token": 7.5e-08, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-07, "source": "https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-2.0-flash", @@ -15454,15 +17618,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, @@ -15498,7 +17656,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini-2.5-flash-image": { @@ -15506,15 +17663,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, - "max_pdf_size_mb": 30, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "image_generation", "output_cost_per_image": 0.039, "output_cost_per_image_token": 3e-05, @@ -15549,9 +17700,48 @@ "supports_vision": true, "supports_web_search": false, "tpm": 8000000, - "supports_service_tier": true, "supports_image_size": false }, + "gemini-3-pro-image": { + "input_cost_per_image": 0.0011, + "input_cost_per_token": 2e-06, + "input_cost_per_token_batches": 1e-06, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.134, + "output_cost_per_image_token": 0.00012, + "output_cost_per_token": 1.2e-05, + "output_cost_per_token_batches": 6e-06, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, "gemini-3-pro-image-preview": { "input_cost_per_image": 0.0011, "input_cost_per_token": 2e-06, @@ -15590,8 +17780,45 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" + }, + "gemini-3.1-flash-image": { + "input_cost_per_image": 0.00056, + "input_cost_per_token": 5e-07, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.0672, + "output_cost_per_image_token": 6e-05, + "output_cost_per_token": 3e-06, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" }, "gemini-3.1-flash-image-preview": { "input_cost_per_image": 0.00056, @@ -15633,19 +17860,12 @@ }, "gemini-3.1-flash-lite-preview": { "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 2.5e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 1.5e-06, "output_cost_per_token": 1.5e-06, @@ -15666,8 +17886,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -15686,14 +17904,11 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, "cache_read_input_token_cost_priority": 4.5e-08, "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 2.5e-07, @@ -15701,15 +17916,9 @@ "input_cost_per_token_flex": 1.25e-07, "input_cost_per_token_priority": 4.5e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 1.5e-06, "output_cost_per_token": 1.5e-06, @@ -15733,8 +17942,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -15753,8 +17960,62 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" + }, + "gemini-3.5-flash-lite": { + "cache_read_input_token_cost": 3e-08, + "cache_read_input_token_cost_flex": 2e-08, + "cache_read_input_token_cost_priority": 5e-08, + "input_cost_per_token": 3e-07, + "input_cost_per_token_batches": 1.5e-07, + "input_cost_per_token_flex": 1.5e-07, + "input_cost_per_token_priority": 5.4e-07, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 2.5e-06, + "output_cost_per_token": 2.5e-06, + "output_cost_per_token_batches": 1.25e-06, + "output_cost_per_token_flex": 1.25e-06, + "output_cost_per_token_priority": 4.5e-06, + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" }, "deep-research-pro-preview-12-2025": { "input_cost_per_image": 0.0011, @@ -15795,15 +18056,9 @@ "input_cost_per_audio_token": 3e-07, "input_cost_per_token": 1e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -15839,7 +18094,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini-2.5-flash-lite-preview-09-2025": { @@ -15847,15 +18101,9 @@ "input_cost_per_audio_token": 3e-07, "input_cost_per_token": 1e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -15898,15 +18146,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, @@ -15949,15 +18191,9 @@ "input_cost_per_audio_token": 3e-06, "input_cost_per_token": 3e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "realtime", "output_cost_per_audio_token": 1.2e-05, "output_cost_per_token": 2e-06, @@ -15991,22 +18227,17 @@ "search_context_size_low": 0.035, "search_context_size_medium": 0.035, "search_context_size_high": 0.035 - } + }, + "gemini_native_audio": true }, "gemini/gemini-live-2.5-flash-preview-native-audio-09-2025": { "cache_read_input_token_cost": 7.5e-08, "input_cost_per_audio_token": 3e-06, "input_cost_per_token": 3e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "realtime", "output_cost_per_audio_token": 1.2e-05, "output_cost_per_token": 2e-06, @@ -16042,7 +18273,8 @@ "search_context_size_low": 0.035, "search_context_size_medium": 0.035, "search_context_size_high": 0.035 - } + }, + "gemini_native_audio": true }, "gemini-2.5-flash-lite-preview-06-17": { "deprecation_date": "2025-11-18", @@ -16050,15 +18282,9 @@ "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 1e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -16103,15 +18329,9 @@ "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1e-05, "output_cost_per_token_above_200k_tokens": 1.5e-05, @@ -16144,8 +18364,7 @@ "search_context_size_low": 0.035, "search_context_size_medium": 0.035, "search_context_size_high": 0.035 - }, - "supports_service_tier": true + } }, "gemini-3-pro-preview": { "deprecation_date": "2026-03-26", @@ -16156,15 +18375,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -16202,7 +18415,6 @@ "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "cache_read_input_token_cost_priority": 3.6e-07, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16218,15 +18430,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -16266,7 +18472,6 @@ "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "cache_read_input_token_cost_priority": 3.6e-07, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16282,15 +18487,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -16339,15 +18538,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -16379,13 +18572,60 @@ "supports_vision": true, "supports_web_search": true, "supports_native_streaming": true, - "input_cost_per_token_priority": 3.6e-06, - "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, - "output_cost_per_token_priority": 2.16e-05, - "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, - "cache_read_input_token_cost_priority": 3.6e-07, - "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, + "input_cost_per_token_priority": 3.6e-06, + "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, + "output_cost_per_token_priority": 2.16e-05, + "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, + "cache_read_input_token_cost_priority": 3.6e-07, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "vertex_ai/gemini-3-flash-preview": { + "cache_read_input_token_cost": 5e-08, + "input_cost_per_token": 5e-07, + "input_cost_per_audio_token": 1e-06, + "litellm_provider": "vertex_ai", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_token": 3e-06, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "input_cost_per_token_priority": 9e-07, + "input_cost_per_audio_token_priority": 1.8e-06, + "output_cost_per_token_priority": 5.4e-06, + "cache_read_input_token_cost_priority": 9e-08, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16393,22 +18633,17 @@ }, "web_search_billing_unit": "per_query" }, - "vertex_ai/gemini-3-flash-preview": { - "cache_read_input_token_cost": 5e-08, - "input_cost_per_token": 5e-07, + "vertex_ai/gemini-3.5-flash": { + "cache_read_input_token_cost": 1.5e-07, + "input_cost_per_token": 1.5e-06, "input_cost_per_audio_token": 1e-06, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", - "output_cost_per_token": 3e-06, + "output_cost_per_reasoning_token": 9e-06, + "output_cost_per_token": 9e-06, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -16426,21 +18661,22 @@ ], "supports_audio_input": true, "supports_function_calling": true, + "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, + "supports_url_context": true, "supports_video_input": true, "supports_vision": true, "supports_web_search": true, "supports_native_streaming": true, - "input_cost_per_token_priority": 9e-07, + "input_cost_per_token_priority": 2.7e-06, "input_cost_per_audio_token_priority": 1.8e-06, - "output_cost_per_token_priority": 5.4e-06, - "cache_read_input_token_cost_priority": 9e-08, - "supports_service_tier": true, + "output_cost_per_token_priority": 1.62e-05, + "cache_read_input_token_cost_priority": 2.7e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16448,23 +18684,21 @@ }, "web_search_billing_unit": "per_query" }, - "vertex_ai/gemini-3.5-flash": { + "vertex_ai/gemini-3.6-flash": { "cache_read_input_token_cost": 1.5e-07, + "cache_read_input_token_cost_flex": 7.5e-08, "input_cost_per_token": 1.5e-06, - "input_cost_per_audio_token": 1e-06, + "input_cost_per_token_batches": 7.5e-07, + "input_cost_per_token_flex": 7.5e-07, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, - "max_output_tokens": 65535, - "max_pdf_size_mb": 30, - "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, + "max_output_tokens": 65536, + "max_tokens": 65536, "mode": "chat", - "output_cost_per_reasoning_token": 9e-06, - "output_cost_per_token": 9e-06, + "output_cost_per_reasoning_token": 7.5e-06, + "output_cost_per_token": 7.5e-06, + "output_cost_per_token_batches": 3.75e-06, + "output_cost_per_token_flex": 3.75e-06, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", "supported_endpoints": [ "/v1/chat/completions", @@ -16495,10 +18729,8 @@ "supports_web_search": true, "supports_native_streaming": true, "input_cost_per_token_priority": 2.7e-06, - "input_cost_per_audio_token_priority": 1.8e-06, - "output_cost_per_token_priority": 1.62e-05, + "output_cost_per_token_priority": 1.35e-05, "cache_read_input_token_cost_priority": 2.7e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16514,15 +18746,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -16562,7 +18788,6 @@ "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "cache_read_input_token_cost_priority": 3.6e-07, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16578,15 +18803,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "vertex_ai", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -16626,7 +18845,6 @@ "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "cache_read_input_token_cost_priority": 3.6e-07, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -16641,15 +18859,9 @@ "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1e-05, "output_cost_per_token_above_200k_tokens": 1.5e-05, @@ -16755,11 +18967,103 @@ "search_context_size_high": 0.035 } }, + "gemini/gemini-robotics-er-2-preview": { + "cache_read_input_token_cost": 2e-07, + "input_cost_per_audio_token": 2e-06, + "input_cost_per_token": 2e-06, + "litellm_provider": "gemini", + "max_input_tokens": 131072, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 1e-05, + "output_cost_per_token": 1e-05, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-robotics-er-2", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "web_search_billing_unit": "per_query" + }, + "gemini/gemini-robotics-er-1.6-preview": { + "input_cost_per_audio_token": 2e-06, + "input_cost_per_token": 1e-06, + "litellm_provider": "gemini", + "max_input_tokens": 131072, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 5e-06, + "output_cost_per_token": 5e-06, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-robotics-er", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "web_search_billing_unit": "per_query" + }, "gemini-2.5-computer-use-preview-10-2025": { "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, "litellm_provider": "vertex_ai-language-models", - "max_images_per_prompt": 3000, "max_input_tokens": 128000, "max_output_tokens": 64000, "max_tokens": 64000, @@ -16927,15 +19231,9 @@ "input_cost_per_audio_token": 7e-07, "input_cost_per_token": 1e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-07, "rpm": 10000, @@ -16973,15 +19271,9 @@ "input_cost_per_audio_token": 7e-07, "input_cost_per_token": 1e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-07, "rpm": 10000, @@ -17017,14 +19309,8 @@ "input_cost_per_audio_token": 7.5e-08, "input_cost_per_token": 7.5e-08, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-07, "rpm": 4000, @@ -17058,15 +19344,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, @@ -17104,7 +19384,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini/gemini-2.5-flash-image": { @@ -17112,16 +19391,10 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, "supports_reasoning": false, - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, - "max_pdf_size_mb": 30, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "image_generation", "output_cost_per_image": 0.039, "output_cost_per_image_token": 3e-05, @@ -17161,9 +19434,51 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, + "gemini/gemini-3-pro-image": { + "input_cost_per_image": 0.0011, + "input_cost_per_token": 2e-06, + "input_cost_per_token_batches": 1e-06, + "litellm_provider": "gemini", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.134, + "output_cost_per_image_token": 0.00012, + "output_cost_per_token": 1.2e-05, + "rpm": 1000, + "tpm": 4000000, + "output_cost_per_token_batches": 6e-06, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3-pro-image", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query", + "supports_reasoning": false + }, "gemini/gemini-3-pro-image-preview": { "input_cost_per_image": 0.0011, "input_cost_per_token": 2e-06, @@ -17195,6 +19510,7 @@ ], "supports_function_calling": false, "supports_prompt_caching": true, + "supports_reasoning": false, "supports_response_schema": true, "supports_system_messages": true, "supports_vision": true, @@ -17204,8 +19520,49 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" + }, + "gemini/gemini-3.1-flash-image": { + "input_cost_per_token": 2.5e-07, + "input_cost_per_token_batches": 1.25e-07, + "litellm_provider": "gemini", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.045, + "output_cost_per_image_token": 6e-05, + "output_cost_per_token": 1.5e-06, + "output_cost_per_token_batches": 7.5e-07, + "rpm": 1000, + "tpm": 4000000, + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-image", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text", + "image" + ], + "supports_function_calling": false, + "supports_prompt_caching": true, + "supports_reasoning": false, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_vision": true, + "supports_web_search": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" }, "gemini/gemini-3.1-flash-image-preview": { "input_cost_per_token": 2.5e-07, @@ -17217,7 +19574,6 @@ "mode": "image_generation", "output_cost_per_image": 0.045, "output_cost_per_image_token": 6e-05, - "output_cost_per_image_token_batches": 3e-05, "output_cost_per_token": 1.5e-06, "output_cost_per_token_batches": 7.5e-07, "rpm": 1000, @@ -17238,6 +19594,7 @@ ], "supports_function_calling": false, "supports_prompt_caching": true, + "supports_reasoning": false, "supports_response_schema": true, "supports_system_messages": true, "supports_vision": true, @@ -17295,15 +19652,9 @@ "input_cost_per_audio_token": 3e-07, "input_cost_per_token": 1e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -17341,7 +19692,6 @@ "search_context_size_medium": 0.035, "search_context_size_high": 0.035 }, - "supports_service_tier": true, "supports_image_size": false }, "gemini/gemini-2.5-flash-lite-preview-09-2025": { @@ -17349,15 +19699,9 @@ "input_cost_per_audio_token": 3e-07, "input_cost_per_token": 1e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -17402,15 +19746,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, @@ -17455,15 +19793,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, @@ -17507,15 +19839,9 @@ "input_cost_per_audio_token": 3e-07, "input_cost_per_token": 1e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -17560,15 +19886,9 @@ "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 1e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -17628,15 +19948,9 @@ "input_cost_per_token_priority": 1.25e-06, "input_cost_per_token_above_200k_tokens_priority": 2.5e-06, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1e-05, "output_cost_per_token_above_200k_tokens": 1.5e-05, @@ -17644,7 +19958,6 @@ "output_cost_per_token_above_200k_tokens_priority": 1.5e-05, "rpm": 2000, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", - "supports_service_tier": true, "supported_endpoints": [ "/v1/chat/completions", "/v1/completions" @@ -17671,65 +19984,110 @@ "supports_web_search": true, "tpm": 800000, "search_context_cost_per_query": { - "search_context_size_low": 0.035, - "search_context_size_medium": 0.035, - "search_context_size_high": 0.035 - } - }, - "gemini/gemini-2.5-computer-use-preview-10-2025": { - "input_cost_per_token": 1.25e-06, - "input_cost_per_token_above_200k_tokens": 2.5e-06, - "litellm_provider": "gemini", - "max_images_per_prompt": 3000, - "max_input_tokens": 128000, - "max_output_tokens": 64000, - "max_tokens": 64000, - "mode": "chat", - "output_cost_per_token": 1e-05, - "output_cost_per_token_above_200k_tokens": 1.5e-05, - "rpm": 2000, - "source": "https://ai.google.dev/gemini-api/docs/computer-use", - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/completions" - ], - "supported_modalities": [ - "text", - "image" - ], - "supported_output_modalities": [ - "text" - ], - "supports_computer_use": true, - "supports_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "supports_vision": true, - "tpm": 800000 + "search_context_size_low": 0.035, + "search_context_size_medium": 0.035, + "search_context_size_high": 0.035 + } + }, + "gemini/gemini-2.5-computer-use-preview-10-2025": { + "input_cost_per_token": 1.25e-06, + "input_cost_per_token_above_200k_tokens": 2.5e-06, + "litellm_provider": "gemini", + "max_input_tokens": 128000, + "max_output_tokens": 64000, + "max_tokens": 64000, + "mode": "chat", + "output_cost_per_token": 1e-05, + "output_cost_per_token_above_200k_tokens": 1.5e-05, + "rpm": 2000, + "source": "https://ai.google.dev/gemini-api/docs/computer-use", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_computer_use": true, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "tpm": 800000 + }, + "gemini/gemini-3-pro-preview": { + "deprecation_date": "2026-03-09", + "cache_read_input_token_cost": 2e-07, + "cache_read_input_token_cost_above_200k_tokens": 4e-07, + "input_cost_per_token": 2e-06, + "input_cost_per_token_above_200k_tokens": 4e-06, + "input_cost_per_token_batches": 1e-06, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_token": 1.2e-05, + "output_cost_per_token_above_200k_tokens": 1.8e-05, + "output_cost_per_token_batches": 6e-06, + "rpm": 2000, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "tpm": 800000, + "input_cost_per_token_priority": 3.6e-06, + "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, + "output_cost_per_token_priority": 2.16e-05, + "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, + "cache_read_input_token_cost_priority": 3.6e-07, + "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" }, - "gemini/gemini-3-pro-preview": { - "deprecation_date": "2026-03-09", - "cache_read_input_token_cost": 2e-07, - "cache_read_input_token_cost_above_200k_tokens": 4e-07, - "input_cost_per_token": 2e-06, - "input_cost_per_token_above_200k_tokens": 4e-06, - "input_cost_per_token_batches": 1e-06, + "gemini/gemini-3.1-flash-lite-preview": { + "cache_read_input_token_cost": 2.5e-08, + "input_cost_per_audio_token": 5e-07, + "input_cost_per_token": 2.5e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, - "max_output_tokens": 65535, - "max_pdf_size_mb": 30, - "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, + "max_output_tokens": 65536, + "max_tokens": 65536, "mode": "chat", - "output_cost_per_token": 1.2e-05, - "output_cost_per_token_above_200k_tokens": 1.8e-05, - "output_cost_per_token_batches": 6e-06, - "rpm": 2000, - "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing", + "output_cost_per_reasoning_token": 1.5e-06, + "output_cost_per_token": 1.5e-06, + "rpm": 15, + "source": "https://ai.google.dev/gemini-api/docs/models", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -17745,24 +20103,21 @@ "text" ], "supports_audio_input": true, + "supports_audio_output": false, "supports_function_calling": true, + "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, + "supports_url_context": true, "supports_video_input": true, "supports_vision": true, "supports_web_search": true, - "tpm": 800000, - "input_cost_per_token_priority": 3.6e-06, - "input_cost_per_token_above_200k_tokens_priority": 7.2e-06, - "output_cost_per_token_priority": 2.16e-05, - "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, - "cache_read_input_token_cost_priority": 3.6e-07, - "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, + "supports_native_streaming": true, + "tpm": 250000, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -17770,26 +20125,27 @@ }, "web_search_billing_unit": "per_query" }, - "gemini/gemini-3.1-flash-lite-preview": { + "gemini/gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, + "cache_read_input_token_cost_flex": 1.25e-08, + "cache_read_input_token_cost_priority": 4.5e-08, "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 2.5e-07, + "input_cost_per_token_batches": 1.25e-07, + "input_cost_per_token_flex": 1.25e-07, + "input_cost_per_token_priority": 4.5e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 1.5e-06, "output_cost_per_token": 1.5e-06, + "output_cost_per_token_batches": 7.5e-07, + "output_cost_per_token_flex": 7.5e-07, + "output_cost_per_token_priority": 2.7e-06, "rpm": 15, - "source": "https://ai.google.dev/gemini-api/docs/models", + "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-lite", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -17806,8 +20162,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -17827,38 +20181,28 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, - "gemini/gemini-3.1-flash-lite": { - "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_batches": 1.25e-08, - "cache_read_input_token_cost_flex": 1.25e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, - "cache_read_input_token_cost_priority": 4.5e-08, - "input_cost_per_audio_token": 5e-07, - "input_cost_per_token": 2.5e-07, - "input_cost_per_token_batches": 1.25e-07, - "input_cost_per_token_flex": 1.25e-07, - "input_cost_per_token_priority": 4.5e-07, + "gemini/gemini-3.5-flash-lite": { + "cache_read_input_token_cost": 3e-08, + "cache_read_input_token_cost_flex": 2e-08, + "cache_read_input_token_cost_priority": 5e-08, + "input_cost_per_token": 3e-07, + "input_cost_per_token_batches": 1.5e-07, + "input_cost_per_token_flex": 1.5e-07, + "input_cost_per_token_priority": 5.4e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", - "output_cost_per_reasoning_token": 1.5e-06, - "output_cost_per_token": 1.5e-06, - "output_cost_per_token_batches": 7.5e-07, - "output_cost_per_token_flex": 7.5e-07, - "output_cost_per_token_priority": 2.7e-06, + "output_cost_per_reasoning_token": 2.5e-06, + "output_cost_per_token": 2.5e-06, + "output_cost_per_token_batches": 1.25e-06, + "output_cost_per_token_flex": 1.25e-06, + "output_cost_per_token_priority": 4.5e-06, "rpm": 15, - "source": "https://ai.google.dev/gemini-api/docs/pricing#gemini-3.1-flash-lite", + "source": "https://ai.google.dev/gemini-api/docs/pricing", "supported_endpoints": [ "/v1/chat/completions", "/v1/completions", @@ -17875,8 +20219,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -17896,23 +20238,16 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" }, "gemini/gemini-3-flash-preview": { "cache_read_input_token_cost": 5e-08, "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 5e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 3e-06, "output_cost_per_token": 3e-06, @@ -17950,7 +20285,6 @@ "input_cost_per_audio_token_priority": 1.8e-06, "output_cost_per_token_priority": 5.4e-06, "cache_read_input_token_cost_priority": 9e-08, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -17963,15 +20297,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 1.5e-06, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 9e-06, "output_cost_per_token": 9e-06, @@ -18011,7 +20339,6 @@ "input_cost_per_audio_token_priority": 1.8e-06, "output_cost_per_token_priority": 1.62e-05, "cache_read_input_token_cost_priority": 2.7e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -18019,6 +20346,96 @@ }, "web_search_billing_unit": "per_query" }, + "gemini/gemini-3.6-flash": { + "cache_read_input_token_cost": 1.5e-07, + "cache_read_input_token_cost_flex": 7.5e-08, + "input_cost_per_token": 1.5e-06, + "input_cost_per_token_batches": 7.5e-07, + "input_cost_per_token_flex": 7.5e-07, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 7.5e-06, + "output_cost_per_token": 7.5e-06, + "output_cost_per_token_batches": 3.75e-06, + "output_cost_per_token_flex": 3.75e-06, + "rpm": 2000, + "source": "https://ai.google.dev/pricing/gemini-3", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_output": false, + "supports_audio_input": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "tpm": 800000, + "input_cost_per_token_priority": 2.7e-06, + "output_cost_per_token_priority": 1.35e-05, + "cache_read_input_token_cost_priority": 2.7e-07, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini/gemini-omni-flash-preview": { + "input_cost_per_audio_token": 1.5e-06, + "input_cost_per_token": 1.5e-06, + "litellm_provider": "gemini", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_reasoning_token": 9e-06, + "output_cost_per_token": 9e-06, + "output_cost_per_video_token": 1.75e-05, + "rpm": 2000, + "source": "https://ai.google.dev/gemini-api/docs/pricing", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text", + "video" + ], + "supports_audio_input": true, + "supports_reasoning": true, + "supports_system_messages": true, + "supports_video_input": true, + "supports_vision": true, + "tpm": 800000 + }, "gemini/gemini-3.1-pro-preview": { "cache_read_input_token_cost": 2e-07, "cache_read_input_token_cost_above_200k_tokens": 4e-07, @@ -18026,15 +20443,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -18075,7 +20486,6 @@ "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "cache_read_input_token_cost_priority": 3.6e-07, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -18090,15 +20500,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -18139,7 +20543,6 @@ "output_cost_per_token_above_200k_tokens_priority": 3.24e-05, "cache_read_input_token_cost_priority": 3.6e-07, "cache_read_input_token_cost_above_200k_tokens_priority": 7.2e-07, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -18152,15 +20555,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 5e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 3e-06, "output_cost_per_token": 3e-06, @@ -18196,7 +20593,6 @@ "input_cost_per_audio_token_priority": 1.8e-06, "output_cost_per_token_priority": 5.4e-06, "cache_read_input_token_cost_priority": 9e-08, - "supports_service_tier": true, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -18204,20 +20600,45 @@ }, "web_search_billing_unit": "per_query" }, + "gemini-omni-flash-preview": { + "input_cost_per_audio_token": 1.5e-06, + "input_cost_per_token": 1.5e-06, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "output_cost_per_reasoning_token": 9e-06, + "output_cost_per_token": 9e-06, + "output_cost_per_video_token": 1.75e-05, + "source": "https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/omni-flash-preview", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text", + "video" + ], + "supports_audio_input": true, + "supports_reasoning": true, + "supports_system_messages": true, + "supports_video_input": true, + "supports_vision": true + }, "gemini-3.5-flash": { "cache_read_input_token_cost": 1.5e-07, "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 1.5e-06, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 9e-06, "output_cost_per_token": 9e-06, @@ -18255,7 +20676,61 @@ "input_cost_per_audio_token_priority": 1.8e-06, "output_cost_per_token_priority": 1.62e-05, "cache_read_input_token_cost_priority": 2.7e-07, - "supports_service_tier": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" + }, + "gemini-3.6-flash": { + "cache_read_input_token_cost": 1.5e-07, + "cache_read_input_token_cost_flex": 7.5e-08, + "input_cost_per_token": 1.5e-06, + "input_cost_per_token_batches": 7.5e-07, + "input_cost_per_token_flex": 7.5e-07, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 7.5e-06, + "output_cost_per_token": 7.5e-06, + "output_cost_per_token_batches": 3.75e-06, + "output_cost_per_token_flex": 3.75e-06, + "source": "https://ai.google.dev/pricing/gemini-3", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_output": false, + "supports_audio_input": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "input_cost_per_token_priority": 2.7e-06, + "output_cost_per_token_priority": 1.35e-05, + "cache_read_input_token_cost_priority": 2.7e-07, "search_context_cost_per_query": { "search_context_size_low": 0.014, "search_context_size_medium": 0.014, @@ -18270,15 +20745,9 @@ "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1e-05, "output_cost_per_token_above_200k_tokens": 1.5e-05, @@ -18309,15 +20778,9 @@ "input_cost_per_token": 0, "input_cost_per_token_above_128k_tokens": 0, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "metadata": { "notes": "Rate limits not documented for gemini-exp-1114. Assuming same as gemini-1.5-pro.", "supports_tool_choice": true @@ -18338,15 +20801,9 @@ "input_cost_per_token": 0, "input_cost_per_token_above_128k_tokens": 0, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 2097152, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "metadata": { "notes": "Rate limits not documented for gemini-exp-1206. Assuming same as gemini-1.5-pro.", "supports_tool_choice": true @@ -18646,6 +21103,7 @@ "supports_output_config": true }, "github_copilot/claude-opus-4.6-fast": { + "supports_adaptive_thinking": true, "litellm_provider": "github_copilot", "max_input_tokens": 128000, "max_output_tokens": 16000, @@ -19489,7 +21947,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "global.anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 3.75e-06, @@ -19518,7 +21978,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "global.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.25e-06, @@ -19541,7 +22003,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "global.amazon.nova-2-lite-v1:0": { "cache_read_input_token_cost": 7.5e-08, @@ -19762,8 +22226,6 @@ "output_cost_per_token": 8e-06, "output_cost_per_token_batches": 4e-06, "output_cost_per_token_priority": 1.4e-05, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -19784,13 +22246,14 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, "gpt-4.1-2025-04-14": { "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_priority": 8.75e-07, "input_cost_per_token": 2e-06, + "input_cost_per_token_priority": 3.5e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "openai", "max_input_tokens": 1047576, @@ -19798,6 +22261,7 @@ "max_tokens": 32768, "mode": "chat", "output_cost_per_token": 8e-06, + "output_cost_per_token_priority": 1.4e-05, "output_cost_per_token_batches": 4e-06, "supported_endpoints": [ "/v1/chat/completions", @@ -19819,7 +22283,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -19837,8 +22300,6 @@ "output_cost_per_token": 1.6e-06, "output_cost_per_token_batches": 8e-07, "output_cost_per_token_priority": 2.8e-06, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -19859,13 +22320,14 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, "gpt-4.1-mini-2025-04-14": { "cache_read_input_token_cost": 1e-07, + "cache_read_input_token_cost_priority": 1.75e-07, "input_cost_per_token": 4e-07, + "input_cost_per_token_priority": 7e-07, "input_cost_per_token_batches": 2e-07, "litellm_provider": "openai", "max_input_tokens": 1047576, @@ -19873,6 +22335,7 @@ "max_tokens": 32768, "mode": "chat", "output_cost_per_token": 1.6e-06, + "output_cost_per_token_priority": 2.8e-06, "output_cost_per_token_batches": 8e-07, "supported_endpoints": [ "/v1/chat/completions", @@ -19894,7 +22357,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -19912,8 +22374,6 @@ "output_cost_per_token": 4e-07, "output_cost_per_token_batches": 2e-07, "output_cost_per_token_priority": 8e-07, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -19934,12 +22394,13 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4.1-nano-2025-04-14": { "cache_read_input_token_cost": 2.5e-08, + "cache_read_input_token_cost_priority": 5e-08, "input_cost_per_token": 1e-07, + "input_cost_per_token_priority": 2e-07, "input_cost_per_token_batches": 5e-08, "litellm_provider": "openai", "max_input_tokens": 1047576, @@ -19947,6 +22408,7 @@ "max_tokens": 32768, "mode": "chat", "output_cost_per_token": 4e-07, + "output_cost_per_token_priority": 8e-07, "output_cost_per_token_batches": 2e-07, "supported_endpoints": [ "/v1/chat/completions", @@ -19968,7 +22430,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o": { @@ -19985,8 +22446,6 @@ "output_cost_per_token": 1e-05, "output_cost_per_token_batches": 5e-06, "output_cost_per_token_priority": 1.7e-05, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -19994,7 +22453,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-2024-05-13": { @@ -20019,7 +22477,9 @@ }, "gpt-4o-2024-08-06": { "cache_read_input_token_cost": 1.25e-06, + "cache_read_input_token_cost_priority": 2.125e-06, "input_cost_per_token": 2.5e-06, + "input_cost_per_token_priority": 4.25e-06, "input_cost_per_token_batches": 1.25e-06, "litellm_provider": "openai", "max_input_tokens": 128000, @@ -20027,9 +22487,8 @@ "max_tokens": 16384, "mode": "chat", "output_cost_per_token": 1e-05, + "output_cost_per_token_priority": 1.7e-05, "output_cost_per_token_batches": 5e-06, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -20037,12 +22496,13 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-2024-11-20": { "cache_read_input_token_cost": 1.25e-06, + "cache_read_input_token_cost_priority": 2.125e-06, "input_cost_per_token": 2.5e-06, + "input_cost_per_token_priority": 4.25e-06, "input_cost_per_token_batches": 1.25e-06, "litellm_provider": "openai", "max_input_tokens": 128000, @@ -20050,9 +22510,8 @@ "max_tokens": 16384, "mode": "chat", "output_cost_per_token": 1e-05, + "output_cost_per_token_priority": 1.7e-05, "output_cost_per_token_batches": 5e-06, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -20060,7 +22519,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-audio-preview": { @@ -20341,8 +22799,6 @@ "output_cost_per_token": 6e-07, "output_cost_per_token_batches": 3e-07, "output_cost_per_token_priority": 1e-06, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -20350,12 +22806,13 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-mini-2024-07-18": { "cache_read_input_token_cost": 7.5e-08, + "cache_read_input_token_cost_priority": 1.25e-07, "input_cost_per_token": 1.5e-07, + "input_cost_per_token_priority": 2.5e-07, "input_cost_per_token_batches": 7.5e-08, "litellm_provider": "openai", "max_input_tokens": 128000, @@ -20363,6 +22820,7 @@ "max_tokens": 16384, "mode": "chat", "output_cost_per_token": 6e-07, + "output_cost_per_token_priority": 1e-06, "output_cost_per_token_batches": 3e-07, "search_context_cost_per_query": { "search_context_size_high": 0.03, @@ -20376,7 +22834,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-4o-mini-audio-preview": { @@ -20422,7 +22879,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2e-05, "output_cost_per_token": 2.4e-06, "supports_audio_input": true, @@ -20441,7 +22898,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2e-05, "output_cost_per_token": 2.4e-06, "supports_audio_input": true, @@ -20535,7 +22992,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 8e-05, "output_cost_per_token": 2e-05, "supports_audio_input": true, @@ -20553,7 +23010,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 8e-05, "output_cost_per_token": 2e-05, "supports_audio_input": true, @@ -20571,7 +23028,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 8e-05, "output_cost_per_token": 2e-05, "supports_audio_input": true, @@ -20640,7 +23097,6 @@ ] }, "gpt-image-1.5": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "litellm_provider": "openai", @@ -20655,7 +23111,6 @@ "supports_pdf_input": true }, "gpt-image-1.5-2025-12-16": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "litellm_provider": "openai", @@ -20670,7 +23125,6 @@ "supports_pdf_input": true }, "gpt-image-2": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "litellm_provider": "openai", @@ -20686,7 +23140,6 @@ "supports_pdf_input": true }, "gpt-image-2-2026-04-21": { - "cache_read_input_image_token_cost": 2e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_token": 5e-06, "litellm_provider": "openai", @@ -21046,8 +23499,6 @@ "output_cost_per_token": 1e-05, "output_cost_per_token_flex": 5e-06, "output_cost_per_token_priority": 2e-05, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21069,7 +23520,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -21109,7 +23559,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21149,7 +23598,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21229,7 +23677,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21270,7 +23717,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21421,6 +23867,234 @@ "supports_xhigh_reasoning_effort": true, "supports_minimal_reasoning_effort": true }, + "gpt-5.6": { + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_272k_tokens": 1.25e-05, + "cache_creation_input_token_cost_above_272k_tokens_flex": 6.25e-06, + "cache_creation_input_token_cost_flex": 3.125e-06, + "cache_creation_input_token_cost_priority": 1.25e-05, + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1e-06, + "cache_read_input_token_cost_above_272k_tokens_flex": 5e-07, + "cache_read_input_token_cost_flex": 2.5e-07, + "cache_read_input_token_cost_priority": 1e-06, + "input_cost_per_token": 5e-06, + "input_cost_per_token_above_272k_tokens": 1e-05, + "input_cost_per_token_above_272k_tokens_flex": 5e-06, + "input_cost_per_token_batches": 2.5e-06, + "input_cost_per_token_flex": 2.5e-06, + "input_cost_per_token_priority": 1e-05, + "litellm_provider": "openai", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-05, + "output_cost_per_token_above_272k_tokens": 4.5e-05, + "output_cost_per_token_above_272k_tokens_flex": 2.25e-05, + "output_cost_per_token_batches": 1.5e-05, + "output_cost_per_token_flex": 1.5e-05, + "output_cost_per_token_priority": 6e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true + }, + "gpt-5.6-sol": { + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_272k_tokens": 1.25e-05, + "cache_creation_input_token_cost_above_272k_tokens_flex": 6.25e-06, + "cache_creation_input_token_cost_flex": 3.125e-06, + "cache_creation_input_token_cost_priority": 1.25e-05, + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_272k_tokens": 1e-06, + "cache_read_input_token_cost_above_272k_tokens_flex": 5e-07, + "cache_read_input_token_cost_flex": 2.5e-07, + "cache_read_input_token_cost_priority": 1e-06, + "input_cost_per_token": 5e-06, + "input_cost_per_token_above_272k_tokens": 1e-05, + "input_cost_per_token_above_272k_tokens_flex": 5e-06, + "input_cost_per_token_batches": 2.5e-06, + "input_cost_per_token_flex": 2.5e-06, + "input_cost_per_token_priority": 1e-05, + "litellm_provider": "openai", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 3e-05, + "output_cost_per_token_above_272k_tokens": 4.5e-05, + "output_cost_per_token_above_272k_tokens_flex": 2.25e-05, + "output_cost_per_token_batches": 1.5e-05, + "output_cost_per_token_flex": 1.5e-05, + "output_cost_per_token_priority": 6e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true + }, + "gpt-5.6-terra": { + "cache_creation_input_token_cost": 2.5e-06, + "cache_creation_input_token_cost_above_272k_tokens": 5e-06, + "cache_creation_input_token_cost_above_272k_tokens_flex": 2.5e-06, + "cache_creation_input_token_cost_flex": 1.25e-06, + "cache_creation_input_token_cost_priority": 5e-06, + "cache_read_input_token_cost": 2e-07, + "cache_read_input_token_cost_above_272k_tokens": 4e-07, + "cache_read_input_token_cost_above_272k_tokens_flex": 2e-07, + "cache_read_input_token_cost_flex": 1e-07, + "cache_read_input_token_cost_priority": 4e-07, + "input_cost_per_token": 2e-06, + "input_cost_per_token_above_272k_tokens": 4e-06, + "input_cost_per_token_above_272k_tokens_flex": 2e-06, + "input_cost_per_token_batches": 1e-06, + "input_cost_per_token_flex": 1e-06, + "input_cost_per_token_priority": 4e-06, + "litellm_provider": "openai", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.2e-05, + "output_cost_per_token_above_272k_tokens": 1.8e-05, + "output_cost_per_token_above_272k_tokens_flex": 9e-06, + "output_cost_per_token_batches": 6e-06, + "output_cost_per_token_flex": 6e-06, + "output_cost_per_token_priority": 2.4e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true + }, + "gpt-5.6-luna": { + "cache_creation_input_token_cost": 2.5e-07, + "cache_creation_input_token_cost_above_272k_tokens": 5e-07, + "cache_creation_input_token_cost_above_272k_tokens_flex": 2.5e-07, + "cache_creation_input_token_cost_flex": 1.25e-07, + "cache_creation_input_token_cost_priority": 5e-07, + "cache_read_input_token_cost": 2e-08, + "cache_read_input_token_cost_above_272k_tokens": 4e-08, + "cache_read_input_token_cost_above_272k_tokens_flex": 2e-08, + "cache_read_input_token_cost_flex": 1e-08, + "cache_read_input_token_cost_priority": 4e-08, + "input_cost_per_token": 2e-07, + "input_cost_per_token_above_272k_tokens": 4e-07, + "input_cost_per_token_above_272k_tokens_flex": 2e-07, + "input_cost_per_token_batches": 1e-07, + "input_cost_per_token_flex": 1e-07, + "input_cost_per_token_priority": 4e-07, + "litellm_provider": "openai", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1.2e-06, + "output_cost_per_token_above_272k_tokens": 1.8e-06, + "output_cost_per_token_above_272k_tokens_flex": 9e-07, + "output_cost_per_token_batches": 6e-07, + "output_cost_per_token_flex": 6e-07, + "output_cost_per_token_priority": 2.4e-06, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true + }, "gpt-5.5": { "cache_read_input_token_cost": 5e-07, "cache_read_input_token_cost_above_272k_tokens": 1e-06, @@ -21441,6 +24115,8 @@ "output_cost_per_token_flex": 1.5e-05, "output_cost_per_token_batches": 1.5e-05, "output_cost_per_token_priority": 6e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21462,7 +24138,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21489,6 +24164,8 @@ "output_cost_per_token_flex": 1.5e-05, "output_cost_per_token_batches": 1.5e-05, "output_cost_per_token_priority": 6e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21510,7 +24187,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21533,6 +24209,8 @@ "output_cost_per_token_above_272k_tokens": 0.00027, "output_cost_per_token_flex": 9e-05, "output_cost_per_token_batches": 9e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/responses", "/v1/batch" @@ -21553,7 +24231,6 @@ "supports_response_schema": false, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -21577,6 +24254,8 @@ "output_cost_per_token_above_272k_tokens": 0.00027, "output_cost_per_token_flex": 9e-05, "output_cost_per_token_batches": 9e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/responses", "/v1/batch" @@ -21597,7 +24276,6 @@ "supports_response_schema": false, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -21625,6 +24303,8 @@ "output_cost_per_token_flex": 7.5e-06, "output_cost_per_token_batches": 7.5e-06, "output_cost_per_token_priority": 3e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21646,7 +24326,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_none_reasoning_effort": true, "supports_xhigh_reasoning_effort": true, @@ -21672,6 +24351,8 @@ "output_cost_per_token_flex": 7.5e-06, "output_cost_per_token_batches": 7.5e-06, "output_cost_per_token_priority": 3e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21693,7 +24374,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true }, "gpt-5.4-pro": { @@ -21712,6 +24392,8 @@ "output_cost_per_token_above_272k_tokens": 0.00027, "output_cost_per_token_flex": 9e-05, "output_cost_per_token_batches": 9e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/responses", "/v1/batch" @@ -21732,7 +24414,6 @@ "supports_response_schema": false, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -21755,6 +24436,8 @@ "output_cost_per_token_above_272k_tokens": 0.00027, "output_cost_per_token_flex": 9e-05, "output_cost_per_token_batches": 9e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/responses", "/v1/batch" @@ -21775,7 +24458,6 @@ "supports_response_schema": false, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -21785,7 +24467,6 @@ "gpt-5.4-mini": { "cache_read_input_token_cost": 7.5e-08, "cache_read_input_token_cost_flex": 3.75e-08, - "cache_read_input_token_cost_batches": 3.75e-08, "cache_read_input_token_cost_priority": 1.5e-07, "input_cost_per_token": 7.5e-07, "input_cost_per_token_flex": 3.75e-07, @@ -21800,6 +24481,8 @@ "output_cost_per_token_flex": 2.25e-06, "output_cost_per_token_batches": 2.25e-06, "output_cost_per_token_priority": 9e-06, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21821,7 +24504,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21831,7 +24513,6 @@ "gpt-5.4-mini-2026-03-17": { "cache_read_input_token_cost": 7.5e-08, "cache_read_input_token_cost_flex": 3.75e-08, - "cache_read_input_token_cost_batches": 3.75e-08, "cache_read_input_token_cost_priority": 1.5e-07, "input_cost_per_token": 7.5e-07, "input_cost_per_token_flex": 3.75e-07, @@ -21846,6 +24527,8 @@ "output_cost_per_token_flex": 2.25e-06, "output_cost_per_token_batches": 2.25e-06, "output_cost_per_token_priority": 9e-06, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21867,7 +24550,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21877,7 +24559,6 @@ "gpt-5.4-nano": { "cache_read_input_token_cost": 2e-08, "cache_read_input_token_cost_flex": 1e-08, - "cache_read_input_token_cost_batches": 1e-08, "input_cost_per_token": 2e-07, "input_cost_per_token_flex": 1e-07, "input_cost_per_token_batches": 1e-07, @@ -21889,6 +24570,8 @@ "output_cost_per_token": 1.25e-06, "output_cost_per_token_flex": 6.25e-07, "output_cost_per_token_batches": 6.25e-07, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21910,7 +24593,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21920,7 +24602,6 @@ "gpt-5.4-nano-2026-03-17": { "cache_read_input_token_cost": 2e-08, "cache_read_input_token_cost_flex": 1e-08, - "cache_read_input_token_cost_batches": 1e-08, "input_cost_per_token": 2e-07, "input_cost_per_token_flex": 1e-07, "input_cost_per_token_batches": 1e-07, @@ -21932,6 +24613,8 @@ "output_cost_per_token": 1.25e-06, "output_cost_per_token_flex": 6.25e-07, "output_cost_per_token_batches": 6.25e-07, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -21953,7 +24636,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": true, @@ -21964,14 +24646,12 @@ "input_cost_per_token": 1.5e-05, "input_cost_per_token_batches": 7.5e-06, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 272000, - "max_tokens": 272000, + "max_input_tokens": 400000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 0.00012, "output_cost_per_token_batches": 6e-05, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supported_endpoints": [ "/v1/batch", "/v1/responses" @@ -22002,9 +24682,9 @@ "input_cost_per_token": 1.5e-05, "input_cost_per_token_batches": 7.5e-06, "litellm_provider": "openai", - "max_input_tokens": 128000, - "max_output_tokens": 272000, - "max_tokens": 272000, + "max_input_tokens": 400000, + "max_output_tokens": 128000, + "max_tokens": 128000, "mode": "responses", "output_cost_per_token": 0.00012, "output_cost_per_token_batches": 6e-05, @@ -22070,7 +24750,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -22378,8 +25057,6 @@ "output_cost_per_token": 2e-06, "output_cost_per_token_flex": 1e-06, "output_cost_per_token_priority": 3.6e-06, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "supported_endpoints": [ "/v1/chat/completions", "/v1/batch", @@ -22401,7 +25078,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -22444,7 +25120,6 @@ "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true, "supports_none_reasoning_effort": false, @@ -22461,8 +25136,6 @@ "max_input_tokens": 272000, "max_output_tokens": 128000, "max_tokens": 128000, - "regional_processing_uplift_multiplier_eu": 1.10, - "regional_processing_uplift_multiplier_us": 1.10, "mode": "chat", "output_cost_per_token": 4e-07, "output_cost_per_token_flex": 2e-07, @@ -22497,6 +25170,7 @@ "cache_read_input_token_cost": 5e-09, "cache_read_input_token_cost_flex": 2.5e-09, "input_cost_per_token": 5e-08, + "input_cost_per_token_priority": 2.5e-06, "input_cost_per_token_flex": 2.5e-08, "litellm_provider": "openai", "max_input_tokens": 272000, @@ -22533,7 +25207,6 @@ "supports_minimal_reasoning_effort": true }, "gpt-image-1": { - "cache_read_input_image_token_cost": 2.5e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_image_token": 1e-05, "input_cost_per_token": 5e-06, @@ -22546,7 +25219,6 @@ ] }, "gpt-image-1-mini": { - "cache_read_input_image_token_cost": 2.5e-07, "cache_read_input_token_cost": 2e-07, "input_cost_per_image_token": 2.5e-06, "input_cost_per_token": 2e-06, @@ -22568,7 +25240,71 @@ "max_input_tokens": 32000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", + "output_cost_per_audio_token": 6.4e-05, + "output_cost_per_token": 1.6e-05, + "supported_endpoints": [ + "/v1/realtime" + ], + "supported_modalities": [ + "text", + "image", + "audio" + ], + "supported_output_modalities": [ + "text", + "audio" + ], + "supports_audio_input": true, + "supports_audio_output": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "gpt-realtime-1.5": { + "cache_creation_input_audio_token_cost": 4e-07, + "cache_read_input_token_cost": 4e-07, + "input_cost_per_audio_token": 3.2e-05, + "input_cost_per_image": 5e-06, + "input_cost_per_token": 4e-06, + "litellm_provider": "openai", + "max_input_tokens": 32000, + "max_output_tokens": 4096, + "max_tokens": 4096, + "mode": "realtime", + "output_cost_per_audio_token": 6.4e-05, + "output_cost_per_token": 1.6e-05, + "supported_endpoints": [ + "/v1/realtime" + ], + "supported_modalities": [ + "text", + "image", + "audio" + ], + "supported_output_modalities": [ + "text", + "audio" + ], + "supports_audio_input": true, + "supports_audio_output": true, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "gpt-realtime-2": { + "cache_creation_input_audio_token_cost": 4e-07, + "cache_read_input_token_cost": 4e-07, + "input_cost_per_audio_token": 3.2e-05, + "input_cost_per_image": 5e-06, + "input_cost_per_token": 4e-06, + "litellm_provider": "openai", + "max_input_tokens": 32000, + "max_output_tokens": 4096, + "max_tokens": 4096, + "mode": "realtime", "output_cost_per_audio_token": 6.4e-05, "output_cost_per_token": 1.6e-05, "supported_endpoints": [ @@ -22590,19 +25326,22 @@ "supports_system_messages": true, "supports_tool_choice": true }, - "gpt-realtime-1.5": { + "gpt-realtime-2.1": { "cache_creation_input_audio_token_cost": 4e-07, + "cache_read_input_audio_token_cost": 4e-07, "cache_read_input_token_cost": 4e-07, "input_cost_per_audio_token": 3.2e-05, "input_cost_per_image": 5e-06, "input_cost_per_token": 4e-06, "litellm_provider": "openai", - "max_input_tokens": 32000, - "max_output_tokens": 4096, - "max_tokens": 4096, - "mode": "chat", + "max_input_tokens": 128000, + "max_output_tokens": 32000, + "max_tokens": 32000, + "mode": "realtime", "output_cost_per_audio_token": 6.4e-05, - "output_cost_per_token": 1.6e-05, + "output_cost_per_token": 2.4e-05, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/realtime" ], @@ -22622,19 +25361,22 @@ "supports_system_messages": true, "supports_tool_choice": true }, - "gpt-realtime-2": { - "cache_creation_input_audio_token_cost": 4e-07, - "cache_read_input_token_cost": 4e-07, - "input_cost_per_audio_token": 3.2e-05, - "input_cost_per_image": 5e-06, - "input_cost_per_token": 4e-06, + "gpt-realtime-2.1-mini": { + "cache_creation_input_audio_token_cost": 3e-07, + "cache_read_input_audio_token_cost": 3e-07, + "cache_read_input_token_cost": 6e-08, + "input_cost_per_audio_token": 1e-05, + "input_cost_per_image": 8e-07, + "input_cost_per_token": 6e-07, "litellm_provider": "openai", - "max_input_tokens": 32000, + "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", - "output_cost_per_audio_token": 6.4e-05, - "output_cost_per_token": 1.6e-05, + "mode": "realtime", + "output_cost_per_audio_token": 2e-05, + "output_cost_per_token": 2.4e-06, + "regional_processing_uplift_multiplier_eu": 1.1, + "regional_processing_uplift_multiplier_us": 1.1, "supported_endpoints": [ "/v1/realtime" ], @@ -22663,7 +25405,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2e-05, "output_cost_per_token": 2.4e-06, "supported_endpoints": [ @@ -22695,7 +25437,7 @@ "max_input_tokens": 32000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 6.4e-05, "output_cost_per_token": 1.6e-05, "supported_endpoints": [ @@ -23126,6 +25868,11 @@ "max_tokens": 32766, "mode": "chat", "output_cost_per_token": 6e-07, + "search_context_cost_per_query": { + "search_context_size_high": 0.005, + "search_context_size_low": 0.005, + "search_context_size_medium": 0.005 + }, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_reasoning": true, @@ -23142,6 +25889,11 @@ "max_tokens": 32768, "mode": "chat", "output_cost_per_token": 3e-07, + "search_context_cost_per_query": { + "search_context_size_high": 0.005, + "search_context_size_low": 0.005, + "search_context_size_medium": 0.005 + }, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_reasoning": true, @@ -23158,6 +25910,11 @@ "max_tokens": 65536, "mode": "chat", "output_cost_per_token": 3e-07, + "search_context_cost_per_query": { + "search_context_size_high": 0.005, + "search_context_size_low": 0.005, + "search_context_size_medium": 0.005 + }, "supports_function_calling": true, "supports_reasoning": true, "supports_response_schema": true, @@ -23613,7 +26370,6 @@ "jina-reranker-v2-base-multilingual": { "input_cost_per_token": 1.8e-08, "litellm_provider": "jina_ai", - "max_document_chunks_per_query": 2048, "max_input_tokens": 1024, "max_output_tokens": 1024, "max_tokens": 1024, @@ -23650,7 +26406,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "jp.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.375e-06, @@ -23673,7 +26431,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "crusoe/deepseek-ai/DeepSeek-R1-0528": { "input_cost_per_token": 3e-06, @@ -24369,6 +27129,42 @@ "supports_function_calling": true, "supports_tool_choice": false }, + "meta/muse-spark-1.1": { + "cache_read_input_token_cost": 1.5e-07, + "input_cost_per_token": 1.25e-06, + "litellm_provider": "meta", + "max_input_tokens": 1048576, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4.25e-06, + "source": "https://dev.meta.ai/docs/getting-started/pricing-rate-limits", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/messages" + ], + "supported_modalities": [ + "text", + "image", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_minimal_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true + }, "meta_llama/Llama-3.3-70B-Instruct": { "litellm_provider": "meta_llama", "max_input_tokens": 128000, @@ -24461,14 +27257,13 @@ }, "minimax.minimax-m2.5": { "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.2e-06, "litellm_provider": "bedrock_converse", "max_input_tokens": 1000000, "max_output_tokens": 8192, "max_tokens": 8192, "mode": "chat", - "output_cost_per_token": 1.2e-06, "supports_function_calling": true, - "supports_reasoning": true, "supports_system_messages": true, "supports_tool_choice": true, "source": "https://aws.amazon.com/bedrock/pricing/" @@ -24955,8 +27750,18 @@ }, "mistral/mistral-ocr-latest": { "litellm_provider": "mistral", - "ocr_cost_per_page": 0.001, - "annotation_cost_per_page": 0.003, + "ocr_cost_per_page": 0.004, + "annotation_cost_per_page": 0.005, + "mode": "ocr", + "supported_endpoints": [ + "/v1/ocr" + ], + "source": "https://mistral.ai/pricing#api-pricing" + }, + "mistral/mistral-ocr-4-0": { + "litellm_provider": "mistral", + "ocr_cost_per_page": 0.004, + "annotation_cost_per_page": 0.005, "mode": "ocr", "supported_endpoints": [ "/v1/ocr" @@ -24973,6 +27778,16 @@ ], "source": "https://mistral.ai/pricing#api-pricing" }, + "mistral/mistral-ocr-2512": { + "litellm_provider": "mistral", + "ocr_cost_per_page": 0.002, + "annotation_cost_per_page": 0.003, + "mode": "ocr", + "supported_endpoints": [ + "/v1/ocr" + ], + "source": "https://mistral.ai/pricing#api-pricing" + }, "mistral/magistral-medium-latest": { "input_cost_per_token": 2e-06, "litellm_provider": "mistral", @@ -25175,7 +27990,7 @@ "supports_response_schema": true, "supports_tool_choice": true }, - "mistral/mistral-medium-latest": { + "mistral/mistral-medium-2508": { "input_cost_per_token": 4e-07, "litellm_provider": "mistral", "max_input_tokens": 131072, @@ -25183,12 +27998,45 @@ "max_tokens": 131072, "mode": "chat", "output_cost_per_token": 2e-06, + "source": "https://mistral.ai/news/mistral-medium-3", "supports_assistant_prefill": true, "supports_function_calling": true, "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true }, + "mistral/mistral-medium-2604": { + "input_cost_per_token": 1.5e-06, + "litellm_provider": "mistral", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 7.5e-06, + "source": "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "mistral/mistral-medium-latest": { + "input_cost_per_token": 1.5e-06, + "litellm_provider": "mistral", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 7.5e-06, + "source": "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "mistral/mistral-medium-3-1-2508": { "input_cost_per_token": 4e-07, "litellm_provider": "mistral", @@ -25215,6 +28063,7 @@ "source": "https://docs.mistral.ai/models/model-cards/mistral-medium-3-5-26-04", "supports_assistant_prefill": true, "supports_function_calling": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true @@ -26544,19 +29393,24 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, "o3-2025-04-16": { "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_flex": 2.5e-07, + "cache_read_input_token_cost_priority": 8.75e-07, "input_cost_per_token": 2e-06, + "input_cost_per_token_flex": 1e-06, + "input_cost_per_token_priority": 3.5e-06, "litellm_provider": "openai", "max_input_tokens": 200000, "max_output_tokens": 100000, "max_tokens": 100000, "mode": "chat", "output_cost_per_token": 8e-06, + "output_cost_per_token_flex": 4e-06, + "output_cost_per_token_priority": 1.4e-05, "supported_endpoints": [ "/v1/responses", "/v1/chat/completions", @@ -26577,7 +29431,6 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -26767,19 +29620,24 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, "o4-mini-2025-04-16": { "cache_read_input_token_cost": 2.75e-07, + "cache_read_input_token_cost_flex": 1.375e-07, + "cache_read_input_token_cost_priority": 5e-07, "input_cost_per_token": 1.1e-06, + "input_cost_per_token_flex": 5.5e-07, + "input_cost_per_token_priority": 2e-06, "litellm_provider": "openai", "max_input_tokens": 200000, "max_output_tokens": 100000, "max_tokens": 100000, "mode": "chat", "output_cost_per_token": 4.4e-06, + "output_cost_per_token_flex": 2.2e-06, + "output_cost_per_token_priority": 8e-06, "supports_function_calling": true, "supports_parallel_function_calling": false, "supports_pdf_input": true, @@ -26787,7 +29645,6 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_service_tier": true, "supports_vision": true, "supports_web_search": true }, @@ -27859,6 +30716,7 @@ "supports_vision": true }, "openrouter/anthropic/claude-sonnet-4.6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 3.75e-06, "cache_creation_input_token_cost_above_200k_tokens": 7.5e-06, "cache_read_input_token_cost": 3e-07, @@ -27902,6 +30760,7 @@ "supports_output_config": true }, "openrouter/anthropic/claude-opus-4.6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_read_input_token_cost": 5e-07, "input_cost_per_token": 5e-06, @@ -27962,6 +30821,7 @@ "supports_vision": true }, "openrouter/anthropic/claude-opus-4.7": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_read_input_token_cost": 5e-07, "input_cost_per_token": 5e-06, @@ -28096,15 +30956,9 @@ "input_cost_per_audio_token": 7e-07, "input_cost_per_token": 1e-07, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 4e-07, "supports_audio_output": true, @@ -28118,15 +30972,9 @@ "input_cost_per_audio_token": 7e-07, "input_cost_per_token": 3e-07, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 2.5e-06, "supports_audio_output": true, @@ -28141,15 +30989,9 @@ "input_cost_per_audio_token": 7e-07, "input_cost_per_token": 1.25e-06, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 30, "max_tokens": 8192, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1e-05, "supports_audio_output": true, @@ -28167,15 +31009,9 @@ "input_cost_per_token_above_200k_tokens": 4e-06, "input_cost_per_token_batches": 1e-06, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1.2e-05, "output_cost_per_token_above_200k_tokens": 1.8e-05, @@ -28211,15 +31047,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 5e-07, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 3e-06, "output_cost_per_token": 3e-06, @@ -28255,19 +31085,12 @@ }, "openrouter/google/gemini-3.1-flash-lite-preview": { "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 2.5e-07, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 1.5e-06, "output_cost_per_token": 1.5e-06, @@ -28289,8 +31112,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -28307,19 +31128,12 @@ }, "openrouter/google/gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 2.5e-07, "litellm_provider": "openrouter", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 1.5e-06, "output_cost_per_token": 1.5e-06, @@ -28341,8 +31155,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -29263,6 +32075,22 @@ "supports_reasoning": true, "supports_tool_choice": true }, + "openrouter/z-ai/glm-5.1": { + "input_cost_per_token": 1.05e-06, + "output_cost_per_token": 3.5e-06, + "cache_read_input_token_cost": 5.25e-07, + "cache_creation_input_token_cost": 0.0, + "litellm_provider": "openrouter", + "max_input_tokens": 202752, + "max_output_tokens": 65535, + "max_tokens": 65535, + "mode": "chat", + "source": "https://openrouter.ai/z-ai/glm-5.1", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true + }, "openrouter/minimax/minimax-m2.1": { "input_cost_per_token": 2.7e-07, "output_cost_per_token": 1.2e-06, @@ -29896,28 +32724,24 @@ "litellm_provider": "perplexity", "mode": "responses", "supports_web_search": true, - "supports_preset": true, "supports_function_calling": true }, "perplexity/preset/pro-search": { "litellm_provider": "perplexity", "mode": "responses", "supports_web_search": true, - "supports_preset": true, "supports_function_calling": true }, "perplexity/preset/deep-research": { "litellm_provider": "perplexity", "mode": "responses", "supports_web_search": true, - "supports_preset": true, "supports_function_calling": true }, "perplexity/preset/advanced-deep-research": { "litellm_provider": "perplexity", "mode": "responses", "supports_web_search": true, - "supports_preset": true, "supports_function_calling": true }, "perplexity/openai/gpt-5.2": { @@ -29942,6 +32766,7 @@ "supports_function_calling": true }, "perplexity/anthropic/claude-opus-4-6": { + "supports_adaptive_thinking": true, "litellm_provider": "perplexity", "mode": "responses", "supports_web_search": true, @@ -29950,6 +32775,7 @@ "supports_output_config": true }, "perplexity/anthropic/claude-opus-4-7": { + "supports_adaptive_thinking": true, "litellm_provider": "perplexity", "mode": "responses", "supports_web_search": true, @@ -30348,7 +33174,7 @@ "supports_tool_choice": true, "supports_response_schema": true }, - "replicateopenai/gpt-oss-20b": { + "replicate/openai/gpt-oss-20b": { "input_cost_per_token": 9e-08, "output_cost_per_token": 3.6e-07, "litellm_provider": "replicate", @@ -30637,7 +33463,6 @@ "litellm_provider": "cohere", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -30648,7 +33473,6 @@ "litellm_provider": "cohere", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -30659,7 +33483,6 @@ "litellm_provider": "cohere", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -30670,7 +33493,6 @@ "litellm_provider": "cohere", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -30681,7 +33503,6 @@ "litellm_provider": "cohere", "max_input_tokens": 4096, "max_output_tokens": 4096, - "max_query_tokens": 2048, "max_tokens": 4096, "mode": "rerank", "output_cost_per_token": 0.0 @@ -30762,13 +33583,13 @@ "output_cost_per_token": 0.0 }, "sambanova/MiniMax-M2.7": { - "input_cost_per_token": 3e-07, + "input_cost_per_token": 6e-07, "litellm_provider": "sambanova", - "max_input_tokens": 204800, + "max_input_tokens": 196608, "max_output_tokens": 131072, "max_tokens": 131072, "mode": "chat", - "output_cost_per_token": 1.2e-06, + "output_cost_per_token": 2.4e-06, "source": "https://cloud.sambanova.ai/plans/pricing", "supports_function_calling": true, "supports_reasoning": true, @@ -30785,6 +33606,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/DeepSeek-R1-Distill-Llama-70B": { + "deprecation_date": "2026-03-20", "input_cost_per_token": 7e-07, "litellm_provider": "sambanova", "max_input_tokens": 131072, @@ -30795,6 +33617,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/DeepSeek-V3-0324": { + "deprecation_date": "2026-04-14", "input_cost_per_token": 3e-06, "litellm_provider": "sambanova", "max_input_tokens": 32768, @@ -30825,6 +33648,7 @@ "supports_vision": true }, "sambanova/Llama-4-Scout-17B-16E-Instruct": { + "deprecation_date": "2025-06-19", "input_cost_per_token": 4e-07, "litellm_provider": "sambanova", "max_input_tokens": 8192, @@ -30841,6 +33665,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-3.1-405B-Instruct": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 5e-06, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -30854,6 +33679,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-3.1-8B-Instruct": { + "deprecation_date": "2026-04-14", "input_cost_per_token": 1e-07, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -30867,6 +33693,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-3.2-1B-Instruct": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 4e-08, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -30877,6 +33704,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/Meta-Llama-3.2-3B-Instruct": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 8e-08, "litellm_provider": "sambanova", "max_input_tokens": 4096, @@ -30900,6 +33728,7 @@ "supports_tool_choice": true }, "sambanova/Meta-Llama-Guard-3-8B": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 3e-07, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -30910,6 +33739,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/QwQ-32B": { + "deprecation_date": "2025-06-25", "input_cost_per_token": 5e-07, "litellm_provider": "sambanova", "max_input_tokens": 16384, @@ -30920,6 +33750,7 @@ "source": "https://cloud.sambanova.ai/plans/pricing" }, "sambanova/Qwen2-Audio-7B-Instruct": { + "deprecation_date": "2025-06-19", "input_cost_per_token": 5e-07, "litellm_provider": "sambanova", "max_input_tokens": 4096, @@ -30931,6 +33762,7 @@ "supports_audio_input": true }, "sambanova/Qwen3-32B": { + "deprecation_date": "2026-04-06", "input_cost_per_token": 4e-07, "litellm_provider": "sambanova", "max_input_tokens": 8192, @@ -30944,9 +33776,9 @@ "supports_tool_choice": true }, "sambanova/DeepSeek-V3.1": { - "max_tokens": 32768, - "max_input_tokens": 32768, - "max_output_tokens": 32768, + "max_tokens": 131072, + "max_input_tokens": 131072, + "max_output_tokens": 131072, "input_cost_per_token": 3e-06, "output_cost_per_token": 4.5e-06, "litellm_provider": "sambanova", @@ -30960,24 +33792,47 @@ "max_tokens": 131072, "max_input_tokens": 131072, "max_output_tokens": 131072, + "input_cost_per_token": 2.2e-07, + "output_cost_per_token": 5.9e-07, + "litellm_provider": "sambanova", + "mode": "chat", + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "source": "https://cloud.sambanova.ai/plans/pricing" + }, + "sambanova/DeepSeek-V3.2": { + "max_tokens": 32768, + "max_input_tokens": 32768, + "max_output_tokens": 32768, "input_cost_per_token": 3e-06, "output_cost_per_token": 4.5e-06, "litellm_provider": "sambanova", "mode": "chat", "supports_function_calling": true, "supports_tool_choice": true, - "supports_reasoning": true, "source": "https://cloud.sambanova.ai/plans/pricing" }, - "snowflake/claude-3-5-sonnet": { + "sambanova/gemma-4-31B-it": { + "max_tokens": 131072, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "input_cost_per_token": 3.8e-07, + "output_cost_per_token": 1.15e-06, + "litellm_provider": "sambanova", + "mode": "chat", + "supports_vision": true, + "source": "https://cloud.sambanova.ai/plans/pricing" + }, + "snowflake/claude-3-5-sonnet": { "litellm_provider": "snowflake", "max_input_tokens": 200000, "max_output_tokens": 16384, "max_tokens": 16384, "mode": "chat", - "input_cost_per_token": 0.000003, - "output_cost_per_token": 0.000015, - "cache_read_input_token_cost": 0.0000003, + "input_cost_per_token": 3e-06, + "output_cost_per_token": 1.5e-05, + "cache_read_input_token_cost": 3e-07, "supports_computer_use": true, "supports_function_calling": true, "supports_vision": true, @@ -30985,14 +33840,14 @@ "supports_system_messages": true, "supports_response_schema": true }, - "snowflake/deepseek-r1": { + "snowflake/deepseek-r1": { "litellm_provider": "snowflake", "max_input_tokens": 128000, "max_output_tokens": 16384, "max_tokens": 16384, "mode": "chat", - "input_cost_per_token": 0.00000135, - "output_cost_per_token": 0.0000054, + "input_cost_per_token": 1.35e-06, + "output_cost_per_token": 5.4e-06, "supports_reasoning": true, "supports_system_messages": true }, @@ -31051,8 +33906,8 @@ "max_output_tokens": 16384, "max_tokens": 16384, "mode": "chat", - "input_cost_per_token": 0.0000012, - "output_cost_per_token": 0.0000012, + "input_cost_per_token": 1.2e-06, + "output_cost_per_token": 1.2e-06, "supports_function_calling": true, "supports_system_messages": true }, @@ -31062,8 +33917,8 @@ "max_output_tokens": 16384, "max_tokens": 16384, "mode": "chat", - "input_cost_per_token": 0.00000072, - "output_cost_per_token": 0.00000072, + "input_cost_per_token": 7.2e-07, + "output_cost_per_token": 7.2e-07, "supports_function_calling": true, "supports_system_messages": true }, @@ -31073,8 +33928,8 @@ "max_output_tokens": 16384, "max_tokens": 16384, "mode": "chat", - "input_cost_per_token": 0.00000024, - "output_cost_per_token": 0.00000024, + "input_cost_per_token": 2.4e-07, + "output_cost_per_token": 2.4e-07, "supports_system_messages": true }, "snowflake/llama3.2-1b": { @@ -31091,17 +33946,17 @@ "max_tokens": 8192, "mode": "chat" }, - "snowflake/llama3.3-70b": { + "snowflake/llama3.3-70b": { "max_tokens": 16384, "max_input_tokens": 128000, "max_output_tokens": 16384, - "input_cost_per_token": 0.00000072, - "output_cost_per_token": 0.00000072, + "input_cost_per_token": 7.2e-07, + "output_cost_per_token": 7.2e-07, "litellm_provider": "snowflake", "mode": "chat", "supports_function_calling": true, "supports_system_messages": true - }, + }, "snowflake/mistral-7b": { "litellm_provider": "snowflake", "max_input_tokens": 32000, @@ -31116,14 +33971,14 @@ "max_tokens": 8192, "mode": "chat" }, - "snowflake/mistral-large2": { + "snowflake/mistral-large2": { "litellm_provider": "snowflake", "max_input_tokens": 128000, "max_output_tokens": 16384, "max_tokens": 16384, "mode": "chat", - "input_cost_per_token": 0.000002, - "output_cost_per_token": 0.000006, + "input_cost_per_token": 2e-06, + "output_cost_per_token": 6e-06, "supports_function_calling": true, "supports_system_messages": true, "supports_response_schema": true @@ -31163,17 +34018,17 @@ "max_tokens": 8192, "mode": "chat" }, - "snowflake/snowflake-llama-3.3-70b": { + "snowflake/snowflake-llama-3.3-70b": { "max_tokens": 16384, "max_input_tokens": 128000, "max_output_tokens": 16384, - "input_cost_per_token": 0.00000072, - "output_cost_per_token": 0.00000072, + "input_cost_per_token": 7.2e-07, + "output_cost_per_token": 7.2e-07, "litellm_provider": "snowflake", "mode": "chat", "supports_function_calling": true, "supports_system_messages": true - }, + }, "stability/sd3": { "litellm_provider": "stability", "mode": "image_generation", @@ -31618,7 +34473,6 @@ }, "text-embedding-preview-0409": { "input_cost_per_token": 6.25e-09, - "input_cost_per_token_batch_requests": 5e-09, "litellm_provider": "vertex_ai-embedding-models", "max_input_tokens": 3072, "max_tokens": 3072, @@ -32235,7 +35089,8 @@ "supports_pdf_input": true, "supports_prompt_caching": true, "supports_response_schema": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "prompt_cache_min_tokens": 2048 }, "us.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.375e-06, @@ -32258,7 +35113,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "us.anthropic.claude-3-5-sonnet-20240620-v1:0": { "input_cost_per_token": 3e-06, @@ -32385,7 +35242,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 4.125e-06, @@ -32417,7 +35275,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0": { "cache_creation_input_token_cost": 4.5e-06, @@ -32426,7 +35286,7 @@ "input_cost_per_token": 3.6e-06, "input_cost_per_token_above_200k_tokens": 7.2e-06, "output_cost_per_token_above_200k_tokens": 2.7e-05, - "cache_creation_input_token_cost_above_200k_tokens": 9.0e-06, + "cache_creation_input_token_cost_above_200k_tokens": 9e-06, "cache_creation_input_token_cost_above_1hr_above_200k_tokens": 1.44e-05, "cache_read_input_token_cost_above_200k_tokens": 7.2e-07, "litellm_provider": "bedrock_converse", @@ -32444,7 +35304,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 1024 }, "au.anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.375e-06, @@ -32466,7 +35328,9 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_structured_output": true + "supports_native_structured_output": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "us.anthropic.claude-opus-4-20250514-v1:0": { "cache_creation_input_token_cost": 1.875e-05, @@ -32491,7 +35355,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "us.anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 6.875e-06, @@ -32520,7 +35385,9 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "global.anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 6.25e-06, @@ -32549,7 +35416,9 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "eu.anthropic.claude-opus-4-5-20251101-v1:0": { "cache_creation_input_token_cost": 6.25e-06, @@ -32577,7 +35446,9 @@ "supports_vision": true, "supports_native_structured_output": true, "supports_output_config": true, - "bedrock_output_config_effort_ceiling": "high" + "bedrock_output_config_effort_ceiling": "high", + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "us.anthropic.claude-sonnet-4-20250514-v1:0": { "cache_creation_input_token_cost": 3.75e-06, @@ -32606,7 +35477,9 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "bedrock_converse_supports_strict_tools": false, + "prompt_cache_min_tokens": 1024 }, "us.deepseek.r1-v1:0": { "input_cost_per_token": 1.35e-06, @@ -33158,6 +36031,7 @@ "supports_output_config": true }, "vercel_ai_gateway/anthropic/claude-opus-4.6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_read_input_token_cost": 5e-07, "input_cost_per_token": 5e-06, @@ -34068,6 +36942,19 @@ "/v1/audio/speech" ] }, + "vertex_ai/chirp_3": { + "input_cost_per_second": 0.00026667, + "litellm_provider": "vertex_ai", + "metadata": { + "calculation": "$0.016/60 seconds = $0.00026667 per second", + "original_pricing_per_minute": 0.016 + }, + "mode": "audio_transcription", + "source": "https://cloud.google.com/speech-to-text/pricing", + "supported_endpoints": [ + "/v1/audio/transcriptions" + ] + }, "vertex_ai/claude-3-5-haiku": { "input_cost_per_token": 1e-06, "litellm_provider": "vertex_ai-anthropic_models", @@ -34114,7 +37001,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_native_streaming": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-haiku-4-5@20251001": { "cache_creation_input_token_cost": 1.25e-06, @@ -34136,7 +37024,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_native_streaming": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-3-5-sonnet": { "input_cost_per_token": 3e-06, @@ -34291,7 +37180,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-opus-4-1": { "cache_creation_input_token_cost": 1.875e-05, @@ -34354,7 +37244,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-5@20251101": { "cache_creation_input_token_cost": 6.25e-06, @@ -34382,9 +37273,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_streaming": true, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -34410,9 +37303,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_output_config": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-6@default": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -34438,9 +37333,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_output_config": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 4096 }, "vertex_ai/claude-opus-4-7": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -34467,9 +37364,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 2048 }, "vertex_ai/claude-opus-4-7@default": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -34496,9 +37395,11 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 2048 }, "vertex_ai/claude-fable-5": { + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 1.25e-05, "cache_creation_input_token_cost_above_1hr": 2e-05, "cache_read_input_token_cost": 1e-06, @@ -34529,6 +37430,7 @@ "supports_max_reasoning_effort": true }, "vertex_ai/claude-fable-5@default": { + "supports_mid_conversation_system": true, "cache_creation_input_token_cost": 1.25e-05, "cache_creation_input_token_cost_above_1hr": 2e-05, "cache_read_input_token_cost": 1e-06, @@ -34558,7 +37460,9 @@ "supports_xhigh_reasoning_effort": true, "supports_max_reasoning_effort": true }, - "vertex_ai/claude-opus-4-8": { + "vertex_ai/claude-opus-5": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -34574,7 +37478,38 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 512 + }, + "vertex_ai/claude-opus-5@default": { + "supports_mid_conversation_system": true, "supports_adaptive_thinking": true, + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_1hr": 1e-05, + "cache_read_input_token_cost": 5e-07, + "input_cost_per_token": 5e-06, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.5e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -34586,9 +37521,12 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 512 }, - "vertex_ai/claude-opus-4-8@default": { + "vertex_ai/claude-opus-4-8": { + "supports_mid_conversation_system": true, + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 6.25e-06, "cache_creation_input_token_cost_above_1hr": 1e-05, "cache_read_input_token_cost": 5e-07, @@ -34604,7 +37542,38 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 + }, + "vertex_ai/claude-opus-4-8@default": { + "supports_mid_conversation_system": true, "supports_adaptive_thinking": true, + "cache_creation_input_token_cost": 6.25e-06, + "cache_creation_input_token_cost_above_1hr": 1e-05, + "cache_read_input_token_cost": 5e-07, + "input_cost_per_token": 5e-06, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2.5e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, "supports_assistant_prefill": false, "supports_computer_use": true, "supports_function_calling": true, @@ -34616,7 +37585,8 @@ "supports_tool_choice": true, "supports_vision": true, "supports_xhigh_reasoning_effort": true, - "supports_max_reasoning_effort": true + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4-5": { "cache_creation_input_token_cost": 3.75e-06, @@ -34643,9 +37613,43 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 + }, + "vertex_ai/claude-sonnet-5": { + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 2.5e-06, + "cache_creation_input_token_cost_above_1hr": 4e-06, + "cache_read_input_token_cost": 2e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4-6": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 3.75e-06, "cache_creation_input_token_cost_above_1hr": 6e-06, "cache_read_input_token_cost": 3e-07, @@ -34671,7 +37675,8 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4-5@20250929": { "cache_creation_input_token_cost": 3.75e-06, @@ -34699,7 +37704,8 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true, - "supports_native_streaming": true + "supports_native_streaming": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-opus-4@20250514": { "cache_creation_input_token_cost": 1.875e-05, @@ -34725,7 +37731,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4": { "cache_creation_input_token_cost": 3.75e-06, @@ -34755,7 +37762,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/claude-sonnet-4@20250514": { "cache_creation_input_token_cost": 3.75e-06, @@ -34785,7 +37793,8 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "prompt_cache_min_tokens": 1024 }, "vertex_ai/mistralai/codestral-2@001": { "input_cost_per_token": 3e-07, @@ -34925,15 +37934,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, - "max_pdf_size_mb": 30, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "image_generation", "output_cost_per_image": 0.039, "output_cost_per_image_token": 3e-05, @@ -34961,6 +37964,7 @@ "supports_parallel_function_calling": true, "supports_pdf_input": true, "supports_prompt_caching": true, + "supports_reasoning": false, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -34970,6 +37974,22 @@ "tpm": 8000000, "supports_image_size": false }, + "vertex_ai/gemini-3-pro-image": { + "input_cost_per_image": 0.0011, + "input_cost_per_token": 2e-06, + "input_cost_per_token_batches": 1e-06, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.134, + "output_cost_per_image_token": 0.00012, + "output_cost_per_token": 1.2e-05, + "output_cost_per_token_batches": 6e-06, + "supports_reasoning": false, + "source": "https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image" + }, "vertex_ai/gemini-3-pro-image-preview": { "input_cost_per_image": 0.0011, "input_cost_per_token": 2e-06, @@ -34983,8 +38003,23 @@ "output_cost_per_image_token": 0.00012, "output_cost_per_token": 1.2e-05, "output_cost_per_token_batches": 6e-06, + "supports_reasoning": false, "source": "https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image" }, + "vertex_ai/gemini-3.1-flash-image": { + "input_cost_per_image": 0.00056, + "input_cost_per_token": 5e-07, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 65536, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "image_generation", + "output_cost_per_image": 0.0672, + "output_cost_per_image_token": 6e-05, + "output_cost_per_token": 3e-06, + "supports_reasoning": false, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models" + }, "vertex_ai/gemini-3.1-flash-image-preview": { "input_cost_per_image": 0.00056, "input_cost_per_token": 5e-07, @@ -34996,23 +38031,17 @@ "output_cost_per_image": 0.0672, "output_cost_per_image_token": 6e-05, "output_cost_per_token": 3e-06, + "supports_reasoning": false, "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models" }, "vertex_ai/gemini-3.1-flash-lite-preview": { "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 2.5e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 1.5e-06, "output_cost_per_token": 1.5e-06, @@ -35033,8 +38062,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -35057,9 +38084,7 @@ }, "vertex_ai/gemini-3.1-flash-lite": { "cache_read_input_token_cost": 2.5e-08, - "cache_read_input_token_cost_batches": 1.25e-08, "cache_read_input_token_cost_flex": 1.25e-08, - "cache_read_input_token_cost_per_audio_token": 5e-08, "cache_read_input_token_cost_priority": 4.5e-08, "input_cost_per_audio_token": 5e-07, "input_cost_per_token": 2.5e-07, @@ -35067,15 +38092,9 @@ "input_cost_per_token_flex": 1.25e-07, "input_cost_per_token_priority": 4.5e-07, "litellm_provider": "vertex_ai-language-models", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65536, - "max_pdf_size_mb": 30, "max_tokens": 65536, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 1.5e-06, "output_cost_per_token": 1.5e-06, @@ -35099,8 +38118,6 @@ ], "supports_audio_input": true, "supports_audio_output": false, - "supports_code_execution": true, - "supports_file_search": true, "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_pdf_input": true, @@ -35119,8 +38136,62 @@ "search_context_size_medium": 0.014, "search_context_size_high": 0.014 }, - "web_search_billing_unit": "per_query", - "supports_service_tier": true + "web_search_billing_unit": "per_query" + }, + "vertex_ai/gemini-3.5-flash-lite": { + "cache_read_input_token_cost": 3e-08, + "cache_read_input_token_cost_flex": 2e-08, + "cache_read_input_token_cost_priority": 5e-08, + "input_cost_per_token": 3e-07, + "input_cost_per_token_batches": 1.5e-07, + "input_cost_per_token_flex": 1.5e-07, + "input_cost_per_token_priority": 5.4e-07, + "litellm_provider": "vertex_ai-language-models", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_reasoning_token": 2.5e-06, + "output_cost_per_token": 2.5e-06, + "output_cost_per_token_batches": 1.25e-06, + "output_cost_per_token_flex": 1.25e-06, + "output_cost_per_token_priority": 4.5e-06, + "source": "https://cloud.google.com/vertex-ai/generative-ai/pricing#gemini-models", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/completions", + "/v1/batch" + ], + "supported_modalities": [ + "text", + "image", + "audio", + "video" + ], + "supported_output_modalities": [ + "text" + ], + "supports_audio_input": true, + "supports_audio_output": false, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true, + "supports_native_streaming": true, + "search_context_cost_per_query": { + "search_context_size_low": 0.014, + "search_context_size_medium": 0.014, + "search_context_size_high": 0.014 + }, + "web_search_billing_unit": "per_query" }, "vertex_ai/deep-research-pro-preview-12-2025": { "input_cost_per_image": 0.0011, @@ -35887,7 +38958,6 @@ "litellm_provider": "voyage", "max_input_tokens": 16000, "max_output_tokens": 16000, - "max_query_tokens": 16000, "max_tokens": 16000, "mode": "rerank", "output_cost_per_token": 0.0 @@ -35897,7 +38967,6 @@ "litellm_provider": "voyage", "max_input_tokens": 8000, "max_output_tokens": 8000, - "max_query_tokens": 8000, "max_tokens": 8000, "mode": "rerank", "output_cost_per_token": 0.0 @@ -35907,7 +38976,6 @@ "litellm_provider": "voyage", "max_input_tokens": 32000, "max_output_tokens": 32000, - "max_query_tokens": 32000, "max_tokens": 32000, "mode": "rerank", "output_cost_per_token": 0.0 @@ -35917,7 +38985,6 @@ "litellm_provider": "voyage", "max_input_tokens": 32000, "max_output_tokens": 32000, - "max_query_tokens": 32000, "max_tokens": 32000, "mode": "rerank", "output_cost_per_token": 0.0 @@ -37124,6 +40191,48 @@ "supports_vision": true, "supports_web_search": true }, + "xai/grok-4.5": { + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_200k_tokens": 1e-06, + "input_cost_per_token": 2e-06, + "input_cost_per_token_above_200k_tokens": 4e-06, + "litellm_provider": "xai", + "max_input_tokens": 500000, + "max_output_tokens": 500000, + "max_tokens": 500000, + "mode": "chat", + "output_cost_per_token": 6e-06, + "output_cost_per_token_above_200k_tokens": 1.2e-05, + "source": "https://docs.x.ai/docs/models", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, + "xai/grok-4.5-latest": { + "cache_read_input_token_cost": 5e-07, + "cache_read_input_token_cost_above_200k_tokens": 1e-06, + "input_cost_per_token": 2e-06, + "input_cost_per_token_above_200k_tokens": 4e-06, + "litellm_provider": "xai", + "max_input_tokens": 500000, + "max_output_tokens": 500000, + "max_tokens": 500000, + "mode": "chat", + "output_cost_per_token": 6e-06, + "output_cost_per_token_above_200k_tokens": 1.2e-05, + "source": "https://docs.x.ai/docs/models", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true + }, "xai/grok-beta": { "input_cost_per_token": 5e-06, "litellm_provider": "xai", @@ -37214,12 +40323,12 @@ }, "zai.glm-5": { "input_cost_per_token": 1e-06, + "output_cost_per_token": 3.2e-06, "litellm_provider": "bedrock_converse", "max_input_tokens": 200000, "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 3.2e-06, "supports_function_calling": true, "supports_reasoning": true, "supports_system_messages": true, @@ -37240,25 +40349,26 @@ "supports_tool_choice": true, "source": "https://aws.amazon.com/bedrock/pricing/" }, - "zai.glm-5": { + "zai/glm-5": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 2e-07, "input_cost_per_token": 1e-06, - "litellm_provider": "bedrock_converse", + "output_cost_per_token": 3.2e-06, + "litellm_provider": "zai", "max_input_tokens": 200000, "max_output_tokens": 128000, - "max_tokens": 128000, "mode": "chat", - "output_cost_per_token": 3.2e-06, - "source": "https://aws.amazon.com/bedrock/pricing/", "supports_function_calling": true, + "supports_prompt_caching": true, "supports_reasoning": true, - "supports_system_messages": true, - "supports_tool_choice": true + "supports_tool_choice": true, + "source": "https://docs.z.ai/guides/overview/pricing" }, - "zai/glm-5": { + "zai/glm-5.1": { "cache_creation_input_token_cost": 0, - "cache_read_input_token_cost": 2e-07, - "input_cost_per_token": 1e-06, - "output_cost_per_token": 3.2e-06, + "cache_read_input_token_cost": 2.6e-07, + "input_cost_per_token": 1.4e-06, + "output_cost_per_token": 4.4e-06, "litellm_provider": "zai", "max_input_tokens": 200000, "max_output_tokens": 128000, @@ -37299,6 +40409,21 @@ "supports_tool_choice": true, "source": "https://docs.z.ai/guides/overview/pricing" }, + "zai/glm-4.7-flash": { + "cache_creation_input_token_cost": 0, + "cache_read_input_token_cost": 0, + "input_cost_per_token": 0, + "output_cost_per_token": 0, + "litellm_provider": "zai", + "max_input_tokens": 200000, + "max_output_tokens": 128000, + "mode": "chat", + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_tool_choice": true, + "source": "https://docs.z.ai/guides/overview/pricing" + }, "zai/glm-4.6": { "cache_creation_input_token_cost": 0, "cache_read_input_token_cost": 1.1e-07, @@ -37413,10 +40538,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "720x1280", - "1280x720" ] }, "openai/sora-2-pro": { @@ -37430,10 +40551,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "720x1280", - "1280x720" ] }, "openai/sora-2-pro-high-res": { @@ -37447,10 +40564,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "1024x1792", - "1792x1024" ] }, "azure/sora-2": { @@ -37463,10 +40576,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "720x1280", - "1280x720" ] }, "azure/sora-2-pro": { @@ -37479,10 +40588,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "720x1280", - "1280x720" ] }, "azure/sora-2-pro-high-res": { @@ -37495,10 +40600,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "1024x1792", - "1792x1024" ] }, "runwayml/gen4_turbo": { @@ -37513,10 +40614,6 @@ "supported_output_modalities": [ "video" ], - "supported_resolutions": [ - "1280x720", - "720x1280" - ], "metadata": { "comment": "5 credits per second @ $0.01 per credit = $0.05 per second" } @@ -37533,10 +40630,6 @@ "supported_output_modalities": [ "video" ], - "supported_resolutions": [ - "1280x720", - "720x1280" - ], "metadata": { "comment": "15 credits per second @ $0.01 per credit = $0.15 per second" } @@ -37553,10 +40646,6 @@ "supported_output_modalities": [ "video" ], - "supported_resolutions": [ - "1280x720", - "720x1280" - ], "metadata": { "comment": "5 credits per second @ $0.01 per credit = $0.05 per second" } @@ -37574,10 +40663,6 @@ "supported_output_modalities": [ "image" ], - "supported_resolutions": [ - "1280x720", - "1920x1080" - ], "metadata": { "comment": "5 credits per 720p image or 8 credits per 1080p image @ $0.01 per credit. Using 5 credits ($0.05) as base cost" } @@ -37595,10 +40680,6 @@ "supported_output_modalities": [ "image" ], - "supported_resolutions": [ - "1280x720", - "1920x1080" - ], "metadata": { "comment": "2 credits per image (any resolution) @ $0.01 per credit = $0.02 per image" } @@ -39497,6 +42578,22 @@ "litellm_provider": "fireworks_ai", "mode": "chat" }, + "fireworks_ai/accounts/fireworks/models/qwen3p7-plus": { + "cache_read_input_token_cost": 8e-08, + "input_cost_per_token": 4e-07, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "output_cost_per_token": 1.6e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "fireworks_ai/accounts/fireworks/models/qwq-32b": { "max_tokens": 131072, "max_input_tokens": 131072, @@ -39596,24 +42693,6 @@ "litellm_provider": "fireworks_ai", "mode": "chat" }, - "fireworks_ai/accounts/fireworks/models/whisper-v3": { - "max_tokens": 4096, - "max_input_tokens": 4096, - "max_output_tokens": 4096, - "input_cost_per_token": 0.0, - "output_cost_per_token": 0.0, - "litellm_provider": "fireworks_ai", - "mode": "audio_transcription" - }, - "fireworks_ai/accounts/fireworks/models/whisper-v3-turbo": { - "max_tokens": 4096, - "max_input_tokens": 4096, - "max_output_tokens": 4096, - "input_cost_per_token": 0.0, - "output_cost_per_token": 0.0, - "litellm_provider": "fireworks_ai", - "mode": "audio_transcription" - }, "fireworks_ai/accounts/fireworks/models/yi-34b": { "max_tokens": 4096, "max_input_tokens": 4096, @@ -39659,6 +42738,54 @@ "litellm_provider": "fireworks_ai", "mode": "chat" }, + "fireworks_ai/accounts/fireworks/routers/glm-5p1-fast": { + "cache_read_input_token_cost": 5.2e-07, + "input_cost_per_token": 2.8e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 202800, + "max_output_tokens": 131072, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 8.8e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "fireworks_ai/accounts/fireworks/routers/kimi-k2p6-fast": { + "cache_read_input_token_cost": 3e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 8e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "fireworks_ai/accounts/fireworks/routers/kimi-k2p7-code-fast": { + "cache_read_input_token_cost": 3.8e-07, + "input_cost_per_token": 1.9e-06, + "litellm_provider": "fireworks_ai", + "max_input_tokens": 262144, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 8e-06, + "source": "https://docs.fireworks.ai/serverless/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "scaleway/qwen/qwen3.5-397b-a17b": { "input_cost_per_token": 6e-07, "litellm_provider": "scaleway", @@ -41445,7 +44572,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2e-05, "output_cost_per_token": 2.4e-06, "supported_endpoints": [ @@ -41478,7 +44605,7 @@ "max_input_tokens": 128000, "max_output_tokens": 4096, "max_tokens": 4096, - "mode": "chat", + "mode": "realtime", "output_cost_per_audio_token": 2e-05, "output_cost_per_token": 2.4e-06, "supported_endpoints": [ @@ -41528,10 +44655,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "720x1280", - "1280x720" ] }, "sora-2-pro": { @@ -41545,10 +44668,6 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "720x1280", - "1280x720" ] }, "sora-2-pro-high-res": { @@ -41562,14 +44681,9 @@ ], "supported_output_modalities": [ "video" - ], - "supported_resolutions": [ - "1024x1792", - "1792x1024" ] }, "chatgpt-image-latest": { - "cache_read_input_image_token_cost": 2.5e-06, "cache_read_input_token_cost": 1.25e-06, "input_cost_per_image_token": 1e-05, "input_cost_per_token": 5e-06, @@ -41584,7 +44698,6 @@ "gemini-2.0-flash-exp-image-generation": { "input_cost_per_token": 0.0, "litellm_provider": "gemini", - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, @@ -41605,7 +44718,6 @@ "gemini/gemini-2.0-flash-exp-image-generation": { "input_cost_per_token": 0.0, "litellm_provider": "gemini", - "max_images_per_prompt": 3000, "max_input_tokens": 32768, "max_output_tokens": 32768, "max_tokens": 32768, @@ -41631,14 +44743,8 @@ "input_cost_per_audio_token": 7.5e-08, "input_cost_per_token": 7.5e-08, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 8192, - "max_pdf_size_mb": 50, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 3e-07, "rpm": 4000, @@ -41689,7 +44795,8 @@ "audio" ], "supports_audio_input": true, - "supports_audio_output": true + "supports_audio_output": true, + "gemini_native_audio": true }, "gemini-2.5-flash-native-audio-preview-09-2025": { "input_cost_per_audio_token": 1e-06, @@ -41713,7 +44820,8 @@ "audio" ], "supports_audio_input": true, - "supports_audio_output": true + "supports_audio_output": true, + "gemini_native_audio": true }, "gemini-2.5-flash-native-audio-preview-12-2025": { "input_cost_per_audio_token": 1e-06, @@ -41737,7 +44845,8 @@ "audio" ], "supports_audio_input": true, - "supports_audio_output": true + "supports_audio_output": true, + "gemini_native_audio": true }, "gemini-3.1-flash-live-preview": { "input_cost_per_audio_token": 3e-06, @@ -41769,7 +44878,8 @@ "supports_audio_output": true, "supports_function_calling": true, "supports_vision": true, - "supports_web_search": true + "supports_web_search": true, + "gemini_audio_only_live": true }, "gemini/gemini-2.5-flash-native-audio-latest": { "input_cost_per_audio_token": 1e-06, @@ -41795,7 +44905,8 @@ "supports_audio_input": true, "supports_audio_output": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_native_audio": true }, "gemini/gemini-2.5-flash-native-audio-preview-09-2025": { "input_cost_per_audio_token": 1e-06, @@ -41821,7 +44932,8 @@ "supports_audio_input": true, "supports_audio_output": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_native_audio": true }, "gemini/gemini-2.5-flash-native-audio-preview-12-2025": { "input_cost_per_audio_token": 1e-06, @@ -41847,7 +44959,8 @@ "supports_audio_input": true, "supports_audio_output": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_native_audio": true }, "gemini/gemini-3.1-flash-live-preview": { "input_cost_per_audio_token": 3e-06, @@ -41881,7 +44994,8 @@ "supports_vision": true, "supports_web_search": true, "tpm": 250000, - "rpm": 10 + "rpm": 10, + "gemini_audio_only_live": true }, "gemini-2.5-flash-preview-tts": { "input_cost_per_token": 3e-07, @@ -41898,15 +45012,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, @@ -41950,15 +45058,9 @@ "input_cost_per_audio_token": 3e-07, "input_cost_per_token": 1e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 4e-07, "output_cost_per_token": 4e-07, @@ -42003,15 +45105,9 @@ "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1e-05, "output_cost_per_token_above_200k_tokens": 1.5e-05, @@ -42054,15 +45150,9 @@ "input_cost_per_token": 1.25e-06, "input_cost_per_token_above_200k_tokens": 2.5e-06, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_token": 1e-05, "output_cost_per_token_above_200k_tokens": 1.5e-05, @@ -42104,15 +45194,9 @@ "input_cost_per_audio_token": 1e-06, "input_cost_per_token": 3e-07, "litellm_provider": "gemini", - "max_audio_length_hours": 8.4, - "max_audio_per_prompt": 1, - "max_images_per_prompt": 3000, "max_input_tokens": 1048576, "max_output_tokens": 65535, - "max_pdf_size_mb": 30, "max_tokens": 65535, - "max_video_length": 1, - "max_videos_per_prompt": 10, "mode": "chat", "output_cost_per_reasoning_token": 2.5e-06, "output_cost_per_token": 2.5e-06, @@ -42151,7 +45235,40 @@ "search_context_size_high": 0.035 } }, + "vertex_ai/claude-sonnet-5@default": { + "supports_mid_conversation_system": true, + "cache_creation_input_token_cost": 2.5e-06, + "cache_creation_input_token_cost_above_1hr": 4e-06, + "cache_read_input_token_cost": 2e-07, + "input_cost_per_token": 2e-06, + "litellm_provider": "vertex_ai-anthropic_models", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 1e-05, + "search_context_cost_per_query": { + "search_context_size_high": 0.01, + "search_context_size_low": 0.01, + "search_context_size_medium": 0.01 + }, + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, + "supports_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_sampling_params": false, + "supports_tool_choice": true, + "supports_vision": true, + "supports_xhigh_reasoning_effort": true, + "supports_max_reasoning_effort": true, + "prompt_cache_min_tokens": 1024 + }, "vertex_ai/claude-sonnet-4-6@default": { + "supports_adaptive_thinking": true, "cache_creation_input_token_cost": 3.75e-06, "cache_creation_input_token_cost_above_1hr": 6e-06, "cache_read_input_token_cost": 3e-07, @@ -42177,7 +45294,8 @@ "search_context_size_low": 0.01, "search_context_size_medium": 0.01 }, - "supports_output_config": true + "supports_output_config": true, + "prompt_cache_min_tokens": 1024 }, "duckduckgo/search": { "litellm_provider": "duckduckgo", @@ -42195,6 +45313,10 @@ "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_reasoning": true, @@ -42209,6 +45331,10 @@ "max_output_tokens": 32768, "max_tokens": 32768, "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], "supports_function_calling": true, "supports_parallel_function_calling": true, "supports_reasoning": true, @@ -42223,6 +45349,9 @@ "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions" + ], "supports_function_calling": true, "supports_reasoning": true, "supports_response_schema": true, @@ -42236,11 +45365,98 @@ "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions" + ], "supports_function_calling": true, "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true }, + "bedrock_mantle/openai.gpt-5.6-sol": { + "input_cost_per_token": 5.5e-06, + "cache_creation_input_token_cost": 6.875e-06, + "cache_read_input_token_cost": 5.5e-07, + "output_cost_per_token": 3.3e-05, + "litellm_provider": "bedrock_mantle", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "responses", + "use_openai_responses_path": true, + "supported_endpoints": [ + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "bedrock_mantle/openai.gpt-5.6-terra": { + "input_cost_per_token": 2.2e-06, + "cache_creation_input_token_cost": 2.75e-06, + "cache_read_input_token_cost": 2.2e-07, + "output_cost_per_token": 1.32e-05, + "litellm_provider": "bedrock_mantle", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "responses", + "use_openai_responses_path": true, + "supported_endpoints": [ + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "bedrock_mantle/openai.gpt-5.6-luna": { + "input_cost_per_token": 2.2e-07, + "cache_creation_input_token_cost": 2.75e-07, + "cache_read_input_token_cost": 2.2e-08, + "output_cost_per_token": 1.32e-06, + "litellm_provider": "bedrock_mantle", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "responses", + "use_openai_responses_path": true, + "supported_endpoints": [ + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, "bedrock_mantle/openai.gpt-5.5": { "input_cost_per_token": 5.5e-06, "cache_read_input_token_cost": 5.5e-07, @@ -42251,9 +45467,16 @@ "max_tokens": 128000, "mode": "responses", "use_openai_responses_path": true, - "supported_endpoints": ["/v1/responses"], - "supported_modalities": ["text", "image"], - "supported_output_modalities": ["text"], + "supported_endpoints": [ + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], "supports_function_calling": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -42271,9 +45494,16 @@ "max_tokens": 128000, "mode": "responses", "use_openai_responses_path": true, - "supported_endpoints": ["/v1/responses"], - "supported_modalities": ["text", "image"], - "supported_output_modalities": ["text"], + "supported_endpoints": [ + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], "supports_function_calling": true, "supports_prompt_caching": true, "supports_reasoning": true, @@ -42289,6 +45519,11 @@ "max_output_tokens": 256000, "max_tokens": 256000, "mode": "chat", + "use_openai_responses_path": true, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], "supports_function_calling": true, "supports_parallel_function_calling": false, "supports_reasoning": true, @@ -42303,6 +45538,11 @@ "max_output_tokens": 256000, "max_tokens": 256000, "mode": "chat", + "use_openai_responses_path": true, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], "supports_function_calling": true, "supports_parallel_function_calling": false, "supports_reasoning": true, @@ -42317,11 +45557,37 @@ "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", + "use_openai_responses_path": true, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], + "supports_function_calling": true, + "supports_parallel_function_calling": false, + "supports_reasoning": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "bedrock_mantle/xai.grok-4.3": { + "use_openai_responses_path": true, + "input_cost_per_token": 1.25e-06, + "output_cost_per_token": 2.5e-06, + "cache_read_input_token_cost": 2e-07, + "litellm_provider": "bedrock_mantle", + "max_input_tokens": 131072, + "max_output_tokens": 16384, + "max_tokens": 16384, + "mode": "chat", + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], "supports_function_calling": true, - "supports_parallel_function_calling": false, "supports_reasoning": true, + "supports_response_schema": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "source": "https://aws.amazon.com/bedrock/pricing/" }, "volcengine/doubao-seed-2-0-pro-260215": { "litellm_provider": "volcengine", @@ -42475,20 +45741,6 @@ } ] }, - "zai.glm-5": { - "input_cost_per_token": 1e-06, - "output_cost_per_token": 3.2e-06, - "litellm_provider": "bedrock_converse", - "max_input_tokens": 200000, - "max_output_tokens": 128000, - "max_tokens": 128000, - "mode": "chat", - "supports_function_calling": true, - "supports_reasoning": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "source": "https://aws.amazon.com/bedrock/pricing/" - }, "bedrock/us-east-1/zai.glm-5": { "input_cost_per_token": 1e-06, "output_cost_per_token": 3.2e-06, @@ -42517,45 +45769,6 @@ "supports_tool_choice": true, "source": "https://aws.amazon.com/bedrock/pricing/" }, - "minimax.minimax-m2.5": { - "input_cost_per_token": 3e-07, - "output_cost_per_token": 1.2e-06, - "litellm_provider": "bedrock_converse", - "max_input_tokens": 1000000, - "max_output_tokens": 8192, - "max_tokens": 8192, - "mode": "chat", - "supports_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "source": "https://aws.amazon.com/bedrock/pricing/" - }, - "bedrock/us-east-1/minimax.minimax-m2.5": { - "input_cost_per_token": 3e-07, - "output_cost_per_token": 1.2e-06, - "litellm_provider": "bedrock", - "max_input_tokens": 1000000, - "max_output_tokens": 8192, - "max_tokens": 8192, - "mode": "chat", - "supports_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "source": "https://aws.amazon.com/bedrock/pricing/" - }, - "bedrock/us-west-2/minimax.minimax-m2.5": { - "input_cost_per_token": 3e-07, - "output_cost_per_token": 1.2e-06, - "litellm_provider": "bedrock", - "max_input_tokens": 1000000, - "max_output_tokens": 8192, - "max_tokens": 8192, - "mode": "chat", - "supports_function_calling": true, - "supports_system_messages": true, - "supports_tool_choice": true, - "source": "https://aws.amazon.com/bedrock/pricing/" - }, "bedrock/us-gov-east-1/anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.5e-06, "cache_creation_input_token_cost_above_1hr": 2.4e-06, @@ -42577,7 +45790,9 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_pdf_input": true + "supports_pdf_input": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 }, "bedrock/us-gov-west-1/anthropic.claude-haiku-4-5-20251001-v1:0": { "cache_creation_input_token_cost": 1.5e-06, @@ -42600,353 +45815,370 @@ "supports_tool_choice": true, "supports_vision": true, "supports_native_structured_output": true, - "supports_pdf_input": true + "supports_pdf_input": true, + "supports_parallel_tool_use_config": true, + "prompt_cache_min_tokens": 4096 + }, + "snowflake/claude-sonnet-4-5": { + "max_tokens": 16384, + "max_input_tokens": 200000, + "max_output_tokens": 16384, + "input_cost_per_token": 3e-06, + "output_cost_per_token": 1.5e-05, + "cache_read_input_token_cost": 3e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_response_schema": true + }, + "snowflake/claude-sonnet-4-6": { + "supports_adaptive_thinking": true, + "max_tokens": 16384, + "max_input_tokens": 200000, + "max_output_tokens": 16384, + "input_cost_per_token": 3e-06, + "output_cost_per_token": 1.5e-05, + "cache_read_input_token_cost": 3e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_response_schema": true + }, + "snowflake/claude-4-sonnet": { + "max_tokens": 16384, + "max_input_tokens": 200000, + "max_output_tokens": 16384, + "input_cost_per_token": 3e-06, + "output_cost_per_token": 1.5e-05, + "cache_read_input_token_cost": 3e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_response_schema": true + }, + "snowflake/claude-4-opus": { + "max_tokens": 16384, + "max_input_tokens": 200000, + "max_output_tokens": 16384, + "input_cost_per_token": 5e-06, + "output_cost_per_token": 2.5e-05, + "cache_read_input_token_cost": 5e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "supports_response_schema": true + }, + "snowflake/claude-haiku-4-5": { + "max_tokens": 16384, + "max_input_tokens": 200000, + "max_output_tokens": 16384, + "input_cost_per_token": 1e-06, + "output_cost_per_token": 5e-06, + "cache_read_input_token_cost": 1e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_response_schema": true + }, + "snowflake/claude-3-7-sonnet": { + "max_tokens": 16384, + "max_input_tokens": 200000, + "max_output_tokens": 16384, + "input_cost_per_token": 3e-06, + "output_cost_per_token": 1.5e-05, + "cache_read_input_token_cost": 3e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "supports_response_schema": true + }, + "snowflake/openai-gpt-4.1": { + "max_tokens": 16384, + "max_input_tokens": 300000, + "max_output_tokens": 16384, + "input_cost_per_token": 2e-06, + "output_cost_per_token": 8e-06, + "cache_read_input_token_cost": 5e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_response_schema": true + }, + "snowflake/openai-gpt-5": { + "max_tokens": 16384, + "max_input_tokens": 300000, + "max_output_tokens": 16384, + "input_cost_per_token": 1.25e-06, + "output_cost_per_token": 1e-05, + "cache_read_input_token_cost": 1.25e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_vision": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "supports_response_schema": true + }, + "snowflake/openai-gpt-5-mini": { + "max_tokens": 16384, + "max_input_tokens": 1000000, + "max_output_tokens": 16384, + "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.2e-06, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_system_messages": true, + "supports_response_schema": true + }, + "snowflake/openai-gpt-5-nano": { + "max_tokens": 16384, + "max_input_tokens": 5000000, + "max_output_tokens": 16384, + "input_cost_per_token": 1.5e-07, + "output_cost_per_token": 6e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_system_messages": true, + "supports_response_schema": true + }, + "snowflake/llama4-maverick": { + "max_tokens": 16384, + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "input_cost_per_token": 2.4e-07, + "output_cost_per_token": 9.7e-07, + "litellm_provider": "snowflake", + "mode": "chat", + "supports_function_calling": true, + "supports_system_messages": true + }, + "snowflake/snowflake-arctic-embed-l-v2.0": { + "max_tokens": 8192, + "max_input_tokens": 8192, + "input_cost_per_token": 7e-08, + "output_cost_per_token": 0.0, + "litellm_provider": "snowflake", + "mode": "embedding" + }, + "snowflake/snowflake-arctic-embed-m-v2.0": { + "max_tokens": 8192, + "max_input_tokens": 8192, + "input_cost_per_token": 7e-08, + "output_cost_per_token": 0.0, + "litellm_provider": "snowflake", + "mode": "embedding" + }, + "soniox/stt-async-v4": { + "litellm_provider": "soniox", + "max_output_tokens": 8000, + "max_tokens": 8000, + "input_cost_per_second": 0.0, + "output_cost_per_second": 2.77778e-05, + "mode": "audio_transcription", + "source": "https://soniox.com/pricing", + "supported_endpoints": [ + "/v1/audio/transcriptions" + ], + "supports_audio_input": true + }, + "soniox/stt-async-v5": { + "litellm_provider": "soniox", + "max_output_tokens": 8000, + "max_tokens": 8000, + "input_cost_per_second": 0.0, + "output_cost_per_second": 2.77778e-05, + "mode": "audio_transcription", + "source": "https://soniox.com/pricing", + "supported_endpoints": [ + "/v1/audio/transcriptions" + ], + "supports_audio_input": true + }, + "tensormesh/Qwen/Qwen3.5-397B-A17B-FP8": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 6e-07, + "output_cost_per_token": 3.6e-06, + "cache_read_input_token_cost": 0, + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 4.5e-07, + "output_cost_per_token": 1.8e-06, + "cache_read_input_token_cost": 0, + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/Qwen/Qwen3.6-27B-FP8": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 3.2e-07, + "output_cost_per_token": 3.2e-06, + "cache_read_input_token_cost": 0, + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/lukealonso/GLM-5.1-NVFP4-MTP": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 1.4e-06, + "output_cost_per_token": 4.4e-06, + "cache_read_input_token_cost": 0, + "max_input_tokens": 202752, + "max_output_tokens": 202752, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/deepseek-ai/DeepSeek-V4-Flash": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 1.4e-07, + "output_cost_per_token": 2.8e-07, + "cache_read_input_token_cost": 0, + "max_input_tokens": 32768, + "max_output_tokens": 32768, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/moonshotai/Kimi-K2.6": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 9.6e-07, + "output_cost_per_token": 4e-06, + "cache_read_input_token_cost": 0, + "max_input_tokens": 32768, + "max_output_tokens": 32768, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/MiniMaxAI/MiniMax-M2.5": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 3e-07, + "output_cost_per_token": 1.2e-06, + "cache_read_input_token_cost": 0, + "max_input_tokens": 196608, + "max_output_tokens": 196608, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/google/gemma-4-31B-it": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 1.4e-07, + "output_cost_per_token": 5.6e-07, + "cache_read_input_token_cost": 0, + "max_input_tokens": 32768, + "max_output_tokens": 32768, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/openai/gpt-oss-120b": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 1.5e-07, + "output_cost_per_token": 6e-07, + "cache_read_input_token_cost": 0, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" + }, + "tensormesh/openai/gpt-oss-20b": { + "litellm_provider": "tensormesh", + "mode": "chat", + "input_cost_per_token": 7e-08, + "output_cost_per_token": 2.8e-07, + "cache_read_input_token_cost": 0, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "supports_function_calling": true, + "supports_tool_choice": true, + "supports_response_schema": true, + "supports_prompt_caching": true, + "supports_system_messages": true, + "supports_reasoning": true, + "source": "https://serverless.tensormesh.ai/v1/models/openrouter" }, - "snowflake/claude-sonnet-4-5": { - "max_tokens": 16384, - "max_input_tokens": 200000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.000003, - "output_cost_per_token": 0.000015, - "cache_read_input_token_cost": 0.0000003, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_response_schema": true - }, - "snowflake/claude-sonnet-4-6": { - "max_tokens": 16384, - "max_input_tokens": 200000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.000003, - "output_cost_per_token": 0.000015, - "cache_read_input_token_cost": 0.0000003, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_response_schema": true - }, - "snowflake/claude-4-sonnet": { - "max_tokens": 16384, - "max_input_tokens": 200000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.000003, - "output_cost_per_token": 0.000015, - "cache_read_input_token_cost": 0.0000003, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_response_schema": true - }, - "snowflake/claude-4-opus": { - "max_tokens": 16384, - "max_input_tokens": 200000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.000005, - "output_cost_per_token": 0.000025, - "cache_read_input_token_cost": 0.0000005, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "supports_response_schema": true - }, - "snowflake/claude-haiku-4-5": { - "max_tokens": 16384, - "max_input_tokens": 200000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.000001, - "output_cost_per_token": 0.000005, - "cache_read_input_token_cost": 0.0000001, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_response_schema": true - }, - "snowflake/claude-3-7-sonnet": { - "max_tokens": 16384, - "max_input_tokens": 200000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.000003, - "output_cost_per_token": 0.000015, - "cache_read_input_token_cost": 0.0000003, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "supports_response_schema": true - }, - "snowflake/openai-gpt-4.1": { - "max_tokens": 16384, - "max_input_tokens": 300000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.000002, - "output_cost_per_token": 0.000008, - "cache_read_input_token_cost": 0.0000005, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_response_schema": true - }, - "snowflake/openai-gpt-5": { - "max_tokens": 16384, - "max_input_tokens": 300000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.00000125, - "output_cost_per_token": 0.00001, - "cache_read_input_token_cost": 0.000000125, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_vision": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "supports_response_schema": true - }, - "snowflake/openai-gpt-5-mini": { - "max_tokens": 16384, - "max_input_tokens": 1000000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.0000003, - "output_cost_per_token": 0.0000012, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_system_messages": true, - "supports_response_schema": true - }, - "snowflake/openai-gpt-5-nano": { - "max_tokens": 16384, - "max_input_tokens": 5000000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.00000015, - "output_cost_per_token": 0.0000006, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_system_messages": true, - "supports_response_schema": true - }, - "snowflake/llama4-maverick": { - "max_tokens": 16384, - "max_input_tokens": 128000, - "max_output_tokens": 16384, - "input_cost_per_token": 0.00000024, - "output_cost_per_token": 0.00000097, - "litellm_provider": "snowflake", - "mode": "chat", - "supports_function_calling": true, - "supports_system_messages": true - }, - "snowflake/snowflake-arctic-embed-l-v2.0": { - "max_tokens": 8192, - "max_input_tokens": 8192, - "input_cost_per_token": 0.00000007, - "output_cost_per_token": 0.0, - "litellm_provider": "snowflake", - "mode": "embedding" - }, - "snowflake/snowflake-arctic-embed-m-v2.0": { - "max_tokens": 8192, - "max_input_tokens": 8192, - "input_cost_per_token": 0.00000007, - "output_cost_per_token": 0.0, - "litellm_provider": "snowflake", - "mode": "embedding" - }, - "soniox/stt-async-v4": { - "litellm_provider": "soniox", - "max_output_tokens": 8000, - "max_tokens": 8000, - "input_cost_per_second": 0.0, - "output_cost_per_second": 0.0000277778, - "mode": "audio_transcription", - "source": "https://soniox.com/pricing", - "supported_endpoints": ["/v1/audio/transcriptions"], - "supports_audio_input": true - }, - "tensormesh/Qwen/Qwen3.5-397B-A17B-FP8": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 6e-07, - "output_cost_per_token": 3.6e-06, - "cache_read_input_token_cost": 0, - "max_input_tokens": 262144, - "max_output_tokens": 262144, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 4.5e-07, - "output_cost_per_token": 1.8e-06, - "cache_read_input_token_cost": 0, - "max_input_tokens": 262144, - "max_output_tokens": 262144, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/Qwen/Qwen3.6-27B-FP8": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 3.2e-07, - "output_cost_per_token": 3.2e-06, - "cache_read_input_token_cost": 0, - "max_input_tokens": 262144, - "max_output_tokens": 262144, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/lukealonso/GLM-5.1-NVFP4-MTP": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 1.4e-06, - "output_cost_per_token": 4.4e-06, - "cache_read_input_token_cost": 0, - "max_input_tokens": 202752, - "max_output_tokens": 202752, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/deepseek-ai/DeepSeek-V4-Flash": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 1.4e-07, - "output_cost_per_token": 2.8e-07, - "cache_read_input_token_cost": 0, - "max_input_tokens": 32768, - "max_output_tokens": 32768, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/moonshotai/Kimi-K2.6": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 9.6e-07, - "output_cost_per_token": 4e-06, - "cache_read_input_token_cost": 0, - "max_input_tokens": 32768, - "max_output_tokens": 32768, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/MiniMaxAI/MiniMax-M2.5": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 3e-07, - "output_cost_per_token": 1.2e-06, - "cache_read_input_token_cost": 0, - "max_input_tokens": 196608, - "max_output_tokens": 196608, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/google/gemma-4-31B-it": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 1.4e-07, - "output_cost_per_token": 5.6e-07, - "cache_read_input_token_cost": 0, - "max_input_tokens": 32768, - "max_output_tokens": 32768, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/openai/gpt-oss-120b": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 1.5e-07, - "output_cost_per_token": 6e-07, - "cache_read_input_token_cost": 0, - "max_input_tokens": 131072, - "max_output_tokens": 131072, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - }, - "tensormesh/openai/gpt-oss-20b": { - "litellm_provider": "tensormesh", - "mode": "chat", - "input_cost_per_token": 7e-08, - "output_cost_per_token": 2.8e-07, - "cache_read_input_token_cost": 0, - "max_input_tokens": 131072, - "max_output_tokens": 131072, - "supports_function_calling": true, - "supports_tool_choice": true, - "supports_response_schema": true, - "supports_prompt_caching": true, - "supports_system_messages": true, - "supports_reasoning": true, - "source": "https://serverless.tensormesh.ai/v1/models/openrouter" - } - , "deepseek-v4-flash": { "cache_creation_input_token_cost": 0.0, "cache_read_input_token_cost": 2.8e-09, @@ -42967,6 +46199,7 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -42992,6 +46225,7 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -43017,6 +46251,7 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, @@ -43042,9 +46277,231 @@ "supports_native_streaming": true, "supports_parallel_function_calling": true, "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "tencent/deepseek-v4-pro": { + "cache_creation_input_token_cost": 0.0, + "cache_read_input_token_cost": 3.625e-09, + "input_cost_per_token": 4.35e-07, + "input_cost_per_token_cache_hit": 3.625e-09, + "litellm_provider": "tencent", + "max_input_tokens": 1000000, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 8.7e-07, + "source": "https://www.tencentcloud.com/products/tokenhub", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_reasoning": true, + "supports_vision": false + }, + "tencent/deepseek-v4-flash": { + "cache_creation_input_token_cost": 0.0, + "cache_read_input_token_cost": 2.8e-09, + "input_cost_per_token": 1.4e-07, + "input_cost_per_token_cache_hit": 2.8e-09, + "litellm_provider": "tencent", + "max_input_tokens": 1000000, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "output_cost_per_token": 2.8e-07, + "source": "https://www.tencentcloud.com/products/tokenhub", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_assistant_prefill": true, + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, "supports_response_schema": true, "supports_system_messages": true, "supports_tool_choice": true, + "supports_reasoning": true, "supports_vision": false + }, + "pinstripes/ps/glm-4.5-air": { + "max_tokens": 128000, + "max_input_tokens": 128000, + "max_output_tokens": 128000, + "input_cost_per_token": 1.25e-07, + "output_cost_per_token": 4.5e-07, + "litellm_provider": "pinstripes", + "mode": "chat", + "supports_function_calling": true, + "supports_assistant_prefill": true, + "supports_reasoning": true, + "source": "https://pinstripes.io/pricing" + }, + "pinstripes/ps/qwen3.6-35b-a3b": { + "max_tokens": 131072, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "input_cost_per_token": 1.4e-07, + "output_cost_per_token": 4.5e-07, + "litellm_provider": "pinstripes", + "mode": "chat", + "supports_function_calling": true, + "supports_assistant_prefill": true, + "supports_reasoning": true, + "source": "https://pinstripes.io/pricing" + }, + "pinstripes/ps/qwen3-30b-a3b": { + "max_tokens": 131072, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "input_cost_per_token": 9e-08, + "output_cost_per_token": 2e-07, + "litellm_provider": "pinstripes", + "mode": "chat", + "supports_function_calling": true, + "supports_assistant_prefill": true, + "supports_reasoning": true, + "source": "https://pinstripes.io/pricing" + }, + "pinstripes/ps/qwen3-coder-30b-a3b": { + "max_tokens": 131072, + "max_input_tokens": 131072, + "max_output_tokens": 131072, + "input_cost_per_token": 3e-07, + "output_cost_per_token": 6e-07, + "litellm_provider": "pinstripes", + "mode": "chat", + "supports_function_calling": true, + "supports_assistant_prefill": true, + "supports_reasoning": false, + "source": "https://pinstripes.io/pricing" + }, + "pinstripes/ps/deepseek-v4-flash": { + "max_tokens": 163840, + "max_input_tokens": 163840, + "max_output_tokens": 163840, + "input_cost_per_token": 1e-07, + "output_cost_per_token": 2e-07, + "litellm_provider": "pinstripes", + "mode": "chat", + "supports_function_calling": true, + "supports_assistant_prefill": true, + "supports_reasoning": true, + "source": "https://pinstripes.io/pricing" + }, + "pinstripes/ps/minimax-m2.7": { + "max_tokens": 1000192, + "max_input_tokens": 1000192, + "max_output_tokens": 1000192, + "input_cost_per_token": 2.55e-07, + "output_cost_per_token": 5.5e-07, + "litellm_provider": "pinstripes", + "mode": "chat", + "supports_function_calling": true, + "supports_assistant_prefill": true, + "supports_reasoning": false, + "source": "https://pinstripes.io/pricing" + }, + "darkbloom/gemma-4-26b": { + "input_cost_per_token": 3e-08, + "litellm_provider": "darkbloom", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 1.65e-07, + "source": "https://www.darkbloom.dev/", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "darkbloom/gpt-oss-20b": { + "input_cost_per_token": 1.45e-08, + "litellm_provider": "darkbloom", + "max_input_tokens": 131072, + "max_output_tokens": 32768, + "max_tokens": 32768, + "mode": "chat", + "output_cost_per_token": 7e-08, + "source": "https://www.darkbloom.dev/", + "supported_endpoints": [ + "/v1/chat/completions" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "fallback_generalizations": { + "rules": [ + { + "name": "bedrock-claude-ids", + "pattern": "^(?:[a-z-]+\\.)?anthropic\\.claude-", + "description": "A Bedrock-syntax Claude id, for every version: anthropic.claude- at the start of the name, optionally behind a single dotted geo segment (us./eu./au./jp./apac./global./us-gov.). Anchored to the start because routing rules see the raw request string and provider inference feeds the proxy's provider/* wildcard access checks: an id under an unrecognized namespace such as bedrockz/anthropic.claude-... must stay unroutable rather than resolve to bedrock and slip through a bedrock/* key. Routes to bedrock before the bare-id Anthropic rule is consulted.", + "model_info": { + "litellm_provider": "bedrock" + } + }, + { + "name": "anthropic-claude-ids", + "pattern": "^claude-[a-z]+-\\d+(?:[-.]\\d+)?(?:-\\d{8})?$", + "description": "A bare Claude family-major id with an optional minor and an optional 8-digit date suffix, anchored to the whole name, so claude-newfamily-5 routes like claude-newfamily-5-1 does. Routes an unmapped Claude id that carries no provider namespace to the Anthropic API.", + "model_info": { + "litellm_provider": "anthropic" + } + }, + { + "name": "claude-family-baseline", + "pattern": "claude-[a-z]+-\\d+(?:[-.]\\d+)?(?:-\\d{8})?", + "description": "Any Claude family-major id with an optional minor and an optional 8-digit date suffix, under any provider namespace (bare, bedrock-dotted, vertex, databricks, ...), so bare majors like claude-newfamily-5 get the same baseline as claude-newfamily-5-1. Carries the model-family facts every Claude shares; it carries no pricing, so cost stays on the standard unpriced behavior rather than a guessed number.", + "model_info": { + "mode": "chat", + "max_input_tokens": 200000, + "max_output_tokens": 64000, + "max_tokens": 64000, + "supports_function_calling": true, + "supports_parallel_function_calling": true, + "supports_vision": true, + "supports_tool_choice": true, + "supports_assistant_prefill": true, + "supports_prompt_caching": true, + "supports_response_schema": true, + "supports_reasoning": true, + "supports_pdf_input": true, + "supports_system_messages": true + } + }, + { + "name": "claude-adaptive-thinking", + "pattern": "claude-[a-z]+-(?:4[-._](?:[6-9]|[1-9]\\d)(?!\\d)|(?:[5-9]|[1-9]\\d)(?!\\d)(?:[-._]\\d{1,2}(?!\\d))?)", + "description": "Claude at version 4.6 or higher, in any id shape that contains claude--: minors 4.6 through 4.99, any later major-minor, and bare 5+ majors so a new family shaped like claude-fable-5 matches. Requiring the claude- prefix keeps non-Claude names such as team-sonnet-5-1 out. The minor is capped at two digits so an 8-digit date suffix such as claude-opus-4-20250514 is never read as a >= 4.6 minor. Turns on adaptive thinking for new versions and new families with no code change.", + "model_info": { + "supports_adaptive_thinking": true + } + }, + { + "name": "claude-mid-conversation-system", + "pattern": "claude-[a-z]+-(?:4[-._](?:[89]|[1-9]\\d)(?!\\d)|(?:[5-9]|[1-9]\\d)(?!\\d)(?:[-._]\\d{1,2}(?!\\d))?)", + "description": "Claude at version 4.8 or higher, in any id shape that contains claude--: minors 4.8 through 4.99, any later major-minor, and bare 5+ majors so a new family like claude-fable-5 matches. Anthropic introduced mid-conversation system messages with Opus 4.8 and every newer Claude keeps them; 4.7 and below reject the system role inside messages.", + "model_info": { + "supports_mid_conversation_system": true + } + } + ] } } diff --git a/src/sdk/agents/events.rs b/src/sdk/agents/events.rs index e86d29eb..f8fc5fa9 100644 --- a/src/sdk/agents/events.rs +++ b/src/sdk/agents/events.rs @@ -176,22 +176,22 @@ impl AgentEvent { #[derive(Debug, Default)] pub struct SseParser { - buffer: String, + buffer: Vec, event_name: Option, data_lines: Vec, } impl SseParser { pub fn push(&mut self, bytes: &[u8]) -> Result, AgentSdkError> { - self.buffer.push_str(std::str::from_utf8(bytes)?); + self.buffer.extend_from_slice(bytes); let mut events = Vec::new(); - while let Some(index) = self.buffer.find('\n') { - let mut line = self.buffer[..index].to_owned(); - self.buffer.drain(..=index); - if line.ends_with('\r') { + while let Some(index) = self.buffer.iter().position(|byte| *byte == b'\n') { + let mut line = self.buffer.drain(..=index).collect::>(); + line.pop(); + if line.last() == Some(&b'\r') { line.pop(); } - if let Some(event) = self.process_line(&line)? { + if let Some(event) = self.process_line(std::str::from_utf8(&line)?)? { events.push(event); } } @@ -201,7 +201,7 @@ impl SseParser { pub fn finish(mut self) -> Result, AgentSdkError> { if !self.buffer.is_empty() { let line = std::mem::take(&mut self.buffer); - let event = self.process_line(&line)?; + let event = self.process_line(std::str::from_utf8(&line)?)?; if let Some(event) = event { return Ok(vec![event]); } diff --git a/src/sdk/agents/events_tests.rs b/src/sdk/agents/events_tests.rs index f1e50a99..3979d886 100644 --- a/src/sdk/agents/events_tests.rs +++ b/src/sdk/agents/events_tests.rs @@ -1,6 +1,6 @@ use serde_json::json; -use super::{parse_sse, AgentEventKind, AgentEventPayload}; +use super::{parse_sse, AgentEventKind, AgentEventPayload, SseParser}; #[test] fn serde_roundtrip_keeps_flat_event_shape() { @@ -67,3 +67,22 @@ fn typed_payload_keeps_extra_fields() { assert_eq!(payload.name.as_deref(), Some("edit")); assert_eq!(payload.raw["processed_at"], json!("now")); } + +#[test] +fn streaming_parser_buffers_split_utf8_code_points() { + let input = concat!( + "event: agent.message\n", + "data: {\"content\":[{\"type\":\"text\",\"text\":\"market – verified\"}]}\n\n" + ); + let split = input.find('–').unwrap() + 1; + let mut parser = SseParser::default(); + + assert!(parser.push(&input.as_bytes()[..split]).unwrap().is_empty()); + let events = parser.push(&input.as_bytes()[split..]).unwrap(); + + assert_eq!(events.len(), 1); + let AgentEventPayload::AgentMessage(payload) = events[0].payload() else { + panic!("expected agent message payload"); + }; + assert_eq!(payload.content[0]["text"], json!("market – verified")); +} diff --git a/src/ui/e2e/codex-runtime-profiles.spec.ts b/src/ui/e2e/codex-runtime-profiles.spec.ts new file mode 100644 index 00000000..e266147b --- /dev/null +++ b/src/ui/e2e/codex-runtime-profiles.spec.ts @@ -0,0 +1,90 @@ +import { expect, test, type Page } from "@playwright/test"; + +const harnesses = [ + { + alias: "Codex-app-server", + api_spec: "claude_managed_agents", + display_name: "Codex-app-server", + api_base: "https://codex.example.test", + is_default: false, + connected: true, + masked_api_key: "rtk_...test", + tools: [], + }, + { + alias: "chatgpt-profile", + api_spec: "claude_managed_agents", + display_name: "chatgpt-profile", + api_base: "https://codex.example.test/profiles/chatgpt-profile", + is_default: false, + connected: true, + masked_api_key: "rtk_...test", + tools: [], + codex_profile_type: "chatgpt", + codex_controller_alias: "Codex-app-server", + }, +]; + +async function mockRuntimeApis(page: Page) { + await page.addInitScript(() => { + window.sessionStorage.setItem("lite-harness-master-key", "sk-test"); + }); + await page.route("**/v1/models", (route) => route.fulfill({ + contentType: "application/json", + body: JSON.stringify({ data: [] }), + })); + await page.route("**/session", (route) => route.fulfill({ + contentType: "application/json", + body: "[]", + })); + await page.route("**/api/inbox**", (route) => route.fulfill({ + contentType: "application/json", + body: JSON.stringify({ items: [] }), + })); + await page.route("**/api/runtime-harnesses", (route) => route.fulfill({ + contentType: "application/json", + body: JSON.stringify({ harnesses }), + })); + await page.route("**/api/codex-connections/Codex-app-server", (route) => route.fulfill({ + contentType: "application/json", + body: JSON.stringify({ profiles: [{ alias: "chatgpt-profile", type: "chatgpt", model: "gpt-5.6-sol", ready: true }] }), + })); + await page.route("**/api/codex-connections/Codex-app-server/chatgpt-profile/account", (route) => route.fulfill({ + contentType: "application/json", + body: JSON.stringify({ account: null, requiresOpenaiAuth: true }), + })); + await page.route("https://raw.githubusercontent.com/**", (route) => route.fulfill({ + contentType: "application/json", + body: JSON.stringify({ templates: [] }), + })); +} + +test("offers API, ChatGPT, and Remote SSH Codex connection forms", async ({ page }) => { + await mockRuntimeApis(page); + await page.goto("/runtimes/"); + await page.getByRole("button", { name: "New Runtime" }).click(); + const dialog = page.getByRole("dialog"); + await dialog.getByRole("combobox").first().click(); + await expect(page.getByText("Codex — OpenAI API", { exact: true })).toBeVisible(); + await expect(page.getByText("Codex — ChatGPT", { exact: true })).toBeVisible(); + await expect(page.getByText("Codex — Remote SSH", { exact: true })).toBeVisible(); + + await page.getByText("Codex — ChatGPT", { exact: true }).click(); + await expect(dialog.getByText("Codex app-server controller")).toBeVisible(); + await expect(dialog.getByText("Sign in with ChatGPT", { exact: false })).toBeVisible(); + + await dialog.getByRole("combobox").first().click(); + await page.getByText("Codex — Remote SSH", { exact: true }).click(); + await expect(dialog.getByText("Host or IP", { exact: true })).toBeVisible(); + await expect(dialog.getByText("Private key", { exact: true })).toBeVisible(); + await expect(dialog.getByText("Host key fingerprint (optional)", { exact: true })).toBeVisible(); +}); + +test("shows native ChatGPT sign-in controls for a ChatGPT profile", async ({ page }) => { + await mockRuntimeApis(page); + await page.goto("/runtimes/"); + await page.getByText("chatgpt-profile", { exact: true }).first().click(); + await expect(page.getByText("ChatGPT sign-in required")).toBeVisible(); + await expect(page.getByRole("button", { name: "Sign in with ChatGPT" })).toBeVisible(); + await expect(page.getByText("no OpenAI API key is needed", { exact: false })).toBeVisible(); +}); diff --git a/src/ui/src/app/runtimes/page.tsx b/src/ui/src/app/runtimes/page.tsx index afc423d4..83f161bc 100644 --- a/src/ui/src/app/runtimes/page.tsx +++ b/src/ui/src/app/runtimes/page.tsx @@ -6,6 +6,8 @@ import { Check, CheckCircle2, ChevronRight, + Copy, + ExternalLink, FileText, KeyRound, Plus, @@ -30,6 +32,7 @@ import { } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, @@ -39,11 +42,18 @@ import { } from "@/components/ui/select"; import { apiErrorMessage, + cancelCodexLogin, + createCodexConnection, createRuntimeHarness, + deleteCodexConnection, deleteAgentRuntimeCredential, deleteRuntimeHarness, + listCodexConnections, listRuntimeHarnesses, + logoutCodexConnection, + readCodexAccount, saveAgentRuntimeCredential, + startCodexLogin, updateRuntimeHarness, } from "@/lib/api"; import { @@ -53,7 +63,7 @@ import { runtimeTemplateIconId, type RuntimeTemplate, } from "@/lib/runtime-templates"; -import type { RuntimeHarness } from "@/lib/types"; +import type { CodexAccountState, CodexDeviceLogin, CodexProfile, RuntimeHarness } from "@/lib/types"; import { cn } from "@/lib/utils"; const SPEC_DEFAULTS: Record = { @@ -69,6 +79,24 @@ const SPEC_LABELS: Record = { }; const RUNTIME_OPTIONS = [ + { + value: "codex_api", + label: "Codex — OpenAI API", + apiSpec: "claude_managed_agents", + defaultApiBase: "", + }, + { + value: "codex_chatgpt", + label: "Codex — ChatGPT", + apiSpec: "claude_managed_agents", + defaultApiBase: "", + }, + { + value: "codex_remote_ssh", + label: "Codex — Remote SSH", + apiSpec: "claude_managed_agents", + defaultApiBase: "", + }, { value: "claude_managed_agents", label: "Claude Managed Agents", @@ -189,17 +217,31 @@ function AddHarnessModal({ template, onClose, onCreated, + controllers, }: { open: boolean; template: RuntimeTemplate | null; onClose: () => void; onCreated: (harnesses: RuntimeHarness[]) => void; + controllers: RuntimeHarness[]; }) { const [alias, setAlias] = useState(""); const [runtimeOption, setRuntimeOption] = useState("claude_managed_agents"); const [apiSpec, setApiSpec] = useState("claude_managed_agents"); const [apiBase, setApiBase] = useState(SPEC_DEFAULTS.claude_managed_agents); const [apiKey, setApiKey] = useState(""); + const [controllerAlias, setControllerAlias] = useState("Codex-app-server"); + const [model, setModel] = useState("gpt-5.6-sol-high"); + const [sshHost, setSshHost] = useState(""); + const [sshPort, setSshPort] = useState("22"); + const [sshUsername, setSshUsername] = useState(""); + const [sshAuth, setSshAuth] = useState("private_key"); + const [sshPassword, setSshPassword] = useState(""); + const [sshPrivateKey, setSshPrivateKey] = useState(""); + const [sshPassphrase, setSshPassphrase] = useState(""); + const [sshWorkspace, setSshWorkspace] = useState("."); + const [sshCodexBin, setSshCodexBin] = useState("codex"); + const [sshFingerprint, setSshFingerprint] = useState(""); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); @@ -209,6 +251,8 @@ function AddHarnessModal({ setRuntimeOption(option.value); setApiSpec(option.apiSpec); setApiBase(option.defaultApiBase); + if (option.value === "codex_api") setModel("gpt-5.6-sol-high"); + if (option.value === "codex_chatgpt" || option.value === "codex_remote_ssh") setModel("gpt-5.6-sol"); }; const reset = useCallback(() => { @@ -217,8 +261,20 @@ function AddHarnessModal({ setRuntimeOption("claude_managed_agents"); setApiSpec("claude_managed_agents"); setApiBase(SPEC_DEFAULTS.claude_managed_agents); + setControllerAlias(controllers[0]?.alias ?? "Codex-app-server"); + setModel("gpt-5.6-sol-high"); + setSshHost(""); + setSshPort("22"); + setSshUsername(""); + setSshAuth("private_key"); + setSshPassword(""); + setSshPrivateKey(""); + setSshPassphrase(""); + setSshWorkspace("."); + setSshCodexBin("codex"); + setSshFingerprint(""); setError(null); - }, []); + }, [controllers]); useEffect(() => { if (!open) return; @@ -227,6 +283,7 @@ function AddHarnessModal({ return; } const matchingOption = + (template.id === "codex" ? "codex_api" : RUNTIME_OPTIONS.find((option) => option.value === template.id)?.value) ?? RUNTIME_OPTIONS.find((option) => option.apiSpec === template.apiSpec)?.value ?? "claude_managed_agents"; setAlias(template.runtimeAlias); @@ -234,8 +291,10 @@ function AddHarnessModal({ setRuntimeOption(matchingOption); setApiSpec(template.apiSpec); setApiBase(""); + setControllerAlias(controllers[0]?.alias ?? "Codex-app-server"); + setModel("gpt-5.6-sol-high"); setError(null); - }, [open, reset, template]); + }, [controllers, open, reset, template]); const handleCreate = async () => { const trimmedAlias = alias.trim(); @@ -253,23 +312,48 @@ function AddHarnessModal({ setError(`"${trimmedAlias}" is reserved.`); return; } - if (!trimmedKey) { - setError("API key is required."); - return; - } - if (!trimmedBase) { - setError("API base is required."); - return; + const isCodex = runtimeOption.startsWith("codex_"); + if (isCodex && !controllerAlias.trim()) return setError("Codex controller is required."); + if (!isCodex && !trimmedKey) return setError("API key is required."); + if (!isCodex && !trimmedBase) return setError("API base is required."); + if (runtimeOption === "codex_api" && !trimmedKey) return setError("OpenAI API key is required."); + if (runtimeOption === "codex_api" && !trimmedBase) return setError("OpenAI-compatible base URL is required."); + if (runtimeOption === "codex_remote_ssh") { + if (!sshHost.trim() || !sshUsername.trim()) return setError("SSH host and username are required."); + if (sshAuth === "private_key" && !sshPrivateKey.trim()) return setError("SSH private key is required."); + if (sshAuth === "password" && !sshPassword) return setError("SSH password is required."); } setSaving(true); setError(null); try { - const next = await createRuntimeHarness({ - alias: trimmedAlias, - api_spec: apiSpec, - api_base: trimmedBase, - api_key: trimmedKey, - }); + const next = isCodex + ? await createCodexConnection({ + controller_alias: controllerAlias.trim(), + alias: trimmedAlias, + type: runtimeOption.replace("codex_", ""), + model: model.trim(), + ...(runtimeOption === "codex_api" ? { baseUrl: trimmedBase, apiKey: trimmedKey } : {}), + ...(runtimeOption === "codex_remote_ssh" ? { + ssh: { + host: sshHost.trim(), + port: Number(sshPort), + username: sshUsername.trim(), + ...(sshAuth === "password" ? { password: sshPassword } : { + privateKey: sshPrivateKey, + ...(sshPassphrase ? { passphrase: sshPassphrase } : {}), + }), + workspace: sshWorkspace.trim() || ".", + codexBin: sshCodexBin.trim() || "codex", + ...(sshFingerprint.trim() ? { hostFingerprint: sshFingerprint.trim() } : {}), + }, + } : {}), + }) + : await createRuntimeHarness({ + alias: trimmedAlias, + api_spec: apiSpec, + api_base: trimmedBase, + api_key: trimmedKey, + }); onCreated(next ?? []); reset(); onClose(); @@ -287,7 +371,7 @@ function AddHarnessModal({ if (!isOpen) onClose(); }} > - + {template ? `Add ${template.name} Runtime` : "New Runtime"} @@ -329,29 +413,64 @@ function AddHarnessModal({ -
- - setApiBase(event.target.value)} - className="font-mono text-xs" - /> -
-
- -
- - setApiKey(event.target.value)} - className="pl-8 font-mono text-xs" - /> + {runtimeOption.startsWith("codex_") && ( + <> +
+ + +

One bridge service can host multiple isolated Codex connections.

+
+
+ + setModel(event.target.value)} className="font-mono text-xs" /> +
+ + )} + {(runtimeOption === "codex_api" || !runtimeOption.startsWith("codex_")) && ( + <> +
+ + setApiBase(event.target.value)} className="font-mono text-xs" /> +
+
+ +
+ + setApiKey(event.target.value)} className="pl-8 font-mono text-xs" /> +
+
+ + )} + {runtimeOption === "codex_chatgpt" && ( +
+ After creation, expand the runtime and choose Sign in with ChatGPT. The portal will show a device code; no OpenAI API key is needed.
-
+ )} + {runtimeOption === "codex_remote_ssh" && ( +
+
+
setSshHost(event.target.value)} />
+
setSshPort(event.target.value)} />
+
+
setSshUsername(event.target.value)} />
+
+ {sshAuth === "password" ? ( +
setSshPassword(event.target.value)} />
+ ) : ( + <>