diff --git a/models/orcarouter/.difyignore b/models/orcarouter/.difyignore
new file mode 100644
index 000000000..af6c7c786
--- /dev/null
+++ b/models/orcarouter/.difyignore
@@ -0,0 +1,7 @@
+.venv/
+__pycache__/
+*.py[cod]
+.pytest_cache/
+.ruff_cache/
+.env
+*.difypkg
diff --git a/models/orcarouter/.env.example b/models/orcarouter/.env.example
new file mode 100644
index 000000000..c9d5a2594
--- /dev/null
+++ b/models/orcarouter/.env.example
@@ -0,0 +1,3 @@
+INSTALL_METHOD=remote
+REMOTE_INSTALL_URL=debug-plugin.dify.dev:5003
+REMOTE_INSTALL_KEY=********-****-****-****-************
diff --git a/models/orcarouter/.python-version b/models/orcarouter/.python-version
new file mode 100644
index 000000000..e4fba2183
--- /dev/null
+++ b/models/orcarouter/.python-version
@@ -0,0 +1 @@
+3.12
diff --git a/models/orcarouter/README.md b/models/orcarouter/README.md
new file mode 100644
index 000000000..548293a56
--- /dev/null
+++ b/models/orcarouter/README.md
@@ -0,0 +1,54 @@
+# Overview
+
+OrcaRouter is an **OpenAI-compatible LLM gateway** that routes requests across 40+ upstream providers (OpenAI, Anthropic, Google, DeepSeek, Qwen, Grok, and more) to the cheapest or fastest path that can serve the model you asked for. Users pay **below list price**, and the dashboard tracks how much they save in real time.
+
+# Configuration
+
+After installation, sign up at [orcarouter.ai](https://www.orcarouter.ai), grab an API key from the [console](https://www.orcarouter.ai/console), and set it up under **Settings → Model Provider** in Dify.
+
+# Adaptive routing — `orcarouter/auto`
+
+The `orcarouter/auto` model is a virtual router that picks the best upstream per request. Configure its strategy from the [routing console](https://www.orcarouter.ai/console/routing). Available strategies:
+
+| Strategy | Behavior |
+|---|---|
+| `cheapest` | Lowest-priced upstream that can serve the request (default) |
+| `balanced` | Trades off price vs latency vs quality |
+| `quality` | Highest-quality upstream |
+| `adaptive` | Linear contextual bandit picks among candidates based on per-request features (prompt length, code/math/JSON density, declared `max_tokens` budget tier, MinHash-LSH similarity to recent traffic) |
+| `gated_adaptive` | Layers a task-difficulty score on top of `adaptive` — mundane prompts restricted to a "weak" model pool, hard prompts to a "strong" pool |
+
+**Why this matters**
+
+- **Self-tuning** — adaptive strategies learn from your own traffic; performance shifts when workload changes
+- **Microsecond overhead** — feature extraction and bandit are closed-form math; routing adds no measurable latency
+- **Workload-aware in one call** — same `orcarouter/auto` endpoint serves cheap summarization and premium code-refactor requests with no client-side dispatch logic
+- **Cost & reliability guardrails by construction** — reward explicitly penalizes cost, latency, rate-limit, and format failures
+- **Admin-tunable without redeploys** — strategies, pools, thresholds, and reward weights are changed from console, not client code
+
+# Fallback routing (`extra_body`)
+
+OrcaRouter supports an OpenAI-compatible extension to specify per-request fallback models. Use the **`Fallback models`** and **`Routing mode`** parameters in the model node:
+
+| Parameter | Example | Effect |
+|---|---|---|
+| `Fallback models` (string, JSON array) | `["openai/gpt-4o-mini", "openai/gpt-4o"]` | If the primary upstream fails, try these in order |
+| `Routing mode` | `fallback` | Activate the fallback list above |
+
+These are translated to the request body's `extra_body: {models, route}` key — see the [API reference](https://docs.orcarouter.ai).
+
+# Reasoning models
+
+Some models (OpenAI `o1`/`o3`/`gpt-5`, Anthropic `claude-opus-4.7`, DeepSeek `deepseek-reasoner`/`deepseek-r1`) expose reasoning controls:
+
+- **OpenAI o-style**: `reasoning_effort` (high / medium / low / minimal), `verbosity`, `exclude_reasoning_tokens`
+- **Anthropic thinking**: `enable_thinking`, `reasoning_budget` (token budget), `exclude_reasoning_tokens`
+- **DeepSeek r-style**: `exclude_reasoning_tokens` (the model reasons by default)
+
+These map onto the upstream provider's native reasoning protocol — OrcaRouter handles the translation.
+
+Reasoning models do not accept `temperature`. The Dify UI will show `temperature` only for non-reasoning models.
+
+# Pricing
+
+All prices are configured at the per-model level in this plugin and reflect the **effective price you pay through OrcaRouter** (which may be below the upstream's list price). See the live [models page](https://www.orcarouter.ai/models) or `GET https://www.orcarouter.ai/api/pricing` for the authoritative source.
diff --git a/models/orcarouter/_assets/orcarouter.svg b/models/orcarouter/_assets/orcarouter.svg
new file mode 100644
index 000000000..90683a36b
--- /dev/null
+++ b/models/orcarouter/_assets/orcarouter.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/models/orcarouter/_assets/orcarouter_square.svg b/models/orcarouter/_assets/orcarouter_square.svg
new file mode 100644
index 000000000..90683a36b
--- /dev/null
+++ b/models/orcarouter/_assets/orcarouter_square.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/models/orcarouter/main.py b/models/orcarouter/main.py
new file mode 100644
index 000000000..568839f52
--- /dev/null
+++ b/models/orcarouter/main.py
@@ -0,0 +1,6 @@
+from dify_plugin import Plugin, DifyPluginEnv
+
+plugin = Plugin(DifyPluginEnv(MAX_REQUEST_TIMEOUT=120))
+
+if __name__ == "__main__":
+ plugin.run()
diff --git a/models/orcarouter/manifest.yaml b/models/orcarouter/manifest.yaml
new file mode 100644
index 000000000..12d19d8d9
--- /dev/null
+++ b/models/orcarouter/manifest.yaml
@@ -0,0 +1,30 @@
+meta:
+ arch:
+ - amd64
+ - arm64
+ runner:
+ entrypoint: main
+ language: python
+ version: "3.12"
+ version: 0.0.1
+name: orcarouter
+author: langgenius
+icon: orcarouter_square.svg
+description:
+ en_US: OrcaRouter is an OpenAI-compatible LLM gateway that routes requests across 40+ upstream providers (OpenAI, Anthropic, Google, DeepSeek, Qwen, Grok, and more) to the cheapest or fastest path, with adaptive routing, fallback chains, and pay-below-list-price billing.
+ zh_Hans: OrcaRouter 是兼容 OpenAI 协议的 LLM 网关,跨 40+ 上游 provider(OpenAI、Anthropic、Google、DeepSeek、Qwen、Grok 等)按最便宜或最快路径分发请求,内置自适应路由、降级链与低于官方价计费。
+ ja_JP: OrcaRouter は OpenAI 互換の LLM ゲートウェイで、40 以上の上流プロバイダー(OpenAI、Anthropic、Google、DeepSeek、Qwen、Grok など)への最安または最速のパスへリクエストをルーティングします。アダプティブルーティング、フォールバックチェーン、表示価格以下の課金を内蔵。
+ pt_BR: OrcaRouter é um gateway LLM compatível com OpenAI que roteia solicitações entre mais de 40 provedores upstream (OpenAI, Anthropic, Google, DeepSeek, Qwen, Grok e outros) pelo caminho mais barato ou mais rápido, com roteamento adaptativo, cadeias de fallback e preços abaixo da tabela.
+label:
+ en_US: OrcaRouter
+resource:
+ memory: 268435456
+ permission:
+ model:
+ enabled: false
+type: plugin
+plugins:
+ models:
+ - provider/orcarouter.yaml
+version: 0.0.1
+created_at: 2026-05-14T19:20:00.000000000-04:00
diff --git a/models/orcarouter/models/_endpoint_utils.py b/models/orcarouter/models/_endpoint_utils.py
new file mode 100644
index 000000000..6d367e840
--- /dev/null
+++ b/models/orcarouter/models/_endpoint_utils.py
@@ -0,0 +1,13 @@
+DEFAULT_ENDPOINT_URL = "https://api.orcarouter.ai/v1"
+
+
+def normalize_endpoint_url(credentials: dict) -> str:
+ """Resolve and normalize the API endpoint URL from credentials.
+
+ Strips leading/trailing whitespace and trailing slashes from the URL.
+ Falls back to DEFAULT_ENDPOINT_URL when the value is missing or blank.
+ """
+ endpoint_url = (
+ (credentials.get("endpoint_url") or DEFAULT_ENDPOINT_URL).strip().rstrip("/")
+ )
+ return endpoint_url or DEFAULT_ENDPOINT_URL
diff --git a/models/orcarouter/models/llm/__init__.py b/models/orcarouter/models/llm/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/models/orcarouter/models/llm/_position.yaml b/models/orcarouter/models/llm/_position.yaml
new file mode 100644
index 000000000..7c494901f
--- /dev/null
+++ b/models/orcarouter/models/llm/_position.yaml
@@ -0,0 +1,107 @@
+- orcarouter/auto
+- openai/gpt-5.5-2026-04-23
+- openai/gpt-3.5-turbo-1106
+- openai/gpt-4.1-mini-2025-04-14
+- qwen/qwen3-vl-235b-a22b-thinking
+- qwen/qwen3.6-plus
+- z-ai/glm-5
+- openai/gpt-3.5-turbo-0125
+- openai/gpt-4o-mini-search-preview-2025-03-11
+- openai/gpt-5-chat-latest
+- openai/gpt-5.4-mini-2026-03-17
+- z-ai/glm-4.5
+- kimi/kimi-k2.6
+- openai/gpt-5.2-2025-12-11
+- qwen/qwen3-vl-235b-a22b-instruct
+- openai/gpt-4-0613
+- openai/gpt-5.4-mini
+- openai/gpt-5.4-nano-2026-03-17
+- z-ai/glm-4.6
+- minimax/minimax-m2.7-highspeed
+- openai/gpt-4-turbo-2024-04-09
+- openai/gpt-4.1
+- google/gemini-3-pro-preview
+- openai/gpt-4o-2024-05-13
+- openai/gpt-5.2-chat-latest
+- qwen/qwen3.5-27b
+- anthropic/claude-opus-4.7
+- openai/gpt-4.1-nano
+- openai/gpt-5.1
+- google/gemini-2.5-flash-lite
+- google/gemini-2.5-pro
+- google/gemini-flash-latest
+- openai/gpt-3.5-turbo
+- openai/gpt-5-nano
+- qwen/qwen3.6-flash
+- openai/gpt-4o-2024-11-20
+- openai/gpt-5
+- google/gemini-3.1-flash-lite-preview
+- minimax/minimax-m2.7
+- anthropic/claude-opus-4.5
+- google/gemma-4-31b-it
+- openai/gpt-4o-mini-search-preview
+- openai/gpt-5-2025-08-07
+- openai/gpt-5.1-chat-latest
+- qwen/qwen3.5-plus-2026-02-15
+- google/gemini-robotics-er-1.6-preview
+- openai/gpt-3.5-turbo-16k
+- openai/gpt-4o-mini-2024-07-18
+- openai/gpt-5.4-nano
+- openai/gpt-4o-2024-08-06
+- openai/gpt-5.2
+- qwen/qwen3-max
+- anthropic/claude-opus-4
+- google/gemini-pro-latest
+- openai/gpt-4-turbo
+- qwen/qwen3-vl-8b-instruct
+- qwen/qwen3.5-flash
+- z-ai/glm-5.1
+- openai/gpt-4.1-2025-04-14
+- openai/gpt-4.1-mini
+- openai/gpt-5-mini
+- qwen/qwen3-max-preview
+- anthropic/claude-opus-4.1
+- anthropic/claude-sonnet-4.5
+- deepseek/deepseek-v4-flash
+- qwen/qwen3.6-plus-2026-04-02
+- anthropic/claude-sonnet-4.6
+- minimax/minimax-m2.5
+- openai/gpt-5-search-api-2025-10-14
+- qwen/qwen3.5-plus
+- qwen/qwen3.6-35b-a3b
+- deepseek/deepseek-chat
+- google/gemini-flash-lite-latest
+- google/gemini-2.5-flash
+- google/gemini-3-flash-preview
+- openai/gpt-4.1-nano-2025-04-14
+- qwen/qwen3.6-flash-2026-04-16
+- minimax/minimax-m2.5-highspeed
+- qwen/qwen3-vl-8b-thinking
+- anthropic/claude-haiku-4.5
+- kimi/kimi-k2.5
+- openai/gpt-5.5
+- qwen/qwen3.5-397b-a17b
+- anthropic/claude-sonnet-4
+- google/gemini-3.1-pro-preview-customtools
+- openai/gpt-5.4-2026-03-05
+- deepseek/deepseek-reasoner
+- deepseek/deepseek-v4-pro
+- openai/gpt-4o-search-preview
+- openai/gpt-5.4
+- z-ai/glm-4.7
+- openai/gpt-4o-search-preview-2025-03-11
+- qwen/qwen3.5-122b-a10b
+- google/gemma-4-26b-a4b-it
+- qwen/qwen3.5-35b-a3b
+- z-ai/glm-4.5-air
+- google/gemini-3.1-pro-preview
+- openai/gpt-5.1-2025-11-13
+- anthropic/claude-opus-4.6
+- openai/gpt-4
+- openai/gpt-5-mini-2025-08-07
+- openai/gpt-5-nano-2025-08-07
+- openai/gpt-5-search-api
+- openai/gpt-5.3-chat-latest
+- openai/gpt-4o-mini
+- qwen/qwen3.5-flash-2026-02-23
+- openai/gpt-4o
diff --git a/models/orcarouter/models/llm/anthropic-claude-haiku-4.5.yaml b/models/orcarouter/models/llm/anthropic-claude-haiku-4.5.yaml
new file mode 100644
index 000000000..c1bec92f9
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-haiku-4.5.yaml
@@ -0,0 +1,97 @@
+# https://www.orcarouter.ai/models/anthropic/claude-haiku-4.5
+model: anthropic/claude-haiku-4.5
+label:
+ en_US: claude-haiku-4.5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 64000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 64000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.0"
+ output: "5.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-opus-4.1.yaml b/models/orcarouter/models/llm/anthropic-claude-opus-4.1.yaml
new file mode 100644
index 000000000..a4c8e7e06
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-opus-4.1.yaml
@@ -0,0 +1,97 @@
+# https://www.orcarouter.ai/models/anthropic/claude-opus-4.1
+model: anthropic/claude-opus-4.1
+label:
+ en_US: claude-opus-4.1
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 32000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "15.0"
+ output: "75.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-opus-4.5.yaml b/models/orcarouter/models/llm/anthropic-claude-opus-4.5.yaml
new file mode 100644
index 000000000..0a48be03e
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-opus-4.5.yaml
@@ -0,0 +1,97 @@
+# https://www.orcarouter.ai/models/anthropic/claude-opus-4.5
+model: anthropic/claude-opus-4.5
+label:
+ en_US: claude-opus-4.5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 64000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 64000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "5.0"
+ output: "25.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-opus-4.6.yaml b/models/orcarouter/models/llm/anthropic-claude-opus-4.6.yaml
new file mode 100644
index 000000000..8d4dd3df9
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-opus-4.6.yaml
@@ -0,0 +1,97 @@
+# https://www.orcarouter.ai/models/anthropic/claude-opus-4.6
+model: anthropic/claude-opus-4.6
+label:
+ en_US: claude-opus-4.6
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1000000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 128000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "5.0"
+ output: "25.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-opus-4.7.yaml b/models/orcarouter/models/llm/anthropic-claude-opus-4.7.yaml
new file mode 100644
index 000000000..8e345af70
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-opus-4.7.yaml
@@ -0,0 +1,86 @@
+# https://www.orcarouter.ai/models/anthropic/claude-opus-4.7
+model: anthropic/claude-opus-4.7
+label:
+ en_US: claude-opus-4.7
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1000000
+parameter_rules:
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 128000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "5.0"
+ output: "25.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-opus-4.yaml b/models/orcarouter/models/llm/anthropic-claude-opus-4.yaml
new file mode 100644
index 000000000..93b948f9a
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-opus-4.yaml
@@ -0,0 +1,88 @@
+# https://www.orcarouter.ai/models/anthropic/claude-opus-4
+model: anthropic/claude-opus-4
+label:
+ en_US: claude-opus-4
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32000
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 32000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "15.0"
+ output: "75.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-sonnet-4.5.yaml b/models/orcarouter/models/llm/anthropic-claude-sonnet-4.5.yaml
new file mode 100644
index 000000000..6c42bc1ba
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-sonnet-4.5.yaml
@@ -0,0 +1,97 @@
+# https://www.orcarouter.ai/models/anthropic/claude-sonnet-4.5
+model: anthropic/claude-sonnet-4.5
+label:
+ en_US: claude-sonnet-4.5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1000000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 64000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 64000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "3.0"
+ output: "15.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-sonnet-4.6.yaml b/models/orcarouter/models/llm/anthropic-claude-sonnet-4.6.yaml
new file mode 100644
index 000000000..e46a91edd
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-sonnet-4.6.yaml
@@ -0,0 +1,97 @@
+# https://www.orcarouter.ai/models/anthropic/claude-sonnet-4.6
+model: anthropic/claude-sonnet-4.6
+label:
+ en_US: claude-sonnet-4.6
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1000000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 128000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "3.0"
+ output: "15.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/anthropic-claude-sonnet-4.yaml b/models/orcarouter/models/llm/anthropic-claude-sonnet-4.yaml
new file mode 100644
index 000000000..ee2077053
--- /dev/null
+++ b/models/orcarouter/models/llm/anthropic-claude-sonnet-4.yaml
@@ -0,0 +1,88 @@
+# https://www.orcarouter.ai/models/anthropic/claude-sonnet-4
+model: anthropic/claude-sonnet-4
+label:
+ en_US: claude-sonnet-4
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1000000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 64000
+ - name: enable_thinking
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 推理模式
+ en_US: Thinking Mode
+ help:
+ zh_Hans: 启用 Anthropic native thinking 模式;启用时输出会包含思考过程。
+ en_US: Enable Anthropic native thinking. When enabled, the output includes reasoning content.
+ - name: reasoning_budget
+ type: int
+ required: false
+ default: 2000
+ min: 1024
+ max: 64000
+ label:
+ en_US: Thinking Budget
+ zh_Hans: 推理预算
+ help:
+ en_US: Token budget for thinking (min 1024, must be less than max_tokens). Only valid when thinking is enabled.
+ zh_Hans: 推理 token 预算(最小 1024,必须小于 max_tokens)。仅 thinking 模式生效。
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "3.0"
+ output: "15.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/deepseek-deepseek-chat.yaml b/models/orcarouter/models/llm/deepseek-deepseek-chat.yaml
new file mode 100644
index 000000000..7a2ea4666
--- /dev/null
+++ b/models/orcarouter/models/llm/deepseek-deepseek-chat.yaml
@@ -0,0 +1,70 @@
+# https://www.orcarouter.ai/models/deepseek/deepseek-chat
+model: deepseek/deepseek-chat
+label:
+ en_US: deepseek-chat
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 163840
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.14"
+ output: "0.28"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/deepseek-deepseek-reasoner.yaml b/models/orcarouter/models/llm/deepseek-deepseek-reasoner.yaml
new file mode 100644
index 000000000..8f767dd1a
--- /dev/null
+++ b/models/orcarouter/models/llm/deepseek-deepseek-reasoner.yaml
@@ -0,0 +1,57 @@
+# https://www.orcarouter.ai/models/deepseek/deepseek-reasoner
+model: deepseek/deepseek-reasoner
+label:
+ en_US: deepseek-reasoner
+model_type: llm
+features:
+ - agent-thought
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.435"
+ output: "0.87"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/deepseek-deepseek-v4-flash.yaml b/models/orcarouter/models/llm/deepseek-deepseek-v4-flash.yaml
new file mode 100644
index 000000000..d611a4b30
--- /dev/null
+++ b/models/orcarouter/models/llm/deepseek-deepseek-v4-flash.yaml
@@ -0,0 +1,91 @@
+# https://www.orcarouter.ai/models/deepseek/deepseek-v4-flash
+model: deepseek/deepseek-v4-flash
+label:
+ en_US: deepseek-v4-flash
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.19"
+ output: "0.37"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/deepseek-deepseek-v4-pro.yaml b/models/orcarouter/models/llm/deepseek-deepseek-v4-pro.yaml
new file mode 100644
index 000000000..42223bb8d
--- /dev/null
+++ b/models/orcarouter/models/llm/deepseek-deepseek-v4-pro.yaml
@@ -0,0 +1,91 @@
+# https://www.orcarouter.ai/models/deepseek/deepseek-v4-pro
+model: deepseek/deepseek-v4-pro
+label:
+ en_US: deepseek-v4-pro
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.56"
+ output: "1.12"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-2.5-flash-lite.yaml b/models/orcarouter/models/llm/google-gemini-2.5-flash-lite.yaml
new file mode 100644
index 000000000..64e6c6eea
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-2.5-flash-lite.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-2.5-flash-lite
+model: google/gemini-2.5-flash-lite
+label:
+ en_US: gemini-2.5-flash-lite
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65535
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.1"
+ output: "0.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-2.5-flash.yaml b/models/orcarouter/models/llm/google-gemini-2.5-flash.yaml
new file mode 100644
index 000000000..8f1bdd0fe
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-2.5-flash.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-2.5-flash
+model: google/gemini-2.5-flash
+label:
+ en_US: gemini-2.5-flash
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65535
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.3"
+ output: "2.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-2.5-pro.yaml b/models/orcarouter/models/llm/google-gemini-2.5-pro.yaml
new file mode 100644
index 000000000..9b486af58
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-2.5-pro.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-2.5-pro
+model: google/gemini-2.5-pro
+label:
+ en_US: gemini-2.5-pro
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.5"
+ output: "15.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-3-flash-preview.yaml b/models/orcarouter/models/llm/google-gemini-3-flash-preview.yaml
new file mode 100644
index 000000000..601317b74
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-3-flash-preview.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-3-flash-preview
+model: google/gemini-3-flash-preview
+label:
+ en_US: gemini-3-flash-preview
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.5"
+ output: "3.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-3-pro-preview.yaml b/models/orcarouter/models/llm/google-gemini-3-pro-preview.yaml
new file mode 100644
index 000000000..31e8c9913
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-3-pro-preview.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-3-pro-preview
+model: google/gemini-3-pro-preview
+label:
+ en_US: gemini-3-pro-preview
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "4.0"
+ output: "18.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-3.1-flash-lite-preview.yaml b/models/orcarouter/models/llm/google-gemini-3.1-flash-lite-preview.yaml
new file mode 100644
index 000000000..d0fe5457b
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-3.1-flash-lite-preview.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-3.1-flash-lite-preview
+model: google/gemini-3.1-flash-lite-preview
+label:
+ en_US: gemini-3.1-flash-lite-preview
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.25"
+ output: "1.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-3.1-pro-preview-customtools.yaml b/models/orcarouter/models/llm/google-gemini-3.1-pro-preview-customtools.yaml
new file mode 100644
index 000000000..7efe61ab7
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-3.1-pro-preview-customtools.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-3.1-pro-preview-customtools
+model: google/gemini-3.1-pro-preview-customtools
+label:
+ en_US: gemini-3.1-pro-preview-customtools
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "4.0"
+ output: "18.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-3.1-pro-preview.yaml b/models/orcarouter/models/llm/google-gemini-3.1-pro-preview.yaml
new file mode 100644
index 000000000..61105887b
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-3.1-pro-preview.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-3.1-pro-preview
+model: google/gemini-3.1-pro-preview
+label:
+ en_US: gemini-3.1-pro-preview
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "4.0"
+ output: "18.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-flash-latest.yaml b/models/orcarouter/models/llm/google-gemini-flash-latest.yaml
new file mode 100644
index 000000000..fe362eccb
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-flash-latest.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-flash-latest
+model: google/gemini-flash-latest
+label:
+ en_US: gemini-flash-latest
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.5"
+ output: "3.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-flash-lite-latest.yaml b/models/orcarouter/models/llm/google-gemini-flash-lite-latest.yaml
new file mode 100644
index 000000000..1589bff15
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-flash-lite-latest.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-flash-lite-latest
+model: google/gemini-flash-lite-latest
+label:
+ en_US: gemini-flash-lite-latest
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.25"
+ output: "1.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-pro-latest.yaml b/models/orcarouter/models/llm/google-gemini-pro-latest.yaml
new file mode 100644
index 000000000..d42c756cd
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-pro-latest.yaml
@@ -0,0 +1,80 @@
+# https://www.orcarouter.ai/models/google/gemini-pro-latest
+model: google/gemini-pro-latest
+label:
+ en_US: gemini-pro-latest
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "4.0"
+ output: "18.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemini-robotics-er-1.6-preview.yaml b/models/orcarouter/models/llm/google-gemini-robotics-er-1.6-preview.yaml
new file mode 100644
index 000000000..27a3f2231
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemini-robotics-er-1.6-preview.yaml
@@ -0,0 +1,79 @@
+# https://www.orcarouter.ai/models/google/gemini-robotics-er-1.6-preview
+model: google/gemini-robotics-er-1.6-preview
+label:
+ en_US: gemini-robotics-er-1.6-preview
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.0"
+ output: "5.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemma-4-26b-a4b-it.yaml b/models/orcarouter/models/llm/google-gemma-4-26b-a4b-it.yaml
new file mode 100644
index 000000000..1618dc48f
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemma-4-26b-a4b-it.yaml
@@ -0,0 +1,92 @@
+# https://www.orcarouter.ai/models/google/gemma-4-26b-a4b-it
+model: google/gemma-4-26b-a4b-it
+label:
+ en_US: gemma-4-26b-a4b-it
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 262144
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ label:
+ zh_Hans: 取样数量
+ en_US: Top k
+ type: int
+ required: false
+ help:
+ zh_Hans: 仅从每个后续标记的前 K 个选项中采样。
+ en_US: Only sample from the top K options for each subsequent token.
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.06"
+ output: "0.33"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/google-gemma-4-31b-it.yaml b/models/orcarouter/models/llm/google-gemma-4-31b-it.yaml
new file mode 100644
index 000000000..37ce232d6
--- /dev/null
+++ b/models/orcarouter/models/llm/google-gemma-4-31b-it.yaml
@@ -0,0 +1,48 @@
+# https://www.orcarouter.ai/models/google/gemma-4-31b-it
+model: google/gemma-4-31b-it
+label:
+ en_US: gemma-4-31b-it
+model_type: llm
+features:
+ - agent-thought
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.13"
+ output: "0.38"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/kimi-kimi-k2.5.yaml b/models/orcarouter/models/llm/kimi-kimi-k2.5.yaml
new file mode 100644
index 000000000..5883f0d64
--- /dev/null
+++ b/models/orcarouter/models/llm/kimi-kimi-k2.5.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/kimi/kimi-k2.5
+model: kimi/kimi-k2.5
+label:
+ en_US: kimi-k2.5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 262144
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.6"
+ output: "3.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/kimi-kimi-k2.6.yaml b/models/orcarouter/models/llm/kimi-kimi-k2.6.yaml
new file mode 100644
index 000000000..90b99c789
--- /dev/null
+++ b/models/orcarouter/models/llm/kimi-kimi-k2.6.yaml
@@ -0,0 +1,103 @@
+# https://www.orcarouter.ai/models/kimi/kimi-k2.6
+model: kimi/kimi-k2.6
+label:
+ en_US: kimi-k2.6
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 262144
+parameter_rules:
+ - name: temperature
+ type: float
+ required: false
+ default: 1
+ min: 1
+ max: 1
+ label:
+ en_US: Temperature
+ zh_Hans: 温度
+ help:
+ en_US: This upstream only accepts temperature=1.
+ zh_Hans: 此上游模型仅接受 temperature=1。
+ - name: top_p
+ type: float
+ required: false
+ default: 0.95
+ min: 0.95
+ max: 0.95
+ label:
+ en_US: Top P
+ zh_Hans: Top P
+ help:
+ en_US: This upstream only accepts top_p=0.95.
+ zh_Hans: 此上游模型仅接受 top_p=0.95。
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.95"
+ output: "4.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/llm.py b/models/orcarouter/models/llm/llm.py
new file mode 100644
index 000000000..501809fa0
--- /dev/null
+++ b/models/orcarouter/models/llm/llm.py
@@ -0,0 +1,418 @@
+import codecs
+import json
+from collections.abc import Generator
+from typing import Optional, Union, Any
+
+import requests
+from dify_plugin import OAICompatLargeLanguageModel
+from dify_plugin.entities.model import AIModelEntity, ModelFeature
+from dify_plugin.entities.model.llm import (
+ LLMResult,
+ LLMResultChunk,
+ LLMResultChunkDelta,
+ LLMMode,
+)
+from dify_plugin.entities.model.message import (
+ PromptMessage,
+ PromptMessageTool,
+ UserPromptMessage,
+ TextPromptMessageContent,
+ ImagePromptMessageContent,
+ PromptMessageContentType,
+ AssistantPromptMessage,
+)
+from dify_plugin.interfaces.model.openai_compatible.llm import _increase_tool_call
+from pydantic import TypeAdapter, ValidationError
+
+from models._endpoint_utils import normalize_endpoint_url
+
+
+class OrcaRouterLargeLanguageModel(OAICompatLargeLanguageModel):
+ def _update_credential(self, model: str, credentials: dict):
+ credentials["endpoint_url"] = normalize_endpoint_url(credentials)
+ credentials["mode"] = self.get_model_mode(model).value
+ schema = self.get_model_schema(model, credentials)
+ if schema and {
+ ModelFeature.TOOL_CALL,
+ ModelFeature.MULTI_TOOL_CALL,
+ }.intersection(schema.features or []):
+ credentials["function_calling_type"] = "tool_call"
+
+ def _convert_files_to_text(
+ self, messages: list[PromptMessage]
+ ) -> list[PromptMessage]:
+ """Convert any file content in messages to text descriptions for non-vision models."""
+ converted_messages = []
+ for message in messages:
+ if isinstance(message, UserPromptMessage) and isinstance(
+ message.content, list
+ ):
+ text_parts = []
+ for content in message.content:
+ if isinstance(content, TextPromptMessageContent):
+ text_parts.append(content.data)
+ elif isinstance(content, ImagePromptMessageContent):
+ if hasattr(content, "url") and content.url:
+ text_parts.append(f"[Image file uploaded]: {content.url}")
+ else:
+ text_parts.append("[Image file uploaded]")
+ elif (
+ hasattr(content, "type")
+ and content.type == PromptMessageContentType.DOCUMENT
+ ):
+ if hasattr(content, "url") and content.url:
+ text_parts.append(
+ f"[Document file uploaded]: {content.url}"
+ )
+ else:
+ text_parts.append("[Document file uploaded]")
+ else:
+ if hasattr(content, "url"):
+ text_parts.append(f"[File uploaded]: {content.url}")
+ else:
+ text_parts.append(str(content))
+ converted_messages.append(UserPromptMessage(content=" ".join(text_parts)))
+ else:
+ converted_messages.append(message)
+ return converted_messages
+
+ @staticmethod
+ def _set_orca_extra_body(model_parameters: dict):
+ """Wrap OrcaRouter fallback routing params into the request's `extra_body` key.
+
+ OrcaRouter server expects `extra_body: {"models": [...], "route": "fallback"}`
+ in the request JSON body. The server parses it then strips it before
+ forwarding upstream, so strict providers (OpenAI etc.) don't see the
+ non-standard field. Reference: OrcaRouter-O2 middleware/distributor.go
+ """
+ fallback_models_str = model_parameters.pop("orcarouter_fallback_models", None)
+ route = model_parameters.pop("orcarouter_route", None)
+
+ extra_body = model_parameters.get("extra_body") or {}
+ if not isinstance(extra_body, dict):
+ extra_body = {}
+
+ if isinstance(fallback_models_str, str) and fallback_models_str.strip():
+ try:
+ parsed = json.loads(fallback_models_str)
+ if isinstance(parsed, list):
+ extra_body["models"] = [str(m) for m in parsed if m]
+ except (json.JSONDecodeError, TypeError):
+ pass
+
+ if isinstance(route, str) and route in {"fallback"}:
+ extra_body["route"] = route
+
+ if extra_body:
+ model_parameters["extra_body"] = extra_body
+
+ @staticmethod
+ def _set_reasoning_params(model: str, model_parameters: dict):
+ """Translate Dify-facing reasoning params to upstream-native fields.
+
+ OrcaRouter forwards requests to upstream providers, so we emit each
+ provider's native reasoning protocol:
+
+ OpenAI o-series / gpt-5: flat `reasoning_effort`
+ Anthropic claude with thinking: nested `thinking: {type, budget_tokens}`
+ DeepSeek r1 / reasoner: no controls (auto)
+ Others (Gemini, Grok, Qwen, Kimi): flat `reasoning_effort` (best-effort)
+
+ `include_reasoning` (the inverse of exclude_reasoning_tokens) controls
+ whether the upstream returns reasoning content in the response stream.
+ """
+ reasoning_budget = model_parameters.pop("reasoning_budget", None)
+ enable_thinking = model_parameters.pop("enable_thinking", None)
+ reasoning_effort = model_parameters.pop("reasoning_effort", None)
+ exclude_reasoning_tokens = model_parameters.pop(
+ "exclude_reasoning_tokens", None
+ )
+
+ is_anthropic = model.lower().startswith("anthropic/")
+
+ # OpenAI / Gemini / Grok / Qwen / Kimi: flat reasoning_effort
+ if not is_anthropic and isinstance(reasoning_effort, str) and reasoning_effort in (
+ "high",
+ "medium",
+ "low",
+ "minimal",
+ ):
+ model_parameters["reasoning_effort"] = reasoning_effort
+
+ # Anthropic: nested thinking block (native API)
+ if is_anthropic:
+ thinking_enabled = (
+ enable_thinking is True
+ or (isinstance(enable_thinking, str) and enable_thinking)
+ )
+ if thinking_enabled:
+ thinking_block: dict[str, Any] = {"type": "enabled"}
+ if isinstance(reasoning_budget, int) and reasoning_budget >= 1024:
+ thinking_block["budget_tokens"] = reasoning_budget
+ model_parameters["thinking"] = thinking_block
+
+ # include_reasoning: hint to upstream/router to surface reasoning content
+ if isinstance(exclude_reasoning_tokens, bool):
+ model_parameters["include_reasoning"] = not exclude_reasoning_tokens
+
+ @staticmethod
+ def _set_verbosity_params(model_parameters: dict):
+ """Pass through `verbosity` for OpenAI-style models that support it."""
+ verbosity = model_parameters.pop("verbosity", None)
+ if isinstance(verbosity, str) and verbosity in ["low", "medium", "high"]:
+ model_parameters["verbosity"] = verbosity
+
+ @staticmethod
+ def _set_json_schema_params(model_parameters: dict):
+ response_format = model_parameters.get("response_format")
+ if response_format and response_format == "json_schema":
+ json_schema_str = model_parameters.get("json_schema")
+ if json_schema_str:
+ json_schema = json.loads(json_schema_str)
+ schema = (
+ json_schema.get("schema")
+ if "schema" in json_schema
+ else json_schema
+ )
+ model_parameters["json_schema"] = json.dumps(
+ {"name": "output", "schema": schema}
+ )
+
+ def _invoke(
+ self,
+ model: str,
+ credentials: dict,
+ prompt_messages: list[PromptMessage],
+ model_parameters: dict,
+ tools: Optional[list[PromptMessageTool]] = None,
+ stop: Optional[list[str]] = None,
+ stream: bool = True,
+ user: Optional[str] = None,
+ ) -> Union[LLMResult, Generator]:
+ self._update_credential(model, credentials)
+
+ model_schema = self.get_model_schema(model, credentials)
+ if not (model_schema and ModelFeature.VISION in (model_schema.features or [])):
+ prompt_messages = self._convert_files_to_text(prompt_messages)
+
+ self._set_reasoning_params(model, model_parameters)
+ self._set_verbosity_params(model_parameters)
+ self._set_json_schema_params(model_parameters)
+ self._set_orca_extra_body(model_parameters)
+
+ return self._generate(
+ model,
+ credentials,
+ prompt_messages,
+ model_parameters,
+ tools,
+ stop,
+ stream,
+ user,
+ )
+
+ def validate_credentials(self, model: str, credentials: dict) -> None:
+ self._update_credential(model, credentials)
+ return super().validate_credentials(model, credentials)
+
+ def _generate(
+ self,
+ model: str,
+ credentials: dict,
+ prompt_messages: list[PromptMessage],
+ model_parameters: dict,
+ tools: Optional[list[PromptMessageTool]] = None,
+ stop: Optional[list[str]] = None,
+ stream: bool = True,
+ user: Optional[str] = None,
+ ) -> Union[LLMResult, Generator]:
+ self._update_credential(model, credentials)
+ return super()._generate(
+ model,
+ credentials,
+ prompt_messages,
+ model_parameters,
+ tools,
+ stop,
+ stream,
+ user,
+ )
+
+ def _wrap_thinking_by_reasoning_content(
+ self, delta: dict, is_reasoning: bool
+ ) -> tuple[str, bool]:
+ """Wrap reasoning chunks in tags so Dify UI renders them as thinking.
+
+ OrcaRouter forwards upstream's native reasoning field, which varies by provider:
+ OpenAI o-series: `delta.reasoning_content`
+ DeepSeek r1: `delta.reasoning_content`
+ Anthropic thinking: `delta.thinking`
+ We probe all known field names.
+ """
+ content = delta.get("content") or ""
+ reasoning_content = (
+ delta.get("reasoning_content")
+ or delta.get("reasoning")
+ or delta.get("thinking")
+ )
+
+ if reasoning_content:
+ if not is_reasoning:
+ content = "\n" + reasoning_content
+ is_reasoning = True
+ else:
+ content = reasoning_content
+ elif is_reasoning and content:
+ content = "\n" + content
+ is_reasoning = False
+ return content, is_reasoning
+
+ def get_customizable_model_schema(
+ self, model: str, credentials: dict
+ ) -> AIModelEntity:
+ return super().get_customizable_model_schema(model, credentials)
+
+ def get_num_tokens(
+ self,
+ model: str,
+ credentials: dict,
+ prompt_messages: list[PromptMessage],
+ tools: Optional[list[PromptMessageTool]] = None,
+ ) -> int:
+ self._update_credential(model, credentials)
+ return super().get_num_tokens(model, credentials, prompt_messages, tools)
+
+ def _handle_generate_stream_response(
+ self,
+ model: str,
+ credentials: dict,
+ response: requests.Response,
+ prompt_messages: list[PromptMessage],
+ ) -> Generator:
+ chunk_index = 0
+ full_assistant_content = ""
+ tools_calls: list[AssistantPromptMessage.ToolCall] = []
+ finish_reason = None
+ usage = None
+ is_reasoning_started = False
+ delimiter = credentials.get("stream_mode_delimiter", "\n\n")
+ delimiter = codecs.decode(delimiter, "unicode_escape")
+
+ for chunk in response.iter_lines(decode_unicode=True, delimiter=delimiter):
+ chunk = chunk.strip()
+ if not chunk:
+ continue
+ if chunk.startswith(":"):
+ continue
+ decoded_chunk = chunk.strip().removeprefix("data:").lstrip()
+ if decoded_chunk == "[DONE]":
+ continue
+
+ try:
+ chunk_json: dict = TypeAdapter(dict[str, Any]).validate_json(
+ decoded_chunk
+ )
+ except ValidationError:
+ yield self._create_final_llm_result_chunk(
+ index=chunk_index + 1,
+ message=AssistantPromptMessage(content=""),
+ finish_reason="Non-JSON encountered.",
+ usage=usage,
+ model=model,
+ credentials=credentials,
+ prompt_messages=prompt_messages,
+ full_content=full_assistant_content,
+ )
+ break
+
+ if chunk_json.get("error") and chunk_json.get("choices") is None:
+ raise ValueError(chunk_json.get("error"))
+
+ if u := chunk_json.get("usage"):
+ usage = u
+ if not chunk_json or len(chunk_json.get("choices", [])) == 0:
+ continue
+
+ choice = chunk_json["choices"][0]
+ finish_reason = choice.get("finish_reason")
+ chunk_index += 1
+
+ if "delta" in choice:
+ delta = choice["delta"]
+ delta_content, is_reasoning_started = (
+ self._wrap_thinking_by_reasoning_content(
+ delta, is_reasoning_started
+ )
+ )
+
+ assistant_message_tool_calls = None
+ if (
+ "tool_calls" in delta
+ and credentials.get("function_calling_type", "no_call")
+ == "tool_call"
+ ):
+ assistant_message_tool_calls = delta.get("tool_calls", None)
+ elif (
+ "function_call" in delta
+ and credentials.get("function_calling_type", "no_call")
+ == "function_call"
+ ):
+ assistant_message_tool_calls = [
+ {
+ "id": "tool_call_id",
+ "type": "function",
+ "function": delta.get("function_call", {}),
+ }
+ ]
+
+ if assistant_message_tool_calls:
+ tool_calls = self._extract_response_tool_calls(
+ assistant_message_tool_calls
+ )
+ _increase_tool_call(tool_calls, tools_calls)
+
+ if not delta_content:
+ continue
+
+ assistant_prompt_message = AssistantPromptMessage(content=delta_content)
+ if isinstance(delta_content, str):
+ full_assistant_content += delta_content
+ else:
+ full_assistant_content += "".join(
+ [c.data for c in delta_content]
+ )
+ elif "text" in choice:
+ choice_text = choice.get("text", "")
+ if choice_text == "":
+ continue
+ assistant_prompt_message = AssistantPromptMessage(content=choice_text)
+ full_assistant_content += choice_text
+ else:
+ continue
+
+ yield LLMResultChunk(
+ model=model,
+ delta=LLMResultChunkDelta(
+ index=chunk_index, message=assistant_prompt_message
+ ),
+ )
+
+ if tools_calls:
+ yield LLMResultChunk(
+ model=model,
+ delta=LLMResultChunkDelta(
+ index=chunk_index,
+ message=AssistantPromptMessage(tool_calls=tools_calls, content=""),
+ ),
+ )
+
+ yield self._create_final_llm_result_chunk(
+ index=chunk_index,
+ message=AssistantPromptMessage(content=""),
+ finish_reason=finish_reason,
+ usage=usage,
+ model=model,
+ credentials=credentials,
+ prompt_messages=prompt_messages,
+ full_content=full_assistant_content,
+ )
diff --git a/models/orcarouter/models/llm/minimax-minimax-m2.5-highspeed.yaml b/models/orcarouter/models/llm/minimax-minimax-m2.5-highspeed.yaml
new file mode 100644
index 000000000..e8737e194
--- /dev/null
+++ b/models/orcarouter/models/llm/minimax-minimax-m2.5-highspeed.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/minimax/minimax-m2.5-highspeed
+model: minimax/minimax-m2.5-highspeed
+label:
+ en_US: minimax-m2.5-highspeed
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 204800
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 2048
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.6"
+ output: "2.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/minimax-minimax-m2.5.yaml b/models/orcarouter/models/llm/minimax-minimax-m2.5.yaml
new file mode 100644
index 000000000..89ef403d2
--- /dev/null
+++ b/models/orcarouter/models/llm/minimax-minimax-m2.5.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/minimax/minimax-m2.5
+model: minimax/minimax-m2.5
+label:
+ en_US: minimax-m2.5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 204800
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 2048
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.3"
+ output: "1.2"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/minimax-minimax-m2.7-highspeed.yaml b/models/orcarouter/models/llm/minimax-minimax-m2.7-highspeed.yaml
new file mode 100644
index 000000000..cd9bfd318
--- /dev/null
+++ b/models/orcarouter/models/llm/minimax-minimax-m2.7-highspeed.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/minimax/minimax-m2.7-highspeed
+model: minimax/minimax-m2.7-highspeed
+label:
+ en_US: minimax-m2.7-highspeed
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 204800
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 2048
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.6"
+ output: "2.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/minimax-minimax-m2.7.yaml b/models/orcarouter/models/llm/minimax-minimax-m2.7.yaml
new file mode 100644
index 000000000..f00fb0514
--- /dev/null
+++ b/models/orcarouter/models/llm/minimax-minimax-m2.7.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/minimax/minimax-m2.7
+model: minimax/minimax-m2.7
+label:
+ en_US: minimax-m2.7
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 204800
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 2048
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.3"
+ output: "1.2"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-3.5-turbo-0125.yaml b/models/orcarouter/models/llm/openai-gpt-3.5-turbo-0125.yaml
new file mode 100644
index 000000000..5558ad764
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-3.5-turbo-0125.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/openai/gpt-3.5-turbo-0125
+model: openai/gpt-3.5-turbo-0125
+label:
+ en_US: gpt-3.5-turbo-0125
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.5"
+ output: "1.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-3.5-turbo-1106.yaml b/models/orcarouter/models/llm/openai-gpt-3.5-turbo-1106.yaml
new file mode 100644
index 000000000..fe913ee1d
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-3.5-turbo-1106.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/openai/gpt-3.5-turbo-1106
+model: openai/gpt-3.5-turbo-1106
+label:
+ en_US: gpt-3.5-turbo-1106
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.0"
+ output: "2.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-3.5-turbo-16k.yaml b/models/orcarouter/models/llm/openai-gpt-3.5-turbo-16k.yaml
new file mode 100644
index 000000000..304f2aa73
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-3.5-turbo-16k.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/openai/gpt-3.5-turbo-16k
+model: openai/gpt-3.5-turbo-16k
+label:
+ en_US: gpt-3.5-turbo-16k
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 16385
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 4096
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "3.0"
+ output: "4.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-3.5-turbo.yaml b/models/orcarouter/models/llm/openai-gpt-3.5-turbo.yaml
new file mode 100644
index 000000000..ba6605702
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-3.5-turbo.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/openai/gpt-3.5-turbo
+model: openai/gpt-3.5-turbo
+label:
+ en_US: gpt-3.5-turbo
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 16385
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 4096
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.5"
+ output: "1.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4-0613.yaml b/models/orcarouter/models/llm/openai-gpt-4-0613.yaml
new file mode 100644
index 000000000..adbf0eb73
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4-0613.yaml
@@ -0,0 +1,52 @@
+# https://www.orcarouter.ai/models/openai/gpt-4-0613
+model: openai/gpt-4-0613
+label:
+ en_US: gpt-4-0613
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "30.0"
+ output: "60.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4-turbo-2024-04-09.yaml b/models/orcarouter/models/llm/openai-gpt-4-turbo-2024-04-09.yaml
new file mode 100644
index 000000000..6baf29c88
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4-turbo-2024-04-09.yaml
@@ -0,0 +1,62 @@
+# https://www.orcarouter.ai/models/openai/gpt-4-turbo-2024-04-09
+model: openai/gpt-4-turbo-2024-04-09
+label:
+ en_US: gpt-4-turbo-2024-04-09
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 4096
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "10.0"
+ output: "30.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4-turbo.yaml b/models/orcarouter/models/llm/openai-gpt-4-turbo.yaml
new file mode 100644
index 000000000..eab4d1d33
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4-turbo.yaml
@@ -0,0 +1,62 @@
+# https://www.orcarouter.ai/models/openai/gpt-4-turbo
+model: openai/gpt-4-turbo
+label:
+ en_US: gpt-4-turbo
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 4096
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "10.0"
+ output: "30.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4.1-2025-04-14.yaml b/models/orcarouter/models/llm/openai-gpt-4.1-2025-04-14.yaml
new file mode 100644
index 000000000..00372e155
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4.1-2025-04-14.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4.1-2025-04-14
+model: openai/gpt-4.1-2025-04-14
+label:
+ en_US: gpt-4.1-2025-04-14
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1047576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.0"
+ output: "8.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4.1-mini-2025-04-14.yaml b/models/orcarouter/models/llm/openai-gpt-4.1-mini-2025-04-14.yaml
new file mode 100644
index 000000000..e93cd9b29
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4.1-mini-2025-04-14.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4.1-mini-2025-04-14
+model: openai/gpt-4.1-mini-2025-04-14
+label:
+ en_US: gpt-4.1-mini-2025-04-14
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1047576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32768
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.4"
+ output: "1.6"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4.1-mini.yaml b/models/orcarouter/models/llm/openai-gpt-4.1-mini.yaml
new file mode 100644
index 000000000..e41f0ecd1
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4.1-mini.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4.1-mini
+model: openai/gpt-4.1-mini
+label:
+ en_US: gpt-4.1-mini
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1047576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32768
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.4"
+ output: "1.6"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4.1-nano-2025-04-14.yaml b/models/orcarouter/models/llm/openai-gpt-4.1-nano-2025-04-14.yaml
new file mode 100644
index 000000000..6640e9bc4
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4.1-nano-2025-04-14.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4.1-nano-2025-04-14
+model: openai/gpt-4.1-nano-2025-04-14
+label:
+ en_US: gpt-4.1-nano-2025-04-14
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1047576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32768
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.1"
+ output: "0.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4.1-nano.yaml b/models/orcarouter/models/llm/openai-gpt-4.1-nano.yaml
new file mode 100644
index 000000000..de161e737
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4.1-nano.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4.1-nano
+model: openai/gpt-4.1-nano
+label:
+ en_US: gpt-4.1-nano
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1047576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32768
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.1"
+ output: "0.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4.1.yaml b/models/orcarouter/models/llm/openai-gpt-4.1.yaml
new file mode 100644
index 000000000..d4fe364ce
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4.1.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4.1
+model: openai/gpt-4.1
+label:
+ en_US: gpt-4.1
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1047576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.0"
+ output: "8.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4.yaml b/models/orcarouter/models/llm/openai-gpt-4.yaml
new file mode 100644
index 000000000..93dda514f
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4.yaml
@@ -0,0 +1,61 @@
+# https://www.orcarouter.ai/models/openai/gpt-4
+model: openai/gpt-4
+label:
+ en_US: gpt-4
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 8191
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 4096
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "30.0"
+ output: "60.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-2024-05-13.yaml b/models/orcarouter/models/llm/openai-gpt-4o-2024-05-13.yaml
new file mode 100644
index 000000000..7dc410488
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-2024-05-13.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-2024-05-13
+model: openai/gpt-4o-2024-05-13
+label:
+ en_US: gpt-4o-2024-05-13
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 4096
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "5.0"
+ output: "15.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-2024-08-06.yaml b/models/orcarouter/models/llm/openai-gpt-4o-2024-08-06.yaml
new file mode 100644
index 000000000..3d42fa9d7
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-2024-08-06.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-2024-08-06
+model: openai/gpt-4o-2024-08-06
+label:
+ en_US: gpt-4o-2024-08-06
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.5"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-2024-11-20.yaml b/models/orcarouter/models/llm/openai-gpt-4o-2024-11-20.yaml
new file mode 100644
index 000000000..a7ce8e78f
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-2024-11-20.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-2024-11-20
+model: openai/gpt-4o-2024-11-20
+label:
+ en_US: gpt-4o-2024-11-20
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.5"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-mini-2024-07-18.yaml b/models/orcarouter/models/llm/openai-gpt-4o-mini-2024-07-18.yaml
new file mode 100644
index 000000000..33dbeb10c
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-mini-2024-07-18.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-mini-2024-07-18
+model: openai/gpt-4o-mini-2024-07-18
+label:
+ en_US: gpt-4o-mini-2024-07-18
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.15"
+ output: "0.6"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-mini-search-preview-2025-03-11.yaml b/models/orcarouter/models/llm/openai-gpt-4o-mini-search-preview-2025-03-11.yaml
new file mode 100644
index 000000000..23f00ce18
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-mini-search-preview-2025-03-11.yaml
@@ -0,0 +1,57 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-mini-search-preview-2025-03-11
+model: openai/gpt-4o-mini-search-preview-2025-03-11
+label:
+ en_US: gpt-4o-mini-search-preview-2025-03-11
+model_type: llm
+features:
+ - agent-thought
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.15"
+ output: "0.6"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-mini-search-preview.yaml b/models/orcarouter/models/llm/openai-gpt-4o-mini-search-preview.yaml
new file mode 100644
index 000000000..0c3564a2b
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-mini-search-preview.yaml
@@ -0,0 +1,57 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-mini-search-preview
+model: openai/gpt-4o-mini-search-preview
+label:
+ en_US: gpt-4o-mini-search-preview
+model_type: llm
+features:
+ - agent-thought
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.15"
+ output: "0.6"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-mini.yaml b/models/orcarouter/models/llm/openai-gpt-4o-mini.yaml
new file mode 100644
index 000000000..a4878409b
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-mini.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-mini
+model: openai/gpt-4o-mini
+label:
+ en_US: gpt-4o-mini
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.15"
+ output: "0.6"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-search-preview-2025-03-11.yaml b/models/orcarouter/models/llm/openai-gpt-4o-search-preview-2025-03-11.yaml
new file mode 100644
index 000000000..a7dc8547f
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-search-preview-2025-03-11.yaml
@@ -0,0 +1,57 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-search-preview-2025-03-11
+model: openai/gpt-4o-search-preview-2025-03-11
+label:
+ en_US: gpt-4o-search-preview-2025-03-11
+model_type: llm
+features:
+ - agent-thought
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.5"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o-search-preview.yaml b/models/orcarouter/models/llm/openai-gpt-4o-search-preview.yaml
new file mode 100644
index 000000000..60c534799
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o-search-preview.yaml
@@ -0,0 +1,57 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-search-preview
+model: openai/gpt-4o-search-preview
+label:
+ en_US: gpt-4o-search-preview
+model_type: llm
+features:
+ - agent-thought
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.5"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-4o.yaml b/models/orcarouter/models/llm/openai-gpt-4o.yaml
new file mode 100644
index 000000000..52c621d47
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-4o.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o
+model: openai/gpt-4o
+label:
+ en_US: gpt-4o
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 16384
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "2.5"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-2025-08-07.yaml b/models/orcarouter/models/llm/openai-gpt-5-2025-08-07.yaml
new file mode 100644
index 000000000..79d1e858e
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-2025-08-07.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-2025-08-07
+model: openai/gpt-5-2025-08-07
+label:
+ en_US: gpt-5-2025-08-07
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-chat-latest.yaml b/models/orcarouter/models/llm/openai-gpt-5-chat-latest.yaml
new file mode 100644
index 000000000..b914ea776
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-chat-latest.yaml
@@ -0,0 +1,62 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-chat-latest
+model: openai/gpt-5-chat-latest
+label:
+ en_US: gpt-5-chat-latest
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-mini-2025-08-07.yaml b/models/orcarouter/models/llm/openai-gpt-5-mini-2025-08-07.yaml
new file mode 100644
index 000000000..bca2775c2
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-mini-2025-08-07.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-mini-2025-08-07
+model: openai/gpt-5-mini-2025-08-07
+label:
+ en_US: gpt-5-mini-2025-08-07
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.25"
+ output: "2.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-mini.yaml b/models/orcarouter/models/llm/openai-gpt-5-mini.yaml
new file mode 100644
index 000000000..008c87d75
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-mini.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-mini
+model: openai/gpt-5-mini
+label:
+ en_US: gpt-5-mini
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.25"
+ output: "2.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-nano-2025-08-07.yaml b/models/orcarouter/models/llm/openai-gpt-5-nano-2025-08-07.yaml
new file mode 100644
index 000000000..7adb39196
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-nano-2025-08-07.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-nano-2025-08-07
+model: openai/gpt-5-nano-2025-08-07
+label:
+ en_US: gpt-5-nano-2025-08-07
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.05"
+ output: "0.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-nano.yaml b/models/orcarouter/models/llm/openai-gpt-5-nano.yaml
new file mode 100644
index 000000000..ec6f32ae2
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-nano.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-nano
+model: openai/gpt-5-nano
+label:
+ en_US: gpt-5-nano
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.05"
+ output: "0.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-search-api-2025-10-14.yaml b/models/orcarouter/models/llm/openai-gpt-5-search-api-2025-10-14.yaml
new file mode 100644
index 000000000..a96535e71
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-search-api-2025-10-14.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-search-api-2025-10-14
+model: openai/gpt-5-search-api-2025-10-14
+label:
+ en_US: gpt-5-search-api-2025-10-14
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5-search-api.yaml b/models/orcarouter/models/llm/openai-gpt-5-search-api.yaml
new file mode 100644
index 000000000..eddadb580
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5-search-api.yaml
@@ -0,0 +1,63 @@
+# https://www.orcarouter.ai/models/openai/gpt-5-search-api
+model: openai/gpt-5-search-api
+label:
+ en_US: gpt-5-search-api
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.1-2025-11-13.yaml b/models/orcarouter/models/llm/openai-gpt-5.1-2025-11-13.yaml
new file mode 100644
index 000000000..128f6a156
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.1-2025-11-13.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.1-2025-11-13
+model: openai/gpt-5.1-2025-11-13
+label:
+ en_US: gpt-5.1-2025-11-13
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.1-chat-latest.yaml b/models/orcarouter/models/llm/openai-gpt-5.1-chat-latest.yaml
new file mode 100644
index 000000000..7d47a9688
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.1-chat-latest.yaml
@@ -0,0 +1,62 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.1-chat-latest
+model: openai/gpt-5.1-chat-latest
+label:
+ en_US: gpt-5.1-chat-latest
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.1.yaml b/models/orcarouter/models/llm/openai-gpt-5.1.yaml
new file mode 100644
index 000000000..1d01cacbc
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.1.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.1
+model: openai/gpt-5.1
+label:
+ en_US: gpt-5.1
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.2-2025-12-11.yaml b/models/orcarouter/models/llm/openai-gpt-5.2-2025-12-11.yaml
new file mode 100644
index 000000000..dfbae7b4c
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.2-2025-12-11.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.2-2025-12-11
+model: openai/gpt-5.2-2025-12-11
+label:
+ en_US: gpt-5.2-2025-12-11
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.75"
+ output: "14.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.2-chat-latest.yaml b/models/orcarouter/models/llm/openai-gpt-5.2-chat-latest.yaml
new file mode 100644
index 000000000..60466a4fe
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.2-chat-latest.yaml
@@ -0,0 +1,62 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.2-chat-latest
+model: openai/gpt-5.2-chat-latest
+label:
+ en_US: gpt-5.2-chat-latest
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.75"
+ output: "14.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.2.yaml b/models/orcarouter/models/llm/openai-gpt-5.2.yaml
new file mode 100644
index 000000000..0bc65b1d8
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.2.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.2
+model: openai/gpt-5.2
+label:
+ en_US: gpt-5.2
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.75"
+ output: "14.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.3-chat-latest.yaml b/models/orcarouter/models/llm/openai-gpt-5.3-chat-latest.yaml
new file mode 100644
index 000000000..3fb2e9b3d
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.3-chat-latest.yaml
@@ -0,0 +1,62 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.3-chat-latest
+model: openai/gpt-5.3-chat-latest
+label:
+ en_US: gpt-5.3-chat-latest
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.75"
+ output: "14.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.4-2026-03-05.yaml b/models/orcarouter/models/llm/openai-gpt-5.4-2026-03-05.yaml
new file mode 100644
index 000000000..d8d03a7de
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.4-2026-03-05.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.4-2026-03-05
+model: openai/gpt-5.4-2026-03-05
+label:
+ en_US: gpt-5.4-2026-03-05
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1050000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "5.0"
+ output: "22.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.4-mini-2026-03-17.yaml b/models/orcarouter/models/llm/openai-gpt-5.4-mini-2026-03-17.yaml
new file mode 100644
index 000000000..b57ce4fa6
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.4-mini-2026-03-17.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.4-mini-2026-03-17
+model: openai/gpt-5.4-mini-2026-03-17
+label:
+ en_US: gpt-5.4-mini-2026-03-17
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.75"
+ output: "4.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.4-mini.yaml b/models/orcarouter/models/llm/openai-gpt-5.4-mini.yaml
new file mode 100644
index 000000000..6b008925c
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.4-mini.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.4-mini
+model: openai/gpt-5.4-mini
+label:
+ en_US: gpt-5.4-mini
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.75"
+ output: "4.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.4-nano-2026-03-17.yaml b/models/orcarouter/models/llm/openai-gpt-5.4-nano-2026-03-17.yaml
new file mode 100644
index 000000000..c924c91fc
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.4-nano-2026-03-17.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.4-nano-2026-03-17
+model: openai/gpt-5.4-nano-2026-03-17
+label:
+ en_US: gpt-5.4-nano-2026-03-17
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.2"
+ output: "1.25"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.4-nano.yaml b/models/orcarouter/models/llm/openai-gpt-5.4-nano.yaml
new file mode 100644
index 000000000..f955eb1e7
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.4-nano.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.4-nano
+model: openai/gpt-5.4-nano
+label:
+ en_US: gpt-5.4-nano
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.2"
+ output: "1.25"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.4.yaml b/models/orcarouter/models/llm/openai-gpt-5.4.yaml
new file mode 100644
index 000000000..a930daece
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.4.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.4
+model: openai/gpt-5.4
+label:
+ en_US: gpt-5.4
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 1050000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "5.0"
+ output: "22.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.5-2026-04-23.yaml b/models/orcarouter/models/llm/openai-gpt-5.5-2026-04-23.yaml
new file mode 100644
index 000000000..15ca37e54
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.5-2026-04-23.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.5-2026-04-23
+model: openai/gpt-5.5-2026-04-23
+label:
+ en_US: gpt-5.5-2026-04-23
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "10.0"
+ output: "45.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.5.yaml b/models/orcarouter/models/llm/openai-gpt-5.5.yaml
new file mode 100644
index 000000000..6a7305d7f
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.5.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5.5
+model: openai/gpt-5.5
+label:
+ en_US: gpt-5.5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "5.0"
+ output: "30.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/openai-gpt-5.yaml b/models/orcarouter/models/llm/openai-gpt-5.yaml
new file mode 100644
index 000000000..f812b7bb5
--- /dev/null
+++ b/models/orcarouter/models/llm/openai-gpt-5.yaml
@@ -0,0 +1,76 @@
+# https://www.orcarouter.ai/models/openai/gpt-5
+model: openai/gpt-5
+label:
+ en_US: gpt-5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+ - document
+model_properties:
+ mode: chat
+ context_size: 400000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.25"
+ output: "10.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/orcarouter-auto.yaml b/models/orcarouter/models/llm/orcarouter-auto.yaml
new file mode 100644
index 000000000..0eaa3f431
--- /dev/null
+++ b/models/orcarouter/models/llm/orcarouter-auto.yaml
@@ -0,0 +1,54 @@
+# OrcaRouter virtual router — picks the best upstream per request.
+# Configure routing strategy at https://www.orcarouter.ai/console/routing
+model: orcarouter/auto
+label:
+ en_US: auto
+model_type: llm
+features:
+ - multi-tool-call
+ - agent-thought
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 2000000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: top_k
+ use_template: top_k
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ max: 8192
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.0"
+ output: "0.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3-max-preview.yaml b/models/orcarouter/models/llm/qwen-qwen3-max-preview.yaml
new file mode 100644
index 000000000..689451795
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3-max-preview.yaml
@@ -0,0 +1,82 @@
+# https://www.orcarouter.ai/models/qwen/qwen3-max-preview
+model: qwen/qwen3-max-preview
+label:
+ en_US: qwen3-max-preview
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 262144
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.861"
+ output: "3.441"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3-max.yaml b/models/orcarouter/models/llm/qwen-qwen3-max.yaml
new file mode 100644
index 000000000..8318b4747
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3-max.yaml
@@ -0,0 +1,82 @@
+# https://www.orcarouter.ai/models/qwen/qwen3-max
+model: qwen/qwen3-max
+label:
+ en_US: qwen3-max
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 262144
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.359"
+ output: "1.434"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3-vl-235b-a22b-instruct.yaml b/models/orcarouter/models/llm/qwen-qwen3-vl-235b-a22b-instruct.yaml
new file mode 100644
index 000000000..2c186b2c6
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3-vl-235b-a22b-instruct.yaml
@@ -0,0 +1,48 @@
+# https://www.orcarouter.ai/models/qwen/qwen3-vl-235b-a22b-instruct
+model: qwen/qwen3-vl-235b-a22b-instruct
+label:
+ en_US: qwen3-vl-235b-a22b-instruct
+model_type: llm
+features:
+ - agent-thought
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.4"
+ output: "1.6"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3-vl-235b-a22b-thinking.yaml b/models/orcarouter/models/llm/qwen-qwen3-vl-235b-a22b-thinking.yaml
new file mode 100644
index 000000000..fc95b9d4e
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3-vl-235b-a22b-thinking.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3-vl-235b-a22b-thinking
+model: qwen/qwen3-vl-235b-a22b-thinking
+label:
+ en_US: qwen3-vl-235b-a22b-thinking
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 131072
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32768
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.4"
+ output: "4.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3-vl-8b-instruct.yaml b/models/orcarouter/models/llm/qwen-qwen3-vl-8b-instruct.yaml
new file mode 100644
index 000000000..ab727eebf
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3-vl-8b-instruct.yaml
@@ -0,0 +1,62 @@
+# https://www.orcarouter.ai/models/qwen/qwen3-vl-8b-instruct
+model: qwen/qwen3-vl-8b-instruct
+label:
+ en_US: qwen3-vl-8b-instruct
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 131072
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32768
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.18"
+ output: "0.7"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3-vl-8b-thinking.yaml b/models/orcarouter/models/llm/qwen-qwen3-vl-8b-thinking.yaml
new file mode 100644
index 000000000..905cf46b1
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3-vl-8b-thinking.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3-vl-8b-thinking
+model: qwen/qwen3-vl-8b-thinking
+label:
+ en_US: qwen3-vl-8b-thinking
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 131072
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 32768
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.18"
+ output: "2.1"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-122b-a10b.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-122b-a10b.yaml
new file mode 100644
index 000000000..b5635ce53
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-122b-a10b.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-122b-a10b
+model: qwen/qwen3.5-122b-a10b
+label:
+ en_US: qwen3.5-122b-a10b
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 32768
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 8192
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.115"
+ output: "0.917"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-27b.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-27b.yaml
new file mode 100644
index 000000000..6a4cfd865
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-27b.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-27b
+model: qwen/qwen3.5-27b
+label:
+ en_US: qwen3.5-27b
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 32768
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 8192
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.086"
+ output: "0.688"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-35b-a3b.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-35b-a3b.yaml
new file mode 100644
index 000000000..f808bd701
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-35b-a3b.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-35b-a3b
+model: qwen/qwen3.5-35b-a3b
+label:
+ en_US: qwen3.5-35b-a3b
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 32768
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 8192
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.057"
+ output: "0.459"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-397b-a17b.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-397b-a17b.yaml
new file mode 100644
index 000000000..e2ff79eee
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-397b-a17b.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-397b-a17b
+model: qwen/qwen3.5-397b-a17b
+label:
+ en_US: qwen3.5-397b-a17b
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 32768
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 8192
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.172"
+ output: "1.032"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-flash-2026-02-23.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-flash-2026-02-23.yaml
new file mode 100644
index 000000000..b53337c52
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-flash-2026-02-23.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-flash-2026-02-23
+model: qwen/qwen3.5-flash-2026-02-23
+label:
+ en_US: qwen3.5-flash-2026-02-23
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.1"
+ output: "0.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-flash.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-flash.yaml
new file mode 100644
index 000000000..2514e4719
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-flash.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-flash
+model: qwen/qwen3.5-flash
+label:
+ en_US: qwen3.5-flash
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.1"
+ output: "0.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-plus-2026-02-15.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-plus-2026-02-15.yaml
new file mode 100644
index 000000000..dd24603ad
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-plus-2026-02-15.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-plus-2026-02-15
+model: qwen/qwen3.5-plus-2026-02-15
+label:
+ en_US: qwen3.5-plus-2026-02-15
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.115"
+ output: "0.688"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.5-plus.yaml b/models/orcarouter/models/llm/qwen-qwen3.5-plus.yaml
new file mode 100644
index 000000000..9f6a2108b
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.5-plus.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.5-plus
+model: qwen/qwen3.5-plus
+label:
+ en_US: qwen3.5-plus
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.115"
+ output: "0.688"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.6-35b-a3b.yaml b/models/orcarouter/models/llm/qwen-qwen3.6-35b-a3b.yaml
new file mode 100644
index 000000000..2b236f297
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.6-35b-a3b.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.6-35b-a3b
+model: qwen/qwen3.6-35b-a3b
+label:
+ en_US: qwen3.6-35b-a3b
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 262144
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.248"
+ output: "1.485"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.6-flash-2026-04-16.yaml b/models/orcarouter/models/llm/qwen-qwen3.6-flash-2026-04-16.yaml
new file mode 100644
index 000000000..28ab482bc
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.6-flash-2026-04-16.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.6-flash-2026-04-16
+model: qwen/qwen3.6-flash-2026-04-16
+label:
+ en_US: qwen3.6-flash-2026-04-16
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.25"
+ output: "1.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.6-flash.yaml b/models/orcarouter/models/llm/qwen-qwen3.6-flash.yaml
new file mode 100644
index 000000000..124eb69e1
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.6-flash.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.6-flash
+model: qwen/qwen3.6-flash
+label:
+ en_US: qwen3.6-flash
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.25"
+ output: "1.5"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.6-plus-2026-04-02.yaml b/models/orcarouter/models/llm/qwen-qwen3.6-plus-2026-04-02.yaml
new file mode 100644
index 000000000..61e963945
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.6-plus-2026-04-02.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.6-plus-2026-04-02
+model: qwen/qwen3.6-plus-2026-04-02
+label:
+ en_US: qwen3.6-plus-2026-04-02
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.276"
+ output: "1.651"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/qwen-qwen3.6-plus.yaml b/models/orcarouter/models/llm/qwen-qwen3.6-plus.yaml
new file mode 100644
index 000000000..d115fba06
--- /dev/null
+++ b/models/orcarouter/models/llm/qwen-qwen3.6-plus.yaml
@@ -0,0 +1,83 @@
+# https://www.orcarouter.ai/models/qwen/qwen3.6-plus
+model: qwen/qwen3.6-plus
+label:
+ en_US: qwen3.6-plus
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+ - vision
+model_properties:
+ mode: chat
+ context_size: 1048576
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: presence_penalty
+ use_template: presence_penalty
+ - name: frequency_penalty
+ use_template: frequency_penalty
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 65536
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.5"
+ output: "3.0"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/z-ai-glm-4.5-air.yaml b/models/orcarouter/models/llm/z-ai-glm-4.5-air.yaml
new file mode 100644
index 000000000..35756889a
--- /dev/null
+++ b/models/orcarouter/models/llm/z-ai-glm-4.5-air.yaml
@@ -0,0 +1,78 @@
+# https://www.orcarouter.ai/models/z-ai/glm-4.5-air
+model: z-ai/glm-4.5-air
+label:
+ en_US: glm-4.5-air
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 96000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.2"
+ output: "1.1"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/z-ai-glm-4.5.yaml b/models/orcarouter/models/llm/z-ai-glm-4.5.yaml
new file mode 100644
index 000000000..70e1e3a46
--- /dev/null
+++ b/models/orcarouter/models/llm/z-ai-glm-4.5.yaml
@@ -0,0 +1,78 @@
+# https://www.orcarouter.ai/models/z-ai/glm-4.5
+model: z-ai/glm-4.5
+label:
+ en_US: glm-4.5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 128000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 96000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.6"
+ output: "2.2"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/z-ai-glm-4.6.yaml b/models/orcarouter/models/llm/z-ai-glm-4.6.yaml
new file mode 100644
index 000000000..d9e0bff69
--- /dev/null
+++ b/models/orcarouter/models/llm/z-ai-glm-4.6.yaml
@@ -0,0 +1,78 @@
+# https://www.orcarouter.ai/models/z-ai/glm-4.6
+model: z-ai/glm-4.6
+label:
+ en_US: glm-4.6
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.6"
+ output: "2.2"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/z-ai-glm-4.7.yaml b/models/orcarouter/models/llm/z-ai-glm-4.7.yaml
new file mode 100644
index 000000000..5c03724ed
--- /dev/null
+++ b/models/orcarouter/models/llm/z-ai-glm-4.7.yaml
@@ -0,0 +1,78 @@
+# https://www.orcarouter.ai/models/z-ai/glm-4.7
+model: z-ai/glm-4.7
+label:
+ en_US: glm-4.7
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "0.6"
+ output: "2.2"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/z-ai-glm-5.1.yaml b/models/orcarouter/models/llm/z-ai-glm-5.1.yaml
new file mode 100644
index 000000000..d30380f06
--- /dev/null
+++ b/models/orcarouter/models/llm/z-ai-glm-5.1.yaml
@@ -0,0 +1,78 @@
+# https://www.orcarouter.ai/models/z-ai/glm-5.1
+model: z-ai/glm-5.1
+label:
+ en_US: glm-5.1
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.4"
+ output: "4.4"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/llm/z-ai-glm-5.yaml b/models/orcarouter/models/llm/z-ai-glm-5.yaml
new file mode 100644
index 000000000..cc6e43b7f
--- /dev/null
+++ b/models/orcarouter/models/llm/z-ai-glm-5.yaml
@@ -0,0 +1,78 @@
+# https://www.orcarouter.ai/models/z-ai/glm-5
+model: z-ai/glm-5
+label:
+ en_US: glm-5
+model_type: llm
+features:
+ - agent-thought
+ - tool-call
+ - multi-tool-call
+ - stream-tool-call
+model_properties:
+ mode: chat
+ context_size: 200000
+parameter_rules:
+ - name: temperature
+ use_template: temperature
+ - name: top_p
+ use_template: top_p
+ - name: max_tokens
+ use_template: max_tokens
+ default: 1024
+ min: 1
+ max: 128000
+ - name: response_format
+ label:
+ zh_Hans: 回复格式
+ en_US: Response Format
+ type: string
+ required: false
+ options:
+ - text
+ - json_object
+ - name: reasoning_effort
+ label:
+ zh_Hans: 推理程度
+ en_US: Reasoning Effort
+ type: string
+ required: false
+ options:
+ - high
+ - medium
+ - low
+ - minimal
+ help:
+ zh_Hans: 控制 reasoning 模型的思考深度(OpenAI / Grok / Gemini 等 reasoning 模型有效)。
+ en_US: Controls reasoning depth for capable upstreams (OpenAI o-series, Gemini, Grok, etc.)
+ - name: exclude_reasoning_tokens
+ type: boolean
+ required: false
+ default: false
+ label:
+ zh_Hans: 隐藏思考过程
+ en_US: Hide the thought process
+ - name: orcarouter_fallback_models
+ type: string
+ required: false
+ label:
+ en_US: Fallback models (JSON array)
+ zh_Hans: 降级模型(JSON 数组)
+ help:
+ en_US: 'Upstream models to try if the primary fails. Example: ["openai/gpt-4o-mini","openai/gpt-4o"]'
+ zh_Hans: 主上游失败时按顺序尝试这些模型。例:["openai/gpt-4o-mini","openai/gpt-4o"]
+ - name: orcarouter_route
+ type: string
+ required: false
+ options:
+ - fallback
+ label:
+ en_US: Routing mode
+ zh_Hans: 路由模式
+ help:
+ en_US: Activate fallback list. Set to 'fallback' to use orcarouter_fallback_models in order.
+ zh_Hans: 启用降级列表。设为 'fallback' 后按 orcarouter_fallback_models 顺序尝试。
+pricing:
+ input: "1.0"
+ output: "3.2"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/text_embedding/__init__.py b/models/orcarouter/models/text_embedding/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/models/orcarouter/models/text_embedding/_position.yaml b/models/orcarouter/models/text_embedding/_position.yaml
new file mode 100644
index 000000000..354d0ed6b
--- /dev/null
+++ b/models/orcarouter/models/text_embedding/_position.yaml
@@ -0,0 +1,5 @@
+- google/gemini-embedding-001
+- google/gemini-embedding-2-preview
+- openai/text-embedding-3-large
+- openai/text-embedding-3-small
+- openai/text-embedding-ada-002
diff --git a/models/orcarouter/models/text_embedding/google-gemini-embedding-001.yaml b/models/orcarouter/models/text_embedding/google-gemini-embedding-001.yaml
new file mode 100644
index 000000000..94c04bf1c
--- /dev/null
+++ b/models/orcarouter/models/text_embedding/google-gemini-embedding-001.yaml
@@ -0,0 +1,12 @@
+# https://www.orcarouter.ai/models/google/gemini-embedding-001
+model: google/gemini-embedding-001
+label:
+ en_US: gemini-embedding-001
+model_type: text-embedding
+model_properties:
+ context_size: 2048
+ max_chunks: 32
+pricing:
+ input: "0.15"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/text_embedding/google-gemini-embedding-2-preview.yaml b/models/orcarouter/models/text_embedding/google-gemini-embedding-2-preview.yaml
new file mode 100644
index 000000000..5f125c763
--- /dev/null
+++ b/models/orcarouter/models/text_embedding/google-gemini-embedding-2-preview.yaml
@@ -0,0 +1,12 @@
+# https://www.orcarouter.ai/models/google/gemini-embedding-2-preview
+model: google/gemini-embedding-2-preview
+label:
+ en_US: gemini-embedding-2-preview
+model_type: text-embedding
+model_properties:
+ context_size: 8192
+ max_chunks: 32
+pricing:
+ input: "0.2"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/text_embedding/openai-text-embedding-3-large.yaml b/models/orcarouter/models/text_embedding/openai-text-embedding-3-large.yaml
new file mode 100644
index 000000000..ac9986e36
--- /dev/null
+++ b/models/orcarouter/models/text_embedding/openai-text-embedding-3-large.yaml
@@ -0,0 +1,12 @@
+# https://www.orcarouter.ai/models/openai/text-embedding-3-large
+model: openai/text-embedding-3-large
+label:
+ en_US: text-embedding-3-large
+model_type: text-embedding
+model_properties:
+ context_size: 8191
+ max_chunks: 32
+pricing:
+ input: "0.13"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/text_embedding/openai-text-embedding-3-small.yaml b/models/orcarouter/models/text_embedding/openai-text-embedding-3-small.yaml
new file mode 100644
index 000000000..f22473aa2
--- /dev/null
+++ b/models/orcarouter/models/text_embedding/openai-text-embedding-3-small.yaml
@@ -0,0 +1,12 @@
+# https://www.orcarouter.ai/models/openai/text-embedding-3-small
+model: openai/text-embedding-3-small
+label:
+ en_US: text-embedding-3-small
+model_type: text-embedding
+model_properties:
+ context_size: 8191
+ max_chunks: 32
+pricing:
+ input: "0.02"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/text_embedding/openai-text-embedding-ada-002.yaml b/models/orcarouter/models/text_embedding/openai-text-embedding-ada-002.yaml
new file mode 100644
index 000000000..313832051
--- /dev/null
+++ b/models/orcarouter/models/text_embedding/openai-text-embedding-ada-002.yaml
@@ -0,0 +1,12 @@
+# https://www.orcarouter.ai/models/openai/text-embedding-ada-002
+model: openai/text-embedding-ada-002
+label:
+ en_US: text-embedding-ada-002
+model_type: text-embedding
+model_properties:
+ context_size: 8191
+ max_chunks: 32
+pricing:
+ input: "0.1"
+ unit: "0.000001"
+ currency: USD
diff --git a/models/orcarouter/models/text_embedding/text_embedding.py b/models/orcarouter/models/text_embedding/text_embedding.py
new file mode 100644
index 000000000..5ade64e04
--- /dev/null
+++ b/models/orcarouter/models/text_embedding/text_embedding.py
@@ -0,0 +1,34 @@
+from typing import Optional
+
+from dify_plugin import OAICompatEmbeddingModel
+from dify_plugin.entities.model import EmbeddingInputType
+from dify_plugin.entities.model.text_embedding import TextEmbeddingResult
+
+from models._endpoint_utils import normalize_endpoint_url
+
+
+class OrcaRouterTextEmbeddingModel(OAICompatEmbeddingModel):
+ def _invoke(
+ self,
+ model: str,
+ credentials: dict,
+ texts: list[str],
+ user: Optional[str] = None,
+ input_type: EmbeddingInputType = EmbeddingInputType.DOCUMENT,
+ ) -> TextEmbeddingResult:
+ self._update_credentials(credentials)
+ return super()._invoke(model, credentials, texts, user, input_type)
+
+ def validate_credentials(self, model: str, credentials: dict) -> None:
+ self._update_credentials(credentials)
+ super().validate_credentials(model, credentials)
+
+ def get_num_tokens(
+ self, model: str, credentials: dict, texts: list[str]
+ ) -> list[int]:
+ self._update_credentials(credentials)
+ return super().get_num_tokens(model, credentials, texts)
+
+ @staticmethod
+ def _update_credentials(credentials: dict) -> None:
+ credentials["endpoint_url"] = normalize_endpoint_url(credentials)
diff --git a/models/orcarouter/models/tts/__init__.py b/models/orcarouter/models/tts/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/models/orcarouter/models/tts/_position.yaml b/models/orcarouter/models/tts/_position.yaml
new file mode 100644
index 000000000..5415a71a3
--- /dev/null
+++ b/models/orcarouter/models/tts/_position.yaml
@@ -0,0 +1,7 @@
+- openai/gpt-4o-mini-tts
+- openai/gpt-4o-mini-tts-2025-03-20
+- openai/gpt-4o-mini-tts-2025-12-15
+- openai/tts-1
+- openai/tts-1-1106
+- openai/tts-1-hd
+- openai/tts-1-hd-1106
diff --git a/models/orcarouter/models/tts/openai-gpt-4o-mini-tts-2025-03-20.yaml b/models/orcarouter/models/tts/openai-gpt-4o-mini-tts-2025-03-20.yaml
new file mode 100644
index 000000000..6515e3d12
--- /dev/null
+++ b/models/orcarouter/models/tts/openai-gpt-4o-mini-tts-2025-03-20.yaml
@@ -0,0 +1,49 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-mini-tts-2025-03-20
+model: openai/gpt-4o-mini-tts-2025-03-20
+label:
+ en_US: gpt-4o-mini-tts-2025-03-20
+model_type: tts
+model_properties:
+ default_voice: 'alloy'
+ voices:
+ - mode: 'alloy'
+ name: 'Alloy'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ash'
+ name: 'Ash'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ballad'
+ name: 'Ballad'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'coral'
+ name: 'Coral'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'echo'
+ name: 'Echo'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'fable'
+ name: 'Fable'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'onyx'
+ name: 'Onyx'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'nova'
+ name: 'Nova'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'sage'
+ name: 'Sage'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'shimmer'
+ name: 'Shimmer'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'verse'
+ name: 'Verse'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ word_limit: 3500
+ audio_type: 'mp3'
+ max_workers: 5
+pricing:
+ input: '0.6'
+ output: '0'
+ unit: '0.000001'
+ currency: USD
diff --git a/models/orcarouter/models/tts/openai-gpt-4o-mini-tts-2025-12-15.yaml b/models/orcarouter/models/tts/openai-gpt-4o-mini-tts-2025-12-15.yaml
new file mode 100644
index 000000000..ffd960dd1
--- /dev/null
+++ b/models/orcarouter/models/tts/openai-gpt-4o-mini-tts-2025-12-15.yaml
@@ -0,0 +1,49 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-mini-tts-2025-12-15
+model: openai/gpt-4o-mini-tts-2025-12-15
+label:
+ en_US: gpt-4o-mini-tts-2025-12-15
+model_type: tts
+model_properties:
+ default_voice: 'alloy'
+ voices:
+ - mode: 'alloy'
+ name: 'Alloy'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ash'
+ name: 'Ash'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ballad'
+ name: 'Ballad'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'coral'
+ name: 'Coral'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'echo'
+ name: 'Echo'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'fable'
+ name: 'Fable'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'onyx'
+ name: 'Onyx'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'nova'
+ name: 'Nova'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'sage'
+ name: 'Sage'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'shimmer'
+ name: 'Shimmer'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'verse'
+ name: 'Verse'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ word_limit: 3500
+ audio_type: 'mp3'
+ max_workers: 5
+pricing:
+ input: '0.6'
+ output: '0'
+ unit: '0.000001'
+ currency: USD
diff --git a/models/orcarouter/models/tts/openai-gpt-4o-mini-tts.yaml b/models/orcarouter/models/tts/openai-gpt-4o-mini-tts.yaml
new file mode 100644
index 000000000..008afdda2
--- /dev/null
+++ b/models/orcarouter/models/tts/openai-gpt-4o-mini-tts.yaml
@@ -0,0 +1,49 @@
+# https://www.orcarouter.ai/models/openai/gpt-4o-mini-tts
+model: openai/gpt-4o-mini-tts
+label:
+ en_US: gpt-4o-mini-tts
+model_type: tts
+model_properties:
+ default_voice: 'alloy'
+ voices:
+ - mode: 'alloy'
+ name: 'Alloy'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ash'
+ name: 'Ash'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ballad'
+ name: 'Ballad'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'coral'
+ name: 'Coral'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'echo'
+ name: 'Echo'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'fable'
+ name: 'Fable'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'onyx'
+ name: 'Onyx'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'nova'
+ name: 'Nova'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'sage'
+ name: 'Sage'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'shimmer'
+ name: 'Shimmer'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'verse'
+ name: 'Verse'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ word_limit: 3500
+ audio_type: 'mp3'
+ max_workers: 5
+pricing:
+ input: '0.6'
+ output: '0'
+ unit: '0.000001'
+ currency: USD
diff --git a/models/orcarouter/models/tts/openai-tts-1-1106.yaml b/models/orcarouter/models/tts/openai-tts-1-1106.yaml
new file mode 100644
index 000000000..3fbf4ac95
--- /dev/null
+++ b/models/orcarouter/models/tts/openai-tts-1-1106.yaml
@@ -0,0 +1,49 @@
+# https://www.orcarouter.ai/models/openai/tts-1-1106
+model: openai/tts-1-1106
+label:
+ en_US: tts-1-1106
+model_type: tts
+model_properties:
+ default_voice: 'alloy'
+ voices:
+ - mode: 'alloy'
+ name: 'Alloy'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ash'
+ name: 'Ash'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ballad'
+ name: 'Ballad'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'coral'
+ name: 'Coral'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'echo'
+ name: 'Echo'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'fable'
+ name: 'Fable'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'onyx'
+ name: 'Onyx'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'nova'
+ name: 'Nova'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'sage'
+ name: 'Sage'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'shimmer'
+ name: 'Shimmer'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'verse'
+ name: 'Verse'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ word_limit: 3500
+ audio_type: 'mp3'
+ max_workers: 5
+pricing:
+ input: '15.0'
+ output: '0'
+ unit: '0.000001'
+ currency: USD
diff --git a/models/orcarouter/models/tts/openai-tts-1-hd-1106.yaml b/models/orcarouter/models/tts/openai-tts-1-hd-1106.yaml
new file mode 100644
index 000000000..c71b41d9a
--- /dev/null
+++ b/models/orcarouter/models/tts/openai-tts-1-hd-1106.yaml
@@ -0,0 +1,49 @@
+# https://www.orcarouter.ai/models/openai/tts-1-hd-1106
+model: openai/tts-1-hd-1106
+label:
+ en_US: tts-1-hd-1106
+model_type: tts
+model_properties:
+ default_voice: 'alloy'
+ voices:
+ - mode: 'alloy'
+ name: 'Alloy'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ash'
+ name: 'Ash'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ballad'
+ name: 'Ballad'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'coral'
+ name: 'Coral'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'echo'
+ name: 'Echo'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'fable'
+ name: 'Fable'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'onyx'
+ name: 'Onyx'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'nova'
+ name: 'Nova'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'sage'
+ name: 'Sage'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'shimmer'
+ name: 'Shimmer'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'verse'
+ name: 'Verse'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ word_limit: 3500
+ audio_type: 'mp3'
+ max_workers: 5
+pricing:
+ input: '30.0'
+ output: '0'
+ unit: '0.000001'
+ currency: USD
diff --git a/models/orcarouter/models/tts/openai-tts-1-hd.yaml b/models/orcarouter/models/tts/openai-tts-1-hd.yaml
new file mode 100644
index 000000000..07626e87d
--- /dev/null
+++ b/models/orcarouter/models/tts/openai-tts-1-hd.yaml
@@ -0,0 +1,49 @@
+# https://www.orcarouter.ai/models/openai/tts-1-hd
+model: openai/tts-1-hd
+label:
+ en_US: tts-1-hd
+model_type: tts
+model_properties:
+ default_voice: 'alloy'
+ voices:
+ - mode: 'alloy'
+ name: 'Alloy'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ash'
+ name: 'Ash'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ballad'
+ name: 'Ballad'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'coral'
+ name: 'Coral'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'echo'
+ name: 'Echo'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'fable'
+ name: 'Fable'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'onyx'
+ name: 'Onyx'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'nova'
+ name: 'Nova'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'sage'
+ name: 'Sage'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'shimmer'
+ name: 'Shimmer'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'verse'
+ name: 'Verse'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ word_limit: 3500
+ audio_type: 'mp3'
+ max_workers: 5
+pricing:
+ input: '30.0'
+ output: '0'
+ unit: '0.000001'
+ currency: USD
diff --git a/models/orcarouter/models/tts/openai-tts-1.yaml b/models/orcarouter/models/tts/openai-tts-1.yaml
new file mode 100644
index 000000000..8d5cea7e8
--- /dev/null
+++ b/models/orcarouter/models/tts/openai-tts-1.yaml
@@ -0,0 +1,49 @@
+# https://www.orcarouter.ai/models/openai/tts-1
+model: openai/tts-1
+label:
+ en_US: tts-1
+model_type: tts
+model_properties:
+ default_voice: 'alloy'
+ voices:
+ - mode: 'alloy'
+ name: 'Alloy'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ash'
+ name: 'Ash'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'ballad'
+ name: 'Ballad'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'coral'
+ name: 'Coral'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'echo'
+ name: 'Echo'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'fable'
+ name: 'Fable'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'onyx'
+ name: 'Onyx'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'nova'
+ name: 'Nova'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'sage'
+ name: 'Sage'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'shimmer'
+ name: 'Shimmer'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ - mode: 'verse'
+ name: 'Verse'
+ language: ['zh-Hans', 'en-US', 'de-DE', 'fr-FR', 'es-ES', 'it-IT', 'ja-JP', 'ko-KR']
+ word_limit: 3500
+ audio_type: 'mp3'
+ max_workers: 5
+pricing:
+ input: '15.0'
+ output: '0'
+ unit: '0.000001'
+ currency: USD
diff --git a/models/orcarouter/models/tts/tts.py b/models/orcarouter/models/tts/tts.py
new file mode 100644
index 000000000..8eccf58fe
--- /dev/null
+++ b/models/orcarouter/models/tts/tts.py
@@ -0,0 +1,28 @@
+from collections.abc import Generator
+from typing import Optional
+
+from dify_plugin import OAICompatText2SpeechModel
+
+from models._endpoint_utils import normalize_endpoint_url
+
+
+class OrcaRouterText2SpeechModel(OAICompatText2SpeechModel):
+ def _invoke(
+ self,
+ model: str,
+ tenant_id: str,
+ credentials: dict,
+ content_text: str,
+ voice: str,
+ user: Optional[str] = None,
+ ) -> Generator[bytes, None, None]:
+ self._update_credentials(credentials)
+ return super()._invoke(model, tenant_id, credentials, content_text, voice, user)
+
+ def validate_credentials(self, model: str, credentials: dict) -> None:
+ self._update_credentials(credentials)
+ super().validate_credentials(model, credentials)
+
+ @staticmethod
+ def _update_credentials(credentials: dict) -> None:
+ credentials["endpoint_url"] = normalize_endpoint_url(credentials)
diff --git a/models/orcarouter/provider/orcarouter.py b/models/orcarouter/provider/orcarouter.py
new file mode 100644
index 000000000..0305bde6f
--- /dev/null
+++ b/models/orcarouter/provider/orcarouter.py
@@ -0,0 +1,18 @@
+import logging
+from dify_plugin.entities.model import ModelType
+from dify_plugin.errors.model import CredentialsValidateFailedError
+from dify_plugin import ModelProvider
+
+logger = logging.getLogger(__name__)
+
+
+class OrcaRouterProvider(ModelProvider):
+ def validate_provider_credentials(self, credentials: dict) -> None:
+ try:
+ model_instance = self.get_model_instance(ModelType.LLM)
+ model_instance.validate_credentials(model="orcarouter/auto", credentials=credentials)
+ except CredentialsValidateFailedError as ex:
+ raise ex
+ except Exception as ex:
+ logger.exception(f"{self.get_provider_schema().provider} credentials validate failed")
+ raise ex
diff --git a/models/orcarouter/provider/orcarouter.yaml b/models/orcarouter/provider/orcarouter.yaml
new file mode 100644
index 000000000..2342dedb4
--- /dev/null
+++ b/models/orcarouter/provider/orcarouter.yaml
@@ -0,0 +1,163 @@
+background: '#F1EFED'
+configurate_methods:
+- predefined-model
+- customizable-model
+extra:
+ python:
+ model_sources:
+ - models/llm/llm.py
+ - models/text_embedding/text_embedding.py
+ - models/tts/tts.py
+ provider_source: provider/orcarouter.py
+help:
+ title:
+ en_US: Get your API key from the OrcaRouter console
+ zh_Hans: 从 OrcaRouter 控制台获取 API Key
+ url:
+ en_US: https://www.orcarouter.ai/console
+icon_large:
+ en_US: orcarouter.svg
+icon_small:
+ en_US: orcarouter_square.svg
+label:
+ en_US: OrcaRouter
+model_credential_schema:
+ credential_form_schemas:
+ - label:
+ en_US: API Key
+ placeholder:
+ en_US: Enter your API Key
+ zh_Hans: 在此输入您的 API Key
+ required: true
+ type: secret-input
+ variable: api_key
+ - label:
+ en_US: Custom API endpoint URL
+ zh_Hans: 自定义 API endpoint 地址
+ placeholder:
+ en_US: Base URL, e.g. https://api.orcarouter.ai/v1
+ zh_Hans: Base URL,例如 https://api.orcarouter.ai/v1
+ required: false
+ type: text-input
+ variable: endpoint_url
+ - default: chat
+ label:
+ en_US: Completion mode
+ options:
+ - label:
+ en_US: Completion
+ zh_Hans: 补全
+ value: completion
+ - label:
+ en_US: Chat
+ zh_Hans: 对话
+ value: chat
+ placeholder:
+ en_US: Select completion mode
+ zh_Hans: 选择对话类型
+ required: false
+ show_on:
+ - value: llm
+ variable: __model_type
+ type: select
+ variable: mode
+ - default: '4096'
+ label:
+ en_US: Model context size
+ zh_Hans: 模型上下文长度
+ placeholder:
+ en_US: Enter your Model context size
+ zh_Hans: 在此输入您的模型上下文长度
+ required: true
+ type: text-input
+ variable: context_size
+ - default: '4096'
+ label:
+ en_US: Upper bound for max tokens
+ zh_Hans: 最大 token 上限
+ show_on:
+ - value: llm
+ variable: __model_type
+ type: text-input
+ variable: max_tokens_to_sample
+ - default: no_support
+ label:
+ en_US: Vision Support
+ zh_Hans: 是否支持 Vision
+ options:
+ - label:
+ en_US: 'Yes'
+ zh_Hans: 是
+ value: support
+ - label:
+ en_US: 'No'
+ zh_Hans: 否
+ value: no_support
+ required: false
+ show_on:
+ - value: llm
+ variable: __model_type
+ type: radio
+ variable: vision_support
+ - default: no_call
+ label:
+ en_US: Function calling
+ options:
+ - label:
+ en_US: Not Support
+ zh_Hans: 不支持
+ value: no_call
+ - label:
+ en_US: Support
+ zh_Hans: 支持
+ value: tool_call
+ required: false
+ show_on:
+ - value: llm
+ variable: __model_type
+ type: select
+ variable: function_calling_type
+ model:
+ label:
+ en_US: Model Name
+ zh_Hans: 模型名称
+ placeholder:
+ en_US: Enter full model name
+ zh_Hans: 输入模型全称
+models:
+ llm:
+ position: models/llm/_position.yaml
+ predefined:
+ - models/llm/*.yaml
+ text_embedding:
+ position: models/text_embedding/_position.yaml
+ predefined:
+ - models/text_embedding/*.yaml
+ tts:
+ position: models/tts/_position.yaml
+ predefined:
+ - models/tts/*.yaml
+provider: orcarouter
+provider_credential_schema:
+ credential_form_schemas:
+ - label:
+ en_US: API Key
+ placeholder:
+ en_US: Enter your API Key
+ zh_Hans: 在此输入您的 API Key
+ required: true
+ type: secret-input
+ variable: api_key
+ - label:
+ en_US: Custom API endpoint URL
+ zh_Hans: 自定义 API endpoint 地址
+ placeholder:
+ en_US: Base URL, e.g. https://api.orcarouter.ai/v1
+ zh_Hans: Base URL,例如 https://api.orcarouter.ai/v1
+ required: false
+ type: text-input
+ variable: endpoint_url
+supported_model_types:
+- llm
+- text-embedding
+- tts
diff --git a/models/orcarouter/pyproject.toml b/models/orcarouter/pyproject.toml
new file mode 100644
index 000000000..ed5e946cc
--- /dev/null
+++ b/models/orcarouter/pyproject.toml
@@ -0,0 +1,22 @@
+[project]
+name = "orcarouter"
+version = "0.1.0"
+description = "OrcaRouter — OpenAI-compatible LLM gateway routing across 40+ providers"
+readme = "README.md"
+requires-python = ">=3.12"
+
+dependencies = [
+ "dify_plugin>=0.5.0,<0.6.0",
+ "pydantic>=2.11.0",
+ "requests>=2.32.0",
+ "sniffio>=1.3.1",
+]
+
+[dependency-groups]
+dev = [
+ "pyrefly>=0.50.0",
+ "pytest>=9.0.2",
+ "pyyaml>=6.0.0",
+ "black>=25.11.0",
+ "ruff>=0.14.6",
+]
diff --git a/models/orcarouter/tests/test_endpoint_url_config.py b/models/orcarouter/tests/test_endpoint_url_config.py
new file mode 100644
index 000000000..c5b87fa84
--- /dev/null
+++ b/models/orcarouter/tests/test_endpoint_url_config.py
@@ -0,0 +1,173 @@
+"""L2 offline tests: endpoint URL normalization + credential injection.
+
+Adapted from openrouter's test_endpoint_url_config.py. No embedding tests
+since OrcaRouter v1 ships LLM only. No HTTP-Referer/X-Title assertions
+since those are OpenRouter-specific telemetry.
+"""
+from __future__ import annotations
+
+import sys
+import unittest
+from pathlib import Path
+from unittest.mock import patch
+
+from dify_plugin import (
+ OAICompatEmbeddingModel,
+ OAICompatLargeLanguageModel,
+ OAICompatText2SpeechModel,
+)
+from dify_plugin.entities.model.llm import LLMMode
+
+sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
+
+from models._endpoint_utils import DEFAULT_ENDPOINT_URL, normalize_endpoint_url
+from models.llm.llm import OrcaRouterLargeLanguageModel
+from models.text_embedding.text_embedding import OrcaRouterTextEmbeddingModel
+from models.tts.tts import OrcaRouterText2SpeechModel
+
+
+class TestNormalizeEndpointUrl(unittest.TestCase):
+ """Unit tests for the normalize_endpoint_url helper."""
+
+ def test_default_when_key_missing(self) -> None:
+ self.assertEqual(normalize_endpoint_url({}), DEFAULT_ENDPOINT_URL)
+ self.assertEqual(DEFAULT_ENDPOINT_URL, "https://api.orcarouter.ai/v1")
+
+ def test_default_when_blank(self) -> None:
+ self.assertEqual(
+ normalize_endpoint_url({"endpoint_url": " "}), DEFAULT_ENDPOINT_URL
+ )
+ self.assertEqual(
+ normalize_endpoint_url({"endpoint_url": ""}), DEFAULT_ENDPOINT_URL
+ )
+
+ def test_default_when_none(self) -> None:
+ self.assertEqual(
+ normalize_endpoint_url({"endpoint_url": None}), DEFAULT_ENDPOINT_URL
+ )
+
+ def test_strips_whitespace_and_trailing_slash(self) -> None:
+ self.assertEqual(
+ normalize_endpoint_url({"endpoint_url": " https://example.com/api/v1/ "}),
+ "https://example.com/api/v1",
+ )
+
+ def test_preserves_clean_url(self) -> None:
+ url = "https://custom.example.com/v1"
+ self.assertEqual(normalize_endpoint_url({"endpoint_url": url}), url)
+
+
+class TestOrcaRouterEndpointUrlConfig(unittest.TestCase):
+ def setUp(self) -> None:
+ self.llm = OrcaRouterLargeLanguageModel(model_schemas=[])
+
+ @patch.object(OrcaRouterLargeLanguageModel, "get_model_schema", return_value=None)
+ @patch.object(OrcaRouterLargeLanguageModel, "get_model_mode", return_value=LLMMode.CHAT)
+ @patch.object(OAICompatLargeLanguageModel, "validate_credentials")
+ def test_llm_validate_credentials_defaults_endpoint_url(
+ self, mock_super_validate, _mock_get_mode, _mock_get_schema
+ ) -> None:
+ credentials = {"api_key": "test-key"}
+ self.llm.validate_credentials("orcarouter/auto", credentials)
+
+ self.assertEqual(credentials["endpoint_url"], "https://api.orcarouter.ai/v1")
+ self.assertEqual(credentials["mode"], LLMMode.CHAT.value)
+ # OrcaRouter does NOT inject HTTP-Referer/X-Title (that's OpenRouter telemetry)
+ self.assertNotIn("extra_headers", credentials)
+ mock_super_validate.assert_called_once_with("orcarouter/auto", credentials)
+
+ @patch.object(OrcaRouterLargeLanguageModel, "get_model_schema", return_value=None)
+ @patch.object(OrcaRouterLargeLanguageModel, "get_model_mode", return_value=LLMMode.CHAT)
+ @patch.object(OAICompatLargeLanguageModel, "validate_credentials")
+ def test_llm_validate_credentials_normalizes_custom_endpoint(
+ self, mock_super_validate, _mock_get_mode, _mock_get_schema
+ ) -> None:
+ credentials = {
+ "api_key": "test-key",
+ "endpoint_url": " https://orcarouter.example.com/api/v1/ ",
+ }
+ self.llm.validate_credentials("orcarouter/auto", credentials)
+ self.assertEqual(
+ credentials["endpoint_url"], "https://orcarouter.example.com/api/v1"
+ )
+ mock_super_validate.assert_called_once_with("orcarouter/auto", credentials)
+
+ @patch.object(OrcaRouterLargeLanguageModel, "get_model_schema", return_value=None)
+ @patch.object(OrcaRouterLargeLanguageModel, "get_model_mode", return_value=LLMMode.CHAT)
+ @patch.object(OAICompatLargeLanguageModel, "validate_credentials")
+ def test_llm_validate_credentials_blank_falls_back_to_default(
+ self, mock_super_validate, _mock_get_mode, _mock_get_schema
+ ) -> None:
+ credentials = {"api_key": "test-key", "endpoint_url": " "}
+ self.llm.validate_credentials("orcarouter/auto", credentials)
+ self.assertEqual(credentials["endpoint_url"], "https://api.orcarouter.ai/v1")
+ mock_super_validate.assert_called_once_with("orcarouter/auto", credentials)
+
+
+class TestEmbeddingEndpointUrlConfig(unittest.TestCase):
+ def setUp(self) -> None:
+ self.embedding = OrcaRouterTextEmbeddingModel(model_schemas=[])
+
+ @patch.object(OAICompatEmbeddingModel, "validate_credentials")
+ def test_embedding_validate_credentials_defaults_endpoint(
+ self, mock_super_validate
+ ) -> None:
+ credentials = {"api_key": "test-key"}
+ self.embedding.validate_credentials("openai/text-embedding-3-small", credentials)
+ self.assertEqual(credentials["endpoint_url"], "https://api.orcarouter.ai/v1")
+ # No HTTP-Referer / X-Title (OpenRouter telemetry); we don't add them
+ self.assertNotIn("extra_headers", credentials)
+ mock_super_validate.assert_called_once_with(
+ "openai/text-embedding-3-small", credentials
+ )
+
+ @patch.object(OAICompatEmbeddingModel, "validate_credentials")
+ def test_embedding_validate_credentials_normalizes_custom_endpoint(
+ self, mock_super_validate
+ ) -> None:
+ credentials = {
+ "api_key": "test-key",
+ "endpoint_url": " https://orcarouter.example.com/api/v1/ ",
+ }
+ self.embedding.validate_credentials("openai/text-embedding-3-small", credentials)
+ self.assertEqual(
+ credentials["endpoint_url"], "https://orcarouter.example.com/api/v1"
+ )
+
+ @patch.object(OAICompatEmbeddingModel, "validate_credentials")
+ def test_embedding_blank_endpoint_falls_back(self, mock_super_validate) -> None:
+ credentials = {"api_key": "test-key", "endpoint_url": " "}
+ self.embedding.validate_credentials("openai/text-embedding-3-small", credentials)
+ self.assertEqual(credentials["endpoint_url"], "https://api.orcarouter.ai/v1")
+
+
+class TestTTSEndpointUrlConfig(unittest.TestCase):
+ def setUp(self) -> None:
+ self.tts = OrcaRouterText2SpeechModel(model_schemas=[])
+
+ @patch.object(OAICompatText2SpeechModel, "validate_credentials")
+ def test_tts_validate_credentials_defaults_endpoint(
+ self, mock_super_validate
+ ) -> None:
+ credentials = {"api_key": "test-key"}
+ self.tts.validate_credentials("openai/tts-1", credentials)
+ self.assertEqual(credentials["endpoint_url"], "https://api.orcarouter.ai/v1")
+ self.assertNotIn("extra_headers", credentials)
+ mock_super_validate.assert_called_once_with("openai/tts-1", credentials)
+
+ @patch.object(OAICompatText2SpeechModel, "validate_credentials")
+ def test_tts_validate_credentials_normalizes_custom_endpoint(
+ self, mock_super_validate
+ ) -> None:
+ credentials = {
+ "api_key": "test-key",
+ "endpoint_url": " https://orcarouter.example.com/api/v1/ ",
+ }
+ self.tts.validate_credentials("openai/tts-1", credentials)
+ self.assertEqual(
+ credentials["endpoint_url"], "https://orcarouter.example.com/api/v1"
+ )
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/models/orcarouter/tests/test_llm_call.py b/models/orcarouter/tests/test_llm_call.py
new file mode 100644
index 000000000..a9d69ade0
--- /dev/null
+++ b/models/orcarouter/tests/test_llm_call.py
@@ -0,0 +1,89 @@
+"""L3 live integration test: invoke every predefined model with a tiny prompt.
+
+For each model in _position.yaml, run `Say hello in one word.` through PluginRunner
+and assert at least one chunk is streamed back. Requires ORCAROUTER_API_KEY env var.
+
+Adapted from openrouter's test_llm_call.py: env name and provider changed,
+retry-on-failure kept (some upstream providers occasionally rate-limit fresh keys).
+"""
+from __future__ import annotations
+
+import os
+import time
+from pathlib import Path
+
+import pytest
+import yaml
+
+from dify_plugin.config.integration_config import IntegrationConfig
+from dify_plugin.core.entities.plugin.request import (
+ ModelActions,
+ ModelInvokeLLMRequest,
+ PluginInvokeType,
+)
+from dify_plugin.entities.model import ModelType
+from dify_plugin.entities.model.llm import LLMResultChunk
+from dify_plugin.integration.run import PluginRunner
+
+
+def get_all_models() -> list[str]:
+ models_dir = Path(__file__).parent.parent / "models" / "llm"
+ position_file = models_dir / "_position.yaml"
+ if not position_file.exists():
+ raise FileNotFoundError(f"Missing model position file: {position_file}")
+
+ data = yaml.safe_load(position_file.read_text(encoding="utf-8"))
+ if data is None:
+ return []
+ if not isinstance(data, list):
+ raise ValueError(f"Expected a YAML list in {position_file}")
+
+ return [item.strip() for item in data if isinstance(item, str) and item.strip()]
+
+
+@pytest.mark.skipif(
+ not os.getenv("ORCAROUTER_API_KEY"),
+ reason="ORCAROUTER_API_KEY required for live LLM invocation test",
+)
+@pytest.mark.parametrize("model_name", get_all_models())
+def test_llm_invoke(model_name: str) -> None:
+ api_key = os.getenv("ORCAROUTER_API_KEY")
+
+ plugin_path = os.getenv("PLUGIN_FILE_PATH")
+ if not plugin_path:
+ plugin_path = str(Path(__file__).parent.parent)
+
+ payload = ModelInvokeLLMRequest(
+ user_id="test_user",
+ provider="orcarouter",
+ model_type=ModelType.LLM,
+ model=model_name,
+ credentials={"api_key": api_key},
+ prompt_messages=[{"role": "user", "content": "Say hello in one word."}],
+ stop=None,
+ tools=None,
+ stream=True,
+ model_parameters={},
+ )
+
+ with PluginRunner(
+ config=IntegrationConfig(), plugin_package_path=plugin_path
+ ) as runner:
+ failure_count = 0
+ while failure_count < 3:
+ try:
+ results: list[LLMResultChunk] = []
+ for result in runner.invoke(
+ access_type=PluginInvokeType.Model,
+ access_action=ModelActions.InvokeLLM,
+ payload=payload,
+ response_type=LLMResultChunk,
+ ):
+ results.append(result)
+ assert len(results) > 0, f"No results received for model {model_name}"
+ break
+ except Exception as e:
+ failure_count += 1
+ time.sleep(1)
+ if failure_count >= 3:
+ raise e
diff --git a/models/orcarouter/tests/test_orca_extra_body.py b/models/orcarouter/tests/test_orca_extra_body.py
new file mode 100644
index 000000000..6ca235c8a
--- /dev/null
+++ b/models/orcarouter/tests/test_orca_extra_body.py
@@ -0,0 +1,151 @@
+"""L2 offline tests: _set_orca_extra_body wraps fallback params into extra_body.
+
+OrcaRouter server expects request body to contain a top-level
+`extra_body: {models: [...], route: "fallback"}` key. This test verifies our
+llm.py method correctly pops the Dify-side parameter names
+(`orcarouter_fallback_models` + `orcarouter_route`) and assembles `extra_body`.
+"""
+from __future__ import annotations
+
+import sys
+import unittest
+from pathlib import Path
+
+sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
+
+from models.llm.llm import OrcaRouterLargeLanguageModel
+
+
+class TestSetOrcaExtraBody(unittest.TestCase):
+ def test_no_params_no_extra_body(self) -> None:
+ params: dict = {"temperature": 0.5}
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertNotIn("extra_body", params)
+ self.assertEqual(params, {"temperature": 0.5})
+
+ def test_fallback_models_only(self) -> None:
+ params = {
+ "temperature": 0.5,
+ "orcarouter_fallback_models": '["openai/gpt-4o-mini", "openai/gpt-4o"]',
+ }
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertNotIn("orcarouter_fallback_models", params)
+ self.assertEqual(
+ params["extra_body"],
+ {"models": ["openai/gpt-4o-mini", "openai/gpt-4o"]},
+ )
+
+ def test_route_only(self) -> None:
+ params = {"orcarouter_route": "fallback"}
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertNotIn("orcarouter_route", params)
+ self.assertEqual(params["extra_body"], {"route": "fallback"})
+
+ def test_both_fallback_and_route(self) -> None:
+ params = {
+ "orcarouter_fallback_models": '["a/b", "c/d"]',
+ "orcarouter_route": "fallback",
+ }
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertEqual(
+ params["extra_body"],
+ {"models": ["a/b", "c/d"], "route": "fallback"},
+ )
+ self.assertNotIn("orcarouter_fallback_models", params)
+ self.assertNotIn("orcarouter_route", params)
+
+ def test_invalid_json_silently_ignored(self) -> None:
+ params = {"orcarouter_fallback_models": "not valid json"}
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertNotIn("extra_body", params)
+ self.assertNotIn("orcarouter_fallback_models", params)
+
+ def test_empty_string_ignored(self) -> None:
+ params = {"orcarouter_fallback_models": "", "orcarouter_route": ""}
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertNotIn("extra_body", params)
+
+ def test_non_list_json_ignored(self) -> None:
+ params = {"orcarouter_fallback_models": '"a single string"'}
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertNotIn("extra_body", params)
+
+ def test_filters_empty_model_names(self) -> None:
+ params = {"orcarouter_fallback_models": '["a/b", "", null, "c/d"]'}
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertEqual(params["extra_body"]["models"], ["a/b", "c/d"])
+
+ def test_unknown_route_value_dropped(self) -> None:
+ # Server only accepts 'fallback' currently
+ params = {"orcarouter_route": "loadbalance"}
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertNotIn("extra_body", params)
+
+ def test_preserves_existing_extra_body(self) -> None:
+ params = {
+ "extra_body": {"custom_key": "preserved"},
+ "orcarouter_route": "fallback",
+ }
+ OrcaRouterLargeLanguageModel._set_orca_extra_body(params)
+ self.assertEqual(
+ params["extra_body"], {"custom_key": "preserved", "route": "fallback"}
+ )
+
+
+class TestSetReasoningParams(unittest.TestCase):
+ def test_no_params_no_reasoning(self) -> None:
+ params: dict = {"temperature": 0.5}
+ OrcaRouterLargeLanguageModel._set_reasoning_params("openai/gpt-4o", params)
+ self.assertNotIn("reasoning_effort", params)
+ self.assertNotIn("thinking", params)
+
+ def test_anthropic_enable_thinking_emits_native_block(self) -> None:
+ params = {"enable_thinking": True, "reasoning_budget": 2000}
+ OrcaRouterLargeLanguageModel._set_reasoning_params(
+ "anthropic/claude-opus-4.7", params
+ )
+ self.assertEqual(
+ params["thinking"], {"type": "enabled", "budget_tokens": 2000}
+ )
+ self.assertNotIn("enable_thinking", params)
+ self.assertNotIn("reasoning_budget", params)
+
+ def test_anthropic_thinking_disabled_no_block(self) -> None:
+ params = {"enable_thinking": False, "reasoning_budget": 2000}
+ OrcaRouterLargeLanguageModel._set_reasoning_params(
+ "anthropic/claude-opus-4.7", params
+ )
+ self.assertNotIn("thinking", params)
+
+ def test_openai_reasoning_effort_flat(self) -> None:
+ params = {"reasoning_effort": "high"}
+ OrcaRouterLargeLanguageModel._set_reasoning_params("openai/gpt-5", params)
+ self.assertEqual(params["reasoning_effort"], "high")
+ self.assertNotIn("thinking", params)
+ self.assertNotIn("reasoning", params)
+
+ def test_anthropic_ignores_reasoning_effort(self) -> None:
+ """Anthropic models don't use reasoning_effort — only thinking block."""
+ params = {"reasoning_effort": "high"}
+ OrcaRouterLargeLanguageModel._set_reasoning_params(
+ "anthropic/claude-opus-4.7", params
+ )
+ self.assertNotIn("reasoning_effort", params)
+
+ def test_exclude_reasoning_tokens_emits_include_reasoning(self) -> None:
+ params = {"exclude_reasoning_tokens": True}
+ OrcaRouterLargeLanguageModel._set_reasoning_params("openai/gpt-5", params)
+ self.assertEqual(params["include_reasoning"], False)
+
+ params = {"exclude_reasoning_tokens": False}
+ OrcaRouterLargeLanguageModel._set_reasoning_params("openai/gpt-5", params)
+ self.assertEqual(params["include_reasoning"], True)
+
+ def test_invalid_effort_dropped(self) -> None:
+ params = {"reasoning_effort": "ultra-high"}
+ OrcaRouterLargeLanguageModel._set_reasoning_params("openai/gpt-5", params)
+ self.assertNotIn("reasoning_effort", params)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/models/orcarouter/tests/test_orca_extra_body_live.py b/models/orcarouter/tests/test_orca_extra_body_live.py
new file mode 100644
index 000000000..062f4415f
--- /dev/null
+++ b/models/orcarouter/tests/test_orca_extra_body_live.py
@@ -0,0 +1,67 @@
+"""L3 live test: verify extra_body fallback routing actually reaches OrcaRouter.
+
+Calls openai/gpt-4o-mini with orcarouter_fallback_models=["openai/gpt-4o"].
+Success criteria: request returns 2xx (either primary or fallback served).
+This proves our llm.py correctly wraps the parameters into extra_body and
+OrcaRouter parses the field.
+
+Requires ORCAROUTER_API_KEY.
+"""
+from __future__ import annotations
+
+import os
+from pathlib import Path
+
+import pytest
+
+from dify_plugin.config.integration_config import IntegrationConfig
+from dify_plugin.core.entities.plugin.request import (
+ ModelActions,
+ ModelInvokeLLMRequest,
+ PluginInvokeType,
+)
+from dify_plugin.entities.model import ModelType
+from dify_plugin.entities.model.llm import LLMResultChunk
+from dify_plugin.integration.run import PluginRunner
+
+
+@pytest.mark.skipif(
+ not os.getenv("ORCAROUTER_API_KEY"),
+ reason="ORCAROUTER_API_KEY required for live extra_body test",
+)
+def test_fallback_models_extra_body() -> None:
+ api_key = os.getenv("ORCAROUTER_API_KEY")
+ plugin_path = os.getenv("PLUGIN_FILE_PATH") or str(Path(__file__).parent.parent)
+
+ payload = ModelInvokeLLMRequest(
+ user_id="test_user",
+ provider="orcarouter",
+ model_type=ModelType.LLM,
+ model="openai/gpt-4o-mini",
+ credentials={"api_key": api_key},
+ prompt_messages=[{"role": "user", "content": "Reply with the word 'ok'."}],
+ stop=None,
+ tools=None,
+ stream=True,
+ model_parameters={
+ "orcarouter_fallback_models": '["openai/gpt-4o"]',
+ "orcarouter_route": "fallback",
+ "max_tokens": 10,
+ },
+ )
+
+ with PluginRunner(
+ config=IntegrationConfig(), plugin_package_path=plugin_path
+ ) as runner:
+ results: list[LLMResultChunk] = []
+ for result in runner.invoke(
+ access_type=PluginInvokeType.Model,
+ access_action=ModelActions.InvokeLLM,
+ payload=payload,
+ response_type=LLMResultChunk,
+ ):
+ results.append(result)
+ assert len(results) > 0, (
+ "extra_body request should succeed (primary or fallback). "
+ "If this fails with 400, check that OrcaRouter accepts extra_body.models/route."
+ )
diff --git a/models/orcarouter/tests/test_yaml_schema.py b/models/orcarouter/tests/test_yaml_schema.py
new file mode 100644
index 000000000..c1cd5f2e4
--- /dev/null
+++ b/models/orcarouter/tests/test_yaml_schema.py
@@ -0,0 +1,86 @@
+"""L1 offline tests: model YAML schema correctness across llm / text_embedding / tts."""
+from __future__ import annotations
+
+from pathlib import Path
+
+import pytest
+import yaml
+
+MODELS_ROOT = Path(__file__).parent.parent / "models"
+LLM_DIR = MODELS_ROOT / "llm"
+EMBED_DIR = MODELS_ROOT / "text_embedding"
+TTS_DIR = MODELS_ROOT / "tts"
+
+ALLOWED_UNITS = {"0.000001", "0.001", "0.01"}
+
+
+def _yaml_files(d: Path) -> list[Path]:
+ if not d.exists():
+ return []
+ return sorted([p for p in d.glob("*.yaml") if p.name != "_position.yaml"])
+
+
+def _all_yaml_files() -> list[Path]:
+ return _yaml_files(LLM_DIR) + _yaml_files(EMBED_DIR) + _yaml_files(TTS_DIR)
+
+
+@pytest.mark.parametrize("yaml_path", _all_yaml_files())
+def test_model_yaml_parses(yaml_path: Path) -> None:
+ data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
+ assert isinstance(data, dict), f"{yaml_path.name}: top-level must be a dict"
+
+
+@pytest.mark.parametrize("yaml_path", _all_yaml_files())
+def test_model_yaml_has_core_fields(yaml_path: Path) -> None:
+ data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
+ for key in ("model", "label", "model_type", "model_properties", "pricing"):
+ assert key in data, f"{yaml_path.name} missing required key: {key}"
+
+
+@pytest.mark.parametrize("yaml_path", _all_yaml_files())
+def test_model_yaml_pricing(yaml_path: Path) -> None:
+ data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
+ p = data["pricing"]
+ assert p.get("currency") == "USD", f"{yaml_path.name}: currency must be USD"
+ assert p.get("unit") in ALLOWED_UNITS, f"{yaml_path.name}: unknown unit {p.get('unit')!r}"
+ assert float(p["input"]) >= 0, f"{yaml_path.name}: input price must be >= 0"
+ if "output" in p:
+ assert float(p["output"]) >= 0, f"{yaml_path.name}: output price must be >= 0"
+
+
+@pytest.mark.parametrize("yaml_path", _yaml_files(LLM_DIR))
+def test_llm_yaml_has_orcarouter_params(yaml_path: Path) -> None:
+ """Every LLM YAML must expose orcarouter_fallback_models + orcarouter_route."""
+ data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
+ names = {rule["name"] for rule in data.get("parameter_rules", [])}
+ assert "orcarouter_fallback_models" in names, f"{yaml_path.name} missing fallback_models"
+ assert "orcarouter_route" in names, f"{yaml_path.name} missing route"
+
+
+@pytest.mark.parametrize("yaml_path", _yaml_files(TTS_DIR))
+def test_tts_yaml_has_voices(yaml_path: Path) -> None:
+ data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
+ voices = data["model_properties"].get("voices") or []
+ assert len(voices) >= 1, f"{yaml_path.name}: must declare at least one voice"
+ assert data["model_properties"].get("default_voice"), f"{yaml_path.name}: missing default_voice"
+
+
+def test_llm_orcarouter_auto_first() -> None:
+ positions = yaml.safe_load((LLM_DIR / "_position.yaml").read_text(encoding="utf-8")) or []
+ assert positions[0] == "orcarouter/auto", f"expected orcarouter/auto first, got {positions[0]!r}"
+
+
+@pytest.mark.parametrize("dir_path", [LLM_DIR, EMBED_DIR, TTS_DIR])
+def test_position_entries_match_files(dir_path: Path) -> None:
+ pos_file = dir_path / "_position.yaml"
+ if not pos_file.exists():
+ pytest.skip(f"no position file in {dir_path.name}")
+ positions = set(yaml.safe_load(pos_file.read_text(encoding="utf-8")) or [])
+ yaml_models = set()
+ for f in _yaml_files(dir_path):
+ data = yaml.safe_load(f.read_text(encoding="utf-8"))
+ yaml_models.add(data["model"])
+ missing = positions - yaml_models
+ orphan = yaml_models - positions
+ assert not missing, f"{dir_path.name}/_position.yaml references missing YAMLs: {missing}"
+ assert not orphan, f"{dir_path.name} has orphan YAMLs not in _position.yaml: {orphan}"
diff --git a/models/orcarouter/tests/validate_classification.py b/models/orcarouter/tests/validate_classification.py
new file mode 100644
index 000000000..6aef7c141
--- /dev/null
+++ b/models/orcarouter/tests/validate_classification.py
@@ -0,0 +1,239 @@
+"""L4 classification validator (run from CLI, not via pytest).
+
+For each model YAML in models/llm/, send a minimal chat request to OrcaRouter
+with the parameters our YAML claims are supported. Report any 400 errors that
+suggest mis-classification (e.g., a model in plain_chat bucket that rejects
+temperature should be moved to openai_o bucket).
+
+Usage:
+ cd
+ export ORCAROUTER_API_KEY=sk-...
+ python tests/validate_classification.py
+ python tests/validate_classification.py --models openai/gpt-5 anthropic/claude-opus-4.7
+"""
+from __future__ import annotations
+
+import argparse
+import json
+import os
+import sys
+import time
+from pathlib import Path
+
+import requests
+import yaml
+
+LLM_DIR = Path(__file__).parent.parent / "models" / "llm"
+DEFAULT_ENDPOINT = "https://api.orcarouter.ai/v1"
+
+
+def load_yaml(model_id: str) -> dict | None:
+ fname = model_id.replace("/", "-") + ".yaml"
+ path = LLM_DIR / fname
+ if not path.exists():
+ return None
+ return yaml.safe_load(path.read_text(encoding="utf-8"))
+
+
+def build_test_payload(model_id: str, yaml_data: dict) -> dict:
+ """Construct a chat completion payload exercising every param our YAML lists.
+
+ Mirrors llm.py's payload shape:
+ - flat `reasoning_effort` (NOT nested reasoning block)
+ - Anthropic thinking left OFF (we just want a smoke test)
+ - skips orcarouter_* params (tested separately)
+
+ Special cases:
+ - kimi-k2.6: temperature MUST be 1
+ """
+ params = {rule["name"]: rule for rule in yaml_data.get("parameter_rules", [])}
+ body: dict = {
+ "model": model_id,
+ "messages": [{"role": "user", "content": "Reply with just 'ok'."}],
+ # stream: True is forced by probe_model() (some upstreams require it)
+ }
+ if "max_tokens" in params:
+ body["max_tokens"] = 10
+ if "temperature" in params:
+ # Respect param-rule constraints (kimi-k2.6 fixed at 1)
+ rule = params["temperature"]
+ if rule.get("min") == rule.get("max"):
+ body["temperature"] = rule.get("default") or rule.get("min")
+ else:
+ body["temperature"] = 0.5
+ if "top_p" in params:
+ rule = params["top_p"]
+ if rule.get("min") == rule.get("max"):
+ body["top_p"] = rule.get("default") or rule.get("min")
+ else:
+ body["top_p"] = 0.9
+ if "top_k" in params:
+ body["top_k"] = 40
+ if "reasoning_effort" in params:
+ body["reasoning_effort"] = "low" # flat field, OpenAI-native
+ # enable_thinking is left OFF in this smoke test
+ if "presence_penalty" in params:
+ body["presence_penalty"] = 0.0
+ if "frequency_penalty" in params:
+ body["frequency_penalty"] = 0.0
+ return body
+
+
+# Errors that indicate user/upstream environment problems, NOT plugin bugs.
+# Validator treats these as WARN (not FAIL) so classification correctness is
+# distinguishable from infra/account issues.
+ENV_ERROR_SIGNALS = [
+ "organization must be verified", # OpenAI gpt-5 / o-series org gate
+ "Read timed out", # transient network
+ "Connection refused",
+ "rate limit",
+ "Rate limit",
+ "quota",
+ "insufficient_quota",
+ "no available channel", # OrcaRouter no upstream configured
+ "all channels failed",
+ "channel quota",
+ "model is not available",
+ "only supported in v1/responses", # gpt-5-pro endpoint mismatch (model itself wrong)
+]
+
+
+def classify_error(msg: str) -> str:
+ """Return 'env' if error is user environment / upstream config, else 'plugin'."""
+ lower = msg.lower()
+ for sig in ENV_ERROR_SIGNALS:
+ if sig.lower() in lower:
+ return "env"
+ return "plugin"
+
+
+def probe_model(api_key: str, endpoint: str, model_id: str, body: dict, timeout: int = 300) -> tuple[str, str]:
+ """Return (status, message) where status is 'pass' | 'fail_plugin' | 'warn_env'.
+
+ Uses streaming since some upstreams (glm-4.5 etc.) require it. Reads the
+ SSE stream just enough to confirm at least one data chunk arrived.
+ """
+ body = {**body, "stream": True}
+ headers = {
+ "Authorization": f"Bearer {api_key}",
+ "Content-Type": "application/json",
+ "Accept": "text/event-stream",
+ }
+ try:
+ r = requests.post(
+ f"{endpoint}/chat/completions",
+ headers=headers,
+ json=body,
+ timeout=timeout,
+ stream=True,
+ )
+ except requests.RequestException as e:
+ msg = f"network error: {e}"
+ return ("warn_env" if classify_error(msg) == "env" else "fail_plugin", msg)
+
+ if r.status_code == 200:
+ chunks_seen = 0
+ try:
+ for raw in r.iter_lines(decode_unicode=True):
+ if not raw:
+ continue
+ if raw.startswith("data:"):
+ payload = raw[5:].strip()
+ if payload == "[DONE]":
+ break
+ try:
+ json.loads(payload)
+ chunks_seen += 1
+ if chunks_seen >= 2: # got real data
+ break
+ except json.JSONDecodeError:
+ continue
+ finally:
+ r.close()
+ if chunks_seen == 0:
+ return "fail_plugin", "200 but no SSE data chunks"
+ return "pass", f"OK ({chunks_seen}+ stream chunks)"
+
+ try:
+ err = r.json()
+ msg = err.get("error", {}).get("message") or json.dumps(err)[:200]
+ except json.JSONDecodeError:
+ msg = r.text[:200]
+ full_msg = f"HTTP {r.status_code}: {msg}"
+ return ("warn_env" if classify_error(msg) == "env" else "fail_plugin", full_msg)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--models", nargs="*", help="Limit to specific model IDs")
+ parser.add_argument(
+ "--endpoint",
+ default=os.getenv("ORCAROUTER_API_BASE_URL", DEFAULT_ENDPOINT),
+ )
+ parser.add_argument("--sleep", type=float, default=0.5, help="Delay between calls")
+ parser.add_argument(
+ "--timeout",
+ type=int,
+ default=300,
+ help="HTTP timeout per request in seconds (default 300; some reasoning models need this)",
+ )
+ args = parser.parse_args()
+
+ api_key = os.getenv("ORCAROUTER_API_KEY")
+ if not api_key:
+ print("ERROR: ORCAROUTER_API_KEY env var required", file=sys.stderr)
+ sys.exit(2)
+
+ if args.models:
+ targets = args.models
+ else:
+ position_file = LLM_DIR / "_position.yaml"
+ targets = yaml.safe_load(position_file.read_text(encoding="utf-8")) or []
+
+ print(f"Probing {len(targets)} models against {args.endpoint}\n")
+
+ results = []
+ for model_id in targets:
+ if model_id == "orcarouter/auto":
+ # AUTO router — exercise with no special params
+ body = {
+ "model": model_id,
+ "messages": [{"role": "user", "content": "Reply with just 'ok'."}],
+ "max_tokens": 10,
+ }
+ else:
+ yaml_data = load_yaml(model_id)
+ if not yaml_data:
+ print(f"[SKIP] {model_id}: no YAML file")
+ continue
+ body = build_test_payload(model_id, yaml_data)
+
+ status, msg = probe_model(api_key, args.endpoint, model_id, body, timeout=args.timeout)
+ label = {"pass": "PASS", "fail_plugin": "FAIL", "warn_env": "WARN"}[status]
+ print(f"[{label}] {model_id}: {msg}")
+ results.append((model_id, status, msg))
+ time.sleep(args.sleep)
+
+ print()
+ print("=" * 70)
+ passed = sum(1 for _, s, _ in results if s == "pass")
+ failed = sum(1 for _, s, _ in results if s == "fail_plugin")
+ warned = sum(1 for _, s, _ in results if s == "warn_env")
+ print(f"PASSED: {passed} / {len(results)}")
+ print(f"FAIL (plugin): {failed}")
+ print(f"WARN (env/infra): {warned}")
+ if failed:
+ print("\nReal plugin failures (suggest classification adjustment):")
+ for model_id, s, msg in results:
+ if s == "fail_plugin":
+ print(f" - {model_id}: {msg}")
+ if warned:
+ print("\nEnvironment / upstream issues (NOT plugin bugs):")
+ for model_id, s, msg in results:
+ if s == "warn_env":
+ print(f" - {model_id}: {msg}")
+ sys.exit(0 if failed == 0 else 1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/models/orcarouter/tests/validate_embedding_tts.py b/models/orcarouter/tests/validate_embedding_tts.py
new file mode 100644
index 000000000..0dcff448c
--- /dev/null
+++ b/models/orcarouter/tests/validate_embedding_tts.py
@@ -0,0 +1,177 @@
+"""Live validator for OrcaRouter embedding + TTS models.
+
+Probes each predefined embedding via POST /v1/embeddings and each TTS via
+POST /v1/audio/speech. Mirrors validate_classification.py's pattern of
+distinguishing plugin bugs from environment/upstream issues.
+
+Usage:
+ cd
+ export ORCAROUTER_API_KEY=sk-...
+ python tests/validate_embedding_tts.py
+ python tests/validate_embedding_tts.py --type embedding
+ python tests/validate_embedding_tts.py --type tts --timeout 600
+"""
+from __future__ import annotations
+
+import argparse
+import json
+import os
+import sys
+import time
+from pathlib import Path
+
+import requests
+import yaml
+
+PLUGIN_ROOT = Path(__file__).parent.parent
+EMBED_DIR = PLUGIN_ROOT / "models" / "text_embedding"
+TTS_DIR = PLUGIN_ROOT / "models" / "tts"
+DEFAULT_ENDPOINT = "https://api.orcarouter.ai/v1"
+
+ENV_ERROR_SIGNALS = [
+ "organization must be verified",
+ "Read timed out",
+ "Connection refused",
+ "rate limit",
+ "Rate limit",
+ "quota",
+ "insufficient_quota",
+ "no available channel",
+ "all channels failed",
+ "channel quota",
+ "model is not available",
+]
+
+
+def classify_error(msg: str) -> str:
+ lower = msg.lower()
+ return "env" if any(s.lower() in lower for s in ENV_ERROR_SIGNALS) else "plugin"
+
+
+def load_models(d: Path) -> list[str]:
+ pos = d / "_position.yaml"
+ if not pos.exists():
+ return []
+ return yaml.safe_load(pos.read_text(encoding="utf-8")) or []
+
+
+def default_voice_for(model: str) -> str:
+ yaml_path = TTS_DIR / (model.replace("/", "-") + ".yaml")
+ if not yaml_path.exists():
+ return "alloy"
+ data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
+ return data["model_properties"].get("default_voice", "alloy")
+
+
+def probe_embedding(api_key: str, endpoint: str, model: str, timeout: int) -> tuple[str, str]:
+ body = {"model": model, "input": "Hello from OrcaRouter plugin validation."}
+ headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
+ try:
+ r = requests.post(f"{endpoint}/embeddings", headers=headers, json=body, timeout=timeout)
+ except requests.RequestException as e:
+ msg = f"network error: {e}"
+ return ("warn_env" if classify_error(msg) == "env" else "fail_plugin", msg)
+
+ if r.status_code == 200:
+ try:
+ data = r.json()
+ embed = data["data"][0]["embedding"]
+ return "pass", f"OK ({len(embed)}-dim vector)"
+ except (KeyError, IndexError, json.JSONDecodeError) as e:
+ return "fail_plugin", f"200 but bad body: {e}"
+
+ try:
+ err = r.json().get("error", {}).get("message") or r.text[:200]
+ except json.JSONDecodeError:
+ err = r.text[:200]
+ full_msg = f"HTTP {r.status_code}: {err}"
+ return ("warn_env" if classify_error(err) == "env" else "fail_plugin", full_msg)
+
+
+def probe_tts(api_key: str, endpoint: str, model: str, timeout: int) -> tuple[str, str]:
+ body = {
+ "model": model,
+ "input": "Hello.",
+ "voice": default_voice_for(model),
+ "response_format": "mp3",
+ }
+ headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
+ try:
+ r = requests.post(f"{endpoint}/audio/speech", headers=headers, json=body, timeout=timeout)
+ except requests.RequestException as e:
+ msg = f"network error: {e}"
+ return ("warn_env" if classify_error(msg) == "env" else "fail_plugin", msg)
+
+ if r.status_code == 200:
+ size = len(r.content)
+ if size < 100:
+ return "fail_plugin", f"200 but suspiciously small audio: {size} bytes"
+ return "pass", f"OK ({size} bytes mp3)"
+
+ try:
+ err = r.json().get("error", {}).get("message") or r.text[:200]
+ except json.JSONDecodeError:
+ err = r.text[:200]
+ full_msg = f"HTTP {r.status_code}: {err}"
+ return ("warn_env" if classify_error(err) == "env" else "fail_plugin", full_msg)
+
+
+def run(probe_fn, label: str, models: list[str], api_key: str, endpoint: str, sleep: float, timeout: int):
+ print(f"\n=== {label} ({len(models)} models) ===")
+ results = []
+ for m in models:
+ status, msg = probe_fn(api_key, endpoint, m, timeout)
+ emoji = {"pass": "PASS", "fail_plugin": "FAIL", "warn_env": "WARN"}[status]
+ print(f"[{emoji}] {m}: {msg}")
+ results.append((m, status, msg))
+ time.sleep(sleep)
+ return results
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--type", choices=["embedding", "tts", "both"], default="both")
+ parser.add_argument("--endpoint", default=os.getenv("ORCAROUTER_API_BASE_URL", DEFAULT_ENDPOINT))
+ parser.add_argument("--sleep", type=float, default=0.5)
+ parser.add_argument("--timeout", type=int, default=300, help="HTTP timeout per request in seconds (default 300)")
+ args = parser.parse_args()
+
+ api_key = os.getenv("ORCAROUTER_API_KEY")
+ if not api_key:
+ print("ERROR: ORCAROUTER_API_KEY env var required", file=sys.stderr)
+ sys.exit(2)
+
+ print(f"Endpoint: {args.endpoint}")
+ all_results = []
+
+ if args.type in ("embedding", "both"):
+ models = load_models(EMBED_DIR)
+ all_results += run(probe_embedding, "Embedding (POST /v1/embeddings)", models, api_key, args.endpoint, args.sleep, args.timeout)
+
+ if args.type in ("tts", "both"):
+ models = load_models(TTS_DIR)
+ all_results += run(probe_tts, "TTS (POST /v1/audio/speech)", models, api_key, args.endpoint, args.sleep, args.timeout)
+
+ print()
+ print("=" * 70)
+ passed = sum(1 for _, s, _ in all_results if s == "pass")
+ failed = sum(1 for _, s, _ in all_results if s == "fail_plugin")
+ warned = sum(1 for _, s, _ in all_results if s == "warn_env")
+ print(f"PASSED: {passed} / {len(all_results)}")
+ print(f"FAIL (plugin): {failed}")
+ print(f"WARN (env/infra): {warned}")
+ if failed:
+ print("\nReal plugin failures (suggest YAML/code fix):")
+ for m, s, msg in all_results:
+ if s == "fail_plugin":
+ print(f" - {m}: {msg}")
+ if warned:
+ print("\nEnvironment / upstream issues (NOT plugin bugs):")
+ for m, s, msg in all_results:
+ if s == "warn_env":
+ print(f" - {m}: {msg}")
+ sys.exit(0 if failed == 0 else 1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/models/orcarouter/uv.lock b/models/orcarouter/uv.lock
new file mode 100644
index 000000000..b8b62a68d
--- /dev/null
+++ b/models/orcarouter/uv.lock
@@ -0,0 +1,1326 @@
+version = 1
+revision = 3
+requires-python = ">=3.12"
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
+]
+
+[[package]]
+name = "anyio"
+version = "4.13.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" },
+]
+
+[[package]]
+name = "black"
+version = "26.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "mypy-extensions" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "platformdirs" },
+ { name = "pytokens" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", size = 666155, upload-time = "2026-03-12T03:36:03.593Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1", size = 1895920, upload-time = "2026-03-12T03:40:13.921Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", size = 1718499, upload-time = "2026-03-12T03:40:15.239Z" },
+ { url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", size = 1794994, upload-time = "2026-03-12T03:40:17.124Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983", size = 1420867, upload-time = "2026-03-12T03:40:18.83Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb", size = 1230124, upload-time = "2026-03-12T03:40:20.425Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54", size = 1895034, upload-time = "2026-03-12T03:40:21.813Z" },
+ { url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", size = 1718503, upload-time = "2026-03-12T03:40:23.666Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", size = 1793557, upload-time = "2026-03-12T03:40:25.497Z" },
+ { url = "https://files.pythonhosted.org/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839", size = 1422766, upload-time = "2026-03-12T03:40:27.14Z" },
+ { url = "https://files.pythonhosted.org/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2", size = 1232140, upload-time = "2026-03-12T03:40:28.882Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78", size = 1889234, upload-time = "2026-03-12T03:40:30.964Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568", size = 1720522, upload-time = "2026-03-12T03:40:32.346Z" },
+ { url = "https://files.pythonhosted.org/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f", size = 1787824, upload-time = "2026-03-12T03:40:33.636Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c", size = 1445855, upload-time = "2026-03-12T03:40:35.442Z" },
+ { url = "https://files.pythonhosted.org/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1", size = 1258109, upload-time = "2026-03-12T03:40:36.832Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", size = 207542, upload-time = "2026-03-12T03:36:01.668Z" },
+]
+
+[[package]]
+name = "blinker"
+version = "1.9.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2026.4.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
+ { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
+ { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" },
+ { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" },
+ { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" },
+ { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" },
+ { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" },
+ { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" },
+ { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" },
+ { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" },
+ { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" },
+ { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" },
+ { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" },
+ { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" },
+ { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" },
+ { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" },
+ { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" },
+ { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" },
+ { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" },
+ { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" },
+ { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" },
+ { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" },
+ { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" },
+ { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" },
+ { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" },
+]
+
+[[package]]
+name = "click"
+version = "8.3.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bb/63/f9e1ea081ce35720d8b92acde70daaedace594dc93b693c869e0d5910718/click-8.3.3.tar.gz", hash = "sha256:398329ad4837b2ff7cbe1dd166a4c0f8900c3ca3a218de04466f38f6497f18a2", size = 328061, upload-time = "2026-04-22T15:11:27.506Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/44/c1221527f6a71a01ec6fbad7fa78f1d50dfa02217385cf0fa3eec7087d59/click-8.3.3-py3-none-any.whl", hash = "sha256:a2bf429bb3033c89fa4936ffb35d5cb471e3719e1f3c8a7c3fff0b8314305613", size = 110502, upload-time = "2026-04-22T15:11:25.044Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "dify-plugin"
+version = "0.5.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "dpkt" },
+ { name = "flask" },
+ { name = "gevent" },
+ { name = "httpx" },
+ { name = "packaging" },
+ { name = "pydantic" },
+ { name = "pydantic-settings" },
+ { name = "pyyaml" },
+ { name = "requests" },
+ { name = "socksio" },
+ { name = "tiktoken" },
+ { name = "werkzeug" },
+ { name = "yarl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b0/1f/7d8b02be4e5976778d0d40a616b56f386a295bd1535de737dc346256df4a/dify_plugin-0.5.1.tar.gz", hash = "sha256:e5e5e5bd0e5081d5eac6461ee4a1d61c7c29f4378aba1bf9bd4e628c421615b0", size = 304507, upload-time = "2025-10-20T06:44:04.107Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/82/072050dba3b9b1ac29273681a67334439ea8fe1fb38796693c7b28646151/dify_plugin-0.5.1-py3-none-any.whl", hash = "sha256:c965f95431b69f1a64022f743fc6efacffe3d5cd6a33d122885c2bec5f4dae3a", size = 338635, upload-time = "2025-10-20T06:44:02.422Z" },
+]
+
+[[package]]
+name = "dpkt"
+version = "1.9.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/7d/52f17a794db52a66e46ebb0c7549bf2f035ed61d5a920ba4aaa127dd038e/dpkt-1.9.8.tar.gz", hash = "sha256:43f8686e455da5052835fd1eda2689d51de3670aac9799b1b00cfd203927ee45", size = 180073, upload-time = "2022-08-18T05:54:13.582Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/79/479e2194c9096b92aecdf33634ae948d2be306c6011673e98ee1917f32c2/dpkt-1.9.8-py3-none-any.whl", hash = "sha256:4da4d111d7bf67575b571f5c678c71bddd2d8a01a3d57d489faf0a92c748fbfd", size = 194973, upload-time = "2022-08-18T05:54:10.793Z" },
+]
+
+[[package]]
+name = "flask"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "blinker" },
+ { name = "click" },
+ { name = "itsdangerous" },
+ { name = "jinja2" },
+ { name = "werkzeug" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/41/e1/d104c83026f8d35dfd2c261df7d64738341067526406b40190bc063e829a/flask-3.0.3.tar.gz", hash = "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842", size = 676315, upload-time = "2024-04-07T19:26:11.035Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/61/80/ffe1da13ad9300f87c93af113edd0638c75138c42a0994becfacac078c06/flask-3.0.3-py3-none-any.whl", hash = "sha256:34e815dfaa43340d1d15a5c3a02b8476004037eb4840b34910c6e21679d288f3", size = 101735, upload-time = "2024-04-07T19:26:08.569Z" },
+]
+
+[[package]]
+name = "gevent"
+version = "25.5.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "platform_python_implementation == 'CPython' and sys_platform == 'win32'" },
+ { name = "greenlet", marker = "platform_python_implementation == 'CPython'" },
+ { name = "zope-event" },
+ { name = "zope-interface" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f1/58/267e8160aea00ab00acd2de97197eecfe307064a376fb5c892870a8a6159/gevent-25.5.1.tar.gz", hash = "sha256:582c948fa9a23188b890d0bc130734a506d039a2e5ad87dae276a456cc683e61", size = 6388207, upload-time = "2025-05-12T12:57:59.833Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/58/c5/cf71423666a0b83db3d7e3f85788bc47d573fca5fe62b798fe2c4273de7c/gevent-25.5.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d87c0a1bd809d8f70f96b9b229779ec6647339830b8888a192beed33ac8d129f", size = 2909333, upload-time = "2025-05-12T11:11:34.883Z" },
+ { url = "https://files.pythonhosted.org/packages/26/7e/d2f174ee8bec6eb85d961ca203bc599d059c857b8412e367b8fa206603a5/gevent-25.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b87a4b66edb3808d4d07bbdb0deed5a710cf3d3c531e082759afd283758bb649", size = 1788420, upload-time = "2025-05-12T11:52:30.306Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/f3/3aba8c147b9108e62ba348c726fe38ae69735a233db425565227336e8ce6/gevent-25.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f076779050029a82feb0cb1462021d3404d22f80fa76a181b1a7889cd4d6b519", size = 1868854, upload-time = "2025-05-12T11:54:21.564Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/b1/11a5453f8fcebe90a456471fad48bd154c6a62fcb96e3475a5e408d05fc8/gevent-25.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb673eb291c19370f69295f7a881a536451408481e2e3deec3f41dedb7c281ec", size = 1833946, upload-time = "2025-05-12T12:00:05.514Z" },
+ { url = "https://files.pythonhosted.org/packages/70/1c/37d4a62303f86e6af67660a8df38c1171b7290df61b358e618c6fea79567/gevent-25.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1325ed44225c8309c0dd188bdbbbee79e1df8c11ceccac226b861c7d52e4837", size = 2070583, upload-time = "2025-05-12T11:33:02.803Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/8f/3b14929ff28263aba1d268ea97bcf104be1a86ba6f6bb4633838e7a1905e/gevent-25.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fcd5bcad3102bde686d0adcc341fade6245186050ce14386d547ccab4bd54310", size = 1808341, upload-time = "2025-05-12T11:59:59.154Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/fc/674ec819fb8a96e482e4d21f8baa43d34602dba09dfce7bbdc8700899d1b/gevent-25.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a93062609e8fa67ec97cd5fb9206886774b2a09b24887f40148c9c37e6fb71c", size = 2137974, upload-time = "2025-05-12T11:40:54.78Z" },
+ { url = "https://files.pythonhosted.org/packages/05/9a/048b7f5e28c54e4595ad4a8ad3c338fa89560e558db2bbe8273f44f030de/gevent-25.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:2534c23dc32bed62b659ed4fd9e198906179e68b26c9276a897e04163bdde806", size = 1638344, upload-time = "2025-05-12T12:08:31.776Z" },
+ { url = "https://files.pythonhosted.org/packages/10/25/2162b38d7b48e08865db6772d632bd1648136ce2bb50e340565e45607cad/gevent-25.5.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a022a9de9275ce0b390b7315595454258c525dc8287a03f1a6cacc5878ab7cbc", size = 2928044, upload-time = "2025-05-12T11:11:36.33Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/e0/dbd597a964ed00176da122ea759bf2a6c1504f1e9f08e185379f92dc355f/gevent-25.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fae8533f9d0ef3348a1f503edcfb531ef7a0236b57da1e24339aceb0ce52922", size = 1788751, upload-time = "2025-05-12T11:52:32.643Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/74/960cc4cf4c9c90eafbe0efc238cdf588862e8e278d0b8c0d15a0da4ed480/gevent-25.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c7b32d9c3b5294b39ea9060e20c582e49e1ec81edbfeae6cf05f8ad0829cb13d", size = 1869766, upload-time = "2025-05-12T11:54:23.903Z" },
+ { url = "https://files.pythonhosted.org/packages/56/78/fa84b1c7db79b156929685db09a7c18c3127361dca18a09e998e98118506/gevent-25.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b95815fe44f318ebbfd733b6428b4cb18cc5e68f1c40e8501dd69cc1f42a83d", size = 1835358, upload-time = "2025-05-12T12:00:06.794Z" },
+ { url = "https://files.pythonhosted.org/packages/00/5c/bfefe3822bbca5b83bfad256c82251b3f5be13d52d14e17a786847b9b625/gevent-25.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d316529b70d325b183b2f3f5cde958911ff7be12eb2b532b5c301f915dbbf1e", size = 2073071, upload-time = "2025-05-12T11:33:04.2Z" },
+ { url = "https://files.pythonhosted.org/packages/20/e4/08a77a3839a37db96393dea952e992d5846a881b887986dde62ead6b48a1/gevent-25.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f6ba33c13db91ffdbb489a4f3d177a261ea1843923e1d68a5636c53fe98fa5ce", size = 1809805, upload-time = "2025-05-12T12:00:00.537Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/ac/28848348f790c1283df74b0fc0a554271d0606676470f848eccf84eae42a/gevent-25.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37ee34b77c7553777c0b8379915f75934c3f9c8cd32f7cd098ea43c9323c2276", size = 2138305, upload-time = "2025-05-12T11:40:56.566Z" },
+ { url = "https://files.pythonhosted.org/packages/52/9e/0e9e40facd2d714bfb00f71fc6dacaacc82c24c1c2e097bf6461e00dec9f/gevent-25.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fa6aa0da224ed807d3b76cdb4ee8b54d4d4d5e018aed2478098e685baae7896", size = 1637444, upload-time = "2025-05-12T12:17:45.995Z" },
+ { url = "https://files.pythonhosted.org/packages/60/16/b71171e97ec7b4ded8669542f4369d88d5a289e2704efbbde51e858e062a/gevent-25.5.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:0bacf89a65489d26c7087669af89938d5bfd9f7afb12a07b57855b9fad6ccbd0", size = 2937113, upload-time = "2025-05-12T11:12:03.191Z" },
+]
+
+[[package]]
+name = "greenlet"
+version = "3.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3c/3f/dbf99fb14bfeb88c28f16729215478c0e265cacd6dc22270c8f31bb6892f/greenlet-3.5.0.tar.gz", hash = "sha256:d419647372241bc68e957bf38d5c1f98852155e4146bd1e4121adea81f4f01e4", size = 196995, upload-time = "2026-04-27T13:37:15.544Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ef/32/f2ce6d4cac3e55bc6173f92dbe627e782e1850f89d986c3606feb63aafa7/greenlet-3.5.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:db2910d3c809444e0a20147361f343fe2798e106af8d9d8506f5305302655a9f", size = 286228, upload-time = "2026-04-27T12:20:34.421Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/aa/caed9e5adf742315fc7be2a84196373aab4816e540e38ba0d76cb7584d68/greenlet-3.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ec9ea74e7268ace7f9aab1b1a4e730193fc661b39a993cd91c606c32d4a3628", size = 601775, upload-time = "2026-04-27T12:52:41.045Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/af/90ae08497400a941595d12774447f752d3dfe0fbb012e35b76bc5c0ff37e/greenlet-3.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54d243512da35485fc7a6bf3c178fdda6327a9d6506fcdd62b1abd1e41b2927b", size = 614436, upload-time = "2026-04-27T12:59:41.595Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/e9/4eeadf8cb3403ac274245ba75f07844abc7fa5f6787583fc9156ba741e0f/greenlet-3.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:41353ec2ecedf7aa8f682753a41919f8718031a6edac46b8d3dc7ed9e1ceb136", size = 620610, upload-time = "2026-04-27T13:02:39.194Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/e0/2e13df68f367e2f9960616927d60857dd7e56aaadd59a47c644216b2f920/greenlet-3.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d280a7f5c331622c69f97eb167f33577ff2d1df282c41cd15907fc0a3ca198c", size = 611388, upload-time = "2026-04-27T12:25:28.008Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/ef/f913b3c0eb7d26d86a2401c5e1546c9d46b657efee724b06f6f4ac5d8824/greenlet-3.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:58c1c374fe2b3d852f9b6b11a7dff4c85404e51b9a596fd9e89cf904eb09866d", size = 422775, upload-time = "2026-04-27T13:05:14.261Z" },
+ { url = "https://files.pythonhosted.org/packages/82/f7/393c64055132ac0d488ef6be549253b7e6274194863967ddc0bc8f5b87b8/greenlet-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1eb67d5adefb5bd2e182d42678a328979a209e4e82eb93575708185d31d1f588", size = 1570768, upload-time = "2026-04-27T12:53:28.099Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/4b/eaf7735253522cf56d1b74d672a58f54fc114702ceaf05def59aae72f6e1/greenlet-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2628d6c86f6cb0cb45e0c3c54058bbec559f57eaae699447748cb3928150577e", size = 1635983, upload-time = "2026-04-27T12:25:26.903Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/fe/4fb3a0805bd5165da5ebf858da7cc01cce8061674106d2cf5bdab32cbfde/greenlet-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:d4d9f0624c775f2dfc56ba54d515a8c771044346852a918b405914f6b19d7fd8", size = 238840, upload-time = "2026-04-27T12:23:54.806Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/cb/baa584cb00532126ffe12d9787db0a60c5a4f55c27bfe2666df5d4c30a32/greenlet-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:83ed9f27f1680b50e89f40f6df348a290ea234b249a4003d366663a12eab94f2", size = 235615, upload-time = "2026-04-27T12:21:38.57Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/58/fc576f99037ce19c5aa16628e4c3226b6d1419f72a62c79f5f40576e6eb3/greenlet-3.5.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:5a5ed18de6a0f6cc7087f1563f6bd93fc7df1c19165ca01e9bde5a5dc281d106", size = 285066, upload-time = "2026-04-27T12:23:05.033Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/ba/b28ddbe6bfad6a8ac196ef0e8cff37bc65b79735995b9e410923fffeeb70/greenlet-3.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a717fbc46d8a354fa675f7c1e813485b6ba3885f9bef0cd56e5ba27d758ff5b", size = 604414, upload-time = "2026-04-27T12:52:42.358Z" },
+ { url = "https://files.pythonhosted.org/packages/09/06/4b69f8f0b67603a8be2790e55107a190b376f2627fe0eaf5695d85ffb3cd/greenlet-3.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ddc090c5c1792b10246a78e8c2163ebbe04cf877f9d785c230a7b27b39ad038e", size = 617349, upload-time = "2026-04-27T12:59:43.32Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/15/a643b4ecd09969e30b8a150d5919960caae0abe4f5af75ab040b1ab85e78/greenlet-3.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4964101b8585c144cbda5532b1aa644255126c08a265dae90c16e7a0e63aaa9d", size = 623234, upload-time = "2026-04-27T13:02:40.611Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/17/a3918541fd0ddefe024a69de6d16aa7b46d36ac19562adaa63c7fa180eff/greenlet-3.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2094acd54b272cb6eae8c03dd87b3fa1820a4cef18d6889c378d503500a1dc13", size = 613927, upload-time = "2026-04-27T12:25:30.28Z" },
+ { url = "https://files.pythonhosted.org/packages/77/18/3b13d5ef1275b0ffaf933b05efa21408ac4ca95823c7411d79682e4fdcff/greenlet-3.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:7022615368890680e67b9965d33f5773aade330d5343bbe25560135aaa849eae", size = 425243, upload-time = "2026-04-27T13:05:15.689Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/e1/bd0af6213c7dd33175d8a462d4c1fe1175124ebed4855bc1475a5b5242c2/greenlet-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5e05ba267789ea87b5a155cf0e810b1ab88bf18e9e8740813945ceb8ee4350ba", size = 1570893, upload-time = "2026-04-27T12:53:29.483Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/2a/0789702f864f5382cb476b93d7a9c823c10472658102ccd65f415747d2e2/greenlet-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0ecec963079cd58cbd14723582384f11f166fd58883c15dcbfb342e0bc9b5846", size = 1636060, upload-time = "2026-04-27T12:25:28.845Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/8f/22bf9df92bbff0eb07842b60f7e63bf7675a9742df628437a9f02d09137f/greenlet-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:728d9667d8f2f586644b748dbd9bb67e50d6a9381767d1357714ea6825bb3bf5", size = 238740, upload-time = "2026-04-27T12:24:01.341Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/b7/9c5c3d653bd4ff614277c049ac676422e2c557db47b4fe43e6313fc005dc/greenlet-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:47422135b1d308c14b2c6e758beedb1acd33bb91679f5670edf77bf46244722b", size = 235525, upload-time = "2026-04-27T12:23:12.308Z" },
+ { url = "https://files.pythonhosted.org/packages/94/5e/a70f31e3e8d961c4ce589c15b28e4225d63704e431a23932a3808cbcc867/greenlet-3.5.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:f35807464c4c58c55f0d31dfa83c541a5615d825c2fe3d2b95360cf7c4e3c0a8", size = 285564, upload-time = "2026-04-27T12:23:08.555Z" },
+ { url = "https://files.pythonhosted.org/packages/af/a6/046c0a28e21833e4086918218cfb3d8bed51c075a1b700f20b9d7861c0f4/greenlet-3.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55fa7ea52771be44af0de27d8b80c02cd18c2c3cddde6c847ecebdf72418b6a1", size = 651166, upload-time = "2026-04-27T12:52:43.644Z" },
+ { url = "https://files.pythonhosted.org/packages/47/f8/4af27f71c5ff32a7fbc516adb46370d9c4ae2bc7bd3dc7d066ac542b4b15/greenlet-3.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a97e4821aa710603f94de0da25f25096454d78ffdace5dc77f3a006bc01abba3", size = 663792, upload-time = "2026-04-27T12:59:44.93Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/89/2dadb89793c37ee8b4c237857188293e9060dc085f19845c292e00f8e091/greenlet-3.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf2d8a80bec89ab46221ae45c5373d5ba0bd36c19aa8508e85c6cd7e5106cd37", size = 668086, upload-time = "2026-04-27T13:02:42.314Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/59/1bd6d7428d6ed9106efbb8c52310c60fd04f6672490f452aeaa3829aa436/greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f52a464e4ed91780bdfbbdd2b97197f3accaa629b98c200f4dffada759f3ae7", size = 660933, upload-time = "2026-04-27T12:25:33.276Z" },
+ { url = "https://files.pythonhosted.org/packages/82/35/75722be7e26a2af4cbd2dc35b0ed382dacf9394b7e75551f76ed1abe87f2/greenlet-3.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:1bae92a1dd94c5f9d9493c3a212dd874c202442047cf96446412c862feca83a2", size = 470799, upload-time = "2026-04-27T13:05:17.094Z" },
+ { url = "https://files.pythonhosted.org/packages/83/e4/b903e5a5fae1e8a28cdd32a0cfbfd560b668c25b692f67768822ddc5f40f/greenlet-3.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:762612baf1161ccb8437c0161c668a688223cba28e1bf038f4eb47b13e39ccdf", size = 1618401, upload-time = "2026-04-27T12:53:31.062Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/e3/5ec408a329acb854fb607a122e1ee5fb3ff649f9a97952948a90803c0d8e/greenlet-3.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:57a43c6079a89713522bc4bcb9f75070ecf5d3dbad7792bfe42239362cbf2a16", size = 1682038, upload-time = "2026-04-27T12:25:31.838Z" },
+ { url = "https://files.pythonhosted.org/packages/91/20/6b165108058767ee643c55c5c4904d591a830ee2b3c7dbd359828fbc829f/greenlet-3.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bc59be3945ae9750b9e7d45067d01ae3fe90ea5f9ade99239dabdd6e28a5033", size = 239835, upload-time = "2026-04-27T12:24:54.136Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/62/1c498375cee177b55d980c1db319f26470e5309e54698c8f8fc06c0fd539/greenlet-3.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:a96fcee45e03fe30a62669fd16ab5c9d3c172660d3085605cb1e2d1280d3c988", size = 236862, upload-time = "2026-04-27T12:23:24.957Z" },
+ { url = "https://files.pythonhosted.org/packages/78/a8/4522939255bb5409af4e87132f915446bf3622c2c292d14d3c38d128ae82/greenlet-3.5.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:a10a732421ab4fec934783ce3e54763470d0181db6e3468f9103a275c3ed1853", size = 293614, upload-time = "2026-04-27T12:24:12.874Z" },
+ { url = "https://files.pythonhosted.org/packages/15/5e/8744c52e2c027b5a8772a01561934c8835f869733e101f62075c60430340/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fc391b1566f2907d17aaebe78f8855dc45675159a775fcf9e61f8ee0078e87f", size = 650723, upload-time = "2026-04-27T12:52:45.412Z" },
+ { url = "https://files.pythonhosted.org/packages/00/ef/7b4c39c03cf46ceca512c5d3f914afd85aa30b2cc9a93015b0dd73e4be6c/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:680bd0e7ad5e8daa8a4aa89f68fd6adc834b8a8036dc256533f7e08f4a4b01f7", size = 656529, upload-time = "2026-04-27T12:59:46.295Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/5c/0602239503b124b70e39355cbdb39361ecfe65b87a5f2f63752c32f5286f/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1aa4ce8debcd4ea7fb2e150f3036588c41493d1d52c43538924ae1819003f4ce", size = 657015, upload-time = "2026-04-27T13:02:43.973Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/b5/c7768f352f5c010f92064d0063f987e7dc0cd290a6d92a34109015ce4aa1/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddb36c7d6c9c0a65f18c7258634e0c416c6ab59caac8c987b96f80c2ebda0112", size = 654364, upload-time = "2026-04-27T12:25:35.64Z" },
+ { url = "https://files.pythonhosted.org/packages/38/51/8699f865f125dc952384cb432b0f7138aa4d8f2969a7d12d0df5b94d054d/greenlet-3.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:728a73687e39ae9ca34e4694cbf2f049d3fbc7174639468d0f67200a97d8f9e2", size = 488275, upload-time = "2026-04-27T13:05:18.28Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/d0/079ebe12e4b1fc758857ce5be1a5e73f06870f2101e52611d1e71925ce54/greenlet-3.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e5ddf316ced87539144621453c3aef229575825fe60c604e62bedc4003f372b2", size = 1614204, upload-time = "2026-04-27T12:53:32.618Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/89/6c2fb63df3596552d20e58fb4d96669243388cf680cff222758812c7bfaa/greenlet-3.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4a448128607be0de65342dc9b31be7f948ef4cc0bc8832069350abefd310a8f2", size = 1675480, upload-time = "2026-04-27T12:25:34.168Z" },
+ { url = "https://files.pythonhosted.org/packages/15/32/77ee8a6c1564fc345a491a4e85b3bf360e4cf26eac98c4532d2fdb96e01f/greenlet-3.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d60097128cb0a1cab9ea541186ea13cd7b847b8449a7787c2e2350da0cb82d86", size = 245324, upload-time = "2026-04-27T12:24:40.295Z" },
+]
+
+[[package]]
+name = "h11"
+version = "0.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
+]
+
+[[package]]
+name = "httpcore"
+version = "1.0.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "h11" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
+]
+
+[[package]]
+name = "httpx"
+version = "0.28.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio" },
+ { name = "certifi" },
+ { name = "httpcore" },
+ { name = "idna" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.15"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "itsdangerous"
+version = "2.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
+ { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
+ { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
+ { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
+ { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
+ { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
+ { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
+ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
+ { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
+ { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
+ { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
+ { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
+ { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
+ { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
+ { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
+]
+
+[[package]]
+name = "multidict"
+version = "6.7.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" },
+ { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" },
+ { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" },
+ { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" },
+ { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" },
+ { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" },
+ { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" },
+ { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" },
+ { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" },
+ { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" },
+ { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" },
+ { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" },
+ { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" },
+ { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" },
+ { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" },
+ { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" },
+ { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" },
+ { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" },
+ { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" },
+ { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" },
+ { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" },
+ { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" },
+ { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" },
+ { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" },
+ { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" },
+ { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" },
+ { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" },
+ { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" },
+ { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" },
+]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" },
+]
+
+[[package]]
+name = "orcarouter"
+version = "0.1.0"
+source = { virtual = "." }
+dependencies = [
+ { name = "dify-plugin" },
+ { name = "pydantic" },
+ { name = "requests" },
+ { name = "sniffio" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "black" },
+ { name = "pyrefly" },
+ { name = "pytest" },
+ { name = "pyyaml" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "dify-plugin", specifier = ">=0.5.0,<0.6.0" },
+ { name = "pydantic", specifier = ">=2.11.0" },
+ { name = "requests", specifier = ">=2.32.0" },
+ { name = "sniffio", specifier = ">=1.3.1" },
+]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "black", specifier = ">=25.11.0" },
+ { name = "pyrefly", specifier = ">=0.50.0" },
+ { name = "pytest", specifier = ">=9.0.2" },
+ { name = "pyyaml", specifier = ">=6.0.0" },
+ { name = "ruff", specifier = ">=0.14.6" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pathspec"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.9.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "propcache"
+version = "0.5.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" },
+ { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" },
+ { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" },
+ { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" },
+ { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" },
+ { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" },
+ { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" },
+ { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/09/f049e45385503fe67db75a6b6186a7b9f0c3930366dc960522c312a825b1/propcache-0.5.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:099aaf4b4d1a02265b92a977edf00b5c4f63b3b17ac6de39b0d637c9cac0188a", size = 94457, upload-time = "2026-05-08T21:00:36.355Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/65/83d1d05655baf63113731bd5a1008435e14f8d1e5a06cbe4ec5b23ad7a31/propcache-0.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68ce1c44c7a813a7f71ea04315a8c7b330b63db99d059a797a4651bb6f69f117", size = 53835, upload-time = "2026-05-08T21:00:38.072Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/12/a6ba6482bb5ea3260c000c9b20881c95fa11c6b30173715668259f844ed7/propcache-0.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fc299c129490f55f254cd90be0deca4764e36e9a7c08b4aa588479a3bbed3098", size = 54545, upload-time = "2026-05-08T21:00:39.319Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/19/7fa086f5764c59ec8a8e157cd93aa8497acc00aba9dcdec56bfffb32602d/propcache-0.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6ae2198be502c10f09b2516e7b5d019816924bc3183a43ce792a7bd6625e6f4", size = 59886, upload-time = "2026-05-08T21:00:40.621Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/e4/5d7663dc8235956c8f5281698a3af1d351d8820341ddd890f59d9a9127f2/propcache-0.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6041d31504dc1779d700e1edcfb08eea334b357620b06681a4eabb57a74e574e", size = 63261, upload-time = "2026-05-08T21:00:41.775Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/4a/15a03adee24d6350da4292caeac44c34c033d2afe5e87eb370f38854560f/propcache-0.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7eabc04151c78a9f4d5bbb5f1faf571e4defeb4b585e0fe95b60ff2dbe4d3d7", size = 64184, upload-time = "2026-05-08T21:00:43.018Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/c6/979176efdaa3d239e36d503d5af63a0a773b36662ed8f52e5b6a6d9fd40e/propcache-0.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4db0ba63d693afd40d249bd93f842b5f144f8fcbb83de05660373bcf30517b1d", size = 61534, upload-time = "2026-05-08T21:00:44.507Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/22/63e8cd1bae4c2d2be6493b6b7d10566ddafad88137cfbc99964a1119853c/propcache-0.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dbcf7675229b35d31abb6547d8ebc8c27a830ac3f9a794edff6254873ec7c0a", size = 61500, upload-time = "2026-05-08T21:00:45.796Z" },
+ { url = "https://files.pythonhosted.org/packages/60/5a/28e5d9acbac1cc9ccb67045e8c1b943aa8d79fdf39c93bd73cacd68008ea/propcache-0.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d310c013aad2c72f1c3f2f8dd3279d460a858c551f97aeb8c63e4693cca7b4d2", size = 59994, upload-time = "2026-05-08T21:00:47.093Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/40/db650677f554a95b9c01a7c9d93d629e93a15562f5deb4573c9ee136fed2/propcache-0.5.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:06187263ddad280d05b4d8a8b3bb7d164cbebd469236544a42e6d9b28ac6a4fa", size = 56884, upload-time = "2026-05-08T21:00:48.376Z" },
+ { url = "https://files.pythonhosted.org/packages/80/45/70b39b89516ff8b96bf732fa6fded8cef20f293cb1508690101c3c07ec51/propcache-0.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3115559b8effafd63b142ea5ed53d63a16ea6469cbc63dce4ee194b42db5d853", size = 63464, upload-time = "2026-05-08T21:00:49.954Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/e2/fa59d3a89eac5534293124af4f1d0d0ada091ce4a0ab4610ce03fd2bdd8d/propcache-0.5.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c60462af8e6dc30c35407c7237ea908d777b22862bbee27bc4699c0d8bcdc45a", size = 61588, upload-time = "2026-05-08T21:00:51.281Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/97/efb547a55c4bc7381cfb202d6a2239ac621045277bc1ea5dfd3a7f0516c0/propcache-0.5.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40314bca9ac559716fe374094fc81c11dcc34b64fd6c585360f5775690505704", size = 64667, upload-time = "2026-05-08T21:00:52.602Z" },
+ { url = "https://files.pythonhosted.org/packages/92/56/f5c7d9b4b7595d5127da38974d791b2153f3d1eae6c674af3583ace92ad3/propcache-0.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cfa21e036ce1e1db2be04ba3b85d2df1bb1702fa01932d984c5464c665228ff4", size = 62463, upload-time = "2026-05-08T21:00:54.303Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/3b/484a3a65fc9f9f60c41dcd17b428bace5389544e2c680994534a20755066/propcache-0.5.2-cp313-cp313-win32.whl", hash = "sha256:f156a3529f38063b6dbaf356e15602a7f95f8055b1295a438433a6386f10463d", size = 38621, upload-time = "2026-05-08T21:00:55.808Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/fd/3f0f10dba4dabad3bf53102be007abf55481067952bde0fdddff439e7c61/propcache-0.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:dfed59d0a5aeb01e242e66ff0300bc4a265a7c05f612d30016f0b60b1017d757", size = 41649, upload-time = "2026-05-08T21:00:57.061Z" },
+ { url = "https://files.pythonhosted.org/packages/90/ec/6ce619cc32bb500a482f811f9cd509368b4e58e638d13f2c68f370d6b475/propcache-0.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:ba338430e87ceb9c8f0cf754de38a9860560261e56c00376debd628698a7364f", size = 37636, upload-time = "2026-05-08T21:00:58.646Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/82/c1d268bbbf2ef981c5bf0fbbe746db617c66e3bcefe431a1aa8943fbe23a/propcache-0.5.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a592f5f3da71c8691c788c13cb6734b6d17663d2e1cb8caddf0673d01ef8847d", size = 98872, upload-time = "2026-05-08T21:00:59.889Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/d4/52c871e73e864e6b34c0e2d58ac1ec5ccd149497ddc7ad2137ae98323a35/propcache-0.5.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6a997d0489e9668a384fcfd5061b857aa5361de73191cac204d04b889cfbbafa", size = 56257, upload-time = "2026-05-08T21:01:01.195Z" },
+ { url = "https://files.pythonhosted.org/packages/67/f0/9b90ca2a210b3d09bcfcd96ecd0f55545c091535abce2a45de2775cfd357/propcache-0.5.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:10734b5484ea113152ee25a91dccedf81631791805d2c9ccb054958e51842c94", size = 56696, upload-time = "2026-05-08T21:01:02.941Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/0e/6e9d4ba07c8e56e21ddec1e75f12148142b21ca83a51871babce095334f4/propcache-0.5.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cafca7e56c12bb02ae16d283742bef25a61122e9dab2b5b3f2ccbe589ce32164", size = 62378, upload-time = "2026-05-08T21:01:04.475Z" },
+ { url = "https://files.pythonhosted.org/packages/65/19/c10badaa463dde8a27ce884f8ee2ec37e6035b7c9f5ff0c8f74f06f08dac/propcache-0.5.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f064f8d2b59177878b7615df1735cd8fe3462ed6be8c7b217d17a276489c2b7f", size = 65283, upload-time = "2026-05-08T21:01:05.959Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/b6/93bea99ca80e19cef6512a8580e5b7857bbe09422d9daa7fd4ef5723306c/propcache-0.5.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f78abfa8dfc32376fd1aacf597b2f2fbbe0ea751419aee718af5d4f82537ef8c", size = 66616, upload-time = "2026-05-08T21:01:07.228Z" },
+ { url = "https://files.pythonhosted.org/packages/83/e4/5c7462e50625f051f37fb38b8224f7639f667184bbd34424ec83819bb1b7/propcache-0.5.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7467da8a9822bf1a55336f877340c5bcbd3c482afc43a99771169f74a26dedc", size = 63773, upload-time = "2026-05-08T21:01:08.514Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/b6/99238894047b13c823be25027e736626cd414a52a5e30d2c3347c2733529/propcache-0.5.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a6ddc6ac9e25de626c1f129c1b467d7ecd33ce2237d3fd0c4e429feef0a7ee1f", size = 63664, upload-time = "2026-05-08T21:01:09.874Z" },
+ { url = "https://files.pythonhosted.org/packages/85/1e/a3a1a63116a2b8edb415a8bb9a6f0c34bd03830b1e18e8ce2904e1dc1cf4/propcache-0.5.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2f22cbbac9e26a8e864c0985ff1268d5d939d53d9d9411a9824279097e03a2cb", size = 62643, upload-time = "2026-05-08T21:01:11.132Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/03/893cf147de2fc6543c5eaa07ad833170e7e2a2385725bbebe8c0503723bb/propcache-0.5.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:fc76378c62a0f04d0cd82fbb1a2cd2d7e28fcb40d5873f28a6c44e388aaa2751", size = 59595, upload-time = "2026-05-08T21:01:12.387Z" },
+ { url = "https://files.pythonhosted.org/packages/86/3b/04c1a2e12c57766568ba75ba72b3bf2042818d4c1425fab6fc07155c7cff/propcache-0.5.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:acd2c8edba48e31e58a363b8cf4e5c7db3b04b3f9e371f601df30d9b0d244836", size = 65711, upload-time = "2026-05-08T21:01:13.676Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/34/80f8d0099f8d6bacc4de1624c85672681c8cd1149ca2da0e38fd120b817f/propcache-0.5.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:452b5065457eb9991ec5eb38ff41d6cd4c991c9ac7c531c4d5849ae473a9a13f", size = 64247, upload-time = "2026-05-08T21:01:14.936Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/1a/8b08f3a5f1037e9e370c55883ceeeee0f6dd0416fb2d2d67b8bfc91f2a79/propcache-0.5.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3430bb2bfe1331885c427745a751e774ee679fd4344f80b97bf879815fe8fa55", size = 67102, upload-time = "2026-05-08T21:01:16.281Z" },
+ { url = "https://files.pythonhosted.org/packages/34/68/8bdb7bb7756d76e005490649d10e4a8369e610c74d619f71e1aedf889e9c/propcache-0.5.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cef6cea3922890dd6c9654971001fa797b526c16ab5e1e46c05fd6f877be7568", size = 64964, upload-time = "2026-05-08T21:01:17.57Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/aa/50fb0b5d3968b61a510926ff8b8465f1d6e976b3ab74496d7a4b9fc42515/propcache-0.5.2-cp313-cp313t-win32.whl", hash = "sha256:72d61e16dd78228b58c5d47be830ff3da7e5f139abdf0aef9d86cde1c5cf2191", size = 42546, upload-time = "2026-05-08T21:01:18.946Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/4c/0ddbae64321bd4a95bcbfc19307238016b5b1fee645c84626c8d539e5b74/propcache-0.5.2-cp313-cp313t-win_amd64.whl", hash = "sha256:0958834041a0166d343b8d2cedcd8bcbaeb4fdbe0cf08320c5379f143c3be6e7", size = 46330, upload-time = "2026-05-08T21:01:20.162Z" },
+ { url = "https://files.pythonhosted.org/packages/00/d9/9cddc8efb78d8af264c5ec9f6d10b62f57c515feda8d321595f56010fb23/propcache-0.5.2-cp313-cp313t-win_arm64.whl", hash = "sha256:6de8bd93ddde9b992cf2b2e0d796d501a19026b5b9fd87356d7d0779531a8d96", size = 40521, upload-time = "2026-05-08T21:01:21.399Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/ea/23ee535d90ce8bcc465a3028eb3cc0ce3bd1005f4bb27710b30587de798d/propcache-0.5.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:46088abff4cba581dea21ae0467a480526cb25aa5f3c269e909f800328bc3999", size = 94662, upload-time = "2026-05-08T21:01:22.683Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/06/c5a52f419b5d8972f8d46a7577476090d8e3263ff589ce40b5ca4968d5be/propcache-0.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fc88b26f08d634f7bc819a7852e5214f5802641ab8d9fd5326892292eee1993e", size = 53928, upload-time = "2026-05-08T21:01:23.986Z" },
+ { url = "https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539", size = 54650, upload-time = "2026-05-08T21:01:25.305Z" },
+ { url = "https://files.pythonhosted.org/packages/70/06/2f46c318e3307cd7a6a7481def374ce838c0fe20084b39dd54b0879d0e99/propcache-0.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba57fffe4ac99c5d30076161b5866336d97600769bad35cc68f7774b15298a4e", size = 59912, upload-time = "2026-05-08T21:01:26.545Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/29/fe1aebec2ce57ab985a9c382bded1124431f85078113aa222c5d278430d4/propcache-0.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:583c19759d9eec1e5b69e2fbef36a7d9c326041be9746cb822d335c8cedc2979", size = 63300, upload-time = "2026-05-08T21:01:27.937Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/18/2334b26768b6c82be8c69e83671b767d5ef426aa09b0cba6c2ea47816774/propcache-0.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d0326e2e5e1f3163fa306c834e48e8d490e5fae607a097a40c0648109b47ba80", size = 64208, upload-time = "2026-05-08T21:01:29.484Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/76/7f1bfd6afff4c5e38e36a3c6d68eb5f4b7311ea80baf693db78d95b603c4/propcache-0.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e00820e192c8dbebcafb383ebbf99030895f09905e7a0eb2e0340a0bcc2bc825", size = 61633, upload-time = "2026-05-08T21:01:31.068Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/46/b3ff8aba2b4953a3e50de2cf72f1b5748b8eca93b15f3dc2c84339084c09/propcache-0.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c66afea89b1e43725731d2004732a046fe6fe955d51f952c3e95a7314a284a39", size = 61724, upload-time = "2026-05-08T21:01:32.374Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/01/814cfcafbcff954f94c01cf30e097ddc88a076b5440fbcf4570753437d40/propcache-0.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc37dec6c6cdad0b57881a5658fd14fbf53e333b1a86cf86559f190e1d9ec4", size = 60069, upload-time = "2026-05-08T21:01:33.67Z" },
+ { url = "https://files.pythonhosted.org/packages/da/68/5c6f7622d510cc666a300687e06fd060c1a43361c0c9b20d284f06d8096a/propcache-0.5.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5570dbcc97571c15f68068e529c92715a12f8d54030e272d264b377e22bd17a5", size = 57099, upload-time = "2026-05-08T21:01:34.915Z" },
+ { url = "https://files.pythonhosted.org/packages/55/27/9cb0b4c679124085327957d42521c99dba04c88c90c3e55a6f0b633ebccc/propcache-0.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f814362777a9f841adddb200ecdf8f5cb1e5a3c4b7a86378edbd6ccb26edd702", size = 63391, upload-time = "2026-05-08T21:01:36.231Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/9d/7258aaa5bdf60fc6f27591eef6fe52768cb0beda7140be477c8b12c9794a/propcache-0.5.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:196913dea116aeb5a2ba95af4ddcb7ea85559ae07d8eee8751688310d09168c3", size = 61626, upload-time = "2026-05-08T21:01:37.545Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/0d/41c602003e8a9b16fe1e7eadf62c7bfba9d5474370b24200bf48b315f45f/propcache-0.5.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6e7b8719005dd1175be4ab1cd25e9b98659a5e0347331506ec6760d2773a7fb5", size = 64781, upload-time = "2026-05-08T21:01:38.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/f3/38e66b1856e9bd079deea015bc4a55f7767c0e4db2f7dcf69e7e680ba4ce/propcache-0.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:51f96d685ab16e88cab128cd37a52c5da540809c8b879fa047731bfcb4ad35a4", size = 62570, upload-time = "2026-05-08T21:01:40.415Z" },
+ { url = "https://files.pythonhosted.org/packages/95/ca/bbfe9b910ce57dde8bb4876b4520fc02a4e89497c10de26be936758a3aaa/propcache-0.5.2-cp314-cp314-win32.whl", hash = "sha256:cc6fc3cc62e8501d3ed62894425040d2728ecddb1ed072737a5c70bd537aa9f0", size = 39436, upload-time = "2026-05-08T21:01:41.654Z" },
+ { url = "https://files.pythonhosted.org/packages/61/d2/45c9defbaa1ea297035d9d4cce9e8f80daafbf19319c6007f157c6256ea9/propcache-0.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:81e3a30b0bb60caa22033dd0f8a3618d1d67356212514f62c57db75cb0ef410c", size = 42373, upload-time = "2026-05-08T21:01:43.041Z" },
+ { url = "https://files.pythonhosted.org/packages/44/68/9ea5103f41d5217d7d6ec24db90018e23aebec070c3f9a6e54d12b841fd8/propcache-0.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:0d2c9bf8528f135dbb805ce027567e09164f7efa51a2be07458a2c0420f292d0", size = 38554, upload-time = "2026-05-08T21:01:44.336Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/81/fadf555f42d3b762eea8a53950b0489fdc0aa9da5f8ed9e10ce0a4e01b48/propcache-0.5.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:4bc8ff1feffc6a61c7002ffe84634c41b822e104990ae009f44a0834430070bb", size = 99395, upload-time = "2026-05-08T21:01:45.883Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/c9/c61e134a686949cf7971af3a390148b1156f7be81c73bc0cd12c873e2d48/propcache-0.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:79aa3ff0a9b566633b642fa9caf7e21ed1c13d6feca718187873f199e1514078", size = 56653, upload-time = "2026-05-08T21:01:47.307Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/73/daf935ea7048ddd7ec8eec5345b4a40b619d2d178b3c0a0900796bc3c794/propcache-0.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1b31822f4474c4036bae62de9402710051d431a606d6a0f907fec79935a071aa", size = 56914, upload-time = "2026-05-08T21:01:48.573Z" },
+ { url = "https://files.pythonhosted.org/packages/79/9f/aba959b435ea18617edd7cf0a7ad0b9c574b8fc7e3d2cd55fb59cb255d33/propcache-0.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fef48778b5a2a756523fdb781326b028ca75e32858b04f2cdd19f394564917", size = 62567, upload-time = "2026-05-08T21:01:49.903Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/a1/859942de9a791ff42f6141736f5b37749b8f53e65edfa49638c67dd67e6a/propcache-0.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8b73ab70f1a3351fbc71f663b3e645af6dd0329100c353081cf69c37433fc6fe", size = 65542, upload-time = "2026-05-08T21:01:51.204Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/61/315bc0fd6c0fc7f80a528b8afd209e5fc4a875ea79571b91b8f50f442907/propcache-0.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5538d2c13d93e4698af7e092b57bc7298fd35d1d58e656ae18f23ee0d0378e03", size = 66845, upload-time = "2026-05-08T21:01:52.539Z" },
+ { url = "https://files.pythonhosted.org/packages/47/f7/9f8122e3132e8e354ac41975ef8f1099be7d5a16bc7ae562734e993665c0/propcache-0.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd645f03898405cabe694fb8bc35241e3a9c332ec85627584fe3de201452b335", size = 63985, upload-time = "2026-05-08T21:01:53.847Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/54/c317819ec157cbf6f35df9df9657a6f82daf34d5faf15948b2f639c2192e/propcache-0.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a473b3440261e0c60706e732b2ed2f517857344fc21bf48fdfe211e2d98eb285", size = 63999, upload-time = "2026-05-08T21:01:55.179Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/56/387e3f7dfce0a9233df41fb888aa1c30222cb4bbbf09537c02dd9bd85fe2/propcache-0.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7afa37062e6650640e932e4cc9297d81f9f42d9944029cc386b8247dea4da837", size = 62779, upload-time = "2026-05-08T21:01:57.489Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/9c/596784cb5824ed61ee960d3f8655a3f0993e107c6e98ab6c818b7fb92ccb/propcache-0.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:8a90efd5777e996e42d568db9ac740b944d691e565cbfd31b2f7832f9184b2b8", size = 59796, upload-time = "2026-05-08T21:01:58.736Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/3d/1a6cfa1726a48542c1e8784a0761421476a5b68e09b7f36bf95eb954aaba/propcache-0.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f19bb891234d72535764d703bfed1153cc34f4214d5bd7150aee1eec9e8f4366", size = 66023, upload-time = "2026-05-08T21:02:00.228Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/0e/05fd6990369477076e4e280bcb970de760fddf0161a46e988bc95f7940ec/propcache-0.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:32775082acd2d807ee3db715c7770d38767b817870acfa08c29e057f3c4d5b56", size = 64448, upload-time = "2026-05-08T21:02:01.888Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/86/5f8da315a4309c62c10c0b2516b17492d5d3bbe1bb862b96604db67e2a37/propcache-0.5.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9282fb1a3bccd038da9f768b927b24a0c753e466c086b7c4f3c6982851eefb2d", size = 67329, upload-time = "2026-05-08T21:02:03.484Z" },
+ { url = "https://files.pythonhosted.org/packages/da/d3/3368efe79ab21f0cdf86ef49895811c9cc933131d4cde1f28a624e22e712/propcache-0.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc49723e2f60d6b32a0f0b08a3fd6d13203c07f1cd9566cfce0f12a917c967a2", size = 65172, upload-time = "2026-05-08T21:02:04.745Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/07/127e8b0bacfb325396196f9d976a22453049b89b9b2b08477cc3145faa44/propcache-0.5.2-cp314-cp314t-win32.whl", hash = "sha256:2d7aa89ebca5acc98cba9d1472d976e394782f587bad6661003602a619fd1821", size = 43813, upload-time = "2026-05-08T21:02:06.025Z" },
+ { url = "https://files.pythonhosted.org/packages/88/fb/46dad6c0ae49ed230ab1b16c890c2b6314e2403e6c412976f4a72d64a527/propcache-0.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d447bb0b3054be5818458fbb171208b1d9ff11eba14e18ca18b90cbb45767370", size = 47764, upload-time = "2026-05-08T21:02:07.353Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/c4/a47d0a63aa309d10d59ede6e9d4cff03a344a79d1f0f4cd0cd74997b53e0/propcache-0.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:fe67a3d11cd9b4efabfa45c3d00ffba2b26811442a73a581a94b67c2b5faccf6", size = 41140, upload-time = "2026-05-08T21:02:09.065Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
+]
+
+[[package]]
+name = "pydantic"
+version = "2.13.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-types" },
+ { name = "pydantic-core" },
+ { name = "typing-extensions" },
+ { name = "typing-inspection" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" },
+]
+
+[[package]]
+name = "pydantic-core"
+version = "2.46.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" },
+ { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" },
+ { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" },
+ { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" },
+ { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" },
+ { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" },
+ { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" },
+ { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" },
+ { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" },
+ { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" },
+ { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" },
+ { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" },
+ { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" },
+ { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" },
+ { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" },
+ { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" },
+ { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" },
+ { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" },
+ { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" },
+ { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" },
+ { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" },
+ { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" },
+ { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" },
+ { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" },
+ { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" },
+ { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" },
+ { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" },
+ { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" },
+]
+
+[[package]]
+name = "pydantic-settings"
+version = "2.14.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pydantic" },
+ { name = "python-dotenv" },
+ { name = "typing-inspection" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyrefly"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9f/3a/9045b0097ac58979c7c30a4fa0e673db942d4adbc7b6d439bd54ae58c441/pyrefly-1.0.0.tar.gz", hash = "sha256:5c2b810ffcebd84be71de5df1223651edee951653a66935c6f091e957c452455", size = 5677995, upload-time = "2026-05-12T20:12:46.812Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/c6/90788819bac9c61dd7bacba53b79f3c12d47ccbe5e51b3d6d89f2387e1d2/pyrefly-1.0.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e355a0908555348ed4b9585ef25c76ff566673e345c866c325f1633f44d890b6", size = 13122950, upload-time = "2026-05-12T20:12:20.711Z" },
+ { url = "https://files.pythonhosted.org/packages/82/91/a3cf2a1e87d336eaa804a1e6fc93266faf6dc2a97eecdbc7eae289628022/pyrefly-1.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a7038efc3a40f8294edee339895633cf22db268c0d434cdbcbefc34f78a9ecc3", size = 12599494, upload-time = "2026-05-12T20:12:23.495Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/ab/74d1e11e737e99b1c003ecc5d7d2e846c4ea1f328966bfdbbd0ac63fad0a/pyrefly-1.0.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da331ca515ed1c08791da2b5f664cf9c1294c48fd802133262e7d5d51e0f4416", size = 12995507, upload-time = "2026-05-12T20:12:25.951Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/ac/2df0899f8464c97e5d995f994c97c5cb5b0f58610432aa90d26d924e1db5/pyrefly-1.0.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c74219d8f3e63cdaa5501a0b21d1c9d37011820f9606728d0ed06f09ae86a878", size = 13947693, upload-time = "2026-05-12T20:12:29.188Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/3e/b247c24321e36f04b7d51f9ccf3df93e5009e4b29939524b36ec2e17dc2a/pyrefly-1.0.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0d05543b1bb6ee6d64149eb5d6b2fb15aa72d3962d6a97abca0afaca8b0c131", size = 13925803, upload-time = "2026-05-12T20:12:31.904Z" },
+ { url = "https://files.pythonhosted.org/packages/61/16/cfa2d61a4aa1e1f7bca48bb37acd01c6a09db4864b16a54f9587092765ff/pyrefly-1.0.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1382d5b1fcdb49a4de9f34d112d2bddf290a78ff93ee8149492ad5f1077ddffc", size = 13470398, upload-time = "2026-05-12T20:12:35.302Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/2b/6372c7dddb326223e24a46b17efd0d4bd7b4fe22c821e523157577eed2d2/pyrefly-1.0.0-py3-none-win32.whl", hash = "sha256:aa8b5d0e47080e3202a2547b39f7a5a61d2c781c712b3b67884f745ca2c759d2", size = 12222643, upload-time = "2026-05-12T20:12:38.618Z" },
+ { url = "https://files.pythonhosted.org/packages/be/ad/1d23be700b6b2ddaeb362360c7145917a8edbbf7240ae428d40541772fce/pyrefly-1.0.0-py3-none-win_amd64.whl", hash = "sha256:c8abcb0f2082e83c890375128f9cff4aa4d3f210b85eea7b3046c1ae764e77f5", size = 13146369, upload-time = "2026-05-12T20:12:41.423Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/38/16589134f3012fd097a10dcc85771555f1a5fb76e04b682597180743af30/pyrefly-1.0.0-py3-none-win_arm64.whl", hash = "sha256:d150fa9e40e8392832be81c3bcfc0497c146674ce4d0f8e04e1ec29e775ffb8c", size = 12538326, upload-time = "2026-05-12T20:12:43.996Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.0.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" },
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.2.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
+]
+
+[[package]]
+name = "pytokens"
+version = "0.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" },
+ { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" },
+ { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" },
+ { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" },
+ { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" },
+ { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" },
+ { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" },
+ { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" },
+ { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" },
+ { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
+]
+
+[[package]]
+name = "regex"
+version = "2026.5.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/dc/0e/49aee608ad09480e7fd276898c99ec6192985fa331abe4eb3a986094490b/regex-2026.5.9.tar.gz", hash = "sha256:a8234aa23ec39894bfe4a3f1b85616a7032481964a13ac6fc9f10de4f6fca270", size = 416074, upload-time = "2026-05-09T23:15:19.37Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/50/9b/6550044bc44e17c84d312c031c2ec42fbdb6a4ec4e29093be3a172d08772/regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06", size = 490451, upload-time = "2026-05-09T23:12:34.72Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/95/fc7ba4303b5a0f92446a12ee6778ef2c6c799233f5060042a31bf390cfe9/regex-2026.5.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:398c521292f4c7fb807001dcd54694d3a1fcafc179a36ad9cc56f98df85930b6", size = 292112, upload-time = "2026-05-09T23:12:36.285Z" },
+ { url = "https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225", size = 289599, upload-time = "2026-05-09T23:12:38.089Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/dd/ba103dc19614e25f3880800ca67ce093d6e21b325d72b8383c7bf906e9fa/regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0", size = 796732, upload-time = "2026-05-09T23:12:40.062Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/e7/f035b4fd858b050b0080bf302968dc0f59ba34e391872d54936758e6844e/regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107", size = 865440, upload-time = "2026-05-09T23:12:42.059Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/51/8cd301ecc899aea28124357f729f4272f44de7806fc7ca02490bfbe253e8/regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309", size = 912329, upload-time = "2026-05-09T23:12:44.373Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8", size = 801239, upload-time = "2026-05-09T23:12:46.268Z" },
+ { url = "https://files.pythonhosted.org/packages/17/2f/6f6008682bf2cf98040a0d3153a8e557b6ab728d7713d045cee4ce544ab8/regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66", size = 777054, upload-time = "2026-05-09T23:12:48.051Z" },
+ { url = "https://files.pythonhosted.org/packages/19/2b/eee0d20a6842ba04df4b8847a920b57ef56853f14ef85405473e586b605a/regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026", size = 785098, upload-time = "2026-05-09T23:12:49.851Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/98/6fc1e6410feefb92159edaed5041992bfe390e8d26c721865434acbca558/regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962", size = 860095, upload-time = "2026-05-09T23:12:51.666Z" },
+ { url = "https://files.pythonhosted.org/packages/18/a3/bd855e0f2cb1a978ecf6fa6bb69632dd9c3f6ea3b81cde62fde14c9daec7/regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621", size = 765762, upload-time = "2026-05-09T23:12:53.413Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/66/0ae8c092e60b14c79d24f8e0b7f0aea5bfbffdcab00b5483d13404d3c3a5/regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d", size = 852100, upload-time = "2026-05-09T23:12:55.256Z" },
+ { url = "https://files.pythonhosted.org/packages/21/de/8dfde60fc1b21c946a893ba273403b72617edb261370cb1087099a83f088/regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce", size = 789479, upload-time = "2026-05-09T23:12:57.573Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/1c/bdcc98f9a4af4fdd166c74941174619ccff4726d3ce32faa8e9a2ecd38dd/regex-2026.5.9-cp312-cp312-win32.whl", hash = "sha256:164eba9b755ea6f244b0d881196fbc1fac09714e9782c9e2732b813142033c8e", size = 266699, upload-time = "2026-05-09T23:12:59.14Z" },
+ { url = "https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl", hash = "sha256:86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e", size = 277783, upload-time = "2026-05-09T23:13:00.789Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/b5/7b30f312b0669dff5beebe5b0989dc2d1a312b1a44fab852199c387a5b96/regex-2026.5.9-cp312-cp312-win_arm64.whl", hash = "sha256:96f5f58b54a063d7ea9dca08e1cf57bfe10499c4d579ee672da284f57f5f0070", size = 270513, upload-time = "2026-05-09T23:13:02.426Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/da/797e91ecec6f84135da778ddce78c20e0af5d2a15c26f87a81bc3eadb6db/regex-2026.5.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb", size = 490303, upload-time = "2026-05-09T23:13:04.382Z" },
+ { url = "https://files.pythonhosted.org/packages/44/da/bf30abaaa737b58f4a4b8c4a03659e02fd92092c822e0197ed9e0daab917/regex-2026.5.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d7bdc0ab8f3dd7e1b4f9ab88634e13374669db86bb3c72e8292f07ae313f539f", size = 292019, upload-time = "2026-05-09T23:13:06.022Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/e7/d0eaf5713828417b9e5648cf81fa9bacd4961f6ab98c380c2034f8716e35/regex-2026.5.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c", size = 289468, upload-time = "2026-05-09T23:13:08.214Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/9b/b3fdd62b003baa1a9b593cd8c8699c9651c2e80cc21a5c715707983c42d7/regex-2026.5.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed", size = 796749, upload-time = "2026-05-09T23:13:10.573Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/30/66ab84588765f5b4b271a9ca09ef7ce2b87caa95176ec3d2ad65d7bc4902/regex-2026.5.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020", size = 865445, upload-time = "2026-05-09T23:13:12.523Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/89/f05169e8588aac365f35ffc7f3bc3184f095ef4cfded7cfaa3c7fd5dbd89/regex-2026.5.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2", size = 912322, upload-time = "2026-05-09T23:13:14.281Z" },
+ { url = "https://files.pythonhosted.org/packages/30/e1/c93444052cf41581f3c884ab3fb5823daf0992f11cd4388d4275ca610558/regex-2026.5.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2", size = 801269, upload-time = "2026-05-09T23:13:16.569Z" },
+ { url = "https://files.pythonhosted.org/packages/50/fe/0cf96b882f540e62e8b9956599798203d599c44cf4c77917ca27400ff69b/regex-2026.5.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04", size = 777085, upload-time = "2026-05-09T23:13:18.675Z" },
+ { url = "https://files.pythonhosted.org/packages/23/5c/d78d4924e7fc875557b9e9b768423925fdfaac5549d06da7810019a9bd26/regex-2026.5.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c", size = 785153, upload-time = "2026-05-09T23:13:20.525Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/e0/5214774090e7b4524dcea3e3c4aa74141d43043f8beb49c1599db1c8b53a/regex-2026.5.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f", size = 860164, upload-time = "2026-05-09T23:13:22.263Z" },
+ { url = "https://files.pythonhosted.org/packages/6e/e1/4a57a83350319b1271f0d7a249b8672513ed928b237a741631270de6caea/regex-2026.5.9-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8", size = 765731, upload-time = "2026-05-09T23:13:24.277Z" },
+ { url = "https://files.pythonhosted.org/packages/12/f4/499e74a20c156fc75836ee04a72a38d1a063978f600937f9760467beb1b0/regex-2026.5.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6", size = 852062, upload-time = "2026-05-09T23:13:26.125Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/92/7eebc0d0a01e78629695f342ba17e0deaff8fb45e79cc0d7b98287da6e3e/regex-2026.5.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21", size = 789577, upload-time = "2026-05-09T23:13:27.814Z" },
+ { url = "https://files.pythonhosted.org/packages/05/a4/018e71f7d2ad48c1ebe6d3ae0026f9b7cb4802fd15c7cc02fdf724355102/regex-2026.5.9-cp313-cp313-win32.whl", hash = "sha256:f3844f134e834076677dd369976e9f5068679fcb8e50102fdf6b7ac96a3ec127", size = 266691, upload-time = "2026-05-09T23:13:29.549Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/1d/861a93719fb9ee7dbfc3761b3797b7a3e112a5d42c6129459d2d741be9b5/regex-2026.5.9-cp313-cp313-win_amd64.whl", hash = "sha256:3527bb4942d2c14552155406cdedd906567456821848aed1cb4933a391bf5eca", size = 277747, upload-time = "2026-05-09T23:13:31.859Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/c6/0a2436ae4da1ba76e51cb98943c6838a9a721faa40ebe2dce07694ae34e3/regex-2026.5.9-cp313-cp313-win_arm64.whl", hash = "sha256:56a33f191f17d8c417f99945ebdc1e691d3af9605d86ec68c7e54a57e3e17af6", size = 270500, upload-time = "2026-05-09T23:13:33.525Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/e9/d21346f7b60ed58789371358ed66b09d00f832e1bd7c06e55d9da5679882/regex-2026.5.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3", size = 494172, upload-time = "2026-05-09T23:13:35.935Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/43/fd1177a2032037c681baecdb3422ee4e1424aec4e4f470ef47793d325274/regex-2026.5.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:48036f6374aaa79eb3b754ec29c61d1c6b1606749d705a13f8854fa2539671f6", size = 293952, upload-time = "2026-05-09T23:13:38.307Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/7d/9fbf919768368d3f8a4f6c692cf2aa61e482b2b81ec6a298ace4cbf02480/regex-2026.5.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff", size = 292314, upload-time = "2026-05-09T23:13:40.353Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/6c/e41bfeecb589716843e7c4df09ba46ff2a42961457afece19059d85caeef/regex-2026.5.9-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88", size = 811681, upload-time = "2026-05-09T23:13:42.543Z" },
+ { url = "https://files.pythonhosted.org/packages/87/83/a5c1c525fba0aa656e88ad0face0b1829788ef4c2fb6b26df58aa1151b84/regex-2026.5.9-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178", size = 871135, upload-time = "2026-05-09T23:13:44.326Z" },
+ { url = "https://files.pythonhosted.org/packages/18/d4/80882e799e440dd878b0979cbebf8fa4d54624a332c83037c7a701649e3f/regex-2026.5.9-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100", size = 917265, upload-time = "2026-05-09T23:13:47.295Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/ff/8db60211e2286e396aad7dc7725356c502bff0901ea05bd6cdc2e1a042b9/regex-2026.5.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e", size = 816311, upload-time = "2026-05-09T23:13:49.885Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/47/742ef579c61730f8d268e5cf1f9ce0e37e2ea041ad0f5644724f2378e463/regex-2026.5.9-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2", size = 785498, upload-time = "2026-05-09T23:13:52.25Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/ab/cb0999802dcb0fb95b1ab005e8d4163d8afdd67efc2cb6b6630ac13f8cb1/regex-2026.5.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b", size = 801348, upload-time = "2026-05-09T23:13:54.127Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/62/8ca59a24c55bc34d166eefaf3717bd77772f329fdbf984d86581e0a3571c/regex-2026.5.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e", size = 866493, upload-time = "2026-05-09T23:13:56.067Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/3d/30f2ae62cef3278bb5bb821f467277a55fb73f01032cf85997e15e8289a8/regex-2026.5.9-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041", size = 772811, upload-time = "2026-05-09T23:13:57.867Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/ae/7d2089bcd78ad0c0161bc684339df50032acb438a7bd3305e7ddb1193cec/regex-2026.5.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0", size = 856584, upload-time = "2026-05-09T23:13:59.679Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/29/92ff47f75990131ea4f24ba17819e5a9d141e10819807e09addd73409af6/regex-2026.5.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081", size = 803453, upload-time = "2026-05-09T23:14:01.978Z" },
+ { url = "https://files.pythonhosted.org/packages/04/99/eff29f1037dcab36702c9ee5d6858cf1ce2336ea8ea2987f64245b99ea5e/regex-2026.5.9-cp313-cp313t-win32.whl", hash = "sha256:ed2c9e8068b614c574d8d30e543d617cf5379b0535d46f97ef00e904745a08b5", size = 269951, upload-time = "2026-05-09T23:14:03.661Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/9d/8870b8981d27b22cda77bb26a5ac7ebfa9c7d9e0dea195a834a82380e748/regex-2026.5.9-cp313-cp313t-win_amd64.whl", hash = "sha256:b46b0f094dc1d3b90356c85a0bd2c9bafc4a6a190b9d6f8ddd5a033b6e088ed4", size = 281240, upload-time = "2026-05-09T23:14:05.56Z" },
+ { url = "https://files.pythonhosted.org/packages/72/b1/3379415e8f135c13ac551353397cc4fe97b4978f3cac73c5fcbcded548b8/regex-2026.5.9-cp313-cp313t-win_arm64.whl", hash = "sha256:872acc074bd29ffc9913ecdfedf6ea77502312ca44a4aa0d3779089c6069d8de", size = 272383, upload-time = "2026-05-09T23:14:07.843Z" },
+ { url = "https://files.pythonhosted.org/packages/13/3e/9c3cd292d8808b3645a2ce517e200179b6d0e903f176300bd8b542e14de5/regex-2026.5.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:1bd7587a2948b4085195d5a3374eaf4a425dc3e55784c038175355ecf3bbbf8a", size = 490376, upload-time = "2026-05-09T23:14:09.64Z" },
+ { url = "https://files.pythonhosted.org/packages/60/70/d43ee8a2ca0a8b68d167f21658b85520ac0574617c7f320367c5047f7556/regex-2026.5.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dea2e88e1cce4522496cce630e11e67b98b7076620bc4336c3f674bc21a375f4", size = 291964, upload-time = "2026-05-09T23:14:11.424Z" },
+ { url = "https://files.pythonhosted.org/packages/21/91/9d50b433828d8e74196904e168a43abf1e6e88b2a15d47ed742456720c37/regex-2026.5.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2099f7e7ff7b6aa3192312650a56e91cc091e49d50b04e4f6f8b6e28b3b27f1c", size = 289682, upload-time = "2026-05-09T23:14:13.123Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/d2/b835e3cafbb9d977736912436259ff551d60919f7d7b3d37d46659c63564/regex-2026.5.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecd353045824e4477562a2ac718c25799cdaaa41f7aa925a806a8a3e6848a5b9", size = 796996, upload-time = "2026-05-09T23:14:14.923Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/a6/9f992d00019166b9de01c546dd4549bc679f2a68df11b877740b0760b7c2/regex-2026.5.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65c8c8c37377794bd5b2f3ebe51919042bf17aec802e23c833d89782ed0c78af", size = 866089, upload-time = "2026-05-09T23:14:17.757Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/08/4d32af657e049b19cb62b02e46e38fe1518797bfb2203ee93a510b21b0dc/regex-2026.5.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b73ab8afcf66c622db143d1c6fda4e58e4d537ee4f125229ad47b1ab80f34c0", size = 911530, upload-time = "2026-05-09T23:14:20.353Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/27/2af43dd1dc201d1fecefda64a45f4ad0995855b92724f795a777b402ee69/regex-2026.5.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0de5cf193997384ed2ca6f1cd4f78055b255d93d82d5a8cd6ba0d11c10b167e4", size = 800643, upload-time = "2026-05-09T23:14:22.265Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/dd/23a249047013b5321d4a60c4d2437462086f601b061776a525e5fba2a59f/regex-2026.5.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d641a8c9a61618047796d572a39a79b26167b0411d2c3031937b2fe2d081e2cf", size = 777223, upload-time = "2026-05-09T23:14:24.179Z" },
+ { url = "https://files.pythonhosted.org/packages/94/6a/e85ed9538cd19586d0465076a4578a12e093ce776d15f3f8ce92733a8dd6/regex-2026.5.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:24b2355ef5cc9aa5b8f07d17704face1c166fdcc2290fa7bd6e6c925655a8346", size = 785760, upload-time = "2026-05-09T23:14:26.065Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/c4/f25473209438638e947c55f9156fd8f236f74169229028cc99116380868e/regex-2026.5.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a24852d3c29ad9e47593593d8a247c44ccc3d0548ef12c822d6ed0810affe676", size = 860891, upload-time = "2026-05-09T23:14:28.17Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/f7/f4f86e3c74419c37370e91f150ae0c2ef7d34b2e0e4cdd5da046a02e4022/regex-2026.5.9-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:916714069da19329ef7de197dcbc77bb3104145c7c2c864dbfbe318f46b88b14", size = 765891, upload-time = "2026-05-09T23:14:30.06Z" },
+ { url = "https://files.pythonhosted.org/packages/26/70/704d8e13765939146b1cd0ef4e2feb71d7929727d2290f026eed10095955/regex-2026.5.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:fa411799ca8da32a8d38d020a88faa5b6f91657d284761352940ecf9f7c3bbdd", size = 851380, upload-time = "2026-05-09T23:14:32.123Z" },
+ { url = "https://files.pythonhosted.org/packages/26/29/1a13582a8460038edc38e49f64ceb0dd7c60f5caba77571f4bf6601965d9/regex-2026.5.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e6da47d679b7010ef27556b6e0f99771b744936db1792a10ceac6547ae1503e", size = 789350, upload-time = "2026-05-09T23:14:34.799Z" },
+ { url = "https://files.pythonhosted.org/packages/73/56/3dcafe34fc72e271d62ad9a291801e88a1457bb251c132f15fcc2e5aad1a/regex-2026.5.9-cp314-cp314-win32.whl", hash = "sha256:98bd73080e8756255137e1bd3f3f00295bbc5aa383c0e0f973920e9134d7c4ad", size = 272130, upload-time = "2026-05-09T23:14:36.729Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/9c/02eebf0be95efe416c664db7fb8b6b05b7a0b06a7544f2884f2558b0526f/regex-2026.5.9-cp314-cp314-win_amd64.whl", hash = "sha256:ff8d372ac2acdc048d1c19916f27ee61bc5722728458ba6ca5052f2c72d51763", size = 280999, upload-time = "2026-05-09T23:14:39.126Z" },
+ { url = "https://files.pythonhosted.org/packages/70/5a/1dd1abee76cb7a846a0bcf42fdc87e5720c3c33c24f3e37814310a513d9f/regex-2026.5.9-cp314-cp314-win_arm64.whl", hash = "sha256:e1d93bf647916292e8edcec150c07ddf3dc50179ccaf770c04a7f9e452155372", size = 273500, upload-time = "2026-05-09T23:14:41.059Z" },
+ { url = "https://files.pythonhosted.org/packages/86/c1/c5f619b0057a7965cb78ec559c1d7a45ce8c99a35bea95483d64959a93d9/regex-2026.5.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:83d0ee4a57d1c87cb549e195ec300b8f0ec3a82eba66d835e4e2ed8634fe4499", size = 494269, upload-time = "2026-05-09T23:14:42.869Z" },
+ { url = "https://files.pythonhosted.org/packages/05/2c/5d01f1aee33de4bbe60c8452945bfc8477ca7c5ae4450f6bfe711036cb36/regex-2026.5.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d3d7eb5c9a7f6df82ed3cfac9beb93882a5cbcb5b8b157b56cb2b3b276574ac1", size = 293954, upload-time = "2026-05-09T23:14:44.822Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/fe/e8988b2ae2108c6ef71bd4aa8d87fbe257976dd0810e826cd75f701c68b6/regex-2026.5.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:075160bf16658e16d35233300b8453aac25de4cbea808d22348b6979668e924d", size = 292405, upload-time = "2026-05-09T23:14:47.211Z" },
+ { url = "https://files.pythonhosted.org/packages/79/34/d2b0937faa7859263f7f0a3c6b103a1296306be6952dc173d0154e9a2f49/regex-2026.5.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45375819235558a4ff1c4971dc32881f022613abdb180128f5cb4768c1765a1c", size = 811855, upload-time = "2026-05-09T23:14:49.21Z" },
+ { url = "https://files.pythonhosted.org/packages/80/fe/daf53a47457a8486db66c66c01ceb9c2303eecee3f87197f1e77eb1a736d/regex-2026.5.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ead4b163ac30a29574510cd4b3e2e985ac5290c05fc7095557d6a5f403fc31b5", size = 871189, upload-time = "2026-05-09T23:14:51.555Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/75/058fc4470cbfbf57d800aff1a0022b929a3f9fa553ee10a0cdf2070eb31f/regex-2026.5.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c6e4218fbdfbcd4f6c19efca40930d24a621bf4b48cb76bc6640543bd28ef20", size = 917485, upload-time = "2026-05-09T23:14:53.633Z" },
+ { url = "https://files.pythonhosted.org/packages/88/e7/179cfda3a28bc843b5c6cfe7f79f23489c791ed95f151083803660878432/regex-2026.5.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6351571c8a42b505eb555c0dc47d740d0fb66977dc142919eea6f4325b7c56a0", size = 816369, upload-time = "2026-05-09T23:14:56.198Z" },
+ { url = "https://files.pythonhosted.org/packages/41/90/6f0cc422071688266d344fca8462d787cba0a2c144acb25721f9a61ec265/regex-2026.5.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:002205cafd2a9e78c6290c7d1df277bf3277b3b7a30e0b4bb0dac2e2e3f7cb2d", size = 785869, upload-time = "2026-05-09T23:14:58.602Z" },
+ { url = "https://files.pythonhosted.org/packages/02/67/a31f1760f09c27b251ef39e9beb541f462cf977381d067faa764c2c0e393/regex-2026.5.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8abd33fef90b2a9efac5557d6033ca82d1195ed3a15fea5af15ba7b463c6a63b", size = 801427, upload-time = "2026-05-09T23:15:00.642Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/c4/1a80654597b6bc1e1ea0494824c31200e8a956abe290afae9b19a166a148/regex-2026.5.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:31037c82eccb44b7ea2e9e221d7c01429430e989a1f4b91ea5a855f6017b509a", size = 866482, upload-time = "2026-05-09T23:15:03.384Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/960724e06482c08466ff5611e242e86f80062949cdf6b4b9cc317b9dd93d/regex-2026.5.9-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5604dfd046dc37eca90250fc3be938b076c8059fa772ac0ed6f499b0f0fb0415", size = 773022, upload-time = "2026-05-09T23:15:05.625Z" },
+ { url = "https://files.pythonhosted.org/packages/50/a8/a9979c3e7918280e93159ebcab5ef1a65116dd4f3bd6091be0eae4a126e8/regex-2026.5.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e1b1b4e496afbb24f4a62aba855ee4f88f25578927697b340702e48c9ee6bc2", size = 856642, upload-time = "2026-05-09T23:15:07.966Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/d4/a9b732f2f0072c0ab12227483abb24fffcb9f73f8a2b203df0a6d0434735/regex-2026.5.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:be3372b9df6ddecff6486d37e19095a7b4973137caf5512407a89f4455361f41", size = 803552, upload-time = "2026-05-09T23:15:10.215Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/fe/1b3113817447a1d4155e4ac76d2e072f42c0bcba2f43fa8a0e756ea2cd91/regex-2026.5.9-cp314-cp314t-win32.whl", hash = "sha256:3ddd90103f9e5c471c49c7852ecc1fe27c7e45eb99e977aefe7caa4e779f4f58", size = 275746, upload-time = "2026-05-09T23:15:12.609Z" },
+ { url = "https://files.pythonhosted.org/packages/92/73/93d42045302636c91f2e5ef588b65b84b01428f28ec77de256b1dfdfbe5c/regex-2026.5.9-cp314-cp314t-win_amd64.whl", hash = "sha256:ca518ed29c46eecba6010b15f1b9a479314d2de409536e71b6a13aa04e3b8a77", size = 285685, upload-time = "2026-05-09T23:15:15.086Z" },
+ { url = "https://files.pythonhosted.org/packages/da/80/35b4c33c804a165a7f55289afda3ea9e3eb6d15800341a2d66455c0f1f30/regex-2026.5.9-cp314-cp314t-win_arm64.whl", hash = "sha256:5e41809d2683fcde7d5a8c87a6567ba1fb1ce0de9f31bff578de00a4b2d76daa", size = 275713, upload-time = "2026-05-09T23:15:16.98Z" },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.12"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" },
+ { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" },
+ { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" },
+ { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" },
+ { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" },
+ { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" },
+ { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" },
+ { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" },
+ { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" },
+]
+
+[[package]]
+name = "sniffio"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
+]
+
+[[package]]
+name = "socksio"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f8/5c/48a7d9495be3d1c651198fd99dbb6ce190e2274d0f28b9051307bdec6b85/socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac", size = 19055, upload-time = "2020-04-17T15:50:34.664Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3", size = 12763, upload-time = "2020-04-17T15:50:31.878Z" },
+]
+
+[[package]]
+name = "tiktoken"
+version = "0.8.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "regex" },
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/02/576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099/tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2", size = 35107, upload-time = "2024-10-03T22:44:04.196Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/22/34b2e136a6f4af186b6640cbfd6f93400783c9ef6cd550d9eab80628d9de/tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586", size = 1039357, upload-time = "2024-10-03T22:43:36.362Z" },
+ { url = "https://files.pythonhosted.org/packages/04/d2/c793cf49c20f5855fd6ce05d080c0537d7418f22c58e71f392d5e8c8dbf7/tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b", size = 982616, upload-time = "2024-10-03T22:43:37.658Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/a1/79846e5ef911cd5d75c844de3fa496a10c91b4b5f550aad695c5df153d72/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab", size = 1144011, upload-time = "2024-10-03T22:43:39.092Z" },
+ { url = "https://files.pythonhosted.org/packages/26/32/e0e3a859136e95c85a572e4806dc58bf1ddf651108ae8b97d5f3ebe1a244/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04", size = 1175432, upload-time = "2024-10-03T22:43:40.323Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/89/926b66e9025b97e9fbabeaa59048a736fe3c3e4530a204109571104f921c/tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc", size = 1236576, upload-time = "2024-10-03T22:43:41.516Z" },
+ { url = "https://files.pythonhosted.org/packages/45/e2/39d4aa02a52bba73b2cd21ba4533c84425ff8786cc63c511d68c8897376e/tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db", size = 883824, upload-time = "2024-10-03T22:43:43.33Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/38/802e79ba0ee5fcbf240cd624143f57744e5d411d2e9d9ad2db70d8395986/tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24", size = 1039648, upload-time = "2024-10-03T22:43:45.22Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/da/24cdbfc302c98663fbea66f5866f7fa1048405c7564ab88483aea97c3b1a/tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a", size = 982763, upload-time = "2024-10-03T22:43:46.571Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/f0/0ecf79a279dfa41fc97d00adccf976ecc2556d3c08ef3e25e45eb31f665b/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5", size = 1144417, upload-time = "2024-10-03T22:43:48.633Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/d3/155d2d4514f3471a25dc1d6d20549ef254e2aa9bb5b1060809b1d3b03d3a/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953", size = 1175108, upload-time = "2024-10-03T22:43:50.568Z" },
+ { url = "https://files.pythonhosted.org/packages/19/eb/5989e16821ee8300ef8ee13c16effc20dfc26c777d05fbb6825e3c037b81/tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7", size = 1236520, upload-time = "2024-10-03T22:43:51.759Z" },
+ { url = "https://files.pythonhosted.org/packages/40/59/14b20465f1d1cb89cfbc96ec27e5617b2d41c79da12b5e04e96d689be2a7/tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69", size = 883849, upload-time = "2024-10-03T22:43:53.999Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]
+
+[[package]]
+name = "typing-inspection"
+version = "0.4.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
+]
+
+[[package]]
+name = "werkzeug"
+version = "3.0.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d4/f9/0ba83eaa0df9b9e9d1efeb2ea351d0677c37d41ee5d0f91e98423c7281c9/werkzeug-3.0.6.tar.gz", hash = "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d", size = 805170, upload-time = "2024-10-25T18:52:31.688Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/6c/69/05837f91dfe42109203ffa3e488214ff86a6d68b2ed6c167da6cdc42349b/werkzeug-3.0.6-py3-none-any.whl", hash = "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17", size = 227979, upload-time = "2024-10-25T18:52:30.129Z" },
+]
+
+[[package]]
+name = "yarl"
+version = "1.23.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "idna" },
+ { name = "multidict" },
+ { name = "propcache" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" },
+ { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" },
+ { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" },
+ { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" },
+ { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" },
+ { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" },
+ { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" },
+ { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" },
+ { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" },
+ { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" },
+ { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" },
+ { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" },
+ { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" },
+ { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" },
+ { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" },
+ { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" },
+ { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" },
+ { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" },
+ { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" },
+ { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" },
+ { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" },
+ { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" },
+ { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" },
+ { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" },
+ { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" },
+ { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" },
+ { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" },
+ { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" },
+ { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" },
+ { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" },
+ { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" },
+ { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" },
+ { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" },
+ { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" },
+ { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" },
+ { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" },
+ { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" },
+ { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" },
+ { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" },
+ { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" },
+]
+
+[[package]]
+name = "zope-event"
+version = "6.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/93/41/faa10af34d48d9cd6fa0249a1162943ad84a9590bd1a06939981e6640416/zope_event-6.2.tar.gz", hash = "sha256:b97d5d6327067ee6b9dfcbdf606ade9ade70991e19c162e808ea39e5fcf0f8d3", size = 18958, upload-time = "2026-04-28T06:24:10.578Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/33/848922889e946d4befc415c219fe516af75c49555d8e736e183bfd30db42/zope_event-6.2-py3-none-any.whl", hash = "sha256:5e755153ac4faf64c10a4b6dd3307680166a3edf65b38df22df592610f8fa874", size = 6525, upload-time = "2026-04-28T06:24:09.176Z" },
+]
+
+[[package]]
+name = "zope-interface"
+version = "8.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/9f/65/34a6e6e4dfa260c4c55ee02bb2fc53625e126ff0181485286cf0c9d453d6/zope_interface-8.4.tar.gz", hash = "sha256:9dbee7925a23aa6349738892c911019d4095a96cff487b743482073ecbc174a8", size = 257736, upload-time = "2026-04-25T07:22:10.439Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b8/96/0017b980424125cf98a9851d8fd3e24939818b7a82ecdd19ae672bb2413f/zope_interface-8.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:84064876ed96ddd0744e3ad5d37134c758d77885e54113567792671405a02bac", size = 211604, upload-time = "2026-04-25T07:28:08.13Z" },
+ { url = "https://files.pythonhosted.org/packages/59/4c/2cf5c45477fdd58a2c786d0c0d1817cbaaff8743d98ae72c643c4fe3be7b/zope_interface-8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:81ed23698bfb588c48b1756129814b890febac971ff6c8a414f82601773145bb", size = 211783, upload-time = "2026-04-25T07:28:10.028Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/8c/efabdafc25ed44ef9c1084aad9870bb6c2c9b78e542684efe6865c0f0067/zope_interface-8.4-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:e0b9d7e958657fad414f8272afcdf0b8a873fbbb2bb6a6287232d2f11a232bf8", size = 264752, upload-time = "2026-04-25T07:28:11.773Z" },
+ { url = "https://files.pythonhosted.org/packages/53/5a/c4d52c58d5fee4ff67cc02f0dec24d0e84428520f67a52f1e4086f0e7779/zope_interface-8.4-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eef0a49e041f4dc4d2a6ab894b4fd0c5354e0e8037e731fb953531e59b0d3d33", size = 269829, upload-time = "2026-04-25T07:28:13.988Z" },
+ { url = "https://files.pythonhosted.org/packages/16/d2/df8f339c93bb5adee695546ba90d0daa2917338a4792281f6b8e652a9328/zope_interface-8.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b302f955c36e924e1f4fe70dd9105ff06235857861c6ae72c3b10b016aeee99", size = 269452, upload-time = "2026-04-25T07:28:16.403Z" },
+ { url = "https://files.pythonhosted.org/packages/17/4b/bd97b1a21bb2c16d66a42f6c7a43c0a5afcfaf14c68d3b7d2ee6afb28e52/zope_interface-8.4-cp312-cp312-win_amd64.whl", hash = "sha256:4ae6a1e111642dbf724f635424dcaf5a5c8abbde49eac3f452f5323ffaa10232", size = 214420, upload-time = "2026-04-25T07:28:18.405Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/85/1477f23cf3b0476608ca987b4338f91439abb5b96564ac26b26d2cde38fd/zope_interface-8.4-cp312-cp312-win_arm64.whl", hash = "sha256:2e9e4aa33b76877af903d5532545e64d24ade0f6f80d9d1a31e6efcea76a60bc", size = 212992, upload-time = "2026-04-25T07:28:20.48Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/6a/a08c62bc1fa0e34fe7b8b401646cba4817427c716bfbef6cc88937cd327f/zope_interface-8.4-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:cd55965d715413038774aead54851bc3dbdd74a69f3ce30252182a94407b9905", size = 211924, upload-time = "2026-04-25T07:28:22.219Z" },
+ { url = "https://files.pythonhosted.org/packages/50/30/2011f17e00ff078658bc317e1f7eccd7843fc1ce60695b665b0a52c45c1b/zope_interface-8.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0d88c1f106a4f06e074a3ada2d20f4a602e3f2871c4f55726ed5d91e94ec19b1", size = 211995, upload-time = "2026-04-25T07:28:24.107Z" },
+ { url = "https://files.pythonhosted.org/packages/25/f3/a16fe884571cfa89271412dbb40def6d6865824428d1e14785a82795100c/zope_interface-8.4-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:36c575356732d59ffd3279ad67e302a6fe517e67db5b061b36b377ee0fa016c4", size = 264443, upload-time = "2026-04-25T07:28:26.401Z" },
+ { url = "https://files.pythonhosted.org/packages/83/88/e08923fcd8a8c8704af05a90418b07cd897ac90865925b37d7ad8139adfa/zope_interface-8.4-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:29f09ec8bda65f7b30294328070070a2590b90f252f834ee0817cdb0e2c35f6a", size = 269626, upload-time = "2026-04-25T07:28:28.423Z" },
+ { url = "https://files.pythonhosted.org/packages/27/67/96c94cd307f9946d0b0f03402a335f7aae7b4f0b129b5734cc56cc78cb65/zope_interface-8.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2bc388cebcb753d21eaf2a0481fd6f0ce6840a47300a40dcec0b56bac27d0f97", size = 269583, upload-time = "2026-04-25T07:28:30.434Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/d4/7e9fcc8bb0dba5d023b9fca92035d68c018457cc550e9d51746670b76a6b/zope_interface-8.4-cp313-cp313-win_amd64.whl", hash = "sha256:3e5866917ccb57d929e515a1136d729bd3fa4f367965fb16e38a4bc72cb05521", size = 214422, upload-time = "2026-04-25T07:28:32.201Z" },
+ { url = "https://files.pythonhosted.org/packages/16/26/b0bcde302f6a4c155d047a8ab5cba1003363031919d6e8f3bcdc139c28a6/zope_interface-8.4-cp313-cp313-win_arm64.whl", hash = "sha256:f1f854bef8bc137519e4413bcc1322d55faad28b20b3ca39f7bec49d2f1b26df", size = 213029, upload-time = "2026-04-25T07:28:34.677Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/d5/ca60c8b404b303d9490e1417430a5198a77557dbeb17c1cb31616e432318/zope_interface-8.4-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:7cbb887fdbfaacb4c362dbb487033551646e28013ad5ffe72e96eb260003a1a1", size = 212012, upload-time = "2026-04-25T07:28:36.88Z" },
+ { url = "https://files.pythonhosted.org/packages/83/64/6bb9f54250c817e24b39e986f173b6cd21ff658bec6c6cc0baad05d761e4/zope_interface-8.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a5638c6be715116d3453e6d099c299c6844d54810de7445ce116424e905ede06", size = 212071, upload-time = "2026-04-25T07:28:38.742Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/cf/42851262e102723058019dc7d0b48210b85a935f79ae32ce60ddccc2e8fb/zope_interface-8.4-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b8147b40bfcd53803870a9519e0879ff066aeecc2fcff8295663c1b17fc38dc2", size = 266075, upload-time = "2026-04-25T07:28:41.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/a7/e48c79b836f6f0a2c219288e2ec343517f90e95c93de5435a8a23918bf20/zope_interface-8.4-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:049ba3c7b38cc400ae08e011617635706e0f442e1d075db1b015246fcbf6091e", size = 269127, upload-time = "2026-04-25T07:28:42.868Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/40/0e26f24d3a2f34f0de2cfeaab6458a865284d9d1fa317ab78913aa1f7322/zope_interface-8.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9c4ac009c2c8e43283842f80387c4d4b41bcbc293391c3b9ab71532ae1ccc301", size = 269446, upload-time = "2026-04-25T07:28:44.97Z" },
+ { url = "https://files.pythonhosted.org/packages/91/d5/20310601450367fc35fa28b0544c98d0347b8cc25eaf106a2c4cc36841e1/zope_interface-8.4-cp314-cp314-win_amd64.whl", hash = "sha256:4713bf651ec36e7eea49d2ace4f0e89bec2b33a339674874b1121f2537edc62a", size = 215199, upload-time = "2026-04-25T07:28:47.146Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/00/0d22ce75126e31f81baa5889e2a40aad37c8e34d1220cf8b18d744f2b5d9/zope_interface-8.4-cp314-cp314-win_arm64.whl", hash = "sha256:d934497c4b72d5f528d2b5ebe9b8b5a7004b5877948ebd4ea00c2432fb27178f", size = 213178, upload-time = "2026-04-25T07:28:48.868Z" },
+]