diff --git a/.env.example b/.env.example index d4d4999..090d82c 100644 --- a/.env.example +++ b/.env.example @@ -1,11 +1,14 @@ -# [OPTIONAL] Free Pipelex Inference API key - Get yours on Discord: https://go.pipelex.com/discord -# No credit card required, limited time offer -PIPELEX_GATEWAY_API_KEY= +# cocode runs its AI workflows on your machine, with your own provider keys. +# +# It ships with the OpenAI backend switched on, and the model deck's default tiers are OpenAI models, +# so OPENAI_API_KEY is all you need to start. A key on its own is not enough for any other provider: +# its backend also has to be switched on, and the model deck pointed at its models. The README says +# how, and so does https://docs.pipelex.com/latest/get-started/configure-ai-providers/ -# OpenAI: to use models like GPT-4o and GPT-5 +# OpenAI: the provider cocode ships configured for OPENAI_API_KEY= -# Azure: to use models like GPT-4o and GPT-5 from OpenAI but on Azure cloud +# Azure: to use OpenAI models on Azure cloud AZURE_API_BASE= AZURE_API_VERSION= AZURE_API_KEY= @@ -15,27 +18,51 @@ AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_REGION= -# To use Claude models directly from their creator, Anthropic +# To use Claude models directly from their creator, Anthropic ANTHROPIC_API_KEY= # To use Mistral models MISTRAL_API_KEY= -# To generate images from fal.ai, the service of Forest Labs +# OpenRouter: one key for models from many providers at once +OPENROUTER_API_KEY= + +# To generate images from fal.ai FAL_API_KEY= # Google AI Studio - Use GOOGLE_API_KEY for direct API access (simpler, rate-limited) GOOGLE_API_KEY= # Google Cloud Platform (GCP) - Use these for production Vertex AI access (requires GCP project setup) -# We recomment to use GOOGLE_API_KEY OR GCP credentials, not both +# We recommend using GOOGLE_API_KEY OR GCP credentials, not both GCP_PROJECT_ID= GCP_LOCATION= GCP_CREDENTIALS_FILE_PATH=gcp_credentials.json # To use Grok from x.ai XAI_API_KEY= -XAI_API_ENDPOINT=https://api.x.ai/v1/ # To get access to many models with one key from blackbox.ai BLACKBOX_API_KEY= + +# To use open models served by Groq +GROQ_API_KEY= + +# To generate images with models on the Hugging Face Inference API +HF_TOKEN= + +# Portkey: an AI gateway reaching many providers with one key +PORTKEY_API_KEY= + +# To use models hosted on Scaleway +SCALEWAY_ENDPOINT= +SCALEWAY_API_KEY= + +# To use MiniMax models +MINIMAX_API_KEY= + +# Linkup: the models behind web search and web page extraction +LINKUP_API_KEY= + +# TypeSafe: the models behind judgment steps +TYPESAFE_API_KEY= diff --git a/.github/workflows/tests-check.yml b/.github/workflows/tests-check.yml index f2a6a6f..b8ed35b 100644 --- a/.github/workflows/tests-check.yml +++ b/.github/workflows/tests-check.yml @@ -21,9 +21,8 @@ jobs: env: VIRTUAL_ENV: ${{ github.workspace }}/.venv ENV: dev - # Our CI never sends usage statistics: the off switch every Pipelex tool honours. Safe on the pinned pipelex, which - # refuses DO_NOT_TRACK only when it boots with inference and the Pipelex Gateway enabled, because `make gha-tests` - # always passes --disable-inference. + # Our CI never sends usage statistics: the off switch every Pipelex tool honours. The pinned pipelex sends none and + # reads DO_NOT_TRACK only to turn its own telemetry off, which it honours at any boot. DO_NOT_TRACK: "1" steps: - uses: actions/checkout@v4 diff --git a/.pipelex/inference/backends.toml b/.pipelex/inference/backends.toml index 8ffc6c6..77a7ddc 100644 --- a/.pipelex/inference/backends.toml +++ b/.pipelex/inference/backends.toml @@ -5,16 +5,23 @@ # This file configures the inference backends available to Pipelex. # Each backend connects to a different AI service provider (OpenAI, Anthropic, Google, etc.). # -# Documentation: https://docs.pipelex.com +# cocode ships with `openai` switched on, because the model deck's default tiers are OpenAI models: +# an OPENAI_API_KEY in your .env file is all a run needs. A run refuses to start while an enabled +# backend's key is missing, so switch a backend on only when you hold its key. The cocode package +# carries this directory and runs on it from any directory without an inference configuration of +# its own. +# +# To run on another provider without editing this tracked file, write the change in a git-ignored +# backends_override.toml beside it (for instance `[openai] enabled = false` and +# `[anthropic] enabled = true`), then point the deck's aliases and the presets that name a model at +# that provider's models in a deck file of your own, such as deck/x_custom_provider_deck.toml. The +# README gives both files in full. +# +# Documentation: https://docs.pipelex.com/latest/get-started/configure-ai-providers/ # Support: https://go.pipelex.com/discord # #################################################################################################### -[pipelex_gateway] -display_name = "⭐ Pipelex Gateway" -enabled = true # Enable after accepting terms via `pipelex init config` -api_key = "${PIPELEX_GATEWAY_API_KEY}" - [anthropic] enabled = false api_key = "${ANTHROPIC_API_KEY}" @@ -58,6 +65,17 @@ display_name = "Hugging Face" enabled = false api_key = "${HF_TOKEN}" +[linkup] +display_name = "Linkup" +enabled = false +api_key = "${LINKUP_API_KEY}" + +[minimax] +display_name = "MiniMax" +enabled = false +endpoint = "https://api.minimax.io/anthropic" +api_key = "${MINIMAX_API_KEY}" + [mistral] display_name = "Mistral AI" enabled = false @@ -69,9 +87,15 @@ endpoint = "http://localhost:11434/v1" [openai] display_name = "OpenAI" -enabled = false +enabled = true api_key = "${OPENAI_API_KEY}" +[openrouter] +display_name = "OpenRouter" +enabled = false +endpoint = "https://openrouter.ai/api/v1" +api_key = "${OPENROUTER_API_KEY}" + [portkey] display_name = "Portkey" enabled = false @@ -84,6 +108,11 @@ enabled = false endpoint = "${SCALEWAY_ENDPOINT}" api_key = "${SCALEWAY_API_KEY}" +[typesafe] +display_name = "TypeSafe" +enabled = false +api_key = "${TYPESAFE_API_KEY}" + [vertexai] display_name = "Google Vertex AI" enabled = false # This is the only one we disable because setting it up requires internet access just to get credentials so it fails in CI sandboxes @@ -99,10 +128,3 @@ api_key = "${XAI_API_KEY}" [internal] # software-only backend, runs internally, without AI enabled = true - -# Deprecated -[pipelex_inference] -display_name = "🛑 Legacy Pipelex Inference" -enabled = false -endpoint = "https://inference.pipelex.com/v1" -api_key = "${PIPELEX_INFERENCE_API_KEY}" diff --git a/.pipelex/inference/backends/.kit_manifest.json b/.pipelex/inference/backends/.kit_manifest.json new file mode 100644 index 0000000..c1cc70c --- /dev/null +++ b/.pipelex/inference/backends/.kit_manifest.json @@ -0,0 +1,6 @@ +{ + "files": { + "internal.toml": "d99ddf303c4da154d01d88d7f2839c07dc8dd6a98c0446290a75a0f3c4eef0d8" + }, + "kit_version": "0.83.0" +} diff --git a/.pipelex/inference/backends/anthropic.toml b/.pipelex/inference/backends/anthropic.toml index f01e6bf..ee3a034 100644 --- a/.pipelex/inference/backends/anthropic.toml +++ b/.pipelex/inference/backends/anthropic.toml @@ -25,6 +25,7 @@ model_type = "llm" sdk = "anthropic" structure_method = "instructor/anthropic_tools" thinking_mode = "manual" +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens ################################################################################ # LANGUAGE MODELS @@ -100,6 +101,15 @@ outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 5.0, output = 25.0 } +["claude-4.6-sonnet"] +model_id = "claude-sonnet-4-6" +max_tokens = 64000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 3.0, output = 15.0 } +thinking_mode = "adaptive" + ["claude-4.6-opus"] model_id = "claude-opus-4-6" max_tokens = 64000 @@ -108,3 +118,110 @@ outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 5.0, output = 25.0 } thinking_mode = "adaptive" + +# --- Claude 4.7 Series -------------------------------------------------------- +["claude-4.7-opus"] +model_id = "claude-opus-4-7" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 5.0, output = 25.0 } +thinking_mode = "adaptive" +listed_constraints = ["temperature_unsupported"] + +# --- Claude 4.8 Series -------------------------------------------------------- +["claude-4.8-opus"] +model_id = "claude-opus-4-8" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 5.0, output = 25.0 } +thinking_mode = "adaptive" +listed_constraints = ["temperature_unsupported"] + +# --- Claude 5 Series ---------------------------------------------------------- +[claude-5-sonnet] +model_id = "claude-sonnet-5" +max_tokens = 64000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 2.0, output = 10.0 } +thinking_mode = "adaptive" +listed_constraints = ["temperature_unsupported"] + +[claude-5-opus] +model_id = "claude-opus-5" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 5.0, output = 25.0 } +thinking_mode = "adaptive" +listed_constraints = ["temperature_unsupported"] + +[claude-5-fable] +model_id = "claude-fable-5" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 10.0, output = 50.0 } +thinking_mode = "adaptive" +listed_constraints = ["temperature_unsupported"] + +# --- Claude 5.1 Series -------------------------------------------------------- +["claude-5.1-fable"] +model_id = "claude-fable-5-1" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 10.0, output = 50.0 } +thinking_mode = "adaptive" +# Fable 5.1 refuses tool_choice "tool" and "any", which is what the section default +# instructor/anthropic_tools forces; the reasoning variant leaves tool_choice on auto. +structure_method = "instructor/anthropic_reasoning_tools" +listed_constraints = ["temperature_unsupported"] + +# --- Claude 5.5 Series -------------------------------------------------------- +["claude-5.5-sonnet"] +model_id = "claude-sonnet-5-5" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 2.0, output = 10.0 } +thinking_mode = "adaptive" +# Sonnet 5.5 refuses tool_choice "tool" and "any", which is what the section default +# instructor/anthropic_tools forces; the reasoning variant leaves tool_choice on auto. +structure_method = "instructor/anthropic_reasoning_tools" +listed_constraints = ["temperature_unsupported"] + +["claude-5.5-opus"] +model_id = "claude-opus-5-5" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 4.0, output = 20.0 } +thinking_mode = "adaptive" +# Opus 5.5 refuses tool_choice "tool" and "any", like Sonnet 5.5 above. +structure_method = "instructor/anthropic_reasoning_tools" +listed_constraints = ["temperature_unsupported"] + +["claude-5.5-haiku"] +model_id = "claude-haiku-5-5" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +# The price of a prompt up to 100,000 tokens; a longer prompt pays $0.50 / $2.50. +costs = { input = 0.10, output = 0.50 } +thinking_mode = "adaptive" +# Unlike Sonnet 5.5 and Opus 5.5, Haiku 5.5 accepts the forced tool_choice that +# instructor/anthropic_tools sends; it then answers with the tool call and no thinking. +structure_method = "instructor/anthropic_tools" +listed_constraints = ["temperature_unsupported"] diff --git a/.pipelex/inference/backends/azure_openai.toml b/.pipelex/inference/backends/azure_openai.toml index f73bd3d..0c1fc25 100644 --- a/.pipelex/inference/backends/azure_openai.toml +++ b/.pipelex/inference/backends/azure_openai.toml @@ -8,7 +8,7 @@ # # Configuration structure: # - Each model is defined in its own section with the model name as the header -# - Headers with dots must be quoted (e.g., ["gpt-4.1"]) +# - Headers with dots must be quoted (e.g., ["gpt-5.4"]) # - Model costs are in USD per million tokens (input/output) # # Documentation: https://docs.pipelex.com @@ -43,129 +43,102 @@ inputs = ["text", "images"] outputs = ["text", "structured"] costs = { input = 0.15, output = 0.6 } -# --- GPT-4.1 Series ----------------------------------------------------------- -["gpt-4.1"] -model_id = "gpt-4.1-2025-04-14" +# --- GPT-5.3 Series ------------------------------------------------------------- +["gpt-5.3-codex"] +model_id = "gpt-5.3-codex-2026-02-24" inputs = ["text", "images"] outputs = ["text", "structured"] -costs = { input = 2, output = 8 } - -["gpt-4.1-mini"] -model_id = "gpt-4.1-mini-2025-04-14" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.4, output = 1.6 } - -["gpt-4.1-nano"] -model_id = "gpt-4.1-nano-2025-04-14" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.1, output = 0.4 } - -# --- o Series ---------------------------------------------------------------- -[o1-mini] -model_id = "o1-mini-2024-09-12" -inputs = ["text"] -outputs = ["text", "structured"] -costs = { input = 3.0, output = 12.0 } +costs = { input = 1.75, output = 14.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -[o1] -model_id = "o1-2024-12-17" -inputs = ["text", "images"] +# --- GPT-5.4 Series ----------------------------------------------------------- +["gpt-5.4"] +model_id = "gpt-5.4-2026-03-05" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 15.0, output = 60.0 } -valued_constraints = { fixed_temperature = 1 } +costs = { input = 2.5, output = 15.0 } thinking_mode = "manual" -[o3-mini] -model_id = "o3-mini-2025-01-31" -inputs = ["text"] +["gpt-5.4-pro"] +model_id = "gpt-5.4-pro-2026-03-05" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.1, output = 4.4 } +costs = { input = 30.0, output = 180.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -[o3] -model_id = "o3-2025-04-16" -inputs = ["text"] +["gpt-5.4-mini"] +model_id = "gpt-5.4-mini-2026-03-17" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 2, output = 8 } -valued_constraints = { fixed_temperature = 1 } +costs = { input = 0.75, output = 4.5 } thinking_mode = "manual" -# --- GPT-5 Series ------------------------------------------------------------- -[gpt-5-mini] -model_id = "gpt-5-mini-2025-08-07" -inputs = ["text", "images"] +["gpt-5.4-nano"] +model_id = "gpt-5.4-nano-2026-03-17" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 0.25, output = 2.0 } -valued_constraints = { fixed_temperature = 1 } +costs = { input = 0.2, output = 1.25 } thinking_mode = "manual" -[gpt-5-nano] -model_id = "gpt-5-nano-2025-08-07" -inputs = ["text", "images"] +# --- GPT-5.5 Series ----------------------------------------------------------- +["gpt-5.5"] +model_id = "gpt-5.5-2026-04-24" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 0.05, output = 0.4 } +costs = { input = 5.0, output = 30.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -[gpt-5-chat] -model_id = "gpt-5-chat-2025-08-07" -inputs = ["text", "images"] +# --- GPT-5.6 Series ----------------------------------------------------------- +["gpt-5.6-sol"] +model_id = "gpt-5.6-sol-2026-07-09" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 4.0, output = 20.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -[gpt-5] -model_id = "gpt-5-2025-08-07" -inputs = ["text", "images"] +["gpt-5.6-terra"] +model_id = "gpt-5.6-terra-2026-07-09" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 2.0, output = 12.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -# --- GPT-5.1 Series ------------------------------------------------------------- -["gpt-5.1"] -model_id = "gpt-5.1-2025-11-13" -inputs = ["text", "images"] +["gpt-5.6-luna"] +model_id = "gpt-5.6-luna-2026-07-09" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 0.2, output = 1.2 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -["gpt-5.1-chat"] -model_id = "gpt-5.1-chat-2025-11-13" -inputs = ["text", "images"] +# --- GPT-6 Series ------------------------------------------------------------- +["gpt-6-astra"] +model_id = "gpt-6-astra-2026-09-03" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 10.0, output = 50.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -["gpt-5.1-codex"] -model_id = "gpt-5.1-codex-2025-11-13" -inputs = ["text", "images"] +["gpt-6-luna"] +model_id = "gpt-6-luna-2026-09-22" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 0.1, output = 0.5 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -# --- GPT-5.2 Series ------------------------------------------------------------- -["gpt-5.2"] -model_id = "gpt-5.2-2025-12-11" -inputs = ["text", "images"] +# --- GPT-6.1 Series ----------------------------------------------------------- +["gpt-6.1-sol"] +model_id = "gpt-6.1-sol-2026-09-29" +inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.75, output = 14.0 } -thinking_mode = "manual" - -["gpt-5.2-chat"] -model_id = "gpt-5.2-chat-2025-12-11" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 2.0, output = 10.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" @@ -178,49 +151,77 @@ thinking_mode = "manual" sdk = "azure_rest_img_gen" model_type = "img_gen" model_id = "gpt-image-1-2025-04-15" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] costs = { input = 10, output = 40 } [gpt-image-1.rules] prompt = "positive_only" -num_images = "gpt" -aspect_ratio = "gpt" -background = "gpt" -inference = "gpt" +num_images = "gpt_image" +aspect_ratio = "gpt_image_legacy" +background = "available" +inference = "gpt_image" safety_checker = "unavailable" -output_format = "gpt" +output_format = "gpt_image_legacy" +output_compression = "gpt_image_legacy" +input_images = "gpt_image" +input_fidelity = "gpt_image_legacy" [gpt-image-1-mini] sdk = "azure_rest_img_gen" model_type = "img_gen" model_id = "gpt-image-1-mini-2025-10-06" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] costs = { input = 2.5, output = 8 } [gpt-image-1-mini.rules] prompt = "positive_only" -num_images = "gpt" -aspect_ratio = "gpt" -background = "gpt" -inference = "gpt" +num_images = "gpt_image" +aspect_ratio = "gpt_image_legacy" +background = "available" +inference = "gpt_image" safety_checker = "unavailable" -output_format = "gpt" +output_format = "gpt_image_legacy" +output_compression = "gpt_image_legacy" +input_images = "gpt_image" +input_fidelity = "gpt_image_legacy" ["gpt-image-1.5"] sdk = "azure_rest_img_gen" model_type = "img_gen" model_id = "gpt-image-1.5-2025-12-16" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] costs = { input = 8, output = 32 } ["gpt-image-1.5".rules] prompt = "positive_only" -num_images = "gpt" -aspect_ratio = "gpt" -background = "gpt" -inference = "gpt" +num_images = "gpt_image" +aspect_ratio = "gpt_image_legacy" +background = "available" +inference = "gpt_image" +safety_checker = "unavailable" +output_format = "gpt_image_legacy" +output_compression = "gpt_image_legacy" +input_images = "gpt_image" +input_fidelity = "gpt_image_legacy" + +[gpt-image-2] +sdk = "azure_rest_img_gen" +model_type = "img_gen" +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 8, output = 30 } + +[gpt-image-2.rules] +prompt = "positive_only" +num_images = "gpt_image" +aspect_ratio = "gpt_image_2" +background = "unavailable" +inference = "gpt_image" safety_checker = "unavailable" -output_format = "gpt" +output_format = "unavailable" +output_compression = "unavailable" +input_images = "gpt_image" +input_fidelity = "unavailable" diff --git a/.pipelex/inference/backends/bedrock.toml b/.pipelex/inference/backends/bedrock.toml index 4181e26..6f75ece 100644 --- a/.pipelex/inference/backends/bedrock.toml +++ b/.pipelex/inference/backends/bedrock.toml @@ -22,7 +22,7 @@ [defaults] model_type = "llm" -sdk = "bedrock_aioboto3" +sdk = "bedrock_aioboto" thinking_mode = "none" ################################################################################ @@ -55,17 +55,15 @@ outputs = ["text"] # TODO: find out the actual cost per million tokens for nova on bedrock costs = { input = 3.0, output = 15.0 } -# --- Claude LLMs -------------------------------------------------------------- -["claude-3.7-sonnet"] -sdk = "bedrock_anthropic" -model_id = "us.anthropic.claude-3-7-sonnet-20250219-v1:0" +# --- DeepSeek Models ---------------------------------------------------------- +["deepseek-v3.1"] +model_id = "deepseek.v3-v1:0" +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } max_tokens = 8192 -inputs = ["text", "images", "pdf"] -outputs = ["text", "structured"] -max_prompt_images = 100 -costs = { input = 3.0, output = 15.0 } -thinking_mode = "manual" +# --- Claude LLMs -------------------------------------------------------------- [claude-4-sonnet] sdk = "bedrock_anthropic" model_id = "us.anthropic.claude-sonnet-4-20250514-v1:0" @@ -74,6 +72,7 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 3.0, output = 15.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens thinking_mode = "manual" [claude-4-opus] @@ -84,6 +83,7 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 3.0, output = 15.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens thinking_mode = "manual" ["claude-4.1-opus"] @@ -94,6 +94,7 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 3.0, output = 15.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens thinking_mode = "manual" ["claude-4.5-sonnet"] @@ -104,6 +105,7 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 3.0, output = 15.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens thinking_mode = "manual" ["claude-4.5-haiku"] @@ -114,6 +116,7 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 1.0, output = 5.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens thinking_mode = "manual" ["claude-4.5-opus"] @@ -124,8 +127,20 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 5.0, output = 25.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens thinking_mode = "manual" +["claude-4.6-sonnet"] +sdk = "bedrock_anthropic" +model_id = "global.anthropic.claude-sonnet-4-6" +max_tokens = 64000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 3.0, output = 15.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens +thinking_mode = "adaptive" + ["claude-4.6-opus"] sdk = "bedrock_anthropic" model_id = "global.anthropic.claude-opus-4-6-v1" @@ -134,4 +149,31 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 100 costs = { input = 5.0, output = 25.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens +thinking_mode = "adaptive" + +# --- Claude 4.7 Series -------------------------------------------------------- +["claude-4.7-opus"] +sdk = "bedrock_anthropic" +model_id = "global.anthropic.claude-opus-4-7" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 5.0, output = 25.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens +thinking_mode = "adaptive" +listed_constraints = ["temperature_unsupported"] + +# --- Claude 4.8 Series -------------------------------------------------------- +["claude-4.8-opus"] +sdk = "bedrock_anthropic" +model_id = "global.anthropic.claude-opus-4-8" +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 100 +costs = { input = 5.0, output = 25.0 } +valued_constraints = { min_thinking_budget = 1024 } # Anthropic refuses a smaller budget_tokens thinking_mode = "adaptive" +listed_constraints = ["temperature_unsupported"] diff --git a/.pipelex/inference/backends/fal.toml b/.pipelex/inference/backends/fal.toml index 1533771..d8dc03f 100644 --- a/.pipelex/inference/backends/fal.toml +++ b/.pipelex/inference/backends/fal.toml @@ -37,6 +37,7 @@ outputs = ["image"] costs = { input = 0.05, output = 0.0 } [flux-pro.rules] +model_choice = "model_id" prompt = "positive_only" num_images = "fal" aspect_ratio = "flux" @@ -52,6 +53,7 @@ outputs = ["image"] costs = { input = 0.05, output = 0.0 } ["flux-pro/v1.1".rules] +model_choice = "model_id" prompt = "positive_only" num_images = "fal" aspect_ratio = "flux" @@ -67,6 +69,7 @@ outputs = ["image"] costs = { input = 0.06, output = 0.0 } ["flux-pro/v1.1-ultra".rules] +model_choice = "model_id" prompt = "positive_only" num_images = "fal" aspect_ratio = "flux_11_ultra" @@ -82,6 +85,7 @@ outputs = ["image"] costs = { input = 0.05, output = 0.0 } [flux-2.rules] +model_choice = "model_id" prompt = "positive_only" num_images = "fal" aspect_ratio = "flux" @@ -98,6 +102,7 @@ outputs = ["image"] costs = { input = 0.0003, output = 0.0 } [fast-lightning-sdxl.rules] +model_choice = "model_id" prompt = "positive_only" num_images = "fal" aspect_ratio = "flux" diff --git a/.pipelex/inference/backends/google.toml b/.pipelex/inference/backends/google.toml index 2d1a408..7552d99 100644 --- a/.pipelex/inference/backends/google.toml +++ b/.pipelex/inference/backends/google.toml @@ -8,7 +8,7 @@ # # Configuration structure: # - Each model is defined in its own section with the model name as the header -# - Headers with dots must be quoted (e.g., ["gemini-3.0-pro"]) +# - Headers with dots must be quoted (e.g., ["gemini-3.1-pro"]) # - Model costs are in USD per million tokens (input/output) # # Documentation: https://docs.pipelex.com @@ -23,7 +23,7 @@ [defaults] model_type = "llm" sdk = "google" -structure_method = "instructor/genai_tools" +structure_method = "instructor/genai_structured_outputs" # Gemini's native JSON output thinking_mode = "manual" ################################################################################ @@ -37,6 +37,9 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 3000 costs = { input = 1.25, output = 10.0 } +valued_constraints = { min_thinking_budget = 128, max_thinking_budget = 32768 } +# Gemini refuses a thinking budget of 0 for this model +listed_constraints = ["thinking_cannot_be_disabled"] ["gemini-2.5-flash"] model_id = "gemini-2.5-flash" @@ -44,6 +47,7 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 3000 costs = { input = 0.30, output = 2.50 } +valued_constraints = { max_thinking_budget = 24576 } ["gemini-2.5-flash-lite"] model_id = "gemini-2.5-flash-lite" @@ -51,22 +55,69 @@ inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 3000 costs = { input = 0.10, output = 0.40 } +valued_constraints = { min_thinking_budget = 512, max_thinking_budget = 24576 } # --- Gemini 3.0 Series ---------------------------------------- -["gemini-3.0-pro"] -model_id = "gemini-3-pro-preview" +["gemini-3.0-flash"] +model_id = "gemini-3-flash-preview" +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 3000 +costs = { input = 0.5, output = 3.0 } +thinking_mode = "adaptive" + +# --- Gemini 3.1 Series ---------------------------------------- +["gemini-3.1-flash-lite"] +model_id = "gemini-3.1-flash-lite-preview" +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 3000 +costs = { input = 0.25, output = 1.50 } +thinking_mode = "adaptive" + +["gemini-3.1-pro"] +model_id = "gemini-3.1-pro-preview" inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 3000 costs = { input = 2, output = 12.0 } +# Gemini refuses a thinking budget of 0 for this model +listed_constraints = ["thinking_cannot_be_disabled"] thinking_mode = "adaptive" -["gemini-3.0-flash-preview"] -model_id = "gemini-3-flash-preview" +# --- Gemini 3.5 Series ---------------------------------------- +["gemini-3.5-flash"] +model_id = "gemini-3.5-flash" inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 3000 -costs = { input = 0.5, output = 3.0 } +costs = { input = 1.5, output = 9.0 } +thinking_mode = "adaptive" + +# --- Latest Aliases (point to current generation, change over time) ----------- +["gemini-pro-latest"] +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 3000 +costs = { input = 1.25, output = 10.0 } +# Gemini refuses a thinking budget of 0 for this model: the alias resolved to gemini-3.1-pro-preview, which always thinks, in October 2026 +listed_constraints = ["thinking_cannot_be_disabled"] +thinking_mode = "adaptive" + +["gemini-flash-latest"] +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 3000 +costs = { input = 0.30, output = 2.50 } +thinking_mode = "adaptive" + +["gemini-flash-lite-latest"] +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +max_prompt_images = 3000 +costs = { input = 0.10, output = 0.40 } +# Gemini refuses a thinking budget of 0 for this model: the alias resolved to gemini-3.5-flash-lite, which always thinks, in October 2026 +listed_constraints = ["thinking_cannot_be_disabled"] thinking_mode = "adaptive" ################################################################################ @@ -76,15 +127,43 @@ thinking_mode = "adaptive" [nano-banana] model_type = "img_gen" model_id = "gemini-2.5-flash-image" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] thinking_mode = "none" -costs = { input = 0.0, output = 0.039 } +costs = { input = 0.30, output = 30 } + +[nano-banana.rules] +aspect_ratio = "gemini_2_5" [nano-banana-pro] model_type = "img_gen" model_id = "gemini-3-pro-image-preview" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] thinking_mode = "none" -costs = { input = 0.0, output = 0.039 } +costs = { input = 2.0, output = 120 } + +[nano-banana-pro.rules] +aspect_ratio = "gemini_3_pro" + +[nano-banana-2] +model_type = "img_gen" +model_id = "gemini-3.1-flash-image-preview" +inputs = ["text", "images"] +outputs = ["image"] +thinking_mode = "none" +costs = { input = 0.50, output = 60 } + +[nano-banana-2.rules] +aspect_ratio = "gemini_3_flash" + +[nano-banana-2-lite] +model_type = "img_gen" +model_id = "gemini-3.1-flash-lite-image" +inputs = ["text", "images"] +outputs = ["image"] +thinking_mode = "none" +costs = { input = 0.25, output = 30 } + +[nano-banana-2-lite.rules] +aspect_ratio = "gemini_3_flash_lite" diff --git a/.pipelex/inference/backends/huggingface.toml b/.pipelex/inference/backends/huggingface.toml index 2fd0faf..ea4665f 100644 --- a/.pipelex/inference/backends/huggingface.toml +++ b/.pipelex/inference/backends/huggingface.toml @@ -35,10 +35,10 @@ model_id = "Qwen/Qwen-Image" inputs = ["text"] outputs = ["image"] costs = { input = 0.0, output = 0.0 } -variant = "fal-ai" -# variant = "replicate" +variant = "fal-ai" # alternative: "replicate" [qwen-image.rules] +model_choice = "model_id" prompt = "with_negative" aspect_ratio = "qwen_image" inference = "qwen_image" diff --git a/.pipelex/inference/backends/internal.toml b/.pipelex/inference/backends/internal.toml index 8fcc38d..e5444f7 100644 --- a/.pipelex/inference/backends/internal.toml +++ b/.pipelex/inference/backends/internal.toml @@ -9,6 +9,10 @@ # - Each model is defined in its own section with the model name as the header # - Model costs are in USD per million tokens (input/output) # +# Managed by `pipelex update`, which refreshes this file from the kit and backs +# up a locally edited copy to .bak. first, so local edits will +# not survive future runs. Declare your own models in a backend of your own. +# # Documentation: https://docs.pipelex.com # Support: https://go.pipelex.com/discord # @@ -39,6 +43,38 @@ costs = {} model_type = "text_extractor" sdk = "docling_sdk" model_id = "extract-text" -inputs = ["pdf", "image"] +inputs = [ + "pdf", + "docx", + "pptx", + "xlsx", + "html", + "md", + "csv", + "txt", + "vtt", + "eml", + "image", +] outputs = ["pages"] costs = {} + +################################################################################ +# DOCUMENT GENERATION ENGINES +################################################################################ +# +# The engines a PipeDocGen step prints with. Their inputs are the sources they +# print from: "layout" is the auto-layout of the step's inputs, "html" an HTML +# template, "template_file" an office template file. Their outputs are the +# formats they print. reportlab-pdf is built into Pipelex. The other engines +# come with the Pipelex document generation plugin, pipelex-doc-gen, which +# declares them itself when it loads: they are never listed in this file. + +# --- ReportLab PDF ------------------------------------------------------------ +[reportlab-pdf] +model_type = "doc_gen" +sdk = "reportlab" +model_id = "print-pdf" +inputs = ["layout"] +outputs = ["pdf"] +costs = {} diff --git a/.pipelex/inference/backends/linkup.toml b/.pipelex/inference/backends/linkup.toml new file mode 100644 index 0000000..73ba1d7 --- /dev/null +++ b/.pipelex/inference/backends/linkup.toml @@ -0,0 +1,49 @@ +################################################################################ +# Linkup Backend Configuration +################################################################################ +# +# This file defines the model specifications for Linkup search models. +# Linkup provides web search capabilities with sourced answers and structured +# data extraction. +# +# Documentation: https://docs.pipelex.com +# Support: https://go.pipelex.com/discord +# +################################################################################ + +################################################################################ +# MODEL DEFAULTS +################################################################################ + +[defaults] +model_type = "search" +sdk = "linkup" +thinking_mode = "none" + +################################################################################ +# SEARCH MODELS +################################################################################ + +["linkup-standard"] +model_id = "standard" +inputs = ["text"] +outputs = ["sourced-answers", "structured"] +costs = { input = 0.005, output = 0 } + +["linkup-deep"] +model_id = "deep" +inputs = ["text"] +outputs = ["sourced-answers", "structured"] +costs = { input = 0.05, output = 0 } + +################################################################################ +# FETCH / EXTRACT MODELS +################################################################################ + +["linkup-fetch"] +model_type = "text_extractor" +sdk = "linkup_fetch" +model_id = "fetch" +inputs = ["web_page"] +outputs = ["pages"] +costs = { input = 0.005, output = 0 } diff --git a/.pipelex/inference/backends/minimax.toml b/.pipelex/inference/backends/minimax.toml new file mode 100644 index 0000000..2f4998a --- /dev/null +++ b/.pipelex/inference/backends/minimax.toml @@ -0,0 +1,77 @@ +################################################################################ +# MiniMax Backend Configuration +################################################################################ +# +# This file defines the model specifications for MiniMax models. +# It contains model definitions for MiniMax language models +# accessible through the MiniMax Anthropic-compatible API. +# +# Configuration structure: +# - Each model is defined in its own section with the model name as the header +# - Headers with dots must be quoted (e.g., ["minimax-m2.1"]) +# - Model costs are in USD per million tokens (input/output) +# +# Documentation: https://docs.pipelex.com +# Support: https://go.pipelex.com/discord +# +################################################################################ + +################################################################################ +# MODEL DEFAULTS +################################################################################ + +[defaults] +model_type = "llm" +sdk = "anthropic" +structure_method = "instructor/anthropic_tools" +thinking_mode = "manual" +max_tokens = 16384 + +################################################################################ +# LANGUAGE MODELS +################################################################################ + +# --- MiniMax M2 Series -------------------------------------------------------- +[minimax-m2] +model_id = "MiniMax-M2" +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 1.2 } + +["minimax-m2.1"] +model_id = "MiniMax-M2.1" +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 1.2 } + +["minimax-m2.1-highspeed"] +model_id = "MiniMax-M2.1-highspeed" +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.6, output = 2.4 } + +# --- MiniMax M2.5 Series ------------------------------------------------------ +["minimax-m2.5"] +model_id = "MiniMax-M2.5" +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 1.2 } + +["minimax-m2.5-highspeed"] +model_id = "MiniMax-M2.5-highspeed" +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.6, output = 2.4 } + +# --- MiniMax M2.7 Series ------------------------------------------------------ +["minimax-m2.7"] +model_id = "MiniMax-M2.7" +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 1.2 } + +["minimax-m2.7-highspeed"] +model_id = "MiniMax-M2.7-highspeed" +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.6, output = 2.4 } diff --git a/.pipelex/inference/backends/mistral.toml b/.pipelex/inference/backends/mistral.toml index 4a25c5e..f4866ac 100644 --- a/.pipelex/inference/backends/mistral.toml +++ b/.pipelex/inference/backends/mistral.toml @@ -99,12 +99,29 @@ inputs = ["text"] outputs = ["text", "structured"] costs = { input = 0.1, output = 0.3 } +[mistral-small-2603] +model_id = "mistral-small-2603" +max_tokens = 256000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.60 } +thinking_mode = "manual" + +["mistral-small-4"] +model_id = "mistral-small-2603" +max_tokens = 256000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.60 } +thinking_mode = "manual" + [mistral-small] model_id = "mistral-small-latest" -max_tokens = 128000 -inputs = ["text"] +max_tokens = 256000 +inputs = ["text", "images"] outputs = ["text", "structured"] -costs = { input = 0.1, output = 0.3 } +costs = { input = 0.15, output = 0.60 } +thinking_mode = "manual" # --- Mistral Medium Series ---------------------------------------------------- [mistral-medium-2508] diff --git a/.pipelex/inference/backends/openai.toml b/.pipelex/inference/backends/openai.toml index 25b8c75..b12134b 100644 --- a/.pipelex/inference/backends/openai.toml +++ b/.pipelex/inference/backends/openai.toml @@ -8,7 +8,7 @@ # # Configuration structure: # - Each model is defined in its own section with the model name as the header -# - Headers with dots must be quoted (e.g., ["gpt-4.1"]) +# - Headers with dots must be quoted (e.g., ["gpt-5.4"]) # - Model costs are in USD per million tokens (input/output) # # Documentation: https://docs.pipelex.com @@ -30,168 +30,101 @@ thinking_mode = "none" # LANGUAGE MODELS ################################################################################ -# --- GPT-3.5 Series ----------------------------------------------------------- -["gpt-3.5-turbo"] -model_id = "gpt-3.5-turbo-1106" -inputs = ["text"] -outputs = ["text", "structured"] -costs = { input = 0.5, output = 1.5 } - -# --- GPT-4 Series ------------------------------------------------------------- -[gpt-4] -inputs = ["text"] -outputs = ["text"] -costs = { input = 30.0, output = 60.0 } - -[gpt-4-turbo] -inputs = ["text"] -outputs = ["text", "structured"] -costs = { input = 10.0, output = 30.0 } - # --- GPT-4o Series ------------------------------------------------------------ -[gpt-4o-2024-11-20] -inputs = ["text", "images", "pdf"] -outputs = ["text", "structured"] -costs = { input = 2.5, output = 10.0 } - [gpt-4o] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] costs = { input = 2.5, output = 10.0 } -[gpt-4o-mini-2024-07-18] -inputs = ["text", "images", "pdf"] -outputs = ["text", "structured"] -costs = { input = 0.15, output = 0.6 } - [gpt-4o-mini] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] costs = { input = 0.15, output = 0.6 } -# --- GPT-4.1 Series ----------------------------------------------------------- -["gpt-4.1"] +# --- GPT-5.3 Series ------------------------------------------------------------- +["gpt-5.3-codex"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 2, output = 8 } - -["gpt-4.1-mini"] -inputs = ["text", "images", "pdf"] -outputs = ["text", "structured"] -costs = { input = 0.4, output = 1.6 } - -["gpt-4.1-nano"] -inputs = ["text", "images", "pdf"] -outputs = ["text", "structured"] -costs = { input = 0.1, output = 0.4 } - -# --- o Series ---------------------------------------------------------------- -[o1] -inputs = ["text", "images", "pdf"] -outputs = ["text", "structured"] -costs = { input = 15.0, output = 60.0 } -valued_constraints = { fixed_temperature = 1 } -thinking_mode = "manual" - -[o3-mini] -inputs = ["text"] -outputs = ["text", "structured"] -costs = { input = 1.1, output = 4.4 } +costs = { input = 1.75, output = 14.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -[o3] +# --- GPT-5.4 Series ----------------------------------------------------------- +["gpt-5.4"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 10.0, output = 40.0 } -valued_constraints = { fixed_temperature = 1 } +costs = { input = 2.5, output = 15.0 } thinking_mode = "manual" -[o4-mini] -inputs = ["text"] -outputs = ["text", "structured"] -costs = { input = 1.1, output = 4.4 } -valued_constraints = { fixed_temperature = 1 } -thinking_mode = "manual" - -# --- GPT-5 Series ------------------------------------------------------------- -[gpt-5] +["gpt-5.4-pro"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 30.0, output = 180.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -[gpt-5-mini] +["gpt-5.4-mini"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 0.25, output = 2.0 } -valued_constraints = { fixed_temperature = 1 } +costs = { input = 0.75, output = 4.5 } thinking_mode = "manual" -[gpt-5-nano] +["gpt-5.4-nano"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 0.05, output = 0.4 } -valued_constraints = { fixed_temperature = 1 } -thinking_mode = "manual" - -[gpt-5-chat] -model_id = "gpt-5-chat-latest" -inputs = ["text", "images", "pdf"] -outputs = ["text"] -costs = { input = 1.25, output = 10.0 } -valued_constraints = { fixed_temperature = 1 } +costs = { input = 0.2, output = 1.25 } thinking_mode = "manual" -[gpt-5-codex] +# --- GPT-5.5 Series ----------------------------------------------------------- +["gpt-5.5"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 5.0, output = 30.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -# --- GPT-5.1 Series ------------------------------------------------------------- -["gpt-5.1"] +# --- GPT-5.6 Series ----------------------------------------------------------- +["gpt-5.6-sol"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 4.0, output = 20.0 } +valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -["gpt-5.1-chat"] -model_id = "gpt-5.1-chat-latest" +["gpt-5.6-terra"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 2.0, output = 12.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -["gpt-5.1-codex"] +["gpt-5.6-luna"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 0.2, output = 1.2 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -["gpt-5.1-codex-max"] +# --- GPT-6 Series ------------------------------------------------------------- +["gpt-6-astra"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.0 } +costs = { input = 10.0, output = 50.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -# --- GPT-5.2 Series ------------------------------------------------------------- -["gpt-5.2"] +["gpt-6-luna"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.75, output = 14.0 } +costs = { input = 0.1, output = 0.5 } +valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" -["gpt-5.2-chat"] -model_id = "gpt-5.2-chat-latest" +# --- GPT-6.1 Series ----------------------------------------------------------- +["gpt-6.1-sol"] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] -costs = { input = 1.75, output = 14.0 } +costs = { input = 2.0, output = 10.0 } valued_constraints = { fixed_temperature = 1 } thinking_mode = "manual" @@ -203,21 +136,100 @@ thinking_mode = "manual" [gpt-image-1] sdk = "openai_img_gen" model_type = "img_gen" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] costs = { input = 10, output = 40 } +[gpt-image-1.rules] +model_choice = "model_id" +prompt = "positive_only" +num_images = "gpt_image" +aspect_ratio = "gpt_image_legacy" +background = "available" +inference = "gpt_image" +safety_checker = "openai_moderation" +output_format = "gpt_image_legacy" +output_compression = "gpt_image_legacy" +input_images = "gpt_image" +input_fidelity = "gpt_image_legacy" + [gpt-image-1-mini] sdk = "openai_img_gen" model_type = "img_gen" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] costs = { input = 2.5, output = 8 } +[gpt-image-1-mini.rules] +model_choice = "model_id" +prompt = "positive_only" +num_images = "gpt_image" +aspect_ratio = "gpt_image_legacy" +background = "available" +inference = "gpt_image" +safety_checker = "openai_moderation" +output_format = "gpt_image_legacy" +output_compression = "gpt_image_legacy" +input_images = "gpt_image" +input_fidelity = "gpt_image_legacy" + ["gpt-image-1.5"] sdk = "openai_img_gen" model_type = "img_gen" model_id = "gpt-image-1.5" -inputs = ["text"] +inputs = ["text", "images"] outputs = ["image"] costs = { input = 8, output = 32 } + +["gpt-image-1.5".rules] +model_choice = "model_id" +prompt = "positive_only" +num_images = "gpt_image" +aspect_ratio = "gpt_image_legacy" +background = "available" +inference = "gpt_image" +safety_checker = "openai_moderation" +output_format = "gpt_image_legacy" +output_compression = "gpt_image_legacy" +input_images = "gpt_image" +input_fidelity = "gpt_image_legacy" + +[gpt-image-2-2026-04-21] +sdk = "openai_img_gen" +model_type = "img_gen" +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 8, output = 30 } + +[gpt-image-2-2026-04-21.rules] +model_choice = "model_id" +prompt = "positive_only" +num_images = "gpt_image" +aspect_ratio = "gpt_image_2" +background = "unavailable" +inference = "gpt_image" +safety_checker = "unavailable" +output_format = "unavailable" +output_compression = "unavailable" +input_images = "gpt_image" +input_fidelity = "unavailable" + +[gpt-image-2] +sdk = "openai_img_gen" +model_type = "img_gen" +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 8, output = 30 } + +[gpt-image-2.rules] +model_choice = "model_id" +prompt = "positive_only" +num_images = "gpt_image" +aspect_ratio = "gpt_image_2" +background = "unavailable" +inference = "gpt_image" +safety_checker = "unavailable" +output_format = "unavailable" +output_compression = "unavailable" +input_images = "gpt_image" +input_fidelity = "unavailable" diff --git a/.pipelex/inference/backends/openrouter.toml b/.pipelex/inference/backends/openrouter.toml new file mode 100644 index 0000000..48fe657 --- /dev/null +++ b/.pipelex/inference/backends/openrouter.toml @@ -0,0 +1,2263 @@ +################################################################################ +# OpenRouter Backend Configuration +################################################################################ +# +# This file defines the model specifications for OpenRouter models. +# It contains model definitions for various LLM and image generation models +# accessible through the OpenRouter API. +# +# Configuration structure: +# - Each model is defined in its own section with the model name as the header +# - Headers with dots or colons must be quoted (e.g., ["anthropic/claude-3.5-sonnet"]) +# - Model costs are in USD per million tokens (input/output) +# +# Documentation: https://docs.pipelex.com +# Support: https://go.pipelex.com/discord +# +################################################################################ + +################################################################################ +# MODEL DEFAULTS +################################################################################ + +[defaults] +model_type = "llm" +sdk = "openai" +structure_method = "instructor/openai_tools" +thinking_mode = "none" + +################################################################################ +# LANGUAGE MODELS +################################################################################ + +# --- ai21 ---------------------------------------------------------------- + +["ai21/jamba-large-1.7"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 2, output = 8 } + +# --- aion-labs ----------------------------------------------------------- + +["aion-labs/aion-1.0"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 4, output = 8 } + +["aion-labs/aion-1.0-mini"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.7, output = 1.4 } + +["aion-labs/aion-rp-llama-3.1-8b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.8, output = 1.6 } + +# --- alfredpros ---------------------------------------------------------- + +["alfredpros/codellama-7b-instruct-solidity"] +max_tokens = 4096 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.8, output = 1.2 } + +# --- alibaba ------------------------------------------------------------- + +["alibaba/tongyi-deepresearch-30b-a3b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.09, output = 0.45 } + +# --- allenai ------------------------------------------------------------- + +["allenai/molmo-2-8b"] +max_tokens = 36864 +inputs = ["text", "images", "video"] +outputs = ["text"] +costs = { input = 0.2, output = 0.2 } + +["allenai/olmo-2-0325-32b-instruct"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.05, output = 0.2 } + +["allenai/olmo-3-32b-think"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.15, output = 0.5 } + +["allenai/olmo-3-7b-instruct"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.1, output = 0.2 } + +["allenai/olmo-3-7b-think"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.12, output = 0.2 } + +["allenai/olmo-3.1-32b-instruct"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 0.6 } + +["allenai/olmo-3.1-32b-think"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.15, output = 0.5 } + +# --- alpindale ----------------------------------------------------------- + +["alpindale/goliath-120b"] +max_tokens = 6144 +inputs = ["text"] +outputs = ["text"] +costs = { input = 3.75, output = 7.5 } + +# --- amazon -------------------------------------------------------------- + +["amazon/nova-2-lite-v1"] +max_tokens = 1000000 +inputs = ["text", "images", "video", "pdf"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 2.5 } + +["amazon/nova-lite-v1"] +max_tokens = 300000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.06, output = 0.24 } + +["amazon/nova-micro-v1"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.035, output = 0.14 } + +["amazon/nova-premier-v1"] +max_tokens = 1000000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 2.5, output = 12.5 } + +["amazon/nova-pro-v1"] +max_tokens = 300000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.8, output = 3.2 } + +# --- anthracite-org ------------------------------------------------------ + +["anthracite-org/magnum-v4-72b"] +max_tokens = 16384 +inputs = ["text"] +outputs = ["text"] +costs = { input = 3, output = 5 } + +# --- anthropic ----------------------------------------------------------- + +["anthropic/claude-3-haiku"] +max_tokens = 200000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.25, output = 1.25 } + +["anthropic/claude-3.5-haiku"] +max_tokens = 200000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.8, output = 4 } + +["anthropic/claude-3.5-sonnet"] +max_tokens = 200000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 6, output = 30 } + +["anthropic/claude-3.7-sonnet"] +max_tokens = 200000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +["anthropic/claude-3.7-sonnet:thinking"] +max_tokens = 200000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +["anthropic/claude-haiku-4.5"] +max_tokens = 200000 +inputs = ["images", "text"] +outputs = ["text", "structured"] +costs = { input = 1, output = 5 } + +["anthropic/claude-opus-4"] +max_tokens = 200000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 15, output = 75 } + +["anthropic/claude-opus-4.1"] +max_tokens = 200000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 15, output = 75 } + +["anthropic/claude-opus-4.5"] +max_tokens = 200000 +inputs = ["pdf", "images", "text"] +outputs = ["text", "structured"] +costs = { input = 5, output = 25 } + +["anthropic/claude-opus-4.6"] +max_tokens = 1000000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 5, output = 25 } + +["anthropic/claude-sonnet-4"] +max_tokens = 1000000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +["anthropic/claude-sonnet-4.5"] +max_tokens = 1000000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +["anthropic/claude-sonnet-4.6"] +max_tokens = 1000000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +# --- arcee-ai ------------------------------------------------------------ + +["arcee-ai/coder-large"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.5, output = 0.8 } + +["arcee-ai/maestro-reasoning"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.9, output = 3.3 } + +["arcee-ai/spotlight"] +max_tokens = 131072 +inputs = ["images", "text"] +outputs = ["text"] +costs = { input = 0.18, output = 0.18 } + +["arcee-ai/trinity-large-preview:free"] +max_tokens = 131000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["arcee-ai/trinity-mini"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.045, output = 0.15 } + +["arcee-ai/trinity-mini:free"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["arcee-ai/virtuoso-large"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.75, output = 1.2 } + +# --- baidu --------------------------------------------------------------- + +["baidu/ernie-4.5-21b-a3b"] +max_tokens = 120000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.07, output = 0.28 } + +["baidu/ernie-4.5-21b-a3b-thinking"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.07, output = 0.28 } + +["baidu/ernie-4.5-300b-a47b"] +max_tokens = 123000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.28, output = 1.1 } + +["baidu/ernie-4.5-vl-28b-a3b"] +max_tokens = 30000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.14, output = 0.56 } + +["baidu/ernie-4.5-vl-424b-a47b"] +max_tokens = 123000 +inputs = ["images", "text"] +outputs = ["text"] +costs = { input = 0.42, output = 1.25 } + +# --- bytedance ----------------------------------------------------------- + +["bytedance/ui-tars-1.5-7b"] +max_tokens = 128000 +inputs = ["images", "text"] +outputs = ["text"] +costs = { input = 0.1, output = 0.2 } + +# --- bytedance-seed ------------------------------------------------------ + +["bytedance-seed/seed-1.6"] +max_tokens = 262144 +inputs = ["images", "text", "video"] +outputs = ["text", "structured"] +costs = { input = 0.25, output = 2 } + +["bytedance-seed/seed-1.6-flash"] +max_tokens = 262144 +inputs = ["images", "text", "video"] +outputs = ["text", "structured"] +costs = { input = 0.075, output = 0.3 } + +# --- cognitivecomputations ----------------------------------------------- + +["cognitivecomputations/dolphin-mistral-24b-venice-edition:free"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +# --- cohere -------------------------------------------------------------- + +["cohere/command-a"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 2.5, output = 10 } + +["cohere/command-r-08-2024"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.6 } + +["cohere/command-r-plus-08-2024"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 2.5, output = 10 } + +["cohere/command-r7b-12-2024"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.0375, output = 0.15 } + +# --- deepcogito ---------------------------------------------------------- + +["deepcogito/cogito-v2.1-671b"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 1.25, output = 1.25 } + +# --- deepseek ------------------------------------------------------------ + +["deepseek/deepseek-chat"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.32, output = 0.89 } + +["deepseek/deepseek-chat-v3-0324"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.19, output = 0.87 } + +["deepseek/deepseek-chat-v3.1"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.75 } + +["deepseek/deepseek-r1"] +max_tokens = 64000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.7, output = 2.5 } + +["deepseek/deepseek-r1-0528"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 1.75 } + +["deepseek/deepseek-r1-0528:free"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["deepseek/deepseek-r1-distill-llama-70b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.7, output = 0.8 } + +["deepseek/deepseek-r1-distill-qwen-32b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.29, output = 0.29 } + +["deepseek/deepseek-v3.1-terminus"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.21, output = 0.79 } + +["deepseek/deepseek-v3.1-terminus:exacto"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.21, output = 0.79 } + +["deepseek/deepseek-v3.2"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.26, output = 0.38 } + +["deepseek/deepseek-v3.2-exp"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.27, output = 0.41 } + +["deepseek/deepseek-v3.2-speciale"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.4, output = 1.2 } + +# --- eleutherai ---------------------------------------------------------- + +["eleutherai/llemma_7b"] +max_tokens = 4096 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.8, output = 1.2 } + +# --- essentialai --------------------------------------------------------- + +["essentialai/rnj-1-instruct"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.15, output = 0.15 } + +# --- google -------------------------------------------------------------- + +["google/gemini-2.0-flash-001"] +max_tokens = 1048576 +inputs = ["text", "images", "pdf", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.4 } + +["google/gemini-2.0-flash-lite-001"] +max_tokens = 1048576 +inputs = ["text", "images", "pdf", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 0.075, output = 0.3 } + +["google/gemini-2.5-flash"] +max_tokens = 1048576 +inputs = ["pdf", "images", "text", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 2.5 } + +["google/gemini-2.5-flash-lite"] +max_tokens = 1048576 +inputs = ["text", "images", "pdf", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.4 } + +["google/gemini-2.5-flash-lite-preview-09-2025"] +max_tokens = 1048576 +inputs = ["text", "images", "pdf", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.4 } + +["google/gemini-2.5-pro"] +max_tokens = 1048576 +inputs = ["text", "images", "pdf", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["google/gemini-2.5-pro-preview"] +max_tokens = 1048576 +inputs = ["pdf", "images", "text", "audio"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["google/gemini-2.5-pro-preview-05-06"] +max_tokens = 1048576 +inputs = ["text", "images", "pdf", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["google/gemini-3-flash-preview"] +max_tokens = 1048576 +inputs = ["text", "images", "pdf", "audio", "video"] +outputs = ["text", "structured"] +costs = { input = 0.5, output = 3 } + +["google/gemini-3.1-pro-preview"] +max_tokens = 1048576 +inputs = ["audio", "pdf", "images", "text", "video"] +outputs = ["text", "structured"] +costs = { input = 2, output = 12 } + +["google/gemma-2-27b-it"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.65, output = 0.65 } + +["google/gemma-2-9b-it"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.03, output = 0.09 } + +["google/gemma-3-12b-it"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.04, output = 0.13 } + +["google/gemma-3-12b-it:free"] +max_tokens = 32768 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["google/gemma-3-27b-it"] +max_tokens = 128000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.04, output = 0.15 } + +["google/gemma-3-27b-it:free"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["google/gemma-3-4b-it"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.04, output = 0.08 } + +["google/gemma-3-4b-it:free"] +max_tokens = 32768 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["google/gemma-3n-e2b-it:free"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["google/gemma-3n-e4b-it"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.02, output = 0.04 } + +["google/gemma-3n-e4b-it:free"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +# --- gryphe -------------------------------------------------------------- + +["gryphe/mythomax-l2-13b"] +max_tokens = 4096 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.06, output = 0.06 } + +# --- ibm-granite --------------------------------------------------------- + +["ibm-granite/granite-4.0-h-micro"] +max_tokens = 131000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.017, output = 0.11 } + +# --- inception ----------------------------------------------------------- + +["inception/mercury"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.25, output = 1 } + +["inception/mercury-coder"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.25, output = 1 } + +# --- inflection ---------------------------------------------------------- + +["inflection/inflection-3-pi"] +max_tokens = 8000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 2.5, output = 10 } + +["inflection/inflection-3-productivity"] +max_tokens = 8000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 2.5, output = 10 } + +# --- kwaipilot ----------------------------------------------------------- + +["kwaipilot/kat-coder-pro"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.207, output = 0.828 } + +# --- liquid -------------------------------------------------------------- + +["liquid/lfm-2.2-6b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.01, output = 0.02 } + +["liquid/lfm-2.5-1.2b-instruct:free"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["liquid/lfm-2.5-1.2b-thinking:free"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["liquid/lfm2-8b-a1b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.01, output = 0.02 } + +# --- mancer -------------------------------------------------------------- + +["mancer/weaver"] +max_tokens = 8000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.75, output = 1 } + +# --- meituan ------------------------------------------------------------- + +["meituan/longcat-flash-chat"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.2, output = 0.8 } + +# --- meta-llama ---------------------------------------------------------- + +["meta-llama/llama-3-70b-instruct"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.51, output = 0.74 } + +["meta-llama/llama-3-8b-instruct"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.03, output = 0.04 } + +["meta-llama/llama-3.1-405b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 4, output = 4 } + +["meta-llama/llama-3.1-405b-instruct"] +max_tokens = 131000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 4, output = 4 } + +["meta-llama/llama-3.1-70b-instruct"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 0.4 } + +["meta-llama/llama-3.1-8b-instruct"] +max_tokens = 16384 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.02, output = 0.05 } + +["meta-llama/llama-3.2-11b-vision-instruct"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.049, output = 0.049 } + +["meta-llama/llama-3.2-1b-instruct"] +max_tokens = 60000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.027, output = 0.2 } + +["meta-llama/llama-3.2-3b-instruct"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.02, output = 0.02 } + +["meta-llama/llama-3.2-3b-instruct:free"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["meta-llama/llama-3.3-70b-instruct"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.32 } + +["meta-llama/llama-3.3-70b-instruct:free"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["meta-llama/llama-4-maverick"] +max_tokens = 1048576 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.6 } + +["meta-llama/llama-4-scout"] +max_tokens = 327680 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.08, output = 0.3 } + +["meta-llama/llama-guard-2-8b"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.2, output = 0.2 } + +["meta-llama/llama-guard-3-8b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.02, output = 0.06 } + +["meta-llama/llama-guard-4-12b"] +max_tokens = 163840 +inputs = ["images", "text"] +outputs = ["text"] +costs = { input = 0.18, output = 0.18 } + +# --- microsoft ----------------------------------------------------------- + +["microsoft/phi-4"] +max_tokens = 16384 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.06, output = 0.14 } + +["microsoft/wizardlm-2-8x22b"] +max_tokens = 65535 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.62, output = 0.62 } + +# --- minimax ------------------------------------------------------------- + +["minimax/minimax-01"] +max_tokens = 1000192 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.2, output = 1.1 } + +["minimax/minimax-m1"] +max_tokens = 1000000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 2.2 } + +["minimax/minimax-m2"] +max_tokens = 196608 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.255, output = 1 } + +["minimax/minimax-m2-her"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.3, output = 1.2 } + +["minimax/minimax-m2.1"] +max_tokens = 196608 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.27, output = 0.95 } + +["minimax/minimax-m2.5"] +max_tokens = 196608 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 1.1 } + +# --- mistralai ----------------------------------------------------------- + +["mistralai/codestral-2508"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 0.9 } + +["mistralai/devstral-2512"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 2 } + +["mistralai/devstral-medium"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 2 } + +["mistralai/devstral-small"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.3 } + +["mistralai/ministral-14b-2512"] +max_tokens = 262144 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 0.2 } + +["mistralai/ministral-3b-2512"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.1 } + +["mistralai/ministral-8b-2512"] +max_tokens = 262144 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.15 } + +["mistralai/mistral-7b-instruct"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.2, output = 0.2 } + +["mistralai/mistral-7b-instruct-v0.1"] +max_tokens = 2824 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.11, output = 0.19 } + +["mistralai/mistral-7b-instruct-v0.2"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.2, output = 0.2 } + +["mistralai/mistral-7b-instruct-v0.3"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.2, output = 0.2 } + +["mistralai/mistral-large"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 2, output = 6 } + +["mistralai/mistral-large-2407"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 2, output = 6 } + +["mistralai/mistral-large-2411"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 2, output = 6 } + +["mistralai/mistral-large-2512"] +max_tokens = 262144 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.5, output = 1.5 } + +["mistralai/mistral-medium-3"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 2 } + +["mistralai/mistral-medium-3.1"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 2 } + +["mistralai/mistral-nemo"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.02, output = 0.04 } + +["mistralai/mistral-saba"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 0.6 } + +["mistralai/mistral-small-24b-instruct-2501"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.05, output = 0.08 } + +["mistralai/mistral-small-3.1-24b-instruct"] +max_tokens = 128000 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.35, output = 0.56 } + +["mistralai/mistral-small-3.1-24b-instruct:free"] +max_tokens = 128000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["mistralai/mistral-small-3.2-24b-instruct"] +max_tokens = 131072 +inputs = ["images", "text"] +outputs = ["text", "structured"] +costs = { input = 0.06, output = 0.18 } + +["mistralai/mistral-small-creative"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.3 } + +["mistralai/mixtral-8x22b-instruct"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 2, output = 6 } + +["mistralai/mixtral-8x7b-instruct"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.54, output = 0.54 } + +["mistralai/pixtral-large-2411"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 2, output = 6 } + +["mistralai/voxtral-small-24b-2507"] +max_tokens = 32000 +inputs = ["text", "audio"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.3 } + +# --- moonshotai ---------------------------------------------------------- + +["moonshotai/kimi-k2"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.5, output = 2.4 } + +["moonshotai/kimi-k2-0905"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 2 } + +["moonshotai/kimi-k2-0905:exacto"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.6, output = 2.5 } + +["moonshotai/kimi-k2-thinking"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.47, output = 2 } + +["moonshotai/kimi-k2.5"] +max_tokens = 262144 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.45, output = 2.2 } + +# --- morph --------------------------------------------------------------- + +["morph/morph-v3-fast"] +max_tokens = 81920 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.8, output = 1.2 } + +["morph/morph-v3-large"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.9, output = 1.9 } + +# --- neversleep ---------------------------------------------------------- + +["neversleep/llama-3.1-lumimaid-8b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.09, output = 0.6 } + +["neversleep/noromaid-20b"] +max_tokens = 4096 +inputs = ["text"] +outputs = ["text"] +costs = { input = 1, output = 1.75 } + +# --- nex-agi ------------------------------------------------------------- + +["nex-agi/deepseek-v3.1-nex-n1"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.27, output = 1 } + +# --- nousresearch -------------------------------------------------------- + +["nousresearch/hermes-2-pro-llama-3-8b"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.14, output = 0.14 } + +["nousresearch/hermes-3-llama-3.1-405b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 1, output = 1 } + +["nousresearch/hermes-3-llama-3.1-405b:free"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0, output = 0 } + +["nousresearch/hermes-3-llama-3.1-70b"] +max_tokens = 65536 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.3, output = 0.3 } + +["nousresearch/hermes-4-405b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 1, output = 3 } + +["nousresearch/hermes-4-70b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.13, output = 0.4 } + +# --- nvidia -------------------------------------------------------------- + +["nvidia/llama-3.1-nemotron-70b-instruct"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1.2, output = 1.2 } + +["nvidia/llama-3.1-nemotron-ultra-253b-v1"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.6, output = 1.8 } + +["nvidia/llama-3.3-nemotron-super-49b-v1.5"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.4 } + +["nvidia/nemotron-3-nano-30b-a3b"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.05, output = 0.2 } + +["nvidia/nemotron-3-nano-30b-a3b:free"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["nvidia/nemotron-nano-12b-v2-vl"] +max_tokens = 131072 +inputs = ["images", "text", "video"] +outputs = ["text"] +costs = { input = 0.07, output = 0.2 } + +["nvidia/nemotron-nano-12b-v2-vl:free"] +max_tokens = 128000 +inputs = ["images", "text", "video"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["nvidia/nemotron-nano-9b-v2"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.04, output = 0.16 } + +["nvidia/nemotron-nano-9b-v2:free"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +# --- openai -------------------------------------------------------------- + +["openai/gpt-3.5-turbo"] +max_tokens = 16385 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.5, output = 1.5 } + +["openai/gpt-3.5-turbo-0613"] +max_tokens = 4095 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1, output = 2 } + +["openai/gpt-3.5-turbo-16k"] +max_tokens = 16385 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 3, output = 4 } + +["openai/gpt-3.5-turbo-instruct"] +max_tokens = 4095 +inputs = ["text"] +outputs = ["text"] +costs = { input = 1.5, output = 2 } + +["openai/gpt-4"] +max_tokens = 8191 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 30, output = 60 } + +["openai/gpt-4-0314"] +max_tokens = 8191 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 30, output = 60 } + +["openai/gpt-4-1106-preview"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 10, output = 30 } + +["openai/gpt-4-turbo"] +max_tokens = 128000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 10, output = 30 } + +["openai/gpt-4-turbo-preview"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 10, output = 30 } + +["openai/gpt-4.1"] +max_tokens = 1047576 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 2, output = 8 } + +["openai/gpt-4.1-mini"] +max_tokens = 1047576 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 1.6 } + +["openai/gpt-4.1-nano"] +max_tokens = 1047576 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.4 } + +["openai/gpt-4o"] +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 2.5, output = 10 } + +["openai/gpt-4o-2024-05-13"] +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 5, output = 15 } + +["openai/gpt-4o-2024-08-06"] +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 2.5, output = 10 } + +["openai/gpt-4o-2024-11-20"] +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 2.5, output = 10 } + +["openai/gpt-4o-audio-preview"] +max_tokens = 128000 +inputs = ["audio", "text"] +outputs = ["text", "audio", "structured"] +costs = { input = 2.5, output = 10 } + +["openai/gpt-4o-mini"] +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.6 } + +["openai/gpt-4o-mini-2024-07-18"] +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.6 } + +["openai/gpt-4o-mini-search-preview"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.15, output = 0.6 } + +["openai/gpt-4o-search-preview"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 2.5, output = 10 } + +["openai/gpt-4o:extended"] +max_tokens = 128000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 6, output = 18 } + +["openai/gpt-5"] +max_tokens = 400000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["openai/gpt-5-chat"] +max_tokens = 128000 +inputs = ["pdf", "images", "text"] +outputs = ["text"] +costs = { input = 1.25, output = 10 } + +["openai/gpt-5-codex"] +max_tokens = 400000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["openai/gpt-5-mini"] +max_tokens = 400000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 0.25, output = 2 } + +["openai/gpt-5-nano"] +max_tokens = 400000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 0.05, output = 0.4 } + +["openai/gpt-5-pro"] +max_tokens = 400000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 15, output = 120 } + +["openai/gpt-5.1"] +max_tokens = 400000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["openai/gpt-5.1-chat"] +max_tokens = 128000 +inputs = ["pdf", "images", "text"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["openai/gpt-5.1-codex"] +max_tokens = 400000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["openai/gpt-5.1-codex-max"] +max_tokens = 400000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 1.25, output = 10 } + +["openai/gpt-5.1-codex-mini"] +max_tokens = 400000 +inputs = ["images", "text"] +outputs = ["text", "structured"] +costs = { input = 0.25, output = 2 } + +["openai/gpt-5.2"] +max_tokens = 400000 +inputs = ["pdf", "images", "text"] +outputs = ["text", "structured"] +costs = { input = 1.75, output = 14 } + +["openai/gpt-5.2-chat"] +max_tokens = 128000 +inputs = ["pdf", "images", "text"] +outputs = ["text", "structured"] +costs = { input = 1.75, output = 14 } + +["openai/gpt-5.2-codex"] +max_tokens = 400000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 1.75, output = 14 } + +["openai/gpt-5.2-pro"] +max_tokens = 400000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 21, output = 168 } + +["openai/gpt-audio"] +max_tokens = 128000 +inputs = ["text", "audio"] +outputs = ["text", "audio"] +costs = { input = 2.5, output = 10 } + +["openai/gpt-audio-mini"] +max_tokens = 128000 +inputs = ["text", "audio"] +outputs = ["text", "audio"] +costs = { input = 0.6, output = 2.4 } + +["openai/gpt-oss-120b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.039, output = 0.19 } + +["openai/gpt-oss-120b:exacto"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.039, output = 0.19 } + +["openai/gpt-oss-120b:free"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["openai/gpt-oss-20b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.03, output = 0.14 } + +["openai/gpt-oss-20b:free"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["openai/gpt-oss-safeguard-20b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.075, output = 0.3 } + +["openai/o1"] +max_tokens = 200000 +inputs = ["text", "images", "pdf"] +outputs = ["text", "structured"] +costs = { input = 15, output = 60 } + +["openai/o1-pro"] +max_tokens = 200000 +inputs = ["text", "images", "pdf"] +outputs = ["text"] +costs = { input = 150, output = 600 } + +["openai/o3"] +max_tokens = 200000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 2, output = 8 } + +["openai/o3-deep-research"] +max_tokens = 200000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 10, output = 40 } + +["openai/o3-mini"] +max_tokens = 200000 +inputs = ["text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 1.1, output = 4.4 } + +["openai/o3-mini-high"] +max_tokens = 200000 +inputs = ["text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 1.1, output = 4.4 } + +["openai/o3-pro"] +max_tokens = 200000 +inputs = ["text", "pdf", "images"] +outputs = ["text", "structured"] +costs = { input = 20, output = 80 } + +["openai/o4-mini"] +max_tokens = 200000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 1.1, output = 4.4 } + +["openai/o4-mini-deep-research"] +max_tokens = 200000 +inputs = ["pdf", "images", "text"] +outputs = ["text", "structured"] +costs = { input = 2, output = 8 } + +["openai/o4-mini-high"] +max_tokens = 200000 +inputs = ["images", "text", "pdf"] +outputs = ["text", "structured"] +costs = { input = 1.1, output = 4.4 } + +# --- opengvlab ----------------------------------------------------------- + +["opengvlab/internvl3-78b"] +max_tokens = 32768 +inputs = ["images", "text"] +outputs = ["text"] +costs = { input = 0.15, output = 0.6 } + +# --- openrouter ---------------------------------------------------------- + +["openrouter/auto"] +max_tokens = 2000000 +inputs = ["text", "images", "audio", "pdf", "video"] +outputs = ["text", "image", "structured"] + +["openrouter/bodybuilder"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text"] + +["openrouter/free"] +max_tokens = 200000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +# --- perplexity ---------------------------------------------------------- + +["perplexity/sonar"] +max_tokens = 127072 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 1, output = 1 } + +["perplexity/sonar-deep-research"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 2, output = 8 } + +["perplexity/sonar-pro"] +max_tokens = 200000 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 3, output = 15 } + +["perplexity/sonar-pro-search"] +max_tokens = 200000 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 3, output = 15 } + +["perplexity/sonar-reasoning-pro"] +max_tokens = 128000 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 2, output = 8 } + +# --- prime-intellect ----------------------------------------------------- + +["prime-intellect/intellect-3"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 1.1 } + +# --- qwen ---------------------------------------------------------------- + +["qwen/qwen-2.5-72b-instruct"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.12, output = 0.39 } + +["qwen/qwen-2.5-7b-instruct"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.04, output = 0.1 } + +["qwen/qwen-2.5-coder-32b-instruct"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.2, output = 0.2 } + +["qwen/qwen-2.5-vl-7b-instruct"] +max_tokens = 32768 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.2, output = 0.2 } + +["qwen/qwen-max"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1.6, output = 6.4 } + +["qwen/qwen-plus"] +max_tokens = 1000000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 1.2 } + +["qwen/qwen-plus-2025-07-28"] +max_tokens = 1000000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 1.2 } + +["qwen/qwen-plus-2025-07-28:thinking"] +max_tokens = 1000000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 1.2 } + +["qwen/qwen-turbo"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.05, output = 0.2 } + +["qwen/qwen-vl-max"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.8, output = 3.2 } + +["qwen/qwen-vl-plus"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.21, output = 0.63 } + +["qwen/qwen2.5-coder-7b-instruct"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.03, output = 0.09 } + +["qwen/qwen2.5-vl-32b-instruct"] +max_tokens = 128000 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.2, output = 0.6 } + +["qwen/qwen2.5-vl-72b-instruct"] +max_tokens = 32000 +inputs = ["text", "images"] +outputs = ["text"] +costs = { input = 0.25, output = 0.75 } + +["qwen/qwen3-14b"] +max_tokens = 40960 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.06, output = 0.24 } + +["qwen/qwen3-235b-a22b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.455, output = 1.82 } + +["qwen/qwen3-235b-a22b-2507"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.071, output = 0.1 } + +["qwen/qwen3-235b-a22b-thinking-2507"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["qwen/qwen3-30b-a3b"] +max_tokens = 40960 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.08, output = 0.28 } + +["qwen/qwen3-30b-a3b-instruct-2507"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.09, output = 0.3 } + +["qwen/qwen3-30b-a3b-thinking-2507"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.051, output = 0.34 } + +["qwen/qwen3-32b"] +max_tokens = 40960 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.08, output = 0.24 } + +["qwen/qwen3-4b:free"] +max_tokens = 40960 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["qwen/qwen3-8b"] +max_tokens = 32000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.05, output = 0.4 } + +["qwen/qwen3-coder"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.22, output = 1 } + +["qwen/qwen3-coder-30b-a3b-instruct"] +max_tokens = 160000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.07, output = 0.27 } + +["qwen/qwen3-coder-flash"] +max_tokens = 1000000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 1.5 } + +["qwen/qwen3-coder-next"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.12, output = 0.75 } + +["qwen/qwen3-coder-plus"] +max_tokens = 1000000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1, output = 5 } + +["qwen/qwen3-coder:exacto"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.22, output = 1.8 } + +["qwen/qwen3-coder:free"] +max_tokens = 262000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["qwen/qwen3-max"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1.2, output = 6 } + +["qwen/qwen3-max-thinking"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1.2, output = 6 } + +["qwen/qwen3-next-80b-a3b-instruct"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.09, output = 1.1 } + +["qwen/qwen3-next-80b-a3b-instruct:free"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["qwen/qwen3-next-80b-a3b-thinking"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 1.2 } + +["qwen/qwen3-vl-235b-a22b-instruct"] +max_tokens = 262144 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 0.88 } + +["qwen/qwen3-vl-235b-a22b-thinking"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["qwen/qwen3-vl-30b-a3b-instruct"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.13, output = 0.52 } + +["qwen/qwen3-vl-30b-a3b-thinking"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["qwen/qwen3-vl-32b-instruct"] +max_tokens = 131072 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.104, output = 0.416 } + +["qwen/qwen3-vl-8b-instruct"] +max_tokens = 131072 +inputs = ["images", "text"] +outputs = ["text", "structured"] +costs = { input = 0.08, output = 0.5 } + +["qwen/qwen3-vl-8b-thinking"] +max_tokens = 131072 +inputs = ["images", "text"] +outputs = ["text", "structured"] +costs = { input = 0.117, output = 1.365 } + +["qwen/qwen3.5-397b-a17b"] +max_tokens = 262144 +inputs = ["text", "images", "video"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 1 } + +["qwen/qwen3.5-plus-02-15"] +max_tokens = 1000000 +inputs = ["text", "images", "video"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 2.4 } + +["qwen/qwq-32b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.15, output = 0.4 } + +# --- raifle -------------------------------------------------------------- + +["raifle/sorcererlm-8x22b"] +max_tokens = 16000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 4.5, output = 4.5 } + +# --- relace -------------------------------------------------------------- + +["relace/relace-apply-3"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.85, output = 1.25 } + +["relace/relace-search"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1, output = 3 } + +# --- sao10k -------------------------------------------------------------- + +["sao10k/l3-euryale-70b"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 1.48, output = 1.48 } + +["sao10k/l3-lunaris-8b"] +max_tokens = 8192 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.04, output = 0.05 } + +["sao10k/l3.1-70b-hanami-x1"] +max_tokens = 16000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 3, output = 3 } + +["sao10k/l3.1-euryale-70b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.65, output = 0.75 } + +["sao10k/l3.3-euryale-70b"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.65, output = 0.75 } + +# --- stepfun ------------------------------------------------------------- + +["stepfun/step-3.5-flash"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.3 } + +["stepfun/step-3.5-flash:free"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +# --- switchpoint --------------------------------------------------------- + +["switchpoint/router"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.85, output = 3.4 } + +# --- tencent ------------------------------------------------------------- + +["tencent/hunyuan-a13b-instruct"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.14, output = 0.57 } + +# --- thedrummer ---------------------------------------------------------- + +["thedrummer/cydonia-24b-v4.1"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.3, output = 0.5 } + +["thedrummer/rocinante-12b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.17, output = 0.43 } + +["thedrummer/skyfall-36b-v2"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.55, output = 0.8 } + +["thedrummer/unslopnemo-12b"] +max_tokens = 32768 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.4, output = 0.4 } + +# --- tngtech ------------------------------------------------------------- + +["tngtech/deepseek-r1t2-chimera"] +max_tokens = 163840 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.25, output = 0.85 } + +# --- undi95 -------------------------------------------------------------- + +["undi95/remm-slerp-l2-13b"] +max_tokens = 6144 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.45, output = 0.65 } + +# --- upstage ------------------------------------------------------------- + +["upstage/solar-pro-3:free"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +# --- writer -------------------------------------------------------------- + +["writer/palmyra-x5"] +max_tokens = 1040000 +inputs = ["text"] +outputs = ["text"] +costs = { input = 0.6, output = 6 } + +# --- x-ai ---------------------------------------------------------------- + +["x-ai/grok-3"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +["x-ai/grok-3-beta"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +["x-ai/grok-3-mini"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 0.5 } + +["x-ai/grok-3-mini-beta"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 0.5 } + +["x-ai/grok-4"] +max_tokens = 256000 +inputs = ["images", "text"] +outputs = ["text", "structured"] +costs = { input = 3, output = 15 } + +["x-ai/grok-4-fast"] +max_tokens = 2000000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 0.5 } + +["x-ai/grok-4.1-fast"] +max_tokens = 2000000 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 0.5 } + +["x-ai/grok-code-fast-1"] +max_tokens = 256000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.2, output = 1.5 } + +# --- xiaomi -------------------------------------------------------------- + +["xiaomi/mimo-v2-flash"] +max_tokens = 262144 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.09, output = 0.29 } + +# --- z-ai ---------------------------------------------------------------- + +["z-ai/glm-4-32b"] +max_tokens = 128000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.1, output = 0.1 } + +["z-ai/glm-4.5"] +max_tokens = 131000 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.55, output = 2 } + +["z-ai/glm-4.5-air"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.13, output = 0.85 } + +["z-ai/glm-4.5-air:free"] +max_tokens = 131072 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0, output = 0 } + +["z-ai/glm-4.5v"] +max_tokens = 65536 +inputs = ["text", "images"] +outputs = ["text", "structured"] +costs = { input = 0.6, output = 1.8 } + +["z-ai/glm-4.6"] +max_tokens = 202752 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.35, output = 1.71 } + +["z-ai/glm-4.6:exacto"] +max_tokens = 204800 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.44, output = 1.76 } + +["z-ai/glm-4.6v"] +max_tokens = 131072 +inputs = ["images", "text", "video"] +outputs = ["text", "structured"] +costs = { input = 0.3, output = 0.9 } + +["z-ai/glm-4.7"] +max_tokens = 202752 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.38, output = 1.7 } + +["z-ai/glm-4.7-flash"] +max_tokens = 202752 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.06, output = 0.4 } + +["z-ai/glm-5"] +max_tokens = 204800 +inputs = ["text"] +outputs = ["text", "structured"] +costs = { input = 0.95, output = 2.55 } + +################################################################################ +# IMAGE GENERATION MODELS +################################################################################ + +# --- black-forest-labs --------------------------------------------------- + +["black-forest-labs/flux.2-flex"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 67344 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +["black-forest-labs/flux.2-klein-4b"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 40960 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +["black-forest-labs/flux.2-max"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 46864 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +["black-forest-labs/flux.2-pro"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 46864 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +# --- bytedance-seed ------------------------------------------------------ + +["bytedance-seed/seedream-4.5"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 4096 +inputs = ["images", "text"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +# --- google -------------------------------------------------------------- + +["google/gemini-2.5-flash-image"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 32768 +inputs = ["images", "text"] +outputs = ["image", "text"] +costs = { input = 0.3, output = 2.5 } + +["google/gemini-3-pro-image-preview"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 65536 +inputs = ["images", "text"] +outputs = ["image", "text"] +costs = { input = 2, output = 12 } + +# --- openai -------------------------------------------------------------- + +["openai/gpt-5-image"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 400000 +inputs = ["images", "text", "pdf"] +outputs = ["image", "text", "structured"] +costs = { input = 10, output = 10 } + +["openai/gpt-5-image-mini"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 400000 +inputs = ["pdf", "images", "text"] +outputs = ["image", "text", "structured"] +costs = { input = 2.5, output = 2 } + +# --- sourceful ----------------------------------------------------------- + +["sourceful/riverflow-v2-fast"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 8192 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +["sourceful/riverflow-v2-fast-preview"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 8192 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +["sourceful/riverflow-v2-max-preview"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 8192 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +["sourceful/riverflow-v2-pro"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 8192 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } + +["sourceful/riverflow-v2-standard-preview"] +model_type = "img_gen" +sdk = "openrouter_img_gen" +max_tokens = 8192 +inputs = ["text", "images"] +outputs = ["image"] +costs = { input = 0, output = 0 } diff --git a/.pipelex/inference/backends/perplexity.toml b/.pipelex/inference/backends/perplexity.toml deleted file mode 100644 index c8dcf31..0000000 --- a/.pipelex/inference/backends/perplexity.toml +++ /dev/null @@ -1,62 +0,0 @@ -################################################################################ -# Perplexity Backend Configuration -################################################################################ -# -# This file defines the model specifications for Perplexity AI models. -# It contains model definitions for Sonar and reasoning models -# accessible through the Perplexity API. -# -# Configuration structure: -# - Each model is defined in its own section with the model name as the header -# - Headers with dots must be quoted (e.g., ["sonar-pro"]) -# - Model costs are in USD per million tokens (input/output) -# -# Documentation: https://docs.pipelex.com -# Support: https://go.pipelex.com/discord -# -################################################################################ - -################################################################################ -# MODEL DEFAULTS -################################################################################ - -[defaults] -model_type = "llm" -sdk = "openai" - -################################################################################ -# LANGUAGE MODELS -################################################################################ - -# --- Sonar Series ------------------------------------------------------------- -[sonar-pro] -model_id = "sonar-pro" -inputs = ["text"] -outputs = ["text"] - -[sonar] -model_id = "sonar" -inputs = ["text"] -outputs = ["text"] - -[sonar-deep-research] -model_id = "sonar-deep-research" -inputs = ["text"] -outputs = ["text"] - -# --- Sonar Reasoning Series --------------------------------------------------- -[sonar-reasoning-pro] -model_id = "sonar-reasoning-pro" -inputs = ["text"] -outputs = ["text"] - -[sonar-reasoning] -model_id = "sonar-reasoning" -inputs = ["text"] -outputs = ["text"] - -# --- DeepSeek Models ----------------------------------------------------------- -[perplexity-deepseek-r1] -model_id = "r1-1776" -inputs = ["text"] -outputs = ["text"] \ No newline at end of file diff --git a/.pipelex/inference/backends/pipelex_gateway.toml b/.pipelex/inference/backends/pipelex_gateway.toml deleted file mode 100644 index bca075b..0000000 --- a/.pipelex/inference/backends/pipelex_gateway.toml +++ /dev/null @@ -1,41 +0,0 @@ -################################################################################ -# Pipelex Gateway Local Overrides -################################################################################ -# -# TELEMETRY NOTICE: -# -# Using Pipelex Gateway enables identified telemetry tied to your API key -# (hashed for security). This is independent from your telemetry.toml settings. -# -# We collect only technical data (model names, token counts, latency, error rates). -# We do NOT collect prompts, completions, pipe codes, or business data. -# -# This allows us to monitor service quality, enforce fair usage, and support you. -# -################################################################################ -# -# WARNING: USE AT YOUR OWN RISK! -# -# The actual model configuration is fetched remotely from Pipelex servers. -# Any override in this file may cause unexpected behavior or failures, -# as the remote configuration may change at any time. -# -# If you must override, you may ONLY use these keys per model: -# - sdk -# - structure_method -# -# All other keys will be ignored. -# -# If you need custom configurations, consider using your own API keys -# with direct provider backends (openai, anthropic, etc.) instead. -# -# Documentation: -# https://docs.pipelex.com/home/7-configuration/config-technical/inference-backend-config/ -# Support: https://go.pipelex.com/discord -# -################################################################################ - -# Per-model overrides example: -# [gpt-4o] -# sdk = "gateway_completions" -# structure_method = "instructor/openai_tools" diff --git a/.pipelex/inference/backends/pipelex_inference.toml b/.pipelex/inference/backends/pipelex_inference.toml deleted file mode 100644 index b8bb982..0000000 --- a/.pipelex/inference/backends/pipelex_inference.toml +++ /dev/null @@ -1,199 +0,0 @@ -################################################################################ -# Pipelex Inference Backend Configuration -################################################################################ -# -# This file defines the model specifications for the Pipelex Inference backend. -# It contains model definitions for various LLM and image generation models -# accessible through the Pipelex unified inference API. -# -# Configuration structure: -# - Each model is defined in its own section with the model name as the header -# - Headers with dots must be quoted (e.g., ["gpt-4.1"]) -# - Model costs are in USD per million tokens (input/output) -# -# Documentation: https://docs.pipelex.com -# Support: https://go.pipelex.com/discord -# -################################################################################ - -################################################################################ -# MODEL DEFAULTS -################################################################################ - -[defaults] -model_type = "llm" -sdk = "openai" -structure_method = "instructor/openai_tools" -thinking_mode = "none" - -################################################################################ -# LANGUAGE MODELS -################################################################################ - -# --- OpenAI LLMs -------------------------------------------------------------- -[gpt-4o] -model_id = "pipelex/gpt-4o" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 2.75, output = 11.00 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -[gpt-4o-mini] -model_id = "pipelex/gpt-4o-mini" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.17, output = 0.66 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -["gpt-4.1"] -model_id = "pipelex/gpt-4.1" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 2, output = 8 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -["gpt-4.1-mini"] -model_id = "pipelex/gpt-4.1-mini" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.4, output = 1.6 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -["gpt-4.1-nano"] -model_id = "pipelex/gpt-4.1-nano" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.1, output = 0.4 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -[gpt-5-nano] -model_id = "pipelex/gpt-5-nano" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.05, output = 0.40 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -[gpt-5-mini] -model_id = "pipelex/gpt-5-mini" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.25, output = 2.00 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -[gpt-5-chat] -model_id = "pipelex/gpt-5-chat" -inputs = ["text", "images"] -outputs = ["text"] -costs = { input = 1.25, output = 10.00 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -[gpt-5] -model_id = "pipelex/gpt-5" -inputs = ["text", "images"] -outputs = ["text"] -costs = { input = 1.25, output = 10.00 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -["gpt-5.1"] -model_id = "pipelex/gpt-5.1" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.00 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -["gpt-5.1-chat"] -model_id = "pipelex/gpt-5.1-chat" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 1.25, output = 10.00 } -sdk = "openai_responses" -structure_method = "instructor/openai_responses_tools" - -# --- Claude LLMs -------------------------------------------------------------- -["claude-4-sonnet"] -model_id = "pipelex/claude-4-sonnet" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 3, output = 15 } - -["claude-4.1-opus"] -model_id = "pipelex/claude-4.1-opus" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 15, output = 75 } - -["claude-4.5-sonnet"] -model_id = "pipelex/claude-4.5-sonnet" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 3, output = 15 } - -["claude-4.5-haiku"] -model_id = "pipelex/claude-4.5-haiku" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 1, output = 5 } - -["claude-4.5-opus"] -model_id = "pipelex/claude-4.5-opus" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 5, output = 25 } - -# --- Gemini LLMs -------------------------------------------------------------- -["gemini-2.5-pro"] -model_id = "pipelex/gemini-2.5-pro" -inputs = ["text", "images"] -outputs = ["text", "structured"] -max_prompt_images = 3000 -costs = { input = 1.25, output = 10.0 } - -["gemini-2.5-flash"] -model_id = "pipelex/gemini-2.5-flash" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.30, output = 2.50 } - -["gemini-2.5-flash-lite"] -model_id = "pipelex/gemini-2.5-flash-lite" -inputs = ["text", "images"] -outputs = ["text", "structured"] -costs = { input = 0.10, output = 0.40 } - -["gemini-3.0-pro"] -model_id = "pipelex/gemini-3.0-pro" -inputs = ["text", "images"] -outputs = ["text", "structured"] -max_prompt_images = 3000 -costs = { input = 2, output = 12.0 } - -# --- XAI LLMs -------------------------------------------------------------- - -[grok-3] -model_id = "grok-3" -inputs = ["text"] -outputs = ["text"] -costs = { input = 3, output = 15 } - -[grok-3-mini] -model_id = "grok-3-mini" -inputs = ["text"] -outputs = ["text"] -costs = { input = 0.3, output = 0.5 } - -################################################################################ -# OCR and IMAGE GENERATION MODELS -################################################################################ - -# We are still working in giving you acces to OCR and image generation models -# and to the best models from Mistral through the Pipelex Inference backend. diff --git a/.pipelex/inference/backends/portkey.toml b/.pipelex/inference/backends/portkey.toml index baab3aa..f46825e 100644 --- a/.pipelex/inference/backends/portkey.toml +++ b/.pipelex/inference/backends/portkey.toml @@ -105,16 +105,6 @@ structure_method = "instructor/openai_responses_tools" thinking_mode = "manual" x-portkey-provider = "@openai" -[o4-mini] -inputs = ["text"] -outputs = ["text", "structured"] -costs = { input = 1.1, output = 4.4 } -valued_constraints = { fixed_temperature = 1 } -sdk = "portkey_responses" -structure_method = "instructor/openai_responses_tools" -thinking_mode = "manual" -x-portkey-provider = "@openai" - [gpt-5-nano] inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] @@ -282,8 +272,8 @@ costs = { input = 0.10, output = 0.40 } thinking_mode = "manual" x-portkey-provider = "@google" -["gemini-3.0-pro"] -model_id = "gemini-3-pro-preview" +["gemini-3.1-pro"] +model_id = "gemini-3.1-pro-preview" inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] max_prompt_images = 3000 @@ -291,7 +281,7 @@ costs = { input = 2, output = 12.0 } thinking_mode = "adaptive" x-portkey-provider = "@google" -["gemini-3.0-flash-preview"] +["gemini-3.0-flash"] model_id = "gemini-3-flash-preview" inputs = ["text", "images", "pdf"] outputs = ["text", "structured"] diff --git a/.pipelex/inference/backends/scaleway.toml b/.pipelex/inference/backends/scaleway.toml index 75d6a05..79cc704 100644 --- a/.pipelex/inference/backends/scaleway.toml +++ b/.pipelex/inference/backends/scaleway.toml @@ -1,10 +1,10 @@ ################################################################################ -# Groq Backend Configuration +# Scaleway Backend Configuration ################################################################################ # # This file defines the model specifications for Scaleway models. # It contains model definitions for various LLM models accessible through -# the Groq API, including text-only and vision-capable models. +# the Scaleway API, including text-only and vision-capable models. # # Configuration structure: # - Each model is defined in its own section with the model name as the header diff --git a/.pipelex/inference/backends/typesafe.toml b/.pipelex/inference/backends/typesafe.toml new file mode 100644 index 0000000..85b3a1a --- /dev/null +++ b/.pipelex/inference/backends/typesafe.toml @@ -0,0 +1,41 @@ +################################################################################ +# TypeSafe Backend Configuration +################################################################################ +# +# This file defines the model specifications for TypeSafe judgment models. +# TypeSafe's System One answers closed-form questions — yes/no, choice, rating — +# over some material, and returns the probability behind each verdict. +# +# Documentation: https://docs.pipelex.com +# Support: https://go.pipelex.com/discord +# +################################################################################ + +################################################################################ +# MODEL DEFAULTS +################################################################################ + +[defaults] +model_type = "judgment" +sdk = "typesafe" +thinking_mode = "none" + +################################################################################ +# JUDGMENT MODELS +################################################################################ +# +# Always a VERSIONED id, never one of the provider's moving aliases: a verdict model that changes +# under a method silently changes what every threshold in that method means. +# +# Finding the next version is a documentation read, not a lookup. `GET /v1/models` lists only the +# aliases `jev-latest` and `jev-preview` and names no version anywhere in its body, so the versioned +# id comes from the provider's own models page. A truncated id is refused outright. +# +# Output tokens are genuinely free at the time of writing, which is why they are priced at zero +# rather than at an output rate. Prices are USD per million tokens. + +["jev-1.13.0"] +model_id = "jev-1.13.0" +inputs = ["text"] +outputs = ["judgments"] +costs = { input = 0.042, output = 0 } diff --git a/.pipelex/inference/deck/.kit_manifest.json b/.pipelex/inference/deck/.kit_manifest.json index 72145a1..fbe8ec6 100644 --- a/.pipelex/inference/deck/.kit_manifest.json +++ b/.pipelex/inference/deck/.kit_manifest.json @@ -1,9 +1,11 @@ { "files": { - "1_llm_deck.toml": "ebf0cda4cc883c40d36d6ce56aa3452ac7df916f926a3171445b2bdad0bcf8f1", - "2_img_gen_deck.toml": "63b1397f0427aada890096c7d430313f287fd613248aa1f3ab4b9e09a7f19402", - "3_extract_deck.toml": "560a40bd3254b1be011cfb35340fef6c40d70136e5ddce33a961899f92fd70ba", - "4_search_deck.toml": "08e3bd1bee0f9f8ed0ffc735a932705392d0ecfbdeefce64c9815d4b2d8d7e22" + "1_llm_deck.toml": "1316c59eb52db62820d313ff92569b736a3f5427ab8c10f495a02b463f37c97a", + "2_img_gen_deck.toml": "00d570907cee9261882922afebc53556013e46d29419fce4cf189135e2849fd6", + "3_extract_deck.toml": "ca1063419239ed1e48fb861d6852cd2fedc9936c9cd51db27391da23f539e8e7", + "4_search_deck.toml": "08e3bd1bee0f9f8ed0ffc735a932705392d0ecfbdeefce64c9815d4b2d8d7e22", + "5_doc_gen_deck.toml": "3f48b443eb9245a87c6d8051223982bf6134155868bb44a3b167c8e05077c372", + "6_judgment_deck.toml": "630bc70c596c241c462ef6aa04248932a7a37cc8a674f9b1c21b27e2029a48f3" }, - "kit_version": "0.31.0" + "kit_version": "0.83.0" } diff --git a/.pipelex/inference/deck/1_llm_deck.toml b/.pipelex/inference/deck/1_llm_deck.toml index c57fb0a..77d234f 100644 --- a/.pipelex/inference/deck/1_llm_deck.toml +++ b/.pipelex/inference/deck/1_llm_deck.toml @@ -22,73 +22,89 @@ # LLM Default Choices #################################################################################################### +# `default_temperature` is the temperature paired with a model named outside a preset — an alias, a +# waterfall or a bare handle written straight into a pipe, and the `for_text` / `for_object` choices +# below. Every model this deck resolves to fixes its temperature at 1, so any other value here would +# be overridden by the worker and warned about on every single call. + [llm.choice_defaults] -default_temperature = 0.5 +default_temperature = 1 for_text = "@default-general" for_object = "@default-general" #################################################################################################### # LLM Aliases #################################################################################################### +# +# The ladder runs over the GPT-5.6 range and nothing else: luna is the cheap tier, terra the +# intermediate one that carries most of the deck, and sol the premium tier. Read an alias as the job +# it names rather than as a model: repointing a tier is a one-line change here, and every preset +# that goes through an alias follows. The four that name a handle outright — `retrieval-cheap`, +# `retrieval-premium`, `engineering-code-cheap` and `engineering-code-cheaper` — do not, and have to +# be repointed with it. [llm.aliases] -best-gpt = "gpt-5.5" -best-claude = "claude-4.8-opus" -best-gemini = "gemini-pro-latest" -best-mistral = "mistral-large" +best-gpt = "gpt-5.6-sol" # Default aliases (first choice from waterfalls) -default-general = "claude-4.6-sonnet" -default-premium = "claude-4.8-opus" -default-premium-vision = "claude-4.8-opus" -default-premium-structured = "claude-4.8-opus" -default-large-context-code = "gemini-pro-latest" -default-large-context-text = "gemini-flash-latest" -default-small = "gpt-4o-mini" -default-small-structured = "gpt-4o-mini" -default-small-vision = "gemini-flash-latest" -default-small-creative = "gemini-flash-latest" +default-general = "gpt-5.6-terra" +default-premium = "gpt-5.6-sol" +default-premium-vision = "gpt-5.6-sol" +default-premium-structured = "gpt-5.6-sol" +default-large-context-code = "gpt-5.6-terra" +default-large-context-text = "gpt-5.6-terra" +default-small = "gpt-5.6-luna" +default-small-structured = "gpt-5.6-luna" +default-small-vision = "gpt-5.6-luna" +default-small-creative = "gpt-5.6-luna" #################################################################################################### # LLM Presets #################################################################################################### +# Every preset here carries temperature = 1, because every model this deck resolves to — the whole +# GPT-5.6 range — fixes its temperature at 1. Declaring anything else would be +# overridden by the worker and warned about on every single call, so the deck states the value the +# model will actually use. Presets are therefore distinguished by their model tier and their +# reasoning effort, not by temperature. If a tier ever moves to a model that accepts a temperature, +# these are the presets to revisit. + [llm.presets] # Writing -writing-factual = { model = "@default-premium", temperature = 0.1, description = "Factual writing with high accuracy" } -writing-factual-cheap = { model = "@default-small", temperature = 0.1, description = "Cheap factual writing with high accuracy" } -writing-creative = { model = "@default-premium", temperature = 0.9, description = "Creative writing with high variability" } -writing-creative-cheap = { model = "@default-small-creative", temperature = 0.9, description = "Cheap creative writing with high variability" } +writing-factual = { model = "@default-premium", temperature = 1, description = "Factual writing with high accuracy" } +writing-factual-cheap = { model = "@default-small", temperature = 1, description = "Cheap factual writing with high accuracy" } +writing-creative = { model = "@default-premium", temperature = 1, description = "Creative writing with high variability" } +writing-creative-cheap = { model = "@default-small-creative", temperature = 1, description = "Cheap creative writing with high variability" } # Retrieval -retrieval = { model = "@default-large-context-text", temperature = 0.1, description = "Data retrieval from large text corpora" } -retrieval-cheap = { model = "gemini-flash-lite-latest", temperature = 0.1, description = "Cheap data retrieval from large text corpora" } -retrieval-premium = { model = "claude-4.8-opus", temperature = 0.1, description = "Premium data retrieval with highest accuracy" } +retrieval = { model = "@default-large-context-text", temperature = 1, description = "Data retrieval from large text corpora" } +retrieval-cheap = { model = "gpt-5.6-luna", temperature = 1, description = "Cheap data retrieval from large text corpora" } +retrieval-premium = { model = "gpt-5.6-terra", temperature = 1, reasoning_effort = "high", description = "Premium data retrieval with highest accuracy" } # Engineering -engineering-structured = { model = "@default-premium-structured", temperature = 0.2, description = "Structured engineering output (JSON, schemas)" } -engineering-code = { model = "@default-premium", temperature = 0.1, description = "Code generation and analysis" } -engineering-code-cheap = { model = "claude-4.6-sonnet", temperature = 0.1, description = "Cheap code generation and analysis" } -engineering-code-cheaper = { model = "claude-4.5-haiku", temperature = 0.1, description = "Cheapest code generation and analysis" } -engineering-codebase-analysis = { model = "@best-gemini", temperature = 0.1, description = "Large codebase analysis" } +engineering-structured = { model = "@default-premium-structured", temperature = 1, description = "Structured engineering output (JSON, schemas)" } +engineering-code = { model = "@default-premium", temperature = 1, description = "Code generation and analysis" } +engineering-code-cheap = { model = "gpt-5.6-terra", temperature = 1, description = "Cheap code generation and analysis" } +engineering-code-cheaper = { model = "gpt-5.6-luna", temperature = 1, description = "Cheapest code generation and analysis" } +engineering-codebase-analysis = { model = "@default-large-context-code", temperature = 1, description = "Large codebase analysis" } # Vision -vision = { model = "@default-premium-vision", temperature = 0.5, description = "Understanding and interpreting images" } -vision-cheap = { model = "@default-small-vision", temperature = 0.5, description = "Cheap image understanding for simple tasks" } -vision-diagram = { model = "@default-premium-vision", temperature = 0.3, description = "Diagram and chart interpretation" } -vision-table = { model = "@default-premium-vision", temperature = 0.3, description = "Table extraction from images" } +vision = { model = "@default-premium-vision", temperature = 1, description = "Understanding and interpreting images" } +vision-cheap = { model = "@default-small-vision", temperature = 1, description = "Cheap image understanding for simple tasks" } +vision-diagram = { model = "@default-premium-vision", temperature = 1, description = "Diagram and chart interpretation" } +vision-table = { model = "@default-premium-vision", temperature = 1, description = "Table extraction from images" } # Image generation prompting -img-gen-prompting = { model = "@default-premium", temperature = 0.5, description = "Crafting image generation prompts" } -img-gen-prompting-cheap = { model = "@default-small-creative", temperature = 0.5, description = "Cheap image prompt generation" } +img-gen-prompting = { model = "@default-premium", temperature = 1, description = "Crafting image generation prompts" } +img-gen-prompting-cheap = { model = "@default-small-creative", temperature = 1, description = "Cheap image prompt generation" } # Reasoning -deep-analysis = { model = "@default-premium", temperature = 0.1, reasoning_effort = "high", description = "Deep reasoning and analysis" } -quick-reasoning = { model = "@default-premium", temperature = 0.3, reasoning_effort = "low", description = "Quick reasoning for simple tasks" } +deep-analysis = { model = "@default-premium", temperature = 1, reasoning_effort = "high", description = "Deep reasoning and analysis" } +quick-reasoning = { model = "@default-premium", temperature = 1, reasoning_effort = "low", description = "Quick reasoning for simple tasks" } # Testing -testing-text = { model = "@default-small", temperature = 0.5, description = "Testing preset for text generation" } -testing-structured = { model = "@default-small-structured", temperature = 0.1, description = "Testing preset for structured output" } -testing-vision = { model = "@default-small-vision", temperature = 0.5, description = "Testing preset for vision tasks" } -testing-vision-structured = { model = "@default-small-vision", temperature = 0.5, description = "Testing preset for structured vision output" } +testing-text = { model = "@default-small", temperature = 1, description = "Testing preset for text generation" } +testing-structured = { model = "@default-small-structured", temperature = 1, description = "Testing preset for structured output" } +testing-vision = { model = "@default-small-vision", temperature = 1, description = "Testing preset for vision tasks" } +testing-vision-structured = { model = "@default-small-vision", temperature = 1, description = "Testing preset for structured vision output" } diff --git a/.pipelex/inference/deck/2_img_gen_deck.toml b/.pipelex/inference/deck/2_img_gen_deck.toml index a2c73f4..5034138 100644 --- a/.pipelex/inference/deck/2_img_gen_deck.toml +++ b/.pipelex/inference/deck/2_img_gen_deck.toml @@ -32,10 +32,9 @@ choice_default = "$gen-image" [img_gen.aliases] best-gpt = "gpt-image-2" -best-gemini = "nano-banana-2" -default-general = "nano-banana" -default-premium = "nano-banana-2" +default-general = "gpt-image-2" +default-premium = "gpt-image-2" default-small = "gpt-image-1-mini" #################################################################################################### @@ -51,7 +50,7 @@ gen-image-high-quality = { model = "@default-premium", quality = "high", descrip # Testing gen-image-testing = { model = "@default-small", quality = "low", description = "Testing preset for image generation" } -gen-image-testing-img2img = { model = "nano-banana-pro", description = "Testing preset for image-to-image" } +gen-image-testing-img2img = { model = "@default-premium", description = "Testing preset for image-to-image" } synthesize-photo = { model = "@default-small", quality = "low", description = "Synthesize realistic photos for testing" } -synthesize-ui = { model = "nano-banana-pro", description = "Synthesize UI screenshots for testing" } -synthesize-chart = { model = "nano-banana-pro", description = "Synthesize charts and graphs for testing" } +synthesize-ui = { model = "@default-premium", description = "Synthesize UI screenshots for testing" } +synthesize-chart = { model = "@default-premium", description = "Synthesize charts and graphs for testing" } diff --git a/.pipelex/inference/deck/3_extract_deck.toml b/.pipelex/inference/deck/3_extract_deck.toml index c67d393..daf2de5 100644 --- a/.pipelex/inference/deck/3_extract_deck.toml +++ b/.pipelex/inference/deck/3_extract_deck.toml @@ -31,13 +31,25 @@ choice_default = "@default-extract-document" #################################################################################################### [extract.aliases] -default-premium = "azure-document-intelligence" -default-extract-document = "azure-document-intelligence" -default-extract-image = "azure-document-intelligence" +default-premium = "~ocr-extractor" +default-extract-document = "~document-extractor" +default-extract-image = "~ocr-extractor" default-text-from-pdf = "pypdfium2-extract-pdf" default-no-inference = "pypdfium2-extract-pdf" default-extract-web-page = "linkup-fetch" +#################################################################################################### +# Waterfalls +#################################################################################################### +# +# Each default resolves to the first entry an enabled backend serves: Mistral OCR with your own +# Mistral key. Documents fall back to reading a PDF's text layer locally, which needs no key but +# recovers no text from a scanned page. + +[extract.waterfalls] +document-extractor = ["mistral-ocr", "pypdfium2-extract-pdf"] +ocr-extractor = ["mistral-ocr"] + #################################################################################################### # Extract Presets #################################################################################################### diff --git a/.pipelex/inference/deck/5_doc_gen_deck.toml b/.pipelex/inference/deck/5_doc_gen_deck.toml new file mode 100644 index 0000000..cdb0ee6 --- /dev/null +++ b/.pipelex/inference/deck/5_doc_gen_deck.toml @@ -0,0 +1,41 @@ +#################################################################################################### +# Pipelex Model Deck - Document Generation Configuration +#################################################################################################### +# +# This file defines the default engine a PipeDocGen step prints with, for each format and source, +# when the step names none with `model`. A source is where the document comes from: "layout" is the +# auto-layout of the step's inputs, "html" an HTML template, "template_file" an office template file. +# +# Open Pipelex prints a pdf from the auto-layout, on its built-in engine reportlab-pdf, so that is +# the one default this file sets. The Pipelex document generation plugin, pipelex-doc-gen, declares +# the defaults for a pdf from a template and for xlsx, docx and pptx itself when it loads. You can +# still set any default yourself, for any format and source, in an x_custom_*.toml file, which +# overrides both this file and the plugin. +# +# Managed by `pipelex update`. To customize without conflict, create an +# x_custom_*.toml file in this directory — pipelex never tracks or +# overwrites x_custom_* files. Local edits to this file are backed up +# to .bak. on update but will not survive future runs. +# +# Model Reference Syntax: +# - Preset: $preset_name or preset:preset_name +# - Alias: @alias_name or alias:alias_name +# +# Documentation: https://docs.pipelex.com +# Support: https://go.pipelex.com/discord +# +#################################################################################################### + +#################################################################################################### +# Document Generation Default Choices, keyed "." +#################################################################################################### + +[doc_gen.choice_defaults] +"pdf.layout" = "@default-pdf" + +#################################################################################################### +# Aliases +#################################################################################################### + +[doc_gen.aliases] +default-pdf = "reportlab-pdf" diff --git a/.pipelex/inference/deck/6_judgment_deck.toml b/.pipelex/inference/deck/6_judgment_deck.toml new file mode 100644 index 0000000..5fec6dd --- /dev/null +++ b/.pipelex/inference/deck/6_judgment_deck.toml @@ -0,0 +1,50 @@ +#################################################################################################### +# Pipelex Model Deck - Judgment Configuration +#################################################################################################### +# +# This file defines model aliases and presets for Judgment models — models that answer +# closed-form questions (yes/no, choice, rating) over some material, with a measure of +# how sure they are. +# +# Managed by `pipelex update`. To customize without conflict, create an +# x_custom_*.toml file in this directory — pipelex never tracks or +# overwrites x_custom_* files. Local edits to this file are backed up +# to .bak. on update but will not survive future runs. +# +# Model Reference Syntax: +# - Preset: $preset_name or preset:preset_name +# - Alias: @alias_name or alias:alias_name +# +# Documentation: https://docs.pipelex.com +# Support: https://go.pipelex.com/discord +# +#################################################################################################### + +#################################################################################################### +# Judgment Default Choice +#################################################################################################### +# +# There is deliberately no `choice_default` here, and that is what tells you no judgment model is +# served out of the box: a judgment backend is one you bring, so a pipe names the model it judges +# with. Set one here once you have a backend configured. + +[judgment] + +#################################################################################################### +# Aliases +#################################################################################################### +# +# A judgment alias points at a VERSIONED model id, never at a provider's `latest` alias: a verdict +# model that changes under a method silently changes what every threshold in that method means. +# +# `jev-1.13.0` is TypeSafe's. Its next version is found on the provider's models page and not through +# its API, whose model listing names only the moving aliases — moving this pin is a documentation read. + +[judgment.aliases] +default-judgment = "jev-1.13.0" + +#################################################################################################### +# Judgment Presets +#################################################################################################### + +[judgment.presets] diff --git a/.pipelex/inference/deck/x_custom_extract_deck.toml b/.pipelex/inference/deck/x_custom_extract_deck.toml index 24fc260..5330484 100644 --- a/.pipelex/inference/deck/x_custom_extract_deck.toml +++ b/.pipelex/inference/deck/x_custom_extract_deck.toml @@ -5,10 +5,10 @@ # This file allows you to override or complete the base model decks. # # ADVANCED USERS ONLY: This file is for users who bring their own API keys and connect directly -# to AI providers (Azure, Mistral, etc.) without using the Pipelex Gateway. +# to AI providers (Azure, Mistral, etc.) and want to tune their own catalog. # -# If you're using the standard Pipelex Gateway setup, you don't need to modify this file. -# The Gateway handles model routing automatically and supports all available models. +# If the shipped backend catalogs cover your needs, you don't need to modify this file. +# The routing profile picks a backend for every model the enabled backends serve. # # Waterfalls are useful when using multiple backends directly - they define ordered lists # of models that are resolved at configuration time based on which backends are available. @@ -27,14 +27,10 @@ # Example (uncomment to use): # [extract.waterfalls] -# document_extractor = ["azure-document-intelligence", "mistral-document-ai-2505"] +# document_extractor = ["mistral-document-ai-2505", "pypdfium2-extract-pdf"] # pdf_text_extractor = [ -# "azure-document-intelligence", # "mistral-document-ai-2505", # "pypdfium2-extract-pdf", # ] -# image_text_extractor = [ -# "azure-document-intelligence", -# "mistral-document-ai-2505", -# ] +# image_text_extractor = ["mistral-document-ai-2505"] #################################################################################################### diff --git a/.pipelex/inference/deck/x_custom_llm_deck.toml b/.pipelex/inference/deck/x_custom_llm_deck.toml index 5ad13b8..0c7833c 100644 --- a/.pipelex/inference/deck/x_custom_llm_deck.toml +++ b/.pipelex/inference/deck/x_custom_llm_deck.toml @@ -5,10 +5,10 @@ # This file allows you to override or complete the base model decks. # # ADVANCED USERS ONLY: This file is for users who bring their own API keys and connect directly -# to AI providers (OpenAI, Anthropic, Google, etc.) without using the Pipelex Gateway. +# to AI providers (OpenAI, Anthropic, Google, etc.) and want to tune their own catalog. # -# If you're using the standard Pipelex Gateway setup, you don't need to modify this file. -# The Gateway handles model routing automatically and supports all available models. +# If the shipped backend catalogs cover your needs, you don't need to modify this file. +# The routing profile picks a backend for every model the enabled backends serve. # # Waterfalls are useful when using multiple backends directly - they define ordered lists # of models that are resolved at configuration time based on which backends are available. @@ -35,23 +35,23 @@ for_object = "disabled" # Example (uncomment to use): # [llm.waterfalls] -# premium-llm = ["claude-4.5-opus", "gemini-3.1-pro", "gpt-5.2", "grok-4"] +# premium-llm = ["claude-4.5-opus", "gemini-3.1-pro", "gpt-5.4", "grok-4"] # premium-llm-vision = [ # "claude-4.5-opus", # "gemini-3.1-pro", -# "gpt-5.2", +# "gpt-5.4", # "grok-4-fast-reasoning", # ] # premium-llm-structured = [ # "claude-4.5-opus", # "gemini-3.1-pro", -# "gpt-5.2", +# "gpt-5.4", # "grok-4", # ] # large-context-llm-code = [ # "gemini-3.1-pro", # "claude-4.5-opus", -# "gpt-5.2", +# "gpt-5.4", # "grok-4-fast-reasoning", # ] # large-context-llm-text = ["gemini-2.5-flash", "claude-4.5-sonnet"] diff --git a/.pipelex/inference/routing_profiles.toml b/.pipelex/inference/routing_profiles.toml index eb9aae0..00272c7 100644 --- a/.pipelex/inference/routing_profiles.toml +++ b/.pipelex/inference/routing_profiles.toml @@ -12,21 +12,45 @@ # which routing profile you select. See the documentation for details. # Which profile to use (change this to switch routing) -active = "all_pipelex_gateway" +active = "all_enabled_backends" -# We recommend using the "all_pipelex_gateway" profile to get a head start with all models. -# To use the Pipelex Gateway backend: -# 1. Get your API key at https://app.pipelex.com (free credits included) -# 2. Add it to your .env file: PIPELEX_GATEWAY_API_KEY=your-key-here -# 3. Run `pipelex init` and accept the Gateway terms of service +# The default profile needs no Pipelex account: it routes each model to the first enabled backend +# that serves it, in the order its `fallback_order` lists. `pipelex init` narrows this to the +# backend you configure (`all_`). The model deck's default tiers point at OpenAI models, +# which `openai` and `azure_openai` serve: with any other single backend, repoint the deck's +# aliases at models it serves in `deck/x_custom_llm_deck.toml`. # ========================================================================================= # Routing Profiles # ========================================================================================= -[profiles.all_pipelex_gateway] -description = "Use Pipelex Gateway for all its supported models" -default = "pipelex_gateway" +[profiles.all_enabled_backends] +description = "Route each model to the first enabled backend that serves it, in this order" +fallback_order = [ + "openai", + "anthropic", + "google", + "mistral", + "bedrock", + "azure_openai", + "xai", + "groq", + "fal", + "huggingface", + "linkup", + "openrouter", + "portkey", + "blackboxai", + "minimax", + "scaleway", + "ollama", + "vertexai", +] + +# Judgment models are served by their own backend alone, so they go to it whenever it is enabled. +# An optional route is inert while its backend is disabled. +[profiles.all_enabled_backends.optional_routes] +"jev-*" = "typesafe" [profiles.all_anthropic] description = "Use Anthropic backend for all its supported models" @@ -60,6 +84,14 @@ default = "groq" description = "Use HuggingFace backend for all its supported models" default = "huggingface" +[profiles.all_linkup] +description = "Use Linkup backend for all its supported models" +default = "linkup" + +[profiles.all_minimax] +description = "Use MiniMax backend for all its supported models" +default = "minimax" + [profiles.all_mistral] description = "Use Mistral backend for all its supported models" default = "mistral" @@ -72,6 +104,10 @@ default = "ollama" description = "Use OpenAI backend for all its supported models" default = "openai" +[profiles.all_openrouter] +description = "Use OpenRouter backend for all its supported models" +default = "openrouter" + [profiles.all_portkey] description = "Use Portkey backend for all its supported models" default = "portkey" @@ -80,6 +116,10 @@ default = "portkey" description = "Use Scaleway backend for all its supported models" default = "scaleway" +[profiles.all_typesafe] +description = "Use TypeSafe backend for all its supported models" +default = "typesafe" + [profiles.all_vertexai] description = "Use Vertex AI backend for all its supported models" default = "vertexai" @@ -113,7 +153,7 @@ default = "internal" # ========================================================================================= [profiles.example_routing_using_patterns] description = "Example routing profile using patterns" -default = "pipelex_gateway" +default = "openrouter" [profiles.example_routing_using_patterns.routes] # Pattern matching: "model-pattern" = "backend-name" @@ -133,17 +173,17 @@ default = "pipelex_gateway" description = "Example routing profile using specific models" [profiles.example_routing_using_specific_models.routes] -"gpt-5-nano" = "pipelex_gateway" +"gpt-5.4-nano" = "openrouter" "gpt-4o-mini" = "blackboxai" -"gpt-5-mini" = "openai" -"gpt-5-chat" = "azure_openai" +"gpt-5.4-mini" = "openai" +"gpt-5.5" = "azure_openai" -"claude-4-sonnet" = "pipelex_gateway" +"claude-4-sonnet" = "openrouter" "claude-3.7-sonnet" = "blackboxai" -"gemini-2.5-flash-lite" = "pipelex_gateway" +"gemini-2.5-flash-lite" = "openrouter" "gemini-2.5-flash" = "blackboxai" "gemini-2.5-pro" = "vertexai" -"grok-3" = "pipelex_gateway" +"grok-3" = "openrouter" "grok-3-mini" = "xai" diff --git a/.pipelex/pipelex.toml b/.pipelex/pipelex.toml index 8849a55..c21b03a 100644 --- a/.pipelex/pipelex.toml +++ b/.pipelex/pipelex.toml @@ -39,8 +39,6 @@ is_generate_graph = true [interpreter.pipeline_execution.graph.data_inclusion] # Control what data is included in graph outputs stuff_json_content = true -stuff_text_content = true -stuff_html_content = true error_stack_traces = true [interpreter.pipeline_execution.graph.graphs_inclusion] @@ -125,23 +123,23 @@ is_upload_local_content_enabled = true [runtime.storage.local] # Local storage settings -uri_format = "{primary_id}/{secondary_id}/{hash}.{extension}" +uri_format = "{hash}.{extension}" local_storage_path = ".pipelex/storage" [runtime.storage.in_memory] # In-memory storage settings -uri_format = "{primary_id}/{secondary_id}/{hash}.{extension}" +uri_format = "{hash}.{extension}" [runtime.storage.s3] # AWS S3 storage settings (requires boto3: `pip install pipelex[s3]`) -uri_format = "{primary_id}/{secondary_id}/{hash}.{extension}" +uri_format = "{hash}.{extension}" bucket_name = "" region = "" signed_urls_lifespan_seconds = 3600 # Set to "disabled" for public URLs [runtime.storage.gcp] # Google Cloud Storage settings (requires google-cloud-storage: `pip install pipelex[gcp-storage]`) -uri_format = "{primary_id}/{secondary_id}/{hash}.{extension}" +uri_format = "{hash}.{extension}" bucket_name = "" project_id = "" signed_urls_lifespan_seconds = 3600 # Set to "disabled" for public URLs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c63c90..9076554 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,17 @@ ### Added - **Usage statistics:** cocode sets `PIPELEX_USAGE_STATS_HOST=cocode` before it boots Pipelex, unless the environment already sets it, so that once cocode runs on the Pipelex release that introduces anonymous usage statistics, the runs it drives report as host `cocode`. cocode sends no statistics of its own, and a Pipelex release without them, like the one this version pins, sends none and ignores the variable. The new Usage Statistics page in the docs explains this and links to Pipelex's page for turning the statistics off. +### Changed +- **Tooling:** Pinned `ruff` to an exact `0.16.4`, up from `0.14.13`. This matches what the Ruff VS Code extension now bundles, which matters because Ruff 0.16 lints `pyproject.toml` itself: the extension syncs the config file to the language server, and a pre-0.16 binary parses it as Python source and paints phantom `invalid-syntax` diagnostics on lines like `requires-python`. Keeping the pin exact stops the editor and the CLI from drifting apart again. Nothing shipped changes — this is a dev dependency, and the upgrade produced no new lint findings and no reformatting. +- **`pipelex` 0.83.0 (Breaking)**: Bumped `pipelex` from `0.46.4` to `0.83.0`, with its `cli` extra added beside `anthropic`, `bedrock`, `google` and `google-genai`. This release has no Pipelex Gateway and refuses to boot on a configuration a Gateway release set up, so anyone with their own `.pipelex/` directory runs `pipelex migrate`, then edits any storage `uri_format` that names `{primary_id}` or `{secondary_id}`, which 0.83.0 also refuses and the migration leaves alone. +- **Model setup: one OpenAI key (Breaking)**: cocode's inference configuration switches on the OpenAI backend alone and carries Pipelex 0.83.0's model catalogs and model deck, which resolve every tier cocode uses to OpenAI's GPT-5.6 models, where cocode previously ran Claude and Gemini models through the Gateway. The package now carries that configuration and runs on it from any directory without an inference configuration of its own, so a `pip install` needs only `OPENAI_API_KEY`, in a `.env` file or in `~/.pipelex/.env`, where it used to work only from the cocode directory. To run on another provider, switch its backend on in a git-ignored `.pipelex/inference/backends_override.toml` and point the whole model deck at its models in a deck file of your own, as the README shows; the docs no longer offer the free Discord key, `PIPELEX_API_KEY` or `PIPELEX_GATEWAY_API_KEY`, and `.env.example` lists the variable of every provider. +- **`make agent-test` and `make codex-tests`**: Run without inference, as `make gha-tests` does, so they boot with no provider key, and CI now dry-runs every pipe. + ### Fixed - **Docs:** `CLI_README.md`'s example of extracting Python files from the cookbook now reads its `recipes` directory. The cookbook's redesign removed the `examples` directory it pointed at, so the example extracted nothing. - **CI:** Bumped the Sigstore signing action in the publish workflow from `v3.0.0` to `v3.5.0`, SHA-pinned as `790bc6befb9d733738f18d8f895854b453640ec9`. The sigstore-python bundled with `v3.0.0` predates the Sigstore TUF trust-root rotation, so the "Sign the dists with Sigstore" step had started failing deterministically with `tuf.api.exceptions.UnsignedMetadataError: root was signed by 0/3 keys`. That step sits in the GitHub-release job, so the failure mode was a version published to PyPI with no matching GitHub release or tag. - -### Changed -- **Tooling:** Pinned `ruff` to an exact `0.16.4`, up from `0.14.13`. This matches what the Ruff VS Code extension now bundles, which matters because Ruff 0.16 lints `pyproject.toml` itself: the extension syncs the config file to the language server, and a pre-0.16 binary parses it as Python source and paints phantom `invalid-syntax` diagnostics on lines like `requires-python`. Keeping the pin exact stops the editor and the CLI from drifting apart again. Nothing shipped changes — this is a dev dependency, and the upgrade produced no new lint findings and no reformatting. +- **Pipelines**: Sequence steps in `doc_proofread` and `doc_update` read a list as a single item (`related_files`, `all_inconsistencies`, `git_citations`, `doc_analyses` and `structured_changes`). Pipelex 0.83.0 refuses such a library when it loads, which stopped every cocode command before its run started, so each input now declares the list its producing step stores. +- **`cocode doc proofread`**: The step writing the report read the inconsistencies as one list, but received one list per documentation file, because batching a pipe that returns a list stores each branch's list as a single item. Each file's proofreading now returns one result, and the method binds their inconsistencies into one flat list before the report step reads it. ## [v0.10.0] - 2026-08-18 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a232aaf..5ad138e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ We are open to contributions in all areas of our core cocode library: - Fork the cocode repository - Clone the repository locally - Install dependencies: `make install` (creates .venv and installs dependencies) -- Copy `.env.example` to `.env` and fill in required API keys (at least OpenAI) +- Copy `.env.example` to `.env` and set `OPENAI_API_KEY`: the shipped configuration runs on OpenAI, and `make test` boots Pipelex with inference, which needs the key even though its dry runs call no model (`make agent-test` and the CI tests boot without inference and need no key) - Run checks to make sure all is good: `make check` & `make test` - Create a branch with the format user_name/category/short_slug where category is one of: `feature`, `fix`, `refactor`, `docs`, `cicd` or `chore` - Make and commit changes @@ -40,7 +40,7 @@ We are open to contributions in all areas of our core cocode library: - Fork & clone the repository - Run `make install` to set up virtualenv and dependencies -- Copy `.env.example` to `.env` and configure API keys +- Copy `.env.example` to `.env` and set `OPENAI_API_KEY` (the README says how to run on another provider) - Use uv for dependency management: - Runtime deps: `uv pip install ` - Dev deps: `uv pip install --extra dev ` @@ -51,7 +51,7 @@ We are open to contributions in all areas of our core cocode library: - Fork the cocode repository - Clone the repository locally - Install dependencies: `make install` (creates .venv and installs dependencies) -- Copy `.env.example` to `.env` and fill in required API keys (at least OpenAI) +- Copy `.env.example` to `.env` and set `OPENAI_API_KEY`: the shipped configuration runs on OpenAI, and `make test` boots Pipelex with inference, which needs the key even though its dry runs call no model (`make agent-test` and the CI tests boot without inference and need no key) - Run checks to make sure all is good: `make check` & `make test` - Create a branch for your feature/bug-fix with the format user_name/feature/some_feature or user_name/fix/some_bugfix - Make and commit changes @@ -69,7 +69,7 @@ We are open to contributions in all areas of our core cocode library: ## Environment Setup - Copy `.env.example` to `.env` -- Fill in required credentials (OPENAI_API_KEY, AWS_ACCESS_KEY_ID, etc.) +- Set `OPENAI_API_KEY`, the one key the shipped configuration needs. Another provider's key matters only once its backend is switched on, as the README describes - Never commit `.env` ## License diff --git a/Makefile b/Makefile index a84b668..78084a5 100644 --- a/Makefile +++ b/Makefile @@ -68,9 +68,9 @@ make merge-check-pyright - Run pyright merge check without updating files make v - Shorthand -> validate make codex-tests - Run tests for Codex (exit on first failure) (no inference, no codex_disabled) make gha-tests - Run tests for github actions (exit on first failure) (no inference, no gha_disabled) -make test - Run unit tests (no inference) -make agent-test - Run unit tests, silent on success, output on failure (for AI agents) -make test-with-prints - Run tests with prints (no inference) +make test - Run unit tests, booting Pipelex with inference (needs OPENAI_API_KEY, calls no model) +make agent-test - Run unit tests without inference, silent on success, output on failure (for AI agents) +make test-with-prints - Run tests with prints, booting Pipelex with inference like make test make t - Shorthand -> test-with-prints make tp - Shorthand -> test-with-prints make tb - Shorthand -> `make test-with-prints TEST=test_boot` @@ -219,7 +219,7 @@ cleanall: cleanderived cleanenv cleanlibraries cleanresults codex-tests: env $(call PRINT_TITLE,"Unit testing for Codex") @echo "• Running unit tests for Codex (excluding inference and codex_disabled)" - $(VENV_PYTEST) --exitfirst --quiet -m "not inference and not codex_disabled" || [ $$? = 5 ] + $(VENV_PYTEST) --disable-inference --exitfirst --quiet -m "not inference and not codex_disabled" || [ $$? = 5 ] gha-tests: env $(call PRINT_TITLE,"Unit testing for github actions") @@ -253,7 +253,7 @@ test: env agent-test: env @echo "• Running unit tests..." @tmpfile=$$(mktemp); \ - $(VENV_PYTEST) -m $(USUAL_PYTEST_MARKERS) -o log_level=WARNING --tb=short -q > "$$tmpfile" 2>&1; \ + $(VENV_PYTEST) --disable-inference -m $(USUAL_PYTEST_MARKERS) -o log_level=WARNING --tb=short -q > "$$tmpfile" 2>&1; \ exit_code=$$?; \ if [ $$exit_code -ne 0 ]; then grep -vE '\[\s*[0-9]+%\]\s*$$' "$$tmpfile"; fi; \ rm -f "$$tmpfile"; \ diff --git a/README.md b/README.md index c8e2601..42eac36 100644 --- a/README.md +++ b/README.md @@ -23,36 +23,70 @@ Streamline your documentation workflow with AI-powered automation: pip install cocode ``` -Important: the current version of Cocode only works when run from the cocode directory. +Cocode runs from any directory: the package carries its pipelines and the inference configuration they run on. -## 🔑 Get Your API Keys +## 🔑 Give Cocode Access to AI Models -Cocode's built-in AI workflows require access to AI models. To use the main features (changelog generation, documentation updates, proofreading), you need API keys for: +Cocode's AI workflows (changelog generation, documentation updates, proofreading and analysis) run on [Pipelex](https://github.com/Pipelex/pipelex), on your machine, with your own provider keys. -- **Claude models** (Anthropic) - Required for changelog generation and documentation analysis -- **Gemini models** (Google) - Required for documentation proofreading +### With an OpenAI key -You have several options: +Cocode ships configured for OpenAI: its inference configuration, [`.pipelex/inference/`](.pipelex/inference/), switches on the OpenAI backend alone, and Pipelex's model deck resolves every tier Cocode uses to OpenAI's GPT-5.6 models. The package carries that configuration, so one key is all you need, whichever directory you run Cocode from. Set it in a `.env` file in that directory, or in `~/.pipelex/.env` to use it everywhere: -### Option 1: Free Pipelex API Key (Free) -Get free access to all models with a single API key: -- Join our [Discord community](https://go.pipelex.com/discord) -- Request your **free API key** (no credit card required) in the [🔑・free-api-key](https://discord.com/channels/1369447918955921449/1418228010431025233) channel -- Add it to your `.env` file: `PIPELEX_API_KEY=your-key-here` +```bash +OPENAI_API_KEY=sk-your-key-here +``` + +In a clone of this repository, copy `.env.example` to `.env` and set the key there: + +```bash +cp .env.example .env +``` + +A directory with an inference configuration of its own, a `.pipelex/inference/backends.toml` such as `pipelex init` writes, runs on that configuration instead, as Pipelex always does. A clone of this repository is such a directory, with the same configuration the package carries. + +### With another provider + +A key alone is not enough for any other provider, including a local model through Ollama: its backend has to be switched on, and the model deck pointed at the models it serves. Anthropic, for example. In a clone of this repository, three personal files do it, and git ignores all of them, so the tracked configuration stays as it is: + +1. Put `ANTHROPIC_API_KEY` in your `.env` file. `.env.example` lists the variable of every provider. +2. Switch the backends in `.pipelex/inference/backends_override.toml`. Turn OpenAI off unless you keep its key, because a run refuses to start while an enabled backend's key is missing: + + ```toml + [openai] + enabled = false + + [anthropic] + enabled = true + ``` + +3. Point the model deck at that provider's models in `.pipelex/inference/deck/x_custom_provider_deck.toml`, a deck file of your own that Pipelex reads after the tracked ones. The deck's tiers are its `default-*` aliases, which every preset goes through, except four that name a model directly, so this one file moves the whole deck: + + ```toml + [llm.aliases] + default-general = "claude-5-sonnet" + default-premium = "claude-5-opus" + default-premium-vision = "claude-5-opus" + default-premium-structured = "claude-5-opus" + default-large-context-code = "claude-5-sonnet" + default-large-context-text = "claude-5-sonnet" + default-small = "claude-5.5-haiku" + default-small-structured = "claude-5.5-haiku" + default-small-vision = "claude-5.5-haiku" + default-small-creative = "claude-5.5-haiku" -### Option 2: Bring Your Own API Keys -Use your own API keys from AI providers: + [llm.presets] + retrieval-cheap = { model = "claude-5.5-haiku" } + retrieval-premium = { model = "claude-5-sonnet" } + engineering-code-cheap = { model = "claude-5-sonnet" } + engineering-code-cheaper = { model = "claude-5.5-haiku" } + ``` -**Required for core features:** -- Claude models - Use either: - - `ANTHROPIC_API_KEY` - Direct Anthropic API ([Get key](https://console.anthropic.com/)) - - Amazon Bedrock - AWS credentials for Claude via Bedrock ([Setup guide](https://docs.pipelex.com/pages/configuration/config-technical/inference-backend-config/)) -- Google Cloud credentials - For Gemini models ([Setup guide](https://docs.pipelex.com/pages/build-reliable-ai-workflows-with-pipelex/ai-plugins-for-multi-llm-workflows/#4-google-vertex-ai-configuration)) +With a `pip install`, the configuration Cocode ships sits inside the package, so give the project you run Cocode in a configuration of its own. At its root, run `pipelex-agent init --config '{"backends": ["anthropic"]}'`: it writes a `.pipelex/` directory with Anthropic as its only backend, which does step 2 for you. Then do steps 1 and 3 in that project. Pipelex recognizes a project's root by a marker such as `.git` or `pyproject.toml`, so in a directory that has none, create an empty `.pipelex` directory before running the command. -Add these to your environment variables or in your `.env` file in your project root. +The models each provider serves are listed in `.pipelex/inference/backends/`. Pipelex's [Configure AI Providers](https://docs.pipelex.com/latest/get-started/configure-ai-providers/) page covers every provider, and [Inference Backend Configuration](https://docs.pipelex.com/latest/configuration/config-technical/inference-backend-config/) the override and deck files. -### Option 3: Local AI -You can also use local models with Ollama, vLLM, or any OpenAI-compatible endpoint. See the [Pipelex configuration guide](https://docs.pipelex.com/pages/setup/configure-ai-providers/) for details. +Cocode runs its workflows inside its own process, so the hosted Pipelex API and its Pipelex API key do not apply to it. ## ✅ Validation diff --git a/cocode/cli/main.py b/cocode/cli/main.py index 3464d10..eab6fc6 100644 --- a/cocode/cli/main.py +++ b/cocode/cli/main.py @@ -19,6 +19,7 @@ from cocode.cli.repo.repo_cli import repo_app from cocode.common import PIPELINE_LIBRARY_DIRS from cocode.github.github_cli import github_app +from cocode.inference_config import CocodeModelManager from cocode.repox.repox_cli import repox_app from cocode.usage_stats import declare_cocode_usage_stats_host from cocode.validation_cli import validation_app @@ -68,7 +69,7 @@ def main(ctx: TyperContext) -> None: """Initialize Pipelex system before any command runs.""" # Before the boot, which reads the declaration along with pipelex's other usage-statistics switches. declare_cocode_usage_stats_host() - Pipelex.make(library_dirs=PIPELINE_LIBRARY_DIRS) + Pipelex.make(library_dirs=PIPELINE_LIBRARY_DIRS, models_manager=CocodeModelManager()) if ctx.invoked_subcommand is None: print(ctx.get_help()) diff --git a/cocode/exceptions.py b/cocode/exceptions.py index f0a44d0..eb2f2bf 100644 --- a/cocode/exceptions.py +++ b/cocode/exceptions.py @@ -14,3 +14,7 @@ class RepoxException(CocodeError): class NoDifferencesFound(CocodeError): pass + + +class InferenceConfigNotFoundError(CocodeError): + pass diff --git a/cocode/inference_config.py b/cocode/inference_config.py new file mode 100644 index 0000000..3f9e703 --- /dev/null +++ b/cocode/inference_config.py @@ -0,0 +1,111 @@ +"""The inference configuration cocode boots Pipelex on. + +cocode is configured for OpenAI: its `.pipelex/inference/` directory switches on the OpenAI backend alone, beside Pipelex's +model catalogs and model deck. Pipelex finds that directory only from the working directory, as the configuration of the +project it runs in, so on its own it would read it only when cocode runs from its checkout. Run from anywhere else, as a +`pip install` runs it, Pipelex falls back to the home directory's inference files, and the ones it writes into a fresh home +switch every backend on, so the boot refuses to start for want of every provider's key. + +cocode therefore carries the directory inside its package, and boots Pipelex with `CocodeModelManager`, which reads the +inference configuration this way: + +- When the project cocode runs from has an inference configuration of its own, a `.pipelex/inference/backends.toml`, Pipelex + resolves everything as it always does. cocode's checkout is such a project, and so is any project set up with `pipelex init`. +- Otherwise cocode's own directory stands where the home directory's inference files would: its backends, model catalogs, + routing profiles and model deck. The personal override files, `backends_override.toml` and `routing_profiles_override.toml`, + are still merged over it, the home directory's first and then the project's, as Pipelex merges them. +""" + +from collections.abc import Sequence +from pathlib import Path + +from pipelex.cogt.models.model_manager import ModelManager +from pipelex.plugins.plugin_model_declarations import PluginModelDeclarations +from pipelex.system.configuration.config_loader import ( + BACKENDS_DIR_NAME, + BACKENDS_FILE_NAME, + INFERENCE_DIR_NAME, + MODEL_DECKS_DIR_NAME, + ROUTING_PROFILES_FILE_NAME, + config_manager, +) +from pipelex.system.environment import CONFIG_DIR_NAME +from pipelex.tools.secrets.secrets_provider_abstract import SecretsProviderAbstract +from typing_extensions import override + +from cocode.exceptions import InferenceConfigNotFoundError + +# Where a built package carries the repository's `.pipelex/inference/` directory: `pyproject.toml` copies it there. +PACKAGED_INFERENCE_DIR_NAME = "pipelex_inference" + +_PACKAGE_DIR = Path(__file__).resolve().parent + + +def shipped_inference_dir() -> Path: + """The inference configuration directory cocode ships, wherever this copy of cocode was installed from. + + An installed package carries it as `cocode/pipelex_inference/`. A source checkout, an editable install included, has the + original itself, the repository's `.pipelex/inference/`. + """ + candidates = [ + _PACKAGE_DIR / PACKAGED_INFERENCE_DIR_NAME, + _PACKAGE_DIR.parent / CONFIG_DIR_NAME / INFERENCE_DIR_NAME, + ] + for candidate in candidates: + if (candidate / BACKENDS_FILE_NAME).is_file(): + return candidate + searched = ", ".join(str(candidate) for candidate in candidates) + msg = f"cocode's inference configuration was not found in {searched}: reinstall cocode." + raise InferenceConfigNotFoundError(msg) + + +def project_has_inference_config() -> bool: + """Whether the project cocode runs from has an inference configuration of its own, which Pipelex then reads as it is.""" + project_config_dir = config_manager.project_config_dir + if project_config_dir is None: + return False + return (project_config_dir / INFERENCE_DIR_NAME / BACKENDS_FILE_NAME).is_file() + + +class CocodeModelManager(ModelManager): + """Pipelex's model manager, reading cocode's shipped inference configuration when the project it runs from has none.""" + + @override + def setup( + self, + *, + secrets_provider: SecretsProviderAbstract, + plugin_model_declarations: PluginModelDeclarations, + needs_inference: bool = True, + backends_library_paths: Sequence[Path] | None = None, + backends_dir_path: str | None = None, + routing_profile_library_paths: Sequence[Path] | None = None, + deck_dir_path: str | None = None, + ) -> None: + is_any_path_given = any( + path is not None for path in (backends_library_paths, backends_dir_path, routing_profile_library_paths, deck_dir_path) + ) + if is_any_path_given or project_has_inference_config(): + super().setup( + secrets_provider=secrets_provider, + plugin_model_declarations=plugin_model_declarations, + needs_inference=needs_inference, + backends_library_paths=backends_library_paths, + backends_dir_path=backends_dir_path, + routing_profile_library_paths=routing_profile_library_paths, + deck_dir_path=deck_dir_path, + ) + return + + inference_dir = shipped_inference_dir() + # Each sequence Pipelex resolves is its base file, then the personal override files of the home directory and of the + # project: cocode's base takes the place of the first, and the override files are merged over it as Pipelex merges them. + super().setup( + secrets_provider=secrets_provider, + plugin_model_declarations=plugin_model_declarations, + needs_inference=needs_inference, + backends_library_paths=[inference_dir / BACKENDS_FILE_NAME, *config_manager.backends_file_paths()[1:]], + backends_dir_path=str(inference_dir / BACKENDS_DIR_NAME), + routing_profile_library_paths=[inference_dir / ROUTING_PROFILES_FILE_NAME, *config_manager.routing_profiles_file_paths()[1:]], + deck_dir_path=str(inference_dir / MODEL_DECKS_DIR_NAME), + ) diff --git a/cocode/pipelines/doc_proofread/doc_proofread.mthds b/cocode/pipelines/doc_proofread/doc_proofread.mthds index 50513c9..30b6413 100644 --- a/cocode/pipelines/doc_proofread/doc_proofread.mthds +++ b/cocode/pipelines/doc_proofread/doc_proofread.mthds @@ -7,6 +7,7 @@ FilePath = "A path to a file in the codebase" RepositoryMap = "A repository map containing the codebase structure and file contents" CodebaseFileContent = "Content of a codebase file" DocumentationInconsistency = "An inconsistency found between documentation and actual code" +DocumentationFileInconsistencies = "The inconsistencies found in one documentation file" MarkdownReport = "A markdown report containing documentation inconsistencies formatted as a Cursor prompt" [pipe] @@ -15,11 +16,11 @@ MarkdownReport = "A markdown report containing documentation inconsi type = "PipeSequence" description = "Process a single documentation file to find inconsistencies" inputs = { doc_file = "DocumentationFile", repo_map = "RepositoryMap" } -output = "DocumentationInconsistency[]" +output = "DocumentationFileInconsistencies" steps = [ { pipe = "find_related_code_files", result = "related_file_paths" }, { pipe = "read_doc_file", result = "related_files" }, - { pipe = "proofread_single_doc", result = "inconsistencies" }, + { pipe = "proofread_single_doc", result = "doc_file_inconsistencies" }, ] [pipe.find_related_code_files] @@ -45,8 +46,8 @@ Only include files with actual code evidence, not just similar names or concepts [pipe.proofread_single_doc] type = "PipeLLM" description = "Find major inconsistencies between docs and code" -inputs = { doc_file = "DocumentationFile", related_files = "CodebaseFileContent" } -output = "DocumentationInconsistency[]" +inputs = { doc_file = "DocumentationFile", related_files = "CodebaseFileContent[]" } +output = "DocumentationFileInconsistencies" model = "$engineering-structured" system_prompt = """ Find MAJOR inconsistencies between documentation and code that would cause user code to fail. @@ -73,7 +74,7 @@ Skip anything that's not a showstopper. If it would just be confusing but still [pipe.create_cursor_report] type = "PipeLLM" description = "Create a markdown report with inconsistencies formatted as a Cursor prompt" -inputs = { all_inconsistencies = "DocumentationInconsistency" } +inputs = { all_inconsistencies = "DocumentationInconsistency[]" } output = "MarkdownReport" model = "$engineering-structured" system_prompt = """ @@ -107,8 +108,11 @@ type = "PipeSequence" description = "Complete documentation proofreading pipeline for CLI usage" inputs = { repo_map = "RepositoryMap", doc_files = "DocumentationFile[]" } output = "MarkdownReport" +# The batch stores one DocumentationFileInconsistencies per documentation file. Binding their `inconsistencies` field +# flattens the lists into one, so `all_inconsistencies` holds every inconsistency found, not a list per file. steps = [ - { pipe = "proofread_doc_sequence", batch_over = "doc_files", batch_as = "doc_file", result = "all_inconsistencies" }, + { pipe = "proofread_doc_sequence", batch_over = "doc_files", batch_as = "doc_file", result = "inconsistencies_by_doc_file" }, + { from = "inconsistencies_by_doc_file.inconsistencies", result = "all_inconsistencies" }, { pipe = "create_cursor_report", result = "cursor_report" }, ] diff --git a/cocode/pipelines/doc_proofread/doc_proofread_models.py b/cocode/pipelines/doc_proofread/doc_proofread_models.py index f1cf900..d695017 100644 --- a/cocode/pipelines/doc_proofread/doc_proofread_models.py +++ b/cocode/pipelines/doc_proofread/doc_proofread_models.py @@ -1,6 +1,7 @@ from typing import List, Optional from pipelex.core.stuffs.structured_content import StructuredContent +from pipelex.tools.typing.pydantic_utils import empty_list_factory_of from pydantic import Field @@ -39,3 +40,12 @@ class DocumentationInconsistency(StructuredContent): issue_description: str = Field(description="Description of the inconsistency") doc_content: str = Field(description="The problematic content in the documentation") actual_code: Optional[str] = Field(None, description="The actual code that contradicts the documentation") + + +class DocumentationFileInconsistencies(StructuredContent): + """The inconsistencies found in one documentation file.""" + + inconsistencies: List[DocumentationInconsistency] = Field( + default_factory=empty_list_factory_of(DocumentationInconsistency), + description="The inconsistencies found in the documentation file, none when it matches the code", + ) diff --git a/cocode/pipelines/doc_update/doc_update.mthds b/cocode/pipelines/doc_update/doc_update.mthds index bb97072..04ca450 100644 --- a/cocode/pipelines/doc_update/doc_update.mthds +++ b/cocode/pipelines/doc_update/doc_update.mthds @@ -60,7 +60,7 @@ For each citation, identify what the CURRENT code does (+ lines) vs what the OLD [pipe.identify_doc_changes] type = "PipeLLM" description = "Identify changes that affect documentation with specific patterns" -inputs = { git_diff = "git.GitDiff", git_citations = "GitDiffCitation" } +inputs = { git_diff = "git.GitDiff", git_citations = "GitDiffCitation[]" } output = "DocumentationItem[]" system_prompt = """ You are a documentation analyst. Identify changes that affect documentation in the docs/ directory. @@ -127,7 +127,7 @@ Be very specific about the exact text patterns that need to be updated in the do [pipe.create_structured_changes] type = "PipeLLM" description = "Create structured documentation changes with exact old/new patterns" -inputs = { doc_analyses = "DocumentationAnalysis" } +inputs = { doc_analyses = "DocumentationAnalysis[]" } output = "DocumentationChangeItem[]" system_prompt = """ You are a documentation coordinator. Convert documentation analyses into structured, actionable changes with exact patterns. @@ -165,7 +165,7 @@ Make each change as specific and actionable as possible, ensuring documentation [pipe.format_final_output] type = "PipeLLM" description = "Format the final documentation update output with clean structure" -inputs = { structured_changes = "DocumentationChangeItem" } +inputs = { structured_changes = "DocumentationChangeItem[]" } output = "Text" system_prompt = """ You are a documentation formatter. Create a clean, well-structured output for documentation updates. diff --git a/cocode/swe/swe_cmd.py b/cocode/swe/swe_cmd.py index e6d9cf7..12c0a2c 100644 --- a/cocode/swe/swe_cmd.py +++ b/cocode/swe/swe_cmd.py @@ -1,7 +1,7 @@ import json import os from pathlib import Path -from typing import Any, Callable, Dict, List, Optional, cast +from typing import Any, Callable, Dict, List, Optional from pipelex import log, pretty_print from pipelex.core.memory.working_memory_factory import WorkingMemoryFactory @@ -384,13 +384,9 @@ async def swe_doc_proofread( inputs=working_memory, ) - main_stuff = pipe_output.working_memory.get_stuff("all_inconsistencies") - main_stuff_content = cast(ListContent[ListContent[DocumentationInconsistency]], main_stuff.content) - - all_inconsistencies: List[DocumentationInconsistency] = [] - for inner_list in main_stuff_content.items: - for inconsistency in inner_list.items: - all_inconsistencies.append(inconsistency) + # One flat list: the method binds every documentation file's inconsistencies into it, and this read refuses any item + # that is not an inconsistency, a list of them included. + all_inconsistencies = pipe_output.working_memory.get_stuff_as_list("all_inconsistencies", item_type=DocumentationInconsistency).items pretty_print(all_inconsistencies, title="All inconsistencies") diff --git a/docs/index.md b/docs/index.md index 658f0ad..2d4f903 100644 --- a/docs/index.md +++ b/docs/index.md @@ -19,11 +19,14 @@ Repository analysis and AI-powered code understanding. pip install cocode ``` -Set your OpenAI API key: +Cocode runs its AI workflows on your machine, with your own provider keys, and ships configured for OpenAI. Set your OpenAI API key in a `.env` file in the directory you run Cocode from: + ```bash echo "OPENAI_API_KEY=sk-..." > .env ``` +To run on another provider, see [Getting Started](pages/getting-started.md#setup). + ## Quick example ```bash diff --git a/docs/pages/getting-started.md b/docs/pages/getting-started.md index 5582f0a..0492090 100644 --- a/docs/pages/getting-started.md +++ b/docs/pages/getting-started.md @@ -17,17 +17,57 @@ pip install cocode ## Setup -Create a `.env` file with your API key: +Cocode runs its AI workflows on [Pipelex](https://github.com/Pipelex/pipelex), on your machine, with your own provider keys. It ships configured for OpenAI: its inference configuration switches on the OpenAI backend alone, and Pipelex's model deck resolves every tier Cocode uses to OpenAI's GPT-5.6 models. The package carries that configuration, so one key is all you need, whichever directory you run Cocode from. Set it in a `.env` file in that directory, or in `~/.pipelex/.env` to use it in every project: ```bash OPENAI_API_KEY=sk-your-key-here - -# Optional -ANTHROPIC_API_KEY=sk-ant-your-key-here -AWS_ACCESS_KEY_ID=your-aws-key -AWS_SECRET_ACCESS_KEY=your-aws-secret ``` +A directory with an inference configuration of its own, a `.pipelex/inference/backends.toml` such as `pipelex init` writes, runs on that configuration instead, as Pipelex always does. A clone of the Cocode repository is such a directory, with the same configuration the package carries. + +### Another provider + +A key alone is not enough for any other provider, including a local model through Ollama: its backend has to be switched on, and the model deck pointed at the models it serves. Anthropic, for example. In a clone of the Cocode repository, three personal files do it, and git ignores all of them, so the tracked configuration stays as it is: + +1. Put `ANTHROPIC_API_KEY` in your `.env` file. `.env.example` lists the variable of every provider. +2. Switch the backends in `.pipelex/inference/backends_override.toml`. Turn OpenAI off unless you keep its key, because a run refuses to start while an enabled backend's key is missing: + + ```toml + [openai] + enabled = false + + [anthropic] + enabled = true + ``` + +3. Point the model deck at that provider's models in `.pipelex/inference/deck/x_custom_provider_deck.toml`, a deck file of your own that Pipelex reads after the tracked ones. The deck's tiers are its `default-*` aliases, which every preset goes through, except four that name a model directly, so this one file moves the whole deck: + + ```toml + [llm.aliases] + default-general = "claude-5-sonnet" + default-premium = "claude-5-opus" + default-premium-vision = "claude-5-opus" + default-premium-structured = "claude-5-opus" + default-large-context-code = "claude-5-sonnet" + default-large-context-text = "claude-5-sonnet" + default-small = "claude-5.5-haiku" + default-small-structured = "claude-5.5-haiku" + default-small-vision = "claude-5.5-haiku" + default-small-creative = "claude-5.5-haiku" + + [llm.presets] + retrieval-cheap = { model = "claude-5.5-haiku" } + retrieval-premium = { model = "claude-5-sonnet" } + engineering-code-cheap = { model = "claude-5-sonnet" } + engineering-code-cheaper = { model = "claude-5.5-haiku" } + ``` + +With a `pip install`, the configuration Cocode ships sits inside the package, so give the project you run Cocode in a configuration of its own. At its root, run `pipelex-agent init --config '{"backends": ["anthropic"]}'`: it writes a `.pipelex/` directory with Anthropic as its only backend, which does step 2 for you. Then do steps 1 and 3 in that project. Pipelex recognizes a project's root by a marker such as `.git` or `pyproject.toml`, so in a directory that has none, create an empty `.pipelex` directory before running the command. + +The models each provider serves are listed in `.pipelex/inference/backends/`. Pipelex's [Configure AI Providers](https://docs.pipelex.com/latest/get-started/configure-ai-providers/) page covers every provider. + +Cocode runs its workflows inside its own process, so the hosted Pipelex API and its Pipelex API key do not apply to it. + ## Basic usage ### Analyze a repository diff --git a/pyproject.toml b/pyproject.toml index cde51c9..1a3ee90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ classifiers = [ ] dependencies = [ - "pipelex[anthropic,google,google-genai,bedrock]==0.46.4", + "pipelex[anthropic,bedrock,cli,google,google-genai]==0.83.0", "PyGithub==2.4.0", ] @@ -59,14 +59,18 @@ allow-direct-references = true [tool.hatch.build.targets.wheel] packages = ["cocode"] +# The package carries cocode's inference configuration, which `cocode.inference_config` reads wherever cocode runs from. +# The whole directory is copied, so build a release from a clean checkout: a personal file under it would ship too. [tool.hatch.build.targets.wheel.force-include] "pipelex.toml" = "pipelex.toml" +".pipelex/inference" = "cocode/pipelex_inference" [tool.hatch.build.targets.sdist] packages = ["cocode"] [tool.hatch.build.targets.sdist.force-include] "pipelex.toml" = "pipelex.toml" +".pipelex/inference" = ".pipelex/inference" [project.urls] Homepage = "https://pipelex.com" diff --git a/tests/conftest.py b/tests/conftest.py index 2c97279..dd3ade9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,31 +1,28 @@ -import asyncio import logging import os from pathlib import Path import pytest -from pipelex.cli.cli_factory import make_pipelex_for_cli -from pipelex.cli.error_handlers import ErrorContext from pipelex.config import get_config from pipelex.pipelex import Pipelex -from pipelex.pipeline.bundle_validator import BundleValidator from pipelex.pipeline.execution_seams import load_libraries_and_activate from pipelex.system.configuration.config_check import check_is_initialized from pipelex.system.configuration.configs import PipelexConfig from pipelex.system.runtime import IntegrationMode -from pipelex.test_extras.shared_pytest_plugins import is_inference_disabled_in_pipelex +from pipelex.test_extras.shared_pytest_plugins import needs_inference_in_pipelex from pytest import FixtureRequest from rich import print from rich.console import Console from rich.traceback import Traceback from cocode.common import PIPELINE_LIBRARY_DIRS +from cocode.inference_config import CocodeModelManager -# Our tests never report usage statistics, whatever pipelex they run against. `PIPELEX_USAGE_STATS=0` turns pipelex's -# statistics off and touches nothing else, so a pipelex that has no statistics ignores it. `DO_NOT_TRACK` would turn -# them off too, but the pinned pipelex refuses to boot with inference while it is set and the Pipelex Gateway is enabled. -# Forced, not defaulted, so no value in the shell turns statistics back on, and set when this conftest loads, before any -# fixture or plugin hook boots pipelex. +# Our tests never report usage statistics, whatever pipelex they run against. `PIPELEX_USAGE_STATS=0` is pipelex's own +# statistics switch, the one its test helpers set, and it touches nothing else, so a pipelex that has no statistics, as +# the pinned one has none, ignores it. `DO_NOT_TRACK` would turn them off too, along with every telemetry destination a +# developer configured, which is more than this guard is about. Forced, not defaulted, so no value in the shell turns +# statistics back on, and set when this conftest loads, before any fixture or plugin hook boots pipelex. os.environ["PIPELEX_USAGE_STATS"] = "0" PIPELINE_LIBRARY_DIRS_FOR_TESTS = [*PIPELINE_LIBRARY_DIRS, Path("tests/pipelines")] @@ -35,6 +32,24 @@ ] +def boot_pipelex_for_tests(*, needs_inference: bool) -> None: + """Boot pipelex as a test run and load cocode's pipelines. + + It boots with the model manager the CLI boots with, so the tests read the inference configuration the CLI reads. + `IntegrationMode.PYTEST` tells pipelex the process is a test run: a pipelex that sends usage statistics turns them + off for it without reading the machine's shared statistics state. Without inference, pipelex still loads every + enabled backend and its models but resolves no provider key, and every run is a dry run. The boot dry-runs no pipe: + `test_dry_run_all_pipes` does that once, with or without inference. + """ + Pipelex.make( + integration_mode=IntegrationMode.PYTEST, + needs_inference=needs_inference, + library_dirs=PIPELINE_LIBRARY_DIRS_FOR_TESTS, + models_manager=CocodeModelManager(), + ) + load_libraries_and_activate(PIPELINE_LIBRARY_DIRS_FOR_TESTS) + + @pytest.fixture(scope="session", autouse=True) def check_pipelex_initialized(): if not check_is_initialized(): @@ -47,22 +62,7 @@ def reset_pipelex_config_fixture(request: FixtureRequest): # Code to run before each test print("\n[magenta]pipelex setup[/magenta]") try: - disable_inference = is_inference_disabled_in_pipelex(request) - if disable_inference: - # When inference is disabled, use Pipelex.make() directly with needs_inference=False: - # this skips the gateway terms check and uses a mock content generator. - Pipelex.make( - integration_mode=IntegrationMode.CI, - needs_inference=False, - library_dirs=PIPELINE_LIBRARY_DIRS_FOR_TESTS, - ) - # Load libraries and keep them loaded (no dry-run, which would need model resolution) - load_libraries_and_activate(PIPELINE_LIBRARY_DIRS_FOR_TESTS) - else: - # When inference is enabled, use the CLI factory for proper error handling - make_pipelex_for_cli(context=ErrorContext.VALIDATION, library_dirs=PIPELINE_LIBRARY_DIRS_FOR_TESTS) - load_libraries_and_activate(PIPELINE_LIBRARY_DIRS_FOR_TESTS) - asyncio.run(BundleValidator().validate_current_library()) + boot_pipelex_for_tests(needs_inference=needs_inference_in_pipelex(request)) config = get_config() assert isinstance(config, PipelexConfig) except Exception as exc: diff --git a/tests/integration/test_basic.py b/tests/integration/test_basic.py index 15bf024..2f76574 100644 --- a/tests/integration/test_basic.py +++ b/tests/integration/test_basic.py @@ -1,6 +1,5 @@ import asyncio -import pytest from pipelex.interpreter_hub import get_required_concept from pipelex.pipeline.bundle_validator import BundleValidator @@ -13,7 +12,6 @@ def test_concept_exists(): assert get_required_concept("swe.OnboardingDocumentation") is not None -@pytest.mark.gha_disabled # Requires model resolution which fails without configured backends def test_dry_run_all_pipes(): """Dry-run every pipe in the library loaded by the conftest fixture, expecting no errors.""" # The session fixture already loaded + activated the pipeline libraries; sweep the current one. diff --git a/tests/integration/test_doc_proofread.py b/tests/integration/test_doc_proofread.py new file mode 100644 index 0000000..5960c67 --- /dev/null +++ b/tests/integration/test_doc_proofread.py @@ -0,0 +1,55 @@ +import pytest +from pipelex.core.memory.working_memory_factory import WorkingMemoryFactory +from pipelex.core.stuffs.list_content import ListContent +from pipelex.core.stuffs.stuff_factory import StuffFactory +from pipelex.interpreter_hub import get_required_concept +from pipelex.pipeline.runner import PipelexMTHDSProtocol +from pipelex.system.pipe_run_mode import PipeRunMode + +from cocode.pipelines.doc_proofread.doc_proofread_models import ( + DocumentationFile, + DocumentationFileInconsistencies, + DocumentationInconsistency, + RepositoryMap, +) + + +@pytest.mark.asyncio(loop_scope="class") +class TestDocProofread: + async def test_all_inconsistencies_is_one_flat_list(self) -> None: + """A dry run over several documentation files stores every inconsistency in one flat list, as the report step reads it.""" + doc_files = [ + DocumentationFile(file_path=f"docs/page_{index_doc}.md", doc_content=f"# Page {index_doc}\n\nCall `foo()`.", title=f"Page {index_doc}") + for index_doc in range(2) + ] + working_memory = WorkingMemoryFactory.make_from_multiple_stuffs( + stuff_list=[ + StuffFactory.make_stuff( + concept=get_required_concept(concept_ref="doc_proofread.RepositoryMap"), + content=RepositoryMap(repo_content="src/foo.py\ndef foo(): ..."), + name="repo_map", + ), + StuffFactory.make_stuff( + concept=get_required_concept(concept_ref="doc_proofread.DocumentationFile"), + content=ListContent[DocumentationFile](items=doc_files), + name="doc_files", + ), + ] + ) + + response = await PipelexMTHDSProtocol(pipe_run_mode=PipeRunMode.DRY).execute(pipe_code="doc_proofread", inputs=working_memory) + output_memory = response.pipe_output.working_memory + + inconsistencies_by_doc_file = output_memory.get_stuff_as_list("inconsistencies_by_doc_file", item_type=DocumentationFileInconsistencies) + assert len(inconsistencies_by_doc_file.items) == len(doc_files) + expected_inconsistencies = [ + inconsistency + for doc_file_inconsistencies in inconsistencies_by_doc_file.items + for inconsistency in doc_file_inconsistencies.inconsistencies + ] + # The dry run's mocks fill each file's list, so the comparison below has items to compare. + assert expected_inconsistencies + + # Reading the items as inconsistencies refuses a list in their place, which a batch over a list-producing pipe stores. + all_inconsistencies = output_memory.get_stuff_as_list("all_inconsistencies", item_type=DocumentationInconsistency) + assert all_inconsistencies.items == expected_inconsistencies diff --git a/tests/integration/test_model_references.py b/tests/integration/test_model_references.py new file mode 100644 index 0000000..ac309d4 --- /dev/null +++ b/tests/integration/test_model_references.py @@ -0,0 +1,27 @@ +from pipelex.interpreter_hub import get_pipes +from pipelex.kernel.llm_ops import resolve_llm_setting_for_object, resolve_llm_setting_for_text, served_llm_model +from pipelex.pipe_operators.llm.pipe_llm import PipeLLM + + +class TestModelReferences: + def test_every_llm_step_resolves_to_a_served_model(self) -> None: + """Every LLM step of the loaded library resolves, through the model deck, to a model an enabled backend serves. + + A dry run calls no model and never follows a step's model reference to the end, so an alias pointing at a model no + enabled backend serves passes it, and fails the first real run. This follows each reference, for text and for objects, + as a run does, and calls no model either. + """ + llm_pipes = [pipe for pipe in get_pipes() if isinstance(pipe, PipeLLM)] + assert llm_pipes + + unserved_references: list[str] = [] + for llm_pipe in llm_pipes: + choice_for_text = llm_pipe.llm_choices.for_text if llm_pipe.llm_choices else None + choice_for_object = llm_pipe.llm_choices.for_object if llm_pipe.llm_choices else None + setting_for_text = resolve_llm_setting_for_text(llm_choice=choice_for_text) + setting_for_object = resolve_llm_setting_for_object(llm_choice=choice_for_object, llm_choice_for_text=choice_for_text) + for llm_setting in (setting_for_text, setting_for_object): + if served_llm_model(model_handle=llm_setting.model) is None: + unserved_references.append(f"{llm_pipe.code}: {llm_setting.model}") + + assert not unserved_references, f"LLM steps whose model no enabled backend serves: {unserved_references}" diff --git a/tests/integration/test_shipped_inference_config.py b/tests/integration/test_shipped_inference_config.py new file mode 100644 index 0000000..2d9bc49 --- /dev/null +++ b/tests/integration/test_shipped_inference_config.py @@ -0,0 +1,39 @@ +import os +from pathlib import Path + +import pytest +from pipelex.pipelex import Pipelex +from pipelex.system.environment import PIPELEX_HOME_ENV_KEY +from pipelex.system.runtime import IntegrationMode +from pipelex.tools.misc.toml_utils import load_toml_from_path +from pytest_mock import MockerFixture + +from cocode.inference_config import CocodeModelManager + + +class TestShippedInferenceConfig: + def test_boot_outside_a_configured_project_runs_on_openai_alone( + self, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch, tmp_path: Path + ) -> None: + """Run from a project with no inference files, on a fresh home, cocode boots with OpenAI as its one provider backend. + + This is how a `pip install` runs. Pipelex fills the fresh home with inference files that switch every backend on, and + a boot that read them would refuse to start without every provider's key. + """ + home_dir = tmp_path / "home" + project_dir = tmp_path / "project" + (project_dir / ".git").mkdir(parents=True) + mocker.patch.dict(os.environ, {PIPELEX_HOME_ENV_KEY: str(home_dir)}) + monkeypatch.chdir(project_dir) + # This test boots on a configuration of its own: the module's boot goes first, and the fixture boots the next module afresh. + Pipelex.teardown_if_needed() + model_manager = CocodeModelManager() + try: + Pipelex.make(integration_mode=IntegrationMode.PYTEST, needs_inference=False, models_manager=model_manager) + enabled_backends = model_manager.inference_backend_library.all_enabled_backends() + finally: + Pipelex.teardown_if_needed() + + assert sorted(enabled_backends) == ["internal", "openai"] + home_backends = load_toml_from_path(path=home_dir / "inference" / "backends.toml") + assert home_backends["anthropic"]["enabled"] is True diff --git a/tests/unit/test_inference_config.py b/tests/unit/test_inference_config.py new file mode 100644 index 0000000..7efee5b --- /dev/null +++ b/tests/unit/test_inference_config.py @@ -0,0 +1,105 @@ +import os +from pathlib import Path + +import pytest +from pipelex.cogt.models.model_manager import ModelManager +from pipelex.plugins.plugin_model_declarations import PluginModelDeclarations +from pipelex.system.environment import PIPELEX_HOME_ENV_KEY +from pipelex.tools.secrets.secrets_provider_abstract import SecretsProviderAbstract +from pytest_mock import MockerFixture +from typer import Context as TyperContext + +from cocode.cli.main import main +from cocode.inference_config import CocodeModelManager, shipped_inference_dir + + +class TestInferenceConfig: + def test_shipped_configuration_switches_on_openai(self) -> None: + """The inference configuration cocode ships carries its backends file, catalogs, routing profiles and deck, with OpenAI on.""" + inference_dir = shipped_inference_dir() + + assert (inference_dir / "backends" / "openai.toml").is_file() + assert (inference_dir / "routing_profiles.toml").is_file() + assert (inference_dir / "deck" / "1_llm_deck.toml").is_file() + assert '[openai]\ndisplay_name = "OpenAI"\nenabled = true\n' in (inference_dir / "backends.toml").read_text(encoding="utf-8") + + @pytest.mark.parametrize( + ("project_files", "expected_overrides_tiers"), + [ + ([], ["home"]), + ([".pipelex/inference/backends_override.toml"], ["home", "project"]), + ], + ) + def test_project_without_inference_config_reads_the_shipped_one( + self, + mocker: MockerFixture, + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + project_files: list[str], + expected_overrides_tiers: list[str], + ) -> None: + """Outside a project with inference files of its own, the boot reads cocode's, with the personal override files merged over it.""" + home_dir = tmp_path / "home" + project_dir = tmp_path / "project" + (project_dir / ".git").mkdir(parents=True) + for project_file in project_files: + (project_dir / project_file).parent.mkdir(parents=True, exist_ok=True) + (project_dir / project_file).write_text("", encoding="utf-8") + mocker.patch.dict(os.environ, {PIPELEX_HOME_ENV_KEY: str(home_dir)}) + monkeypatch.chdir(project_dir) + parent_setup = mocker.patch.object(ModelManager, "setup") + + CocodeModelManager().setup( + secrets_provider=mocker.Mock(spec=SecretsProviderAbstract), + plugin_model_declarations=mocker.Mock(spec=PluginModelDeclarations), + needs_inference=False, + ) + + override_dirs = {"home": home_dir / "inference", "project": project_dir.resolve() / ".pipelex" / "inference"} + inference_dir = shipped_inference_dir() + parent_setup.assert_called_once() + setup_kwargs = parent_setup.call_args.kwargs + assert setup_kwargs["needs_inference"] is False + assert setup_kwargs["backends_library_paths"] == [ + inference_dir / "backends.toml", + *[override_dirs[tier] / "backends_override.toml" for tier in expected_overrides_tiers], + ] + assert setup_kwargs["routing_profile_library_paths"] == [ + inference_dir / "routing_profiles.toml", + *[override_dirs[tier] / "routing_profiles_override.toml" for tier in expected_overrides_tiers], + ] + assert setup_kwargs["backends_dir_path"] == str(inference_dir / "backends") + assert setup_kwargs["deck_dir_path"] == str(inference_dir / "deck") + + def test_project_with_inference_config_is_read_as_pipelex_reads_it( + self, mocker: MockerFixture, monkeypatch: pytest.MonkeyPatch, tmp_path: Path + ) -> None: + """A project with a `backends.toml` of its own, as cocode's checkout or a project set up by `pipelex init` has, keeps Pipelex's resolution.""" + project_dir = tmp_path / "project" + (project_dir / ".pipelex" / "inference").mkdir(parents=True) + (project_dir / ".pipelex" / "inference" / "backends.toml").write_text("", encoding="utf-8") + mocker.patch.dict(os.environ, {PIPELEX_HOME_ENV_KEY: str(tmp_path / "home")}) + monkeypatch.chdir(project_dir) + parent_setup = mocker.patch.object(ModelManager, "setup") + + CocodeModelManager().setup( + secrets_provider=mocker.Mock(spec=SecretsProviderAbstract), + plugin_model_declarations=mocker.Mock(spec=PluginModelDeclarations), + ) + + parent_setup.assert_called_once() + setup_kwargs = parent_setup.call_args.kwargs + assert setup_kwargs["needs_inference"] is True + for path_argument in ("backends_library_paths", "backends_dir_path", "routing_profile_library_paths", "deck_dir_path"): + assert setup_kwargs[path_argument] is None + + def test_cli_boots_with_the_cocode_model_manager(self, mocker: MockerFixture) -> None: + """The CLI boots Pipelex with the model manager that reads cocode's inference configuration.""" + pipelex_make = mocker.patch("cocode.cli.main.Pipelex.make") + ctx = mocker.Mock(spec=TyperContext) + ctx.invoked_subcommand = "validate" + + main(ctx=ctx) + + pipelex_make.assert_called_once() + assert isinstance(pipelex_make.call_args.kwargs["models_manager"], CocodeModelManager) diff --git a/tests/unit/test_tests_never_report.py b/tests/unit/test_tests_never_report.py index 35bf90b..cf46ac8 100644 --- a/tests/unit/test_tests_never_report.py +++ b/tests/unit/test_tests_never_report.py @@ -1,13 +1,27 @@ import importlib.util import os from pathlib import Path +from types import ModuleType import pytest +from pipelex.pipeline.bundle_validator import BundleValidator +from pipelex.system.runtime import IntegrationMode from pytest_mock import MockerFixture +from cocode.inference_config import CocodeModelManager + ROOT_CONFTEST_PATH = Path(__file__).parents[1] / "conftest.py" +def load_root_conftest_again() -> ModuleType: + spec = importlib.util.spec_from_file_location("cocode_root_conftest_loaded_again", ROOT_CONFTEST_PATH) + assert spec is not None + assert spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + class TestTestsNeverReport: @pytest.mark.parametrize("usage_stats_before", [None, "1"]) def test_root_conftest_turns_usage_stats_off(self, mocker: MockerFixture, usage_stats_before: str | None) -> None: @@ -17,9 +31,28 @@ def test_root_conftest_turns_usage_stats_off(self, mocker: MockerFixture, usage_ if usage_stats_before is not None: os.environ["PIPELEX_USAGE_STATS"] = usage_stats_before - spec = importlib.util.spec_from_file_location("cocode_root_conftest_loaded_again", ROOT_CONFTEST_PATH) - assert spec is not None - assert spec.loader is not None - spec.loader.exec_module(importlib.util.module_from_spec(spec)) + load_root_conftest_again() assert os.environ.get("PIPELEX_USAGE_STATS") == "0" + + @pytest.mark.parametrize("needs_inference", [False, True]) + def test_root_conftest_boots_pipelex_as_a_test_run(self, mocker: MockerFixture, needs_inference: bool) -> None: + """The root conftest boots pipelex as a test run, with or without inference: a pipelex with usage statistics reads that as off.""" + mocker.patch.dict(os.environ) + root_conftest = load_root_conftest_again() + pipelex_make = mocker.patch.object(root_conftest.Pipelex, "make") + load_libraries = mocker.patch.object(root_conftest, "load_libraries_and_activate") + validate_current_library = mocker.patch.object(BundleValidator, "validate_current_library") + + root_conftest.boot_pipelex_for_tests(needs_inference=needs_inference) + + pipelex_make.assert_called_once_with( + integration_mode=IntegrationMode.PYTEST, + needs_inference=needs_inference, + library_dirs=root_conftest.PIPELINE_LIBRARY_DIRS_FOR_TESTS, + models_manager=mocker.ANY, + ) + assert isinstance(pipelex_make.call_args.kwargs["models_manager"], CocodeModelManager) + load_libraries.assert_called_once_with(root_conftest.PIPELINE_LIBRARY_DIRS_FOR_TESTS) + # The boot dry-runs no pipe, with inference or without: `test_dry_run_all_pipes` dry-runs the library once. + validate_current_library.assert_not_called() diff --git a/uv.lock b/uv.lock index 549ecc0..637f7de 100644 --- a/uv.lock +++ b/uv.lock @@ -1,27 +1,14 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.14'", "python_full_version < '3.14'", ] -[[package]] -name = "aioboto3" -version = "15.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiobotocore", extra = ["boto3"] }, - { name = "aiofiles" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/80/d0/ed107e16551ba1b93ddcca9a6bf79580450945268a8bc396530687b3189f/aioboto3-15.0.0.tar.gz", hash = "sha256:dce40b701d1f8e0886dc874d27cd9799b8bf6b32d63743f57e7bef7e4a562756", size = 225278, upload-time = "2025-06-26T16:30:48.967Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/95/d69c744f408e5e4592fe53ed98fc244dd13b83d84cf1f83b2499d98bfcc9/aioboto3-15.0.0-py3-none-any.whl", hash = "sha256:9cf54b3627c8b34bb82eaf43ab327e7027e37f92b1e10dd5cfe343cd512568d0", size = 35785, upload-time = "2025-06-26T16:30:47.444Z" }, -] - [[package]] name = "aiobotocore" -version = "2.23.0" +version = "3.9.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -32,14 +19,9 @@ dependencies = [ { name = "python-dateutil" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/25/4b06ea1214ddf020a28df27dc7136ac9dfaf87929d51e6f6044dd350ed67/aiobotocore-2.23.0.tar.gz", hash = "sha256:0333931365a6c7053aee292fe6ef50c74690c4ae06bb019afdf706cb6f2f5e32", size = 115825, upload-time = "2025-06-12T23:46:38.055Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/95/4f7e0453d5e81bdb1b40ecf09f135bb88e12ce27fdb3efa125022dcca5d7/aiobotocore-3.9.2.tar.gz", hash = "sha256:8e32238c5bd77717ab1ac90077ff51ab141d025528115ccc7cc9b50b2d176e5f", size = 524343, upload-time = "2026-10-01T02:01:59.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/43/ccf9b29669cdb09fd4bfc0a8effeb2973b22a0f3c3be4142d0b485975d11/aiobotocore-2.23.0-py3-none-any.whl", hash = "sha256:8202cebbf147804a083a02bc282fbfda873bfdd0065fd34b64784acb7757b66e", size = 84161, upload-time = "2025-06-12T23:46:36.305Z" }, -] - -[package.optional-dependencies] -boto3 = [ - { name = "boto3" }, + { url = "https://files.pythonhosted.org/packages/09/ab/c8f982c4dfaab49200e31820a4ffe6275356f7dcaaa1024735d8f8b4e048/aiobotocore-3.9.2-py3-none-any.whl", hash = "sha256:363b4892423b272eb84afbb58000da0be6ccd0cf8a68b98438c957d05b841efc", size = 102571, upload-time = "2026-10-01T02:01:57.883Z" }, ] [[package]] @@ -62,7 +44,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.12.14" +version = "3.14.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -71,61 +53,153 @@ dependencies = [ { name = "frozenlist" }, { name = "multidict" }, { name = "propcache" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/0b/e39ad954107ebf213a2325038a3e7a506be3d98e1435e1f82086eec4cde2/aiohttp-3.12.14.tar.gz", hash = "sha256:6e06e120e34d93100de448fd941522e11dafa78ef1a893c179901b7d66aa29f2", size = 7822921, upload-time = "2025-07-10T13:05:33.968Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/e1/8029b29316971c5fa89cec170274582619a01b3d82dd1036872acc9bc7e8/aiohttp-3.12.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f4552ff7b18bcec18b60a90c6982049cdb9dac1dba48cf00b97934a06ce2e597", size = 709960, upload-time = "2025-07-10T13:03:11.936Z" }, - { url = "https://files.pythonhosted.org/packages/96/bd/4f204cf1e282041f7b7e8155f846583b19149e0872752711d0da5e9cc023/aiohttp-3.12.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8283f42181ff6ccbcf25acaae4e8ab2ff7e92b3ca4a4ced73b2c12d8cd971393", size = 482235, upload-time = "2025-07-10T13:03:14.118Z" }, - { url = "https://files.pythonhosted.org/packages/d6/0f/2a580fcdd113fe2197a3b9df30230c7e85bb10bf56f7915457c60e9addd9/aiohttp-3.12.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:040afa180ea514495aaff7ad34ec3d27826eaa5d19812730fe9e529b04bb2179", size = 470501, upload-time = "2025-07-10T13:03:16.153Z" }, - { url = "https://files.pythonhosted.org/packages/38/78/2c1089f6adca90c3dd74915bafed6d6d8a87df5e3da74200f6b3a8b8906f/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b413c12f14c1149f0ffd890f4141a7471ba4b41234fe4fd4a0ff82b1dc299dbb", size = 1740696, upload-time = "2025-07-10T13:03:18.4Z" }, - { url = "https://files.pythonhosted.org/packages/4a/c8/ce6c7a34d9c589f007cfe064da2d943b3dee5aabc64eaecd21faf927ab11/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d6f607ce2e1a93315414e3d448b831238f1874b9968e1195b06efaa5c87e245", size = 1689365, upload-time = "2025-07-10T13:03:20.629Z" }, - { url = "https://files.pythonhosted.org/packages/18/10/431cd3d089de700756a56aa896faf3ea82bee39d22f89db7ddc957580308/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:565e70d03e924333004ed101599902bba09ebb14843c8ea39d657f037115201b", size = 1788157, upload-time = "2025-07-10T13:03:22.44Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b2/26f4524184e0f7ba46671c512d4b03022633bcf7d32fa0c6f1ef49d55800/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4699979560728b168d5ab63c668a093c9570af2c7a78ea24ca5212c6cdc2b641", size = 1827203, upload-time = "2025-07-10T13:03:24.628Z" }, - { url = "https://files.pythonhosted.org/packages/e0/30/aadcdf71b510a718e3d98a7bfeaea2396ac847f218b7e8edb241b09bd99a/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5fdf6af93ec6c99bf800eba3af9a43d8bfd66dce920ac905c817ef4a712afe", size = 1729664, upload-time = "2025-07-10T13:03:26.412Z" }, - { url = "https://files.pythonhosted.org/packages/67/7f/7ccf11756ae498fdedc3d689a0c36ace8fc82f9d52d3517da24adf6e9a74/aiohttp-3.12.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ac76627c0b7ee0e80e871bde0d376a057916cb008a8f3ffc889570a838f5cc7", size = 1666741, upload-time = "2025-07-10T13:03:28.167Z" }, - { url = "https://files.pythonhosted.org/packages/6b/4d/35ebc170b1856dd020c92376dbfe4297217625ef4004d56587024dc2289c/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:798204af1180885651b77bf03adc903743a86a39c7392c472891649610844635", size = 1715013, upload-time = "2025-07-10T13:03:30.018Z" }, - { url = "https://files.pythonhosted.org/packages/7b/24/46dc0380146f33e2e4aa088b92374b598f5bdcde1718c77e8d1a0094f1a4/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4f1205f97de92c37dd71cf2d5bcfb65fdaed3c255d246172cce729a8d849b4da", size = 1710172, upload-time = "2025-07-10T13:03:31.821Z" }, - { url = "https://files.pythonhosted.org/packages/2f/0a/46599d7d19b64f4d0fe1b57bdf96a9a40b5c125f0ae0d8899bc22e91fdce/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:76ae6f1dd041f85065d9df77c6bc9c9703da9b5c018479d20262acc3df97d419", size = 1690355, upload-time = "2025-07-10T13:03:34.754Z" }, - { url = "https://files.pythonhosted.org/packages/08/86/b21b682e33d5ca317ef96bd21294984f72379454e689d7da584df1512a19/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a194ace7bc43ce765338ca2dfb5661489317db216ea7ea700b0332878b392cab", size = 1783958, upload-time = "2025-07-10T13:03:36.53Z" }, - { url = "https://files.pythonhosted.org/packages/4f/45/f639482530b1396c365f23c5e3b1ae51c9bc02ba2b2248ca0c855a730059/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:16260e8e03744a6fe3fcb05259eeab8e08342c4c33decf96a9dad9f1187275d0", size = 1804423, upload-time = "2025-07-10T13:03:38.504Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e5/39635a9e06eed1d73671bd4079a3caf9cf09a49df08490686f45a710b80e/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c779e5ebbf0e2e15334ea404fcce54009dc069210164a244d2eac8352a44b28", size = 1717479, upload-time = "2025-07-10T13:03:40.158Z" }, - { url = "https://files.pythonhosted.org/packages/51/e1/7f1c77515d369b7419c5b501196526dad3e72800946c0099594c1f0c20b4/aiohttp-3.12.14-cp311-cp311-win32.whl", hash = "sha256:a289f50bf1bd5be227376c067927f78079a7bdeccf8daa6a9e65c38bae14324b", size = 427907, upload-time = "2025-07-10T13:03:41.801Z" }, - { url = "https://files.pythonhosted.org/packages/06/24/a6bf915c85b7a5b07beba3d42b3282936b51e4578b64a51e8e875643c276/aiohttp-3.12.14-cp311-cp311-win_amd64.whl", hash = "sha256:0b8a69acaf06b17e9c54151a6c956339cf46db4ff72b3ac28516d0f7068f4ced", size = 452334, upload-time = "2025-07-10T13:03:43.485Z" }, - { url = "https://files.pythonhosted.org/packages/c3/0d/29026524e9336e33d9767a1e593ae2b24c2b8b09af7c2bd8193762f76b3e/aiohttp-3.12.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a0ecbb32fc3e69bc25efcda7d28d38e987d007096cbbeed04f14a6662d0eee22", size = 701055, upload-time = "2025-07-10T13:03:45.59Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b8/a5e8e583e6c8c1056f4b012b50a03c77a669c2e9bf012b7cf33d6bc4b141/aiohttp-3.12.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0400f0ca9bb3e0b02f6466421f253797f6384e9845820c8b05e976398ac1d81a", size = 475670, upload-time = "2025-07-10T13:03:47.249Z" }, - { url = "https://files.pythonhosted.org/packages/29/e8/5202890c9e81a4ec2c2808dd90ffe024952e72c061729e1d49917677952f/aiohttp-3.12.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a56809fed4c8a830b5cae18454b7464e1529dbf66f71c4772e3cfa9cbec0a1ff", size = 468513, upload-time = "2025-07-10T13:03:49.377Z" }, - { url = "https://files.pythonhosted.org/packages/23/e5/d11db8c23d8923d3484a27468a40737d50f05b05eebbb6288bafcb467356/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f2e373276e4755691a963e5d11756d093e346119f0627c2d6518208483fb6d", size = 1715309, upload-time = "2025-07-10T13:03:51.556Z" }, - { url = "https://files.pythonhosted.org/packages/53/44/af6879ca0eff7a16b1b650b7ea4a827301737a350a464239e58aa7c387ef/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ca39e433630e9a16281125ef57ece6817afd1d54c9f1bf32e901f38f16035869", size = 1697961, upload-time = "2025-07-10T13:03:53.511Z" }, - { url = "https://files.pythonhosted.org/packages/bb/94/18457f043399e1ec0e59ad8674c0372f925363059c276a45a1459e17f423/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c748b3f8b14c77720132b2510a7d9907a03c20ba80f469e58d5dfd90c079a1c", size = 1753055, upload-time = "2025-07-10T13:03:55.368Z" }, - { url = "https://files.pythonhosted.org/packages/26/d9/1d3744dc588fafb50ff8a6226d58f484a2242b5dd93d8038882f55474d41/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0a568abe1b15ce69d4cc37e23020720423f0728e3cb1f9bcd3f53420ec3bfe7", size = 1799211, upload-time = "2025-07-10T13:03:57.216Z" }, - { url = "https://files.pythonhosted.org/packages/73/12/2530fb2b08773f717ab2d249ca7a982ac66e32187c62d49e2c86c9bba9b4/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9888e60c2c54eaf56704b17feb558c7ed6b7439bca1e07d4818ab878f2083660", size = 1718649, upload-time = "2025-07-10T13:03:59.469Z" }, - { url = "https://files.pythonhosted.org/packages/b9/34/8d6015a729f6571341a311061b578e8b8072ea3656b3d72329fa0faa2c7c/aiohttp-3.12.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3006a1dc579b9156de01e7916d38c63dc1ea0679b14627a37edf6151bc530088", size = 1634452, upload-time = "2025-07-10T13:04:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4b/08b83ea02595a582447aeb0c1986792d0de35fe7a22fb2125d65091cbaf3/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa8ec5c15ab80e5501a26719eb48a55f3c567da45c6ea5bb78c52c036b2655c7", size = 1695511, upload-time = "2025-07-10T13:04:04.165Z" }, - { url = "https://files.pythonhosted.org/packages/b5/66/9c7c31037a063eec13ecf1976185c65d1394ded4a5120dd5965e3473cb21/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:39b94e50959aa07844c7fe2206b9f75d63cc3ad1c648aaa755aa257f6f2498a9", size = 1716967, upload-time = "2025-07-10T13:04:06.132Z" }, - { url = "https://files.pythonhosted.org/packages/ba/02/84406e0ad1acb0fb61fd617651ab6de760b2d6a31700904bc0b33bd0894d/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:04c11907492f416dad9885d503fbfc5dcb6768d90cad8639a771922d584609d3", size = 1657620, upload-time = "2025-07-10T13:04:07.944Z" }, - { url = "https://files.pythonhosted.org/packages/07/53/da018f4013a7a179017b9a274b46b9a12cbeb387570f116964f498a6f211/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:88167bd9ab69bb46cee91bd9761db6dfd45b6e76a0438c7e884c3f8160ff21eb", size = 1737179, upload-time = "2025-07-10T13:04:10.182Z" }, - { url = "https://files.pythonhosted.org/packages/49/e8/ca01c5ccfeaafb026d85fa4f43ceb23eb80ea9c1385688db0ef322c751e9/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:791504763f25e8f9f251e4688195e8b455f8820274320204f7eafc467e609425", size = 1765156, upload-time = "2025-07-10T13:04:12.029Z" }, - { url = "https://files.pythonhosted.org/packages/22/32/5501ab525a47ba23c20613e568174d6c63aa09e2caa22cded5c6ea8e3ada/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2785b112346e435dd3a1a67f67713a3fe692d288542f1347ad255683f066d8e0", size = 1724766, upload-time = "2025-07-10T13:04:13.961Z" }, - { url = "https://files.pythonhosted.org/packages/06/af/28e24574801fcf1657945347ee10df3892311c2829b41232be6089e461e7/aiohttp-3.12.14-cp312-cp312-win32.whl", hash = "sha256:15f5f4792c9c999a31d8decf444e79fcfd98497bf98e94284bf390a7bb8c1729", size = 422641, upload-time = "2025-07-10T13:04:16.018Z" }, - { url = "https://files.pythonhosted.org/packages/98/d5/7ac2464aebd2eecac38dbe96148c9eb487679c512449ba5215d233755582/aiohttp-3.12.14-cp312-cp312-win_amd64.whl", hash = "sha256:3b66e1a182879f579b105a80d5c4bd448b91a57e8933564bf41665064796a338", size = 449316, upload-time = "2025-07-10T13:04:18.289Z" }, - { url = "https://files.pythonhosted.org/packages/06/48/e0d2fa8ac778008071e7b79b93ab31ef14ab88804d7ba71b5c964a7c844e/aiohttp-3.12.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3143a7893d94dc82bc409f7308bc10d60285a3cd831a68faf1aa0836c5c3c767", size = 695471, upload-time = "2025-07-10T13:04:20.124Z" }, - { url = "https://files.pythonhosted.org/packages/8d/e7/f73206afa33100804f790b71092888f47df65fd9a4cd0e6800d7c6826441/aiohttp-3.12.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3d62ac3d506cef54b355bd34c2a7c230eb693880001dfcda0bf88b38f5d7af7e", size = 473128, upload-time = "2025-07-10T13:04:21.928Z" }, - { url = "https://files.pythonhosted.org/packages/df/e2/4dd00180be551a6e7ee979c20fc7c32727f4889ee3fd5b0586e0d47f30e1/aiohttp-3.12.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48e43e075c6a438937c4de48ec30fa8ad8e6dfef122a038847456bfe7b947b63", size = 465426, upload-time = "2025-07-10T13:04:24.071Z" }, - { url = "https://files.pythonhosted.org/packages/de/dd/525ed198a0bb674a323e93e4d928443a680860802c44fa7922d39436b48b/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:077b4488411a9724cecc436cbc8c133e0d61e694995b8de51aaf351c7578949d", size = 1704252, upload-time = "2025-07-10T13:04:26.049Z" }, - { url = "https://files.pythonhosted.org/packages/d8/b1/01e542aed560a968f692ab4fc4323286e8bc4daae83348cd63588e4f33e3/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d8c35632575653f297dcbc9546305b2c1133391089ab925a6a3706dfa775ccab", size = 1685514, upload-time = "2025-07-10T13:04:28.186Z" }, - { url = "https://files.pythonhosted.org/packages/b3/06/93669694dc5fdabdc01338791e70452d60ce21ea0946a878715688d5a191/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b8ce87963f0035c6834b28f061df90cf525ff7c9b6283a8ac23acee6502afd4", size = 1737586, upload-time = "2025-07-10T13:04:30.195Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3a/18991048ffc1407ca51efb49ba8bcc1645961f97f563a6c480cdf0286310/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0a2cf66e32a2563bb0766eb24eae7e9a269ac0dc48db0aae90b575dc9583026", size = 1786958, upload-time = "2025-07-10T13:04:32.482Z" }, - { url = "https://files.pythonhosted.org/packages/30/a8/81e237f89a32029f9b4a805af6dffc378f8459c7b9942712c809ff9e76e5/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdea089caf6d5cde975084a884c72d901e36ef9c2fd972c9f51efbbc64e96fbd", size = 1709287, upload-time = "2025-07-10T13:04:34.493Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e3/bd67a11b0fe7fc12c6030473afd9e44223d456f500f7cf526dbaa259ae46/aiohttp-3.12.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7865f27db67d49e81d463da64a59365ebd6b826e0e4847aa111056dcb9dc88", size = 1622990, upload-time = "2025-07-10T13:04:36.433Z" }, - { url = "https://files.pythonhosted.org/packages/83/ba/e0cc8e0f0d9ce0904e3cf2d6fa41904e379e718a013c721b781d53dcbcca/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0ab5b38a6a39781d77713ad930cb5e7feea6f253de656a5f9f281a8f5931b086", size = 1676015, upload-time = "2025-07-10T13:04:38.958Z" }, - { url = "https://files.pythonhosted.org/packages/d8/b3/1e6c960520bda094c48b56de29a3d978254637ace7168dd97ddc273d0d6c/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b3b15acee5c17e8848d90a4ebc27853f37077ba6aec4d8cb4dbbea56d156933", size = 1707678, upload-time = "2025-07-10T13:04:41.275Z" }, - { url = "https://files.pythonhosted.org/packages/0a/19/929a3eb8c35b7f9f076a462eaa9830b32c7f27d3395397665caa5e975614/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e4c972b0bdaac167c1e53e16a16101b17c6d0ed7eac178e653a07b9f7fad7151", size = 1650274, upload-time = "2025-07-10T13:04:43.483Z" }, - { url = "https://files.pythonhosted.org/packages/22/e5/81682a6f20dd1b18ce3d747de8eba11cbef9b270f567426ff7880b096b48/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7442488b0039257a3bdbc55f7209587911f143fca11df9869578db6c26feeeb8", size = 1726408, upload-time = "2025-07-10T13:04:45.577Z" }, - { url = "https://files.pythonhosted.org/packages/8c/17/884938dffaa4048302985483f77dfce5ac18339aad9b04ad4aaa5e32b028/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f68d3067eecb64c5e9bab4a26aa11bd676f4c70eea9ef6536b0a4e490639add3", size = 1759879, upload-time = "2025-07-10T13:04:47.663Z" }, - { url = "https://files.pythonhosted.org/packages/95/78/53b081980f50b5cf874359bde707a6eacd6c4be3f5f5c93937e48c9d0025/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f88d3704c8b3d598a08ad17d06006cb1ca52a1182291f04979e305c8be6c9758", size = 1708770, upload-time = "2025-07-10T13:04:49.944Z" }, - { url = "https://files.pythonhosted.org/packages/ed/91/228eeddb008ecbe3ffa6c77b440597fdf640307162f0c6488e72c5a2d112/aiohttp-3.12.14-cp313-cp313-win32.whl", hash = "sha256:a3c99ab19c7bf375c4ae3debd91ca5d394b98b6089a03231d4c580ef3c2ae4c5", size = 421688, upload-time = "2025-07-10T13:04:51.993Z" }, - { url = "https://files.pythonhosted.org/packages/66/5f/8427618903343402fdafe2850738f735fd1d9409d2a8f9bcaae5e630d3ba/aiohttp-3.12.14-cp313-cp313-win_amd64.whl", hash = "sha256:3f8aad695e12edc9d571f878c62bedc91adf30c760c8632f09663e5f564f4baa", size = 448098, upload-time = "2025-07-10T13:04:53.999Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/6c/4c/bdccd81e9ee225b69c60e7766c9a5b05364f118f4d383713b89a682d772d/aiohttp-3.14.5.tar.gz", hash = "sha256:5558a7f5a05af9ecf744af91e5baefc436f93c9333e656c27ec253f9a6bbe178", size = 8078052, upload-time = "2026-10-11T01:05:12.408Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/f3/8997f18890a92c79f77fcfbb4f78ca17c2d4ab109e9eb6d31b4e9de194a0/aiohttp-3.14.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d51db97c96384fbfcaf8f4c65922183a68b94f891c3c10c862ef5f6df2adbb1f", size = 832358, upload-time = "2026-10-11T00:59:42.195Z" }, + { url = "https://files.pythonhosted.org/packages/8e/42/084651e9efb5cadb99265f786df60f2a7b353cead7bfd2c87003cb4867ad/aiohttp-3.14.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ae53924aa853a7a2ca20ed4142c7c6b56338e4d4cd999e2980075b9efc2e257a", size = 559636, upload-time = "2026-10-11T00:59:43.677Z" }, + { url = "https://files.pythonhosted.org/packages/3d/fe/92838944e601f0fe195fd3f3ada37e29fbee3d19bfd323fe15937ec79d36/aiohttp-3.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2c473a355f9239efcb72c92d5abfd8fcdb0cc78c8e9af607e72ca12dbb36593", size = 552588, upload-time = "2026-10-11T00:59:45.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b8/dd9b95c5c20ceae1b47738e656bd79e9883e3117a9cc8b143901eb604e9a/aiohttp-3.14.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e8fa6644e541fcd7e02430588c7fc93b602c1778ea0bc345505db76b61cfb4", size = 1928224, upload-time = "2026-10-11T00:59:47.294Z" }, + { url = "https://files.pythonhosted.org/packages/c6/47/70010cd2ba8746968d53d433ff328c33f06a66c99da5f3de759c64a6b2eb/aiohttp-3.14.5-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:579f97d5120f2971876d2ddca2968135f6944d00c44c3a6590ad7d86ca9b403f", size = 1877674, upload-time = "2026-10-11T00:59:49.472Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a1/b026f071dbd87f0bdba86b92d47e46f3899e3ad7143b6e0fe7e7887090b4/aiohttp-3.14.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:24409db442e2fb6e766bc7f3943851a8381dec3098140e43bb2e843b79e31b12", size = 1985850, upload-time = "2026-10-11T00:59:51.296Z" }, + { url = "https://files.pythonhosted.org/packages/36/d1/f7b6f6f8c3cb5a71b53baeddc2e70c224c28b12a23a55c42994c504019b7/aiohttp-3.14.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5e8f97c0488ffda3082766ac0f2c8150a9a58c4d05788330e479cfd449b37939", size = 2105471, upload-time = "2026-10-11T00:59:53.191Z" }, + { url = "https://files.pythonhosted.org/packages/42/74/2a2b22953de15c6c8a80debf26db3047e4e8a5a5db6dd7c2c6c01eec0605/aiohttp-3.14.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50a195903119008fe9cc68710535eb37f556ffffd6a7759afe70a2c145587045", size = 1929915, upload-time = "2026-10-11T00:59:55.609Z" }, + { url = "https://files.pythonhosted.org/packages/33/ad/f80e8d33933d0eacd0217efa3b7fb32c9f48ed480ed0db53cf9948bf474f/aiohttp-3.14.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0133c3c3b54a0bf1e71fa5c1ad95c93f07fd54e24ef1fe182f5122e1573d2bf1", size = 1773832, upload-time = "2026-10-11T00:59:57.611Z" }, + { url = "https://files.pythonhosted.org/packages/04/a4/0273d239f3e3bb69438f209c64c82e1f98dc60d5db264795e41f7dd05dcb/aiohttp-3.14.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c172db893e516e1358e65a95ee20b7ce7173963eefe318b6ab2a2220688b999e", size = 1901001, upload-time = "2026-10-11T01:00:00.605Z" }, + { url = "https://files.pythonhosted.org/packages/16/ed/7dd439d26c654645bc34ca3c9a822fc11c1c51801fed1cefdfe1cc41c1f6/aiohttp-3.14.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f2a7966bda23dd85051f1661ce0ace38d6890e05ec6c357ecae9d2479cba377e", size = 1907218, upload-time = "2026-10-11T01:00:02.699Z" }, + { url = "https://files.pythonhosted.org/packages/32/dd/86249c3b8248562a17fd3e22ee0c164378d65766f01aceef62cf52783710/aiohttp-3.14.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4887d130a7bbfed3a85493bb5a25e5b5b558d40c1d986dd16970d2bb26d63793", size = 1958650, upload-time = "2026-10-11T01:00:04.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/ca4d53d68f683ce195807fd0aeb063bf6d1c6b39343fff234c9524e8d5a9/aiohttp-3.14.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:225c579c23b68b343cccea27a7e06e3bd8ec23a09c30b427eb3f1e4ca6239b20", size = 1760057, upload-time = "2026-10-11T01:00:06.978Z" }, + { url = "https://files.pythonhosted.org/packages/6b/42/005437ffd7fa56c2ce3347add40404b654a32754ce91f2e2a14b9e5ab2bc/aiohttp-3.14.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ab52d8f1fc1b64821c1fbad64a647ed6203627004059a6d1ed4f0858a1499703", size = 1978081, upload-time = "2026-10-11T01:00:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/3a5b66fe1b7b23d3c6524350817ed55de5feb7fbb4cccba7cbe044d118dd/aiohttp-3.14.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb131d775a1573c1aee66656bd78b023577bbdb6cb8349a07773bd4f73e68a6e", size = 1922954, upload-time = "2026-10-11T01:00:11.035Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/d08a554f281d42fd7c6b2b6dd7738f3e3a7a9f657ddd87e11ca2091cdfe3/aiohttp-3.14.5-cp311-cp311-win32.whl", hash = "sha256:e87046c8ff77a8decdb6a41d8ab25824b47531b2da933aeab0c1e21c7acff329", size = 488101, upload-time = "2026-10-11T01:00:12.933Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/52b5e65f02b33686ae49f1518548ae4f5a7adaf31d9d3c54fa12a143137b/aiohttp-3.14.5-cp311-cp311-win_amd64.whl", hash = "sha256:6f275c11d1aa6d4c458e05a68be084efe3c55a113d99e3f46a318098e52948fc", size = 512575, upload-time = "2026-10-11T01:00:14.743Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b9/bb75012635f3defb0f7cbb7c4ae391e36bb9cb3fbdca3b9944e2ebebf743/aiohttp-3.14.5-cp311-cp311-win_arm64.whl", hash = "sha256:b032a0023eb41d768ce77d83210ab2a3c389bc0b09313273c7e1eca48c10a755", size = 493179, upload-time = "2026-10-11T01:00:16.961Z" }, + { url = "https://files.pythonhosted.org/packages/d5/94/6ba86efddcb616c811b40e6a0dfdd862738f647e4e3860a961075d5e9ed8/aiohttp-3.14.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df37b620684e19b5e25724412518ccafc3b1a49cdac706fdbd2f983fad943450", size = 817499, upload-time = "2026-10-11T01:00:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e1/7bca6d84dabd228aa8eb4b7f9feac2586aaa9be5505d7d65bf287a615c43/aiohttp-3.14.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef60869969180ec2464f1349aff07138ae35ca2200f0946cb3552e49e8f301a8", size = 549467, upload-time = "2026-10-11T01:00:20.854Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/11b89f45ca486252dd67dd5f3231fec04bf5518da39a95cb3997619f17fb/aiohttp-3.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d079c0a0135c36e7beb6f1c88087c8f108dc5891cdd0b5eafa778421bda70ed2", size = 548067, upload-time = "2026-10-11T01:00:22.659Z" }, + { url = "https://files.pythonhosted.org/packages/22/ff/c6615806c14aab34f82b9424ccde8ce6e417315fd57ce1c5b4d4747888e1/aiohttp-3.14.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abfda5cb094a829f7bc25216a32f7db2e85cc65bd59910f8e7b40b3d9b224764", size = 1896245, upload-time = "2026-10-11T01:00:24.638Z" }, + { url = "https://files.pythonhosted.org/packages/39/b2/25a8c971ae6a92c8394d77e42422d7f38989e05cf41a5ceb92d73d67ab7e/aiohttp-3.14.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9cc882cf8619109583c906b4d4a85d6a111a98afa34b7a450d1e08118d016820", size = 1872180, upload-time = "2026-10-11T01:00:26.838Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d5/99f93ea36cc5205e47c1e5a803e087f2ad21b5430b5db2e942cb6e988a37/aiohttp-3.14.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7457580535e019e1247ea35d6a02bf081ad30c26d0cbc210c93f6c3ab67a0835", size = 1937261, upload-time = "2026-10-11T01:00:28.74Z" }, + { url = "https://files.pythonhosted.org/packages/40/a6/9ac9c9e6695040bd73d2584a1b59a9388f6433c76d5294a7bf591e21ffe5/aiohttp-3.14.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c5ed596aedb9c42afd3fe0aae3117725378ac73d2cc5ddc735056fbdb96c5d02", size = 2064994, upload-time = "2026-10-11T01:00:30.623Z" }, + { url = "https://files.pythonhosted.org/packages/da/e4/aa172eb534b7f02f1f8ff1c3213347eaf3cf218db91a727c6863c22f1035/aiohttp-3.14.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20f085697d7e911f1f73c43ed03fafbed1e7121797e2eb5428efa80398060584", size = 1919630, upload-time = "2026-10-11T01:00:32.548Z" }, + { url = "https://files.pythonhosted.org/packages/06/7d/4eedafc5bababa8932636c141e346806966eade12c0b7e5946d43bf8218b/aiohttp-3.14.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:74b0a9c8270f9b0a11410e124ff8d4f18bfc1f1837440ec84da5ae7b50927b5d", size = 1710016, upload-time = "2026-10-11T01:00:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/b2/94/eee018537ba19da0ceb2ac79cab83faed4ac49568e08376e2799043f2538/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:19e2ba471507c34f8252402ab50f5ab512398b9ea8c8f1cb26beb3f75793ba30", size = 1858112, upload-time = "2026-10-11T01:00:36.581Z" }, + { url = "https://files.pythonhosted.org/packages/68/76/354653a306547238f3427283905972d796ba7c292ba9977abec9f2b6f260/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d418ce2af40c6bb685b3f663e9e8de27cb0a22431d8e88a167348d7f01878073", size = 1896371, upload-time = "2026-10-11T01:00:38.478Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ec/63e8c7136b570e356345ad3174e3820fdc973ea10712cb6c649bf875755a/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:70cb4008ac2ed1e0ca9e824deb4b53d3aa0d939109698ebf1e723a84337bd794", size = 1905836, upload-time = "2026-10-11T01:00:40.527Z" }, + { url = "https://files.pythonhosted.org/packages/57/d8/11365bda144b127928cd42533d0eff78a55613c9e28f81941bd6630ea887/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a23fe35d776bc03cb495938b9594450d047e3bc08c5255315a82323e9cb7d2dd", size = 1696534, upload-time = "2026-10-11T01:00:42.686Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3d/82df0461b18e00b2998f205c03e0d3010222478c43640aceb8e03dcd7e8f/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3e0eb43bed3c6801a6cee315195377789e90b2a72c2277a475b578535312488d", size = 1933970, upload-time = "2026-10-11T01:00:44.71Z" }, + { url = "https://files.pythonhosted.org/packages/03/ad/6ddfe0aacd931c17b53533336d97e9d11a98b96d6ae815a9da0b19f82ccf/aiohttp-3.14.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be7dd397d64ca3e1869626fa9318aaebb54b7bf93bc72d7a205448d83e4f748", size = 1899501, upload-time = "2026-10-11T01:00:46.629Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8e/189bdd9ae4793059bb09f6dc880f211a6c6c7859cebcbf33912dbfab7dd7/aiohttp-3.14.5-cp312-cp312-win32.whl", hash = "sha256:eb324e2009fb54db30a071dad7caf6998ee2879c4704007efb244514dad1fec1", size = 480370, upload-time = "2026-10-11T01:00:48.468Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ce/1f08114679d49655b30a6e0a29858375c94b82c1de1a0bd0a20c2fee8b02/aiohttp-3.14.5-cp312-cp312-win_amd64.whl", hash = "sha256:2cc38a4f2b516bef1714e690df87a0e043faf1a7693c82d860091684453d5111", size = 506141, upload-time = "2026-10-11T01:00:50.272Z" }, + { url = "https://files.pythonhosted.org/packages/79/d4/c7b4f60b16a1b7e43249fa9031ae05e7e8c341ba4b7d1866f914dafeaa0e/aiohttp-3.14.5-cp312-cp312-win_arm64.whl", hash = "sha256:a63afd1f757de949028387e65a7127b61ad0f775432dbb0e62816ae619fe69ac", size = 488108, upload-time = "2026-10-11T01:00:52.321Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e1/2841e020ebb7aefae5513586193e011e06313d9a6bdbd296622afbbce204/aiohttp-3.14.5-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:9ad7e6aa38c20da1be697874349c4c273c8a03b7887169665081706398d0439a", size = 538932, upload-time = "2026-10-11T01:00:54.3Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a6/7fb8ea8fe96bcc7b7c7a36d10f021d99d01a8dc8a4b3f0ddacecfad9a80e/aiohttp-3.14.5-cp313-cp313-android_24_x86_64.whl", hash = "sha256:f59c7673465908cbe506117176156c127f29f917677afceada34957179221d91", size = 553329, upload-time = "2026-10-11T01:00:56.442Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/d056e3c27647dc25af1a592cf356245382ea7c808171b9dac7677afedfc8/aiohttp-3.14.5-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1b5416552740edf07234cc9437d0706f2acb67b93c198670b1a68e1b2b587dec", size = 521367, upload-time = "2026-10-11T01:00:58.345Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e4/95226147e11d4db916fd1d495dcf85af8e3816e38333e42718241196e848/aiohttp-3.14.5-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:43351bdb5e4c3cb7d1772368e988534e869a74db7778079a83782c11c69535c7", size = 528322, upload-time = "2026-10-11T01:01:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/17/cd/1d3c9192cafdb51cad62b2d3ded96cff9cc8af51893210aadd448a325389/aiohttp-3.14.5-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:c8c4478bef6d57fcfda15dae461ea3c9f06aa7b257c58df3f2300174ccbb185a", size = 539874, upload-time = "2026-10-11T01:01:02.06Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0c/dfa33aecc7d4d1dc75e05248f5eac5a0edf4d09e7b44d93ab62529b0c1db/aiohttp-3.14.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c2c30484dd1417ef98b51021ffa2cc0d7f3c78918adaaaab7e70817335ab3e02", size = 813836, upload-time = "2026-10-11T01:01:04.01Z" }, + { url = "https://files.pythonhosted.org/packages/33/17/4a63738052d20567d55529d6daa1b9480d906fd52930fbcf6d3fbed618f0/aiohttp-3.14.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dab9ac5a67c8d1f070c00fa8fccb7cbd1b8dcc1a8d6b42f37540df9b3d4cc603", size = 548070, upload-time = "2026-10-11T01:01:06.035Z" }, + { url = "https://files.pythonhosted.org/packages/15/e5/b57e58695a757fd4c02497c033fced96a69c631b13866c43d336530c9670/aiohttp-3.14.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e1cc2bfaee8c214f06080a7c7d5772419b8a1108e8e5349236189811823fb02a", size = 545786, upload-time = "2026-10-11T01:01:07.817Z" }, + { url = "https://files.pythonhosted.org/packages/9a/68/8c2c67a3aedf46e00f3c42f04fbc6983de80d4ed5786151e33681ba45883/aiohttp-3.14.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74efb69332b85675b1eabd760a8cfc2e2cf42c60607c66f88014c1bdfb40942d", size = 1886492, upload-time = "2026-10-11T01:01:09.834Z" }, + { url = "https://files.pythonhosted.org/packages/ab/4b/74aab5e8d28c62e8f795b4fe8f38cf5586fd264a9a27bd2141ef6490333d/aiohttp-3.14.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:42b5e616946dbaf505e2bff18c9af2cd4ef9e7ef300ee58a6e951a5b7cf147ae", size = 1870057, upload-time = "2026-10-11T01:01:12.045Z" }, + { url = "https://files.pythonhosted.org/packages/a8/f7/eafc3b1988302b1815d9fd4a21071be5c360d616c0a430d02fd92dc97688/aiohttp-3.14.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f9033b43f511f27547c557dcaba0177649e10a3725336ccd2cce0fdc1dc4850d", size = 1925119, upload-time = "2026-10-11T01:01:14.09Z" }, + { url = "https://files.pythonhosted.org/packages/a1/04/78d8f294f74dd570f3898ff20402349fce524176045df98ba727d6846a68/aiohttp-3.14.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15a310d3c71398e3d7bfc93a1a73fbe664315cd9e9016b8efc1cff85eeab7155", size = 2053137, upload-time = "2026-10-11T01:01:16.344Z" }, + { url = "https://files.pythonhosted.org/packages/32/51/395d225ef36f5a50d8e548dcd3141bfdbcd31fb6eed859022c573d2c4d66/aiohttp-3.14.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ffa3a523a36d8628f98c06492ae16a31a23d14c0b4ec721757b477319f656d6", size = 1911038, upload-time = "2026-10-11T01:01:18.653Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a4/2aec1aa06d82e8a244843b5dae31d78061e5e76744270a86dd0ee051c889/aiohttp-3.14.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5fb6a6e919bfb703227bc1ce6579281b84b1a2ba57deb9794dfdbec7dcd1e40c", size = 1702205, upload-time = "2026-10-11T01:01:20.904Z" }, + { url = "https://files.pythonhosted.org/packages/16/27/6051bfde7b6f418f70edd60d655fa426abb3355fa0981764739d87ecf160/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:43e1b7994a8b038125f722bff07492ef501110722c2727c408995d9fb864c421", size = 1848588, upload-time = "2026-10-11T01:01:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/9e/44/55efc06fc26c4e6e1c095f231b4c222bf2d86d64a8eebbc24b2bb5958ea8/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5f3e96071686755d9cd3600c3880183eb94b012178e92746d68101800f0ed8a3", size = 1887540, upload-time = "2026-10-11T01:01:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/48/dc/1502bfdc2a65760d386ac6a00090b0addaa8a3c9c60b3f8127fad3a9afb2/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cd88b01f3d37b7a2a34f91d98f14720206f1ea3d540843fab2d649dd5fb91fec", size = 1895030, upload-time = "2026-10-11T01:01:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/93/7e/44174bb6288264418c9eec07a5e35180969c0d5a796c7af544db3cb8a33a/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f2ed8b64dc0c651c0f5a9c926777719770021251b8f336d97c4b80b660836ce1", size = 1693244, upload-time = "2026-10-11T01:01:29.39Z" }, + { url = "https://files.pythonhosted.org/packages/47/dd/b507d64e50db23888582fff08eda13998b12f9dea70c072edaac19218380/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a9918e58faf62ba2c7147927d06057aec78f42475aff5048047ec47e7265a600", size = 1926308, upload-time = "2026-10-11T01:01:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/5b51b4f63e3f2793151f4aea49c48fe1e00baeb7cec9c7a206de499f8de0/aiohttp-3.14.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:42f320d4a5b00b9af0bddcfec5407dc6f2d9816f006b2f79ebbaa31f16895df3", size = 1888406, upload-time = "2026-10-11T01:01:33.715Z" }, + { url = "https://files.pythonhosted.org/packages/ff/13/d5e818a5eaba9f822016727299f41c0e1075799f82a6433ec508a93ab867/aiohttp-3.14.5-cp313-cp313-win32.whl", hash = "sha256:3ae800a20947e2c2e53088047d021e6bf7d51560cc49f6a0737a1f79d2e3a13c", size = 479970, upload-time = "2026-10-11T01:01:35.677Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d0/8eca2c65aa467320990d78fb2005f38ed3588944280c39ff9deb6423fef1/aiohttp-3.14.5-cp313-cp313-win_amd64.whl", hash = "sha256:d05e94cdfe0d15d0206f970722d2554780ce562787b21b218b275447f8751319", size = 505985, upload-time = "2026-10-11T01:01:37.574Z" }, + { url = "https://files.pythonhosted.org/packages/7a/f8/4cdd65305d2fca14b886bea9ed2abb1fe726287872524e56e3d26692b47d/aiohttp-3.14.5-cp313-cp313-win_arm64.whl", hash = "sha256:f001b571ead90ca1770f1e616db255351a1703317f20374c361ef22f12c06d09", size = 487629, upload-time = "2026-10-11T01:01:39.477Z" }, + { url = "https://files.pythonhosted.org/packages/43/be/3184a1d34a8be665569eadb7e9e764b4629e4f3413e241cb2e4d6fecf3b3/aiohttp-3.14.5-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:939042d5cda21d41a6f512e7cc8b8e33a2aebff863352251da495fbd91b673b5", size = 540673, upload-time = "2026-10-11T01:01:41.354Z" }, + { url = "https://files.pythonhosted.org/packages/60/2a/d35f3ba4cf157b072e3b674bf9983047ca5ea5173c995d32d877e1191d36/aiohttp-3.14.5-cp314-cp314-android_24_x86_64.whl", hash = "sha256:6da32b5ff3fd78d244e37300463434c7145162bfd2b6e9e915ab164da37f7343", size = 554087, upload-time = "2026-10-11T01:01:43.719Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d2/61a33880ca4eaca95a9c60ca3f6beed15555af1028652dfaac601627787b/aiohttp-3.14.5-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1b438b73c38111818d0c9d6a5c2bfed8584c8e503a49ef085d70e874ec846738", size = 522613, upload-time = "2026-10-11T01:01:46.154Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/de579b299d2225dc2c6fd99d579d91f16c02a913fb5af9a3cf2fe9bd88ba/aiohttp-3.14.5-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:755933b107ea7a6a9ac916f635a70595a5b1a32fac10a8ff0b9f2ab88555550c", size = 529682, upload-time = "2026-10-11T01:01:48.477Z" }, + { url = "https://files.pythonhosted.org/packages/f4/4a/ddb923564e15e053b6e060b0036e1694dcadcb13aa476c5a87dcad20e336/aiohttp-3.14.5-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:b3cc509327c7b27f6f4727a8830f4004f6df7766e179f2f4b8e54e65c0bec5d3", size = 540120, upload-time = "2026-10-11T01:01:50.474Z" }, + { url = "https://files.pythonhosted.org/packages/3d/36/a640fbecaa53727a5900b892bdbe17b5f3e8cc88903e22864fe41b654def/aiohttp-3.14.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:7bd8ac754ebd6733a3e2a0dd1674c4d8ab086196803fd8dcd776f07b4e2607d9", size = 818795, upload-time = "2026-10-11T01:01:52.665Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b6/d52ca608859e271b5fa7944074802dc45f60e52c318a4ddc34edbf73586e/aiohttp-3.14.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e724a7b6091f0b1ac064f9d1b15ff9ec52e6033a86cdae649e5f086e32a3c0db", size = 549667, upload-time = "2026-10-11T01:01:54.65Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b5/05b8ac39a76ff4bca89f42a4c2471560c71f894ff6e4bc16158c951874e3/aiohttp-3.14.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c32e26310cc10e547f53cd13d39a369034f69dcb7d749d5cb0e5f67bc196b6ba", size = 548922, upload-time = "2026-10-11T01:01:56.547Z" }, + { url = "https://files.pythonhosted.org/packages/19/b0/5aa186d56ce2334dabe29b70bd99dc8ae926ee44184c0de64a53d415a4f3/aiohttp-3.14.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1eb8167961ec4dfcc8cb9dd50bd0ee72519f7ef496be95203e49e27b01618382", size = 1882422, upload-time = "2026-10-11T01:01:59.258Z" }, + { url = "https://files.pythonhosted.org/packages/db/f7/7d5c91bb9620db300c8ddb05337a9014301acb626223faff3abcb8ea47d7/aiohttp-3.14.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c1d60eafd9c7e8e74abd03a5b00df44e7febfe6d9b89b559c0a6551eef0699d4", size = 1843621, upload-time = "2026-10-11T01:02:01.417Z" }, + { url = "https://files.pythonhosted.org/packages/30/0a/b208953b96d8f24b75f6da704f508e6c5cf3022f52b60c61933df082e89c/aiohttp-3.14.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:137351bf20bbed9a65e839f4a4452ac377389bdb2f2857d2acffef38f5e9f2d1", size = 1927915, upload-time = "2026-10-11T01:02:03.697Z" }, + { url = "https://files.pythonhosted.org/packages/f6/79/90ebcccb55e2d1e11a1fed581d83bb966e38fb35fb4b2577fdc980f8707a/aiohttp-3.14.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fba47bc2c3d7303c3d027c6cf4d07626c37b1314ac81f5820c31032e0ca1f677", size = 2036339, upload-time = "2026-10-11T01:02:06.046Z" }, + { url = "https://files.pythonhosted.org/packages/a6/66/55a8904b3a129fafdf94f9cc0a2e4ca09a3c914650be52355db7ad0bbdb6/aiohttp-3.14.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94684b879ac1d71e4238850c99b62dc1b28d9086b156a2555f082010b85a865c", size = 1888041, upload-time = "2026-10-11T01:02:08.384Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b8/96b25da7329a52e42c812b1e8b076386039ec4fc312afa043d173d8147fc/aiohttp-3.14.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56572c42e3ecd636de8d2c3dd54cf5fc939cb5c32eb56297f176a0d366fac622", size = 1703849, upload-time = "2026-10-11T01:02:10.903Z" }, + { url = "https://files.pythonhosted.org/packages/1b/43/fbf976e3ae4c038d6f5c84945ab2150298c2d71201674d4e53d158063e75/aiohttp-3.14.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a95529a92a446db351675f4aab518feaf5e99842f63f5dd17160c2b74f382db3", size = 1849703, upload-time = "2026-10-11T01:02:13.15Z" }, + { url = "https://files.pythonhosted.org/packages/8b/7d/218e912f4c1d89bde7ac551409be57ad2f6121638e56942d395a7cb1fa58/aiohttp-3.14.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:3edbece0379b8b4aaa67619b8aa2399bb66fce372cd5911098a434ea77220aa0", size = 1852695, upload-time = "2026-10-11T01:02:15.295Z" }, + { url = "https://files.pythonhosted.org/packages/5a/42/252a1b9287e3b6e393a1c3bd1776f36af30f5f25f071bbf2b0cb7eba9116/aiohttp-3.14.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:56d9828f204331a5ca8850fcfe2bcce95a149f1f223f60cc7216e5524978e480", size = 1893493, upload-time = "2026-10-11T01:02:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/78/97/71cae83d5100556fad1521684f7cd1e3e578432644f850245ed3bd969310/aiohttp-3.14.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:20064a177a070d789ee64a50b01a9161d3468e989baacfc6c714aa685c4b332f", size = 1693468, upload-time = "2026-10-11T01:02:20.666Z" }, + { url = "https://files.pythonhosted.org/packages/1f/69/73d88e97a8b5f0ca7a946d0011c0de99fb188b1687c7948ecd0553dc5bf0/aiohttp-3.14.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:81c2b3dfd56c62bee6108e4852d5970b4cf9086390b6983f52b666e878c1f115", size = 1915398, upload-time = "2026-10-11T01:02:23.011Z" }, + { url = "https://files.pythonhosted.org/packages/05/f0/881644bcb15d4b258daea9b720a0af9dc4330496cc8d6ade9090cdd0cffc/aiohttp-3.14.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:09ec102b4b8c9a920275733bbc11fdbb615efe6f9231a06007c0218d336fb77a", size = 1871470, upload-time = "2026-10-11T01:02:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/7f/de/19d9ebbcce5aedaa3242d8a99ff8816a60bdb7629fb0084bf4a45bfd1f62/aiohttp-3.14.5-cp314-cp314-win32.whl", hash = "sha256:9c428eb2bd8817588d16a0ab898aa4eb5d141f896aa2b394cc79a4cf61d9a8e2", size = 485517, upload-time = "2026-10-11T01:02:27.579Z" }, + { url = "https://files.pythonhosted.org/packages/a9/74/8cdaf0e58c2588371670d5a9a8215bbb971d36940b6e5d051967dd05c07d/aiohttp-3.14.5-cp314-cp314-win_amd64.whl", hash = "sha256:6f967dde489ca6a8c02d093ab245d2cbf50ccb5c36adf0188b17b0ca39d24b67", size = 511755, upload-time = "2026-10-11T01:02:29.685Z" }, + { url = "https://files.pythonhosted.org/packages/1a/6b/e0100e25502430a531c7cf1482a378d0b65bf728ab60c01ee270e56bc469/aiohttp-3.14.5-cp314-cp314-win_arm64.whl", hash = "sha256:1d2d981b53dd09a319e3570ef8cc3bbc3ef86f5a7abef0f6b2bff3867db3a9e7", size = 495151, upload-time = "2026-10-11T01:02:32.163Z" }, + { url = "https://files.pythonhosted.org/packages/9d/c2/ca2ead7b655688c53c03aeeb6e96e6851c9ff08d6be7b13802f53a6ae8fd/aiohttp-3.14.5-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9ce66feae6ac65327379460380549bf1b8df8e17c4e25df2a2bcf168272e3bed", size = 855396, upload-time = "2026-10-11T01:02:34.443Z" }, + { url = "https://files.pythonhosted.org/packages/a7/70/22206fea409255a240c926ce11de48de354ae2bb90ca44f709c05497585d/aiohttp-3.14.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:27c2322e03f66101acb09869ce1cf1efc04994ee95e1735b69827bf8c8b9d781", size = 567734, upload-time = "2026-10-11T01:02:36.644Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e5/79a36c118308b56f8667d67e05d2fb6dc638ab45985704cdb199631bedaa/aiohttp-3.14.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff75a7537413a86e7cafe98e0e1d6e3dc4b15c6349896e7d5c6b881bfdb6d550", size = 567379, upload-time = "2026-10-11T01:02:38.757Z" }, + { url = "https://files.pythonhosted.org/packages/63/a3/2ebec7dece3b1f02c30d2e484647f6f7b13952b1bb40a4cb285b849e8432/aiohttp-3.14.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c061aa954daaf57d2a4b8374f9fca621ef0e1b603584431c220c22458c59b6d", size = 2050686, upload-time = "2026-10-11T01:02:41.169Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d2/7e4d093db2f4450482652e7ef19a9e19919028f5135aa52bc4078c3beb80/aiohttp-3.14.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1612fa5857b37bf32e5c1eaeefb96e3b01e9c70679eec81f0934e8a600080863", size = 1915077, upload-time = "2026-10-11T01:02:43.563Z" }, + { url = "https://files.pythonhosted.org/packages/a6/88/bd40d09958442a0a1df67da81de496361d6e2afc04f9db2950d835da750b/aiohttp-3.14.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:adbeee7d6fd4cf5fe0aece2fb3edc4243615d3180430ba8149d01a90670cac99", size = 2027204, upload-time = "2026-10-11T01:02:46.185Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/3a601c1f8d3103c1a60ea981f20924855da9f575d2007fc38f8898b792fb/aiohttp-3.14.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b2966998927d7bed9db12c0a4647b0c7b179755878fc9c357fe1ffd3e3b0c1a5", size = 2149520, upload-time = "2026-10-11T01:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/22/d0/4e41bfe1b1ce1cb6f6d2e59fa7a88ef5cf92c402b2d07e9018778ba9edbc/aiohttp-3.14.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e317e0fb6b16212c881d2205a7d87414c29acd69320b3aa6dce9d9c7b86fe4f", size = 2002039, upload-time = "2026-10-11T01:02:51.293Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/72067019545c502b881b031153c437752ecef48d7d213bc0218ccebb4bfb/aiohttp-3.14.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50343c1757b4b6f6708eeaf24534b32f19dfb99fb1b762c00420867a62fc81e0", size = 1786164, upload-time = "2026-10-11T01:02:53.533Z" }, + { url = "https://files.pythonhosted.org/packages/d9/fe/7741efd6119bfb7a00827fe6f7b84b4409de58d888ae21adc5a9a6824992/aiohttp-3.14.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:083673c7a94c3ea035caaa5ca04288bdb44887abfe1f5ba23294e6a4b03efd2d", size = 1970689, upload-time = "2026-10-11T01:02:55.888Z" }, + { url = "https://files.pythonhosted.org/packages/43/e7/342a13bf67f34d269bf2f7e870ecd72b99c832cc6f0a271a9210c0ebfb84/aiohttp-3.14.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2528cb4c6b92008c76ac9ac6298624069bb2db91ff4929905512d1d84485f658", size = 1951967, upload-time = "2026-10-11T01:02:58.467Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d4/fdb3b27340617e5e64df18a70fa89097778652ea5c7c7e2f79def76999c3/aiohttp-3.14.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b1b8ece1e71132d2afba4dbc0c3d62c766e25165990b25db1196c04969eb3d84", size = 1968511, upload-time = "2026-10-11T01:03:00.883Z" }, + { url = "https://files.pythonhosted.org/packages/83/b2/e8f88298de78d1a951f36f9f966d38ec6ed1d4721303ba02064a545e8aa6/aiohttp-3.14.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fce9523df31cea6284f3e2c479876750d7687cf671d7b25d32b19effc0e86441", size = 1778497, upload-time = "2026-10-11T01:03:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/22/68/9ccdb93d664345c546be7f34480b921774d8c0d98f47e70d7e03b115d475/aiohttp-3.14.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:09e0eb18c7e0c8777e2f9149de63799195b9b3ca1b5c81ba6f32f2c6b8628210", size = 1999676, upload-time = "2026-10-11T01:03:05.829Z" }, + { url = "https://files.pythonhosted.org/packages/57/4a/a33cfa6dcb00e94194ae4fe710432ca4ed111e016356b4ba4d2f4c3a124c/aiohttp-3.14.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6774814fd5c338e72ee0da5cbb9432816df450e69c019f72b5d29bdec2a1792d", size = 1963437, upload-time = "2026-10-11T01:03:08.196Z" }, + { url = "https://files.pythonhosted.org/packages/f4/20/eacbecfea3b5c3dcbfc9b023e3a5460f43e5dda16d06a2877ebe7184c3f3/aiohttp-3.14.5-cp314-cp314t-win32.whl", hash = "sha256:33f706574e32c6e694f352a856e05caf18f7f2c871b3e87b41c55ea452b409ab", size = 503973, upload-time = "2026-10-11T01:03:10.481Z" }, + { url = "https://files.pythonhosted.org/packages/ff/78/18eec294f6c8c5dc845dcf6d730a0147d8d0f17e86138a7bdb85e43a30fa/aiohttp-3.14.5-cp314-cp314t-win_amd64.whl", hash = "sha256:5ba14a839fbe87cf7c12a6b5661c05f324a296eb8363141edb3944ba63d4c9d3", size = 531190, upload-time = "2026-10-11T01:03:12.716Z" }, + { url = "https://files.pythonhosted.org/packages/9d/39/e53f8169acc85271ebd12b5b32ad7f1541b35639ccbe0f49034c64785d10/aiohttp-3.14.5-cp314-cp314t-win_arm64.whl", hash = "sha256:1061b364556e8172e8d46b0b183adeeb73e8c42d30ebc745591e1bd89acad52e", size = 510360, upload-time = "2026-10-11T01:03:15.08Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1c/06d89f58b2db3ee92dd377217659d587e06f973e57bf0a97a0d8a4586c0c/aiohttp-3.14.5-cp315-cp315-android_24_arm64_v8a.whl", hash = "sha256:788ecaa9c10533b786ce5ba70c4f2df78ad41819fd00a6c99d92b66f9a32e1da", size = 540674, upload-time = "2026-10-11T01:03:17.483Z" }, + { url = "https://files.pythonhosted.org/packages/18/39/5e822e038f496f0540ada91e27099d48f9e7f919b6c6deb4cf6db36cc706/aiohttp-3.14.5-cp315-cp315-android_24_x86_64.whl", hash = "sha256:5c76f1802bab718a68ac3cce447160605c734551f95c67ae90fa1132b215cb29", size = 554183, upload-time = "2026-10-11T01:03:19.71Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ff/0cf2619d902b5b160762422a7e5e02091295766a7fe4fcf5b9a655e386c1/aiohttp-3.14.5-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:a6d02b4c38de03d9c7617813433e6a0fb6b522797974177d69d9dad431900833", size = 523160, upload-time = "2026-10-11T01:03:22.193Z" }, + { url = "https://files.pythonhosted.org/packages/86/99/3553abfc53a40849dbaacc3f54c730ec58410809ffa2d05885ae56108f2d/aiohttp-3.14.5-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:20726f9782d5c2744c1c66255842d1d163bb3edcf768b8de25216bf47f7b6ccf", size = 530311, upload-time = "2026-10-11T01:03:24.435Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a4/5d25f73754bc1e8f983ba704e86d641aea290c967f195f2aeebdaed2bd84/aiohttp-3.14.5-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:248d779ad720b49d4fb355720e60c9e5f444f95887bc16974fea48fc56c41789", size = 540274, upload-time = "2026-10-11T01:03:26.698Z" }, + { url = "https://files.pythonhosted.org/packages/29/a4/07eda5db2e3ee017d9590f36c12a94ec6f1f50516e8df78672373dfc7185/aiohttp-3.14.5-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:0a8ea271867e360ac985ae607f4a23ad9a38414b9aca1d49ec98839ae660e49f", size = 819239, upload-time = "2026-10-11T01:03:29.481Z" }, + { url = "https://files.pythonhosted.org/packages/cb/aa/a8723dd987a696dd48d4cf2f0088e589ce77caebff0b96f2a78c20424380/aiohttp-3.14.5-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:823c910f046f23f4c713b8d99a2242dc65f591cb45ee86418fa11762a3c2963c", size = 549832, upload-time = "2026-10-11T01:03:32.02Z" }, + { url = "https://files.pythonhosted.org/packages/29/5c/969a1b72692055fd2a419590c41847ec9144fefb97b75ff1cde5b6372891/aiohttp-3.14.5-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:9b42db919715e91eb76acf3bc492a9a7ccd8bd9adc6745c1412b689735269f14", size = 549234, upload-time = "2026-10-11T01:03:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/38/05/8e3e07fd8a0d33d06955ff4e54a1cb92f4bce347ff55e441dc3e25a7b5e5/aiohttp-3.14.5-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3112585250b199296c26ca6e0131640b6a8d01bab8b232d2eb3763ed469de11", size = 1891314, upload-time = "2026-10-11T01:03:36.899Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b3/05a79ce2e25f024e93de30c94f39dc6aa6e2bc1e9c531a5c4b18dc61b7a4/aiohttp-3.14.5-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c147451b4a58e7050f7f7394e6c467867c84161560001f9ad4fb2d1446743946", size = 1884372, upload-time = "2026-10-11T01:03:39.334Z" }, + { url = "https://files.pythonhosted.org/packages/94/52/0fd8af0717db109eea258191b326b5cb5847fb88928bfa6c862fd78b9ad3/aiohttp-3.14.5-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bf163cc701f3d4ac43ba7d97771bf5fd955220ef5500ef3ee847bc0ecfbf4ec1", size = 1930957, upload-time = "2026-10-11T01:03:42.172Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b3/fa78733da88812bf9fb193913fb0ce1548f8b6912047633fdf88a758ff8c/aiohttp-3.14.5-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8d40ce41991e9d56fab4f5dc4a51fe59bc3b5c77c27f4b148963064d00232e8", size = 2038886, upload-time = "2026-10-11T01:03:44.646Z" }, + { url = "https://files.pythonhosted.org/packages/cf/f5/2fcc5e30053a938286f17d0edf3f0850b8061b984256fa7c26850b9c8809/aiohttp-3.14.5-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:276a4fc00b1d9ae492b802763a789c5b86328b989c5ea169f2faa447d6a11c7c", size = 1894470, upload-time = "2026-10-11T01:03:47.304Z" }, + { url = "https://files.pythonhosted.org/packages/62/2a/f87feb42abe8e6a7c03814dbcb711540849a1e90aa392055f3183c643610/aiohttp-3.14.5-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50983e3be33d8c0942ab88cec3905b10602f64c469b20153c48c5d4e558dd016", size = 1716273, upload-time = "2026-10-11T01:03:50.121Z" }, + { url = "https://files.pythonhosted.org/packages/81/b2/adf1f960dd977722ed1347d33da512a1624807114f57a3b91f5cc828e081/aiohttp-3.14.5-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:16c8abd5bca220a47efe667d26f8460124c81810787e79ee87b242677563d9dd", size = 1857513, upload-time = "2026-10-11T01:03:52.959Z" }, + { url = "https://files.pythonhosted.org/packages/d7/fd/ef8d910e641de4160026a513ace5888b7f92826bbc3fd90ced05d55a828e/aiohttp-3.14.5-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:0790ec66fa4013e83c53b9025a45d454723da1a2fce28b3208c9b32d08af162f", size = 1887704, upload-time = "2026-10-11T01:03:55.641Z" }, + { url = "https://files.pythonhosted.org/packages/7e/db/6c9142f941cba8d35be8e1fae6ea2bd390e754fc14076b8147aee1a4592f/aiohttp-3.14.5-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:cb11a971a3aea10f9b8373be628f1df932964fc6c6b174516d318a48c3ac4412", size = 1895684, upload-time = "2026-10-11T01:03:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/e6/7c/6a6bd9a72e576d376c668333b00c51c6147aba4fb863ed6c94996d497eca/aiohttp-3.14.5-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:932ce7e694bbc29b2bf6f64f2343c27d148d4997c771d01bdade4639b6749ff4", size = 1706299, upload-time = "2026-10-11T01:04:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/69/ec/d2cc494242f8c4d3d1cd70baf591742818a74386dc3b84af3195c5c4fced/aiohttp-3.14.5-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:a7d470cf7b206e6359fc77b1b860632fde400d5a2ed59cd0181b93a686bc81ee", size = 1916645, upload-time = "2026-10-11T01:04:03.892Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6e/e852c53647e815db09a1b6b5ab634f54bd736412397e11940feef4d2c89a/aiohttp-3.14.5-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:6e1d8637cf73eebc92eba2e11d4cfff98a3b562f2505bd75bba766d908926e8d", size = 1875408, upload-time = "2026-10-11T01:04:06.922Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f6/72ab6ef20c332399be593bac543d2c24a6d241e39d3540ce9f95a63e4bd2/aiohttp-3.14.5-cp315-cp315-win32.whl", hash = "sha256:fbdc5ec49f9ca3cd24955cf3520b10a4d4c901ba2572094c84274e9e7eb30534", size = 485590, upload-time = "2026-10-11T01:04:09.626Z" }, + { url = "https://files.pythonhosted.org/packages/06/eb/e9de75b8c6d2170c42c08ff303abf857ea8a6d9d9b6e99b5aba40f15e962/aiohttp-3.14.5-cp315-cp315-win_amd64.whl", hash = "sha256:a9d3983bd6ab7aa1cfd573544ae98df9b6cb6912a5185a198263e024a636861d", size = 511740, upload-time = "2026-10-11T01:04:12.277Z" }, + { url = "https://files.pythonhosted.org/packages/fc/25/455f3c2785eb0d50748cffd0abd07500815f419a9495b14610b7622d8d2d/aiohttp-3.14.5-cp315-cp315-win_arm64.whl", hash = "sha256:e29347c142cf6e99e0dff5e2995ead1d50fa3b51bf37a7c726a7ccfe5419745a", size = 495171, upload-time = "2026-10-11T01:04:14.667Z" }, + { url = "https://files.pythonhosted.org/packages/e7/6c/497f0a98782eebfcf0f02a7fbdef5428148bd426027140cbad494cf842b5/aiohttp-3.14.5-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:9bf1d5dcc15204d9ec8b8ea4c18fd66e6b80e5de1f4ecbafb3a2f2740f8039d4", size = 855638, upload-time = "2026-10-11T01:04:17.154Z" }, + { url = "https://files.pythonhosted.org/packages/9a/c5/55c0cef2572af9b1ee81608f7c0a1bf74e6c9151a73b04915d933f192335/aiohttp-3.14.5-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:14f04769cfefe4734016a856a83af36133cd17779cef9ae817f812b8ba9d6d51", size = 567455, upload-time = "2026-10-11T01:04:19.702Z" }, + { url = "https://files.pythonhosted.org/packages/4d/47/e1a0e39f4a2b881f6071225afaf94a6547001b5aefc1566734d73c685934/aiohttp-3.14.5-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:6e4251c0ba4624a68a2c11471a1ac54c3306876c21f0ae86de085cc9241c8905", size = 567836, upload-time = "2026-10-11T01:04:22.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1d/817d85836f52b687160064a326e62e037dc42f1ad5b6b5188a70e5c134b5/aiohttp-3.14.5-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4f5cf4dc72a71c4cfa9751b4950be22f733626670230d46e7d606592aa22d59", size = 2051409, upload-time = "2026-10-11T01:04:24.821Z" }, + { url = "https://files.pythonhosted.org/packages/f7/25/e8ea6fc212a9aabce982917346ce8ecab0929c74b60232a056dd11c99da0/aiohttp-3.14.5-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:dbf53ae2601b7fd5a93c3944deea3a78d40f495226d582c35ef7a433425ce2b2", size = 1936493, upload-time = "2026-10-11T01:04:27.456Z" }, + { url = "https://files.pythonhosted.org/packages/24/33/de0517f71f1a19feea4aff78a2ec4ec2d98634129ec30ead78fce2f8f81b/aiohttp-3.14.5-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:657291433bf4dd3142f3abac495764cd47d0c7c92087751e6666c6447e65fcef", size = 2021405, upload-time = "2026-10-11T01:04:30.276Z" }, + { url = "https://files.pythonhosted.org/packages/c4/11/ddaf2e7930543e9f0cad3a1c54e1af0c1bd2fae3973d568c4263d3b010e9/aiohttp-3.14.5-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3e51a27980c3788e6e6b3325d694fdd4898087fa8a86b2763af77b39353da41e", size = 2142017, upload-time = "2026-10-11T01:04:33.022Z" }, + { url = "https://files.pythonhosted.org/packages/1d/7b/58784353c06de8adc20f426daad3d85dd86fd55331c713a3f4b638c94573/aiohttp-3.14.5-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:82c7583cd3dfdc7dcc927835b4f6c7faae7ecc1ba3ca5879321621ae2e6f8e84", size = 2002482, upload-time = "2026-10-11T01:04:35.94Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f0/417d9535caa9e165ffe6a53e2347a78107e7c87dcb0e10aca315c3af0344/aiohttp-3.14.5-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6fdcd6af7e2e51d1ba1b4bea16e97b074bcb7b5dd0246a9d8201341bb28085a0", size = 1791774, upload-time = "2026-10-11T01:04:38.733Z" }, + { url = "https://files.pythonhosted.org/packages/98/01/25e49c2e8a01b9f0e19ca0a8448ad50aa2bdf96c8cd41e92bd45af044784/aiohttp-3.14.5-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:c8859a013ae0de1074660992139a1a440df3e6b219b86cf0d3f11c2692bb4fe3", size = 1970358, upload-time = "2026-10-11T01:04:41.66Z" }, + { url = "https://files.pythonhosted.org/packages/2d/fc/c132fd3465b6c7e4ce0193154f602c3e6c46b680e4da7eb3bd0d8a40d1c7/aiohttp-3.14.5-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:8966ecac808dd5f473c9c4cefd10cd3ffda71c18a4d3493b7c7d2ae1803bf2cc", size = 1969192, upload-time = "2026-10-11T01:04:44.66Z" }, + { url = "https://files.pythonhosted.org/packages/95/4e/d58b45e7dba4eb607eca11fc0a4aa77ae0f39c11afa804635a61ce18cff4/aiohttp-3.14.5-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:3093b72c215bda16ce961a6d073f6e71d46e022962a9d5d457c5d4d421c78b57", size = 1963618, upload-time = "2026-10-11T01:04:47.505Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d9/f6ac50946efb3490428ef52b56e62c1c6b7f9c6ff3ec6083535526c83e60/aiohttp-3.14.5-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:149fb56caf7acb67073126f675d0958d9c4b3125fcd3f6d4877df98aa8a97ce9", size = 1784817, upload-time = "2026-10-11T01:04:50.287Z" }, + { url = "https://files.pythonhosted.org/packages/d0/2f/f255eb63da788cd8a452fe350869c03266ccad7d884925f6963c87808f24/aiohttp-3.14.5-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:293d3ae7c6a0ed176a42e59a1b5fde825ead65c835360f734148e96729f928d2", size = 1995956, upload-time = "2026-10-11T01:04:53.213Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9b/241aa3393eaafda0034470add1625f82a4c252901108723b283a9b0b32ca/aiohttp-3.14.5-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:3f2dcc00191fd563e9075181a14ec31d7dd63223ced7582cc70a15a499de0c79", size = 1967794, upload-time = "2026-10-11T01:04:55.958Z" }, + { url = "https://files.pythonhosted.org/packages/5f/7f/a68e689288c9e4bfcf8d0979f2b12b774bf01861985420df6150eba5448e/aiohttp-3.14.5-cp315-cp315t-win32.whl", hash = "sha256:7779cd97e61ebe583ec2f1c5616cdd038aa08a4453b1848c67842176d054948e", size = 503876, upload-time = "2026-10-11T01:04:58.978Z" }, + { url = "https://files.pythonhosted.org/packages/a4/78/49b0299da6d54de19fc6fdc6889d50233ac47d192a461624f4fc010fde83/aiohttp-3.14.5-cp315-cp315t-win_amd64.whl", hash = "sha256:0e6f16f5e49c4b8267988c05ab07760d7064cea57d077c3d068d04b0fbb992cb", size = 530957, upload-time = "2026-10-11T01:05:02.23Z" }, + { url = "https://files.pythonhosted.org/packages/21/d4/b0afc936aeb6d2f93157e3408b069ec5d7934429ae7d023de5e0953b1887/aiohttp-3.14.5-cp315-cp315t-win_arm64.whl", hash = "sha256:1aead151c3abbac6b32942e452020cb66d7efc099d253cc6c20f748e926c858b", size = 510408, upload-time = "2026-10-11T01:05:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/68/30/173960c42b05a6c59f7558e4b12a4b0d9ba376cf6aa9bde7f9e08a30ca8d/aiohttp-3.14.5-py3-none-any.whl", hash = "sha256:efc21a454892828368b11c2c780de0ff8bc991f73f6b99c6b66e56205470929b", size = 279517, upload-time = "2026-10-11T01:05:08.523Z" }, ] [[package]] @@ -150,6 +224,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, ] +[[package]] +name = "annotated-doc" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -282,16 +365,16 @@ wheels = [ [[package]] name = "boto3" -version = "1.38.27" +version = "1.43.106" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/96/fc74d8521d2369dd8c412438401ff12e1350a1cd3eab5c758ed3dd5e5f82/boto3-1.38.27.tar.gz", hash = "sha256:94bd7fdd92d5701b362d4df100d21e28f8307a67ff56b6a8b0398119cf22f859", size = 111875, upload-time = "2025-05-30T19:32:41.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/01/97aaee4d3e94467983a0c1b986ed4f4da48960d7ebc948e7d739c818cb59/boto3-1.43.106.tar.gz", hash = "sha256:c11ad4c429a983493ba10014c7af9831a455c2c0eea91c1cefff74530e480277", size = 112730, upload-time = "2026-09-30T19:36:41.684Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/8b/b2361188bd1e293eede1bc165e2461d390394f71ec0c8c21211c8dabf62c/boto3-1.38.27-py3-none-any.whl", hash = "sha256:95f5fe688795303a8a15e8b7e7f255cadab35eae459d00cc281a4fd77252ea80", size = 139938, upload-time = "2025-05-30T19:32:38.006Z" }, + { url = "https://files.pythonhosted.org/packages/72/d8/a01764ffd32fbcd66c5575eb85764ae9ea7b7d03dc591592e132c43af1f5/boto3-1.43.106-py3-none-any.whl", hash = "sha256:fdf2e304f9e8864b8613591b18b36ee995560c9666033622eda1cb9057866880", size = 140045, upload-time = "2026-09-30T19:36:40.228Z" }, ] [[package]] @@ -310,16 +393,16 @@ wheels = [ [[package]] name = "botocore" -version = "1.38.27" +version = "1.43.106" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/5e/67899214ad57f7f26af5bd776ac5eb583dc4ecf5c1e52e2cbfdc200e487a/botocore-1.38.27.tar.gz", hash = "sha256:9788f7efe974328a38cbade64cc0b1e67d27944b899f88cb786ae362973133b6", size = 13919963, upload-time = "2025-05-30T19:32:29.657Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/b9/10ca68d0092895d5ea60f485a61a9840d5aff9d732c66ed60da53a20b1d4/botocore-1.43.106.tar.gz", hash = "sha256:006870b3b4e40547232ad12c3bb4faec91bbbe0659aafaa3b7fa48a112c4ee97", size = 16271399, upload-time = "2026-09-30T19:36:35.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/83/a753562020b69fa90cebc39e8af2c753b24dcdc74bee8355ee3f6cefdf34/botocore-1.38.27-py3-none-any.whl", hash = "sha256:a785d5e9a5eda88ad6ab9ed8b87d1f2ac409d0226bba6ff801c55359e94d91a8", size = 13580545, upload-time = "2025-05-30T19:32:26.712Z" }, + { url = "https://files.pythonhosted.org/packages/a8/eb/c51d3b54dfaa9267a687359d946dc2a1ca6a27fb4d381773e59b7bd72bf4/botocore-1.43.106-py3-none-any.whl", hash = "sha256:c1fb8818f9957cb5037f73db34ac1a12ba43562e31d6e7f9cb7e5fc64e1dba78", size = 15965506, upload-time = "2026-09-30T19:36:32.625Z" }, ] [[package]] @@ -481,14 +564,14 @@ wheels = [ [[package]] name = "click" -version = "8.2.1" +version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } +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/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, + { 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]] @@ -496,7 +579,7 @@ name = "cocode" version = "0.10.0" source = { editable = "." } dependencies = [ - { name = "pipelex", extra = ["anthropic", "bedrock", "google", "google-genai"] }, + { name = "pipelex", extra = ["anthropic", "bedrock", "cli", "google", "google-genai"] }, { name = "pygithub" }, ] @@ -533,7 +616,7 @@ requires-dist = [ { name = "mkdocs-material", marker = "extra == 'docs'", specifier = "==9.6.14" }, { name = "mkdocs-meta-manager", marker = "extra == 'docs'", specifier = "==1.1.0" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.11.2" }, - { name = "pipelex", extras = ["anthropic", "google", "google-genai", "bedrock"], specifier = "==0.46.4" }, + { name = "pipelex", extras = ["anthropic", "bedrock", "cli", "google", "google-genai"], specifier = "==0.83.0" }, { name = "pygithub", specifier = "==2.4.0" }, { name = "pyright", marker = "extra == 'dev'", specifier = ">=1.1.411" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=9.0.1" }, @@ -988,11 +1071,13 @@ wheels = [ [[package]] name = "instructor" -version = "1.15.1" +version = "1.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, + { name = "click" }, { name = "docstring-parser" }, + { name = "idna" }, { name = "jinja2" }, { name = "jiter" }, { name = "openai" }, @@ -1000,14 +1085,16 @@ dependencies = [ { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, { name = "pydantic-core", version = "2.27.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, { name = "pydantic-core", version = "2.46.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, + { name = "regex" }, { name = "requests" }, { name = "rich" }, { name = "tenacity" }, { name = "typer" }, + { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/a4/832cfb15420360e26d2d85bd9d5fe1e4b839d52587574d389bc31284bf6f/instructor-1.15.1.tar.gz", hash = "sha256:c72406469d9025b742e83cf0c13e914b317db2089d08d889944e74fcd659ef94", size = 69948370, upload-time = "2026-04-03T01:51:30.107Z" } +sdist = { url = "https://files.pythonhosted.org/packages/80/cc/d9b8e4e0684033388c9a88df56c47f639758e4ac946e9eb3789d1b4d13d4/instructor-1.17.0.tar.gz", hash = "sha256:aeab1e7f21f5214deedf60e8e264951408057ce21d9589743f533580dc0d6bfb", size = 70240472, upload-time = "2026-09-09T02:26:00.614Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/c8/36c5d9b80aaf40ba9a7084a8fc18c967db6bf248a4cc8d0f0816b14284be/instructor-1.15.1-py3-none-any.whl", hash = "sha256:be81d17ba2b154a04ab4720808f24f9d6b598f80992f82eaf9cc79006099cf6c", size = 178156, upload-time = "2026-04-03T01:51:23.098Z" }, + { url = "https://files.pythonhosted.org/packages/42/22/429e950b50569cb56eb324cc62992c0a458121e5d5a43acec295a127ade7/instructor-1.17.0-py3-none-any.whl", hash = "sha256:f6b1832d178e899ee0a6a3f247e221f19580fa525c815211c02447691d761217", size = 269394, upload-time = "2026-09-09T02:25:54.888Z" }, ] [package.optional-dependencies] @@ -1148,16 +1235,25 @@ wheels = [ [[package]] name = "kajson" -version = "0.7.0" +version = "0.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic", version = "2.10.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/a4/da91af6dac42516e45a9897ba901d8ec2ee2b13b135caf6ce120867aac2b/kajson-0.7.0.tar.gz", hash = "sha256:1c8f80d157f980c9adb9fda0e77c1cc0078f50547d84ef548a5e19b5a84d8d37", size = 25071, upload-time = "2026-06-10T10:00:56.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/06/69bacab23fd509b2063489a4e4d3c44c6ce47133606a2d99d0f81cf17a47/kajson-0.7.1.tar.gz", hash = "sha256:725f5c02c065f829d4b4e409553b6016258784a77de2140246a96c851c64f362", size = 25057, upload-time = "2026-08-30T19:39:43.489Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/1c/8251c0dadd1843e020edf4ef162aaa7dd0e98cbd2e1fe33d843807cd7ce9/kajson-0.7.0-py3-none-any.whl", hash = "sha256:d9903327bc7f182ec481ffafd074765347365600592e5f9f67866d5b0ae4f939", size = 31524, upload-time = "2026-06-10T10:00:54.952Z" }, + { url = "https://files.pythonhosted.org/packages/0c/55/24cb6081dc828db12b4fd6c88dd67ed70f628cc8a4c9fc8d1aa7716c81fb/kajson-0.7.1-py3-none-any.whl", hash = "sha256:ba1249bbac58eaa8701a99f321c94edc103809e265506f7e9e270b9ef906126e", size = 31512, upload-time = "2026-08-30T19:39:42.179Z" }, +] + +[[package]] +name = "linkify-it-py" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/98/7a1a5f31fd5c7ba93e963b168e244b8e3dd705b3d2a718e3c3307583bf57/linkify_it_py-2.2.0.tar.gz", hash = "sha256:907acd2d17ac1fbb9ddb62c8957ccbd6158cac602231a15c3b0cd1e215f03cee", size = 32939, upload-time = "2026-08-29T07:07:08.305Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/d4/1152d1c7ab42d8b908be64fd200ddc870dc9d4925e951198702084aa1a7d/linkify_it_py-2.2.0-py3-none-any.whl", hash = "sha256:3adc40eb5af300b2605fcfdb968c24e1d780a90f1f2221af7c15e5111e94d443", size = 21971, upload-time = "2026-08-29T07:07:07.164Z" }, ] [[package]] @@ -1181,6 +1277,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] +[package.optional-dependencies] +linkify = [ + { name = "linkify-it-py" }, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -1349,7 +1450,7 @@ wheels = [ [[package]] name = "mthds" -version = "0.8.1" +version = "0.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, @@ -1359,9 +1460,9 @@ dependencies = [ { name = "tomlkit" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/62/8c94607b2466105906232858dcee74eb8dbc2ed0352fb6b280e1f06f94b9/mthds-0.8.1.tar.gz", hash = "sha256:0c9082c2c5d833605431911635d3290ab1d1ad9d8f6d0eb68a27b89df9d256a2", size = 129886, upload-time = "2026-07-06T21:24:01.313Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/99/ebe133c36b3db8cf7bb4abf60c3330f980fbd378822bcc62cddc09a989c9/mthds-0.21.0.tar.gz", hash = "sha256:c52f13b58471b07583e29d15aece925c03d3509a0ea1204b13e549d20a0b1e33", size = 282110, upload-time = "2026-10-10T12:10:30.802Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/29/32de38940a4d1c452285eaa8aec8bf251136a26397ded8ff85edf624b217/mthds-0.8.1-py3-none-any.whl", hash = "sha256:ea421aa00a13009d12168fa84b5fd451d0c513e60febcbfb47431c058b15bbfa", size = 58115, upload-time = "2026-07-06T21:23:59.783Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1d/97001f8f2d42e904f2ce2f8a005cddb596efcdf103b413a0d22bbcd5bf67/mthds-0.21.0-py3-none-any.whl", hash = "sha256:c2ac9762980936e63864941c2107fa589c17ea367ca00dbb6a17bf4022c6beaa", size = 111488, upload-time = "2026-10-10T12:10:29.298Z" }, ] [[package]] @@ -1789,7 +1890,7 @@ wheels = [ [[package]] name = "pipelex" -version = "0.46.4" +version = "0.83.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiofiles" }, @@ -1802,7 +1903,7 @@ dependencies = [ { name = "jinja2" }, { name = "json2html" }, { name = "kajson" }, - { name = "markdown" }, + { name = "markdown-it-py", extra = ["linkify"] }, { name = "mthds" }, { name = "networkx" }, { name = "openai" }, @@ -1811,6 +1912,7 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "opentelemetry-semantic-conventions" }, { name = "pillow" }, + { name = "pipelex-sdk" }, { name = "pipelex-tools-py" }, { name = "polyfactory" }, { name = "portkey-ai" }, @@ -1823,7 +1925,6 @@ dependencies = [ { name = "pyyaml" }, { name = "reportlab" }, { name = "requests" }, - { name = "rich" }, { name = "semantic-version" }, { name = "shortuuid" }, { name = "tomli" }, @@ -1832,9 +1933,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/5f/3747963f8e1c5a2c2f0c4b452962df1ef5da3e2e4feee32bf3f7e6916637/pipelex-0.46.4.tar.gz", hash = "sha256:6ed3e41c41335757ecd55980473ba83c5c807405b29ee5e43fe8d3ebadf5611e", size = 1415544, upload-time = "2026-08-18T18:35:54.415Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a9/4fe637aa7b098137f781df4a9f9aa28a7e28c3e471e5144b30022efe71cf/pipelex-0.83.0.tar.gz", hash = "sha256:aa862a80d269f6c30f26a0de0acc6a06c2dddd0be7d3aeaba99bdcf3d2a89a89", size = 2488402, upload-time = "2026-10-11T09:39:18.407Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/21/48790f2874a8155e9b4e3fc60d8f7daa05c088f4d21872f8a6e4368c781a/pipelex-0.46.4-py3-none-any.whl", hash = "sha256:b5d9914938cff19d8d0a5bb958537bc7f103cf965afc5897adc13b93b41fab3f", size = 1950918, upload-time = "2026-08-18T18:35:52.717Z" }, + { url = "https://files.pythonhosted.org/packages/42/a3/56ace91becf1786bf816cb86ae37c9cb9f2054831fe68788f51b9011809a/pipelex-0.83.0-py3-none-any.whl", hash = "sha256:00a5f2fe4654b4ad4fa4c61e56196cd116ae9195391763c865aa83a4fed66322", size = 3241016, upload-time = "2026-10-11T09:39:16.073Z" }, ] [package.optional-dependencies] @@ -1842,9 +1943,12 @@ anthropic = [ { name = "anthropic" }, ] bedrock = [ - { name = "aioboto3" }, + { name = "aiobotocore" }, { name = "boto3" }, ] +cli = [ + { name = "rich" }, +] google = [ { name = "cryptography" }, { name = "google-auth-oauthlib" }, @@ -1855,6 +1959,22 @@ google-genai = [ { name = "instructor", extra = ["google-genai"] }, ] +[[package]] +name = "pipelex-sdk" +version = "0.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "mthds" }, + { name = "pydantic", version = "2.10.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, + { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/96/ec90e611b2fb8944e95f8fcf917093d7a1b3c9dcf60994b8c7553d0ae394/pipelex_sdk-0.38.0.tar.gz", hash = "sha256:6a2e5000408c6dbcdf06cc662df8f13accbebb1a3293616ddd90dcceefef0377", size = 533494, upload-time = "2026-10-10T13:41:06.803Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/14/01a43fc54d87e883e92ca317e0a1b8d23dfe3ef0251dbcbf9a29e101b72c/pipelex_sdk-0.38.0-py3-none-any.whl", hash = "sha256:291296c4ea5e03cd3328626c6ee68acf669f7c60d60f41ca26d489297e2820df", size = 213968, upload-time = "2026-10-10T13:41:04.946Z" }, +] + [[package]] name = "pipelex-tools-py" version = "0.1.4" @@ -2548,6 +2668,126 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, ] +[[package]] +name = "regex" +version = "2026.9.29" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f2/af1da9d3ceed77bfcdce40427d49ba0be94e4fe84245e3bfef68c10e75b6/regex-2026.9.29.tar.gz", hash = "sha256:8b5fcc4771732191b2b7d1dd68d8f0353f47f8d90b6150f6dce58bf1112442cb", size = 419199, upload-time = "2026-09-29T00:49:58.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/6b/6dea87689c3a06a6e79d254bf824e6f3e3d724b5ba027c6112559aa6cd2c/regex-2026.9.29-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6abb75ab16bc3281714a5b99548a2225db70dba1f995f6d7f7419b76eb5a8fbe", size = 495413, upload-time = "2026-09-29T00:46:14.51Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a5/0c791a0e83ad1013d262c13247c4c77e0f4a8d05bdc167df96aba6681c0d/regex-2026.9.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7b893976e7fe42053da64f2aa27239c24252fd2ec6df471e1be197c0addc3b1", size = 295145, upload-time = "2026-09-29T00:46:16.292Z" }, + { url = "https://files.pythonhosted.org/packages/b1/07/9bf3607d8d13a12e436ab9d63f9791e10706827d535695b23964ad79fd79/regex-2026.9.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:066d0e3dbfdd739bce2bf8c2a41dd16f73e3d8adc2eb06dd803a36a307f56075", size = 292123, upload-time = "2026-09-29T00:46:17.646Z" }, + { url = "https://files.pythonhosted.org/packages/64/6b/32c2e6fc617e1d3f247e250fea31a9a35b1265bd32f585968aa13b9999b9/regex-2026.9.29-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7020ed44df30b3aa492c00ee3b52d0548c1f30c2c6c5bb13ae897680900d3413", size = 799537, upload-time = "2026-09-29T00:46:18.976Z" }, + { url = "https://files.pythonhosted.org/packages/bf/72/f041177f3c7a4606f7c81a95fe7eea03e2a0c4e8bff9e439a01432cbc9f2/regex-2026.9.29-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4613d7d9dda60fcba95f846cc6f808017f1843f392cf9daad14a6534493d71", size = 873255, upload-time = "2026-09-29T00:46:20.684Z" }, + { url = "https://files.pythonhosted.org/packages/d0/4e/a78948e11dd715e0e46716c2e0f3404b3fe6a44e2a2e9abdc7d965cab2b3/regex-2026.9.29-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bec37990e3d6121f29ecfb594bd8f1bf009e9f7926daba2e50e3b27d3892a783", size = 914570, upload-time = "2026-09-29T00:46:22.599Z" }, + { url = "https://files.pythonhosted.org/packages/8a/70/aa08d1d2b294894b365e5f8ba5380fe3f8546acdb81f10639dfd74209c37/regex-2026.9.29-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:612b709381c0355b70d89cdb51b7f670591ed5cbbc0e3b5337488019dc667b65", size = 804978, upload-time = "2026-09-29T00:46:23.981Z" }, + { url = "https://files.pythonhosted.org/packages/21/32/1b03534c4715aca3b564416d28d518083ed4dab3bc913267600d2256140d/regex-2026.9.29-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a760da040b47767b4b873adfb7c3b691e9ba2fc60f113f9d0b88f1a62f323e85", size = 779297, upload-time = "2026-09-29T00:46:25.318Z" }, + { url = "https://files.pythonhosted.org/packages/76/a7/378f6f558d9e4444af315a307c5953565a511d1e3666f1bb7bdc82012b6b/regex-2026.9.29-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ee178ca31c94621294bf9b8b676a92a2e6bba8af0529591753719e57edb621", size = 786961, upload-time = "2026-09-29T00:46:26.963Z" }, + { url = "https://files.pythonhosted.org/packages/59/13/79f0b1846f5f342f92ddbd4b27b18bcb86da96d902c1a0be26520bde98d7/regex-2026.9.29-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5eeb8edc6110d9194a4d0d54610f64c37a31c605b5dbb7e407fc6ec7fa34a4a1", size = 863234, upload-time = "2026-09-29T00:46:28.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/19/05af70dec9f2eed6ba34e08d2dcc6a48e7ae5e307659d5fe4201a5d7bbee/regex-2026.9.29-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ccb64d887a9db1cd76dbc0f92051a1a478a2a67e7f56c62d915cb881d7734704", size = 766487, upload-time = "2026-09-29T00:46:29.941Z" }, + { url = "https://files.pythonhosted.org/packages/01/e1/9c7486d4afe8fdd1fe0ad60139f8aa91427381f409af6a29b609d8fdcb3a/regex-2026.9.29-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9e4482589065c8ecd761cff522dcd85f2d39e62f551e37e025d1c7d54772def3", size = 854792, upload-time = "2026-09-29T00:46:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/26/c7/49d008ff5f741d9a9799d7315556f3a12b983ff0fcd2cdfb62904bedafbf/regex-2026.9.29-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d60030baaa7bfbb02d650c126cdcddcb6e33dbff14d819434c8fa2fdcaeeeba5", size = 793050, upload-time = "2026-09-29T00:46:32.775Z" }, + { url = "https://files.pythonhosted.org/packages/cb/a1/46ba549e65562ca04608b24179b8a7bb6f146ae0e7c6d7f5e70f3339c8ba/regex-2026.9.29-cp311-cp311-win32.whl", hash = "sha256:18ae8eed4526e35bdb754d61562b90bf5c00a67fdcf3cc1380dd59597486631b", size = 268940, upload-time = "2026-09-29T00:46:34.179Z" }, + { url = "https://files.pythonhosted.org/packages/4d/4a/aab232183c70fdcf77bcf0c51819da02ec522e393e6a0bf00bcf2142e21f/regex-2026.9.29-cp311-cp311-win_amd64.whl", hash = "sha256:1043aedf5917caa861bcb25a9c11460049656bdf0017a90a309fa8f255467725", size = 280641, upload-time = "2026-09-29T00:46:35.484Z" }, + { url = "https://files.pythonhosted.org/packages/33/b1/7c05954af0f51de376df2ba97f7f78a8b79334c7e5b3d2d9f2aead1f4d3d/regex-2026.9.29-cp311-cp311-win_arm64.whl", hash = "sha256:352cf115a810b357caa35193ab656ecf5ef41056855e82f292c99e8514f8d954", size = 279411, upload-time = "2026-09-29T00:46:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/84/48/3fdcde9a0baa84d7d25571223265d6e434e114763b438601d54a8028bf3e/regex-2026.9.29-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc79d36d0618752265f0d575915bdc5c5130ecb9c9f6b3bcefeae32e4bdfafcf", size = 497903, upload-time = "2026-09-29T00:46:38.938Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1c/4ee3e97c76f53940488dfe7a7e18705e78daac8cd7fb161d246b9e328449/regex-2026.9.29-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3a21a9509d0ee88e7a70e1ad228cd2f0e0fd1e187458db132e8a8d18c97daf9d", size = 296416, upload-time = "2026-09-29T00:46:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/37/14/f3f0ba083d2094392d5eabf56db5ea6ba469fd6e927afd187042054ea68a/regex-2026.9.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f57dc6b8fef170f105d2cf5cdce254f47b137d7755086cf7050f47e16582abba", size = 293633, upload-time = "2026-09-29T00:46:41.959Z" }, + { url = "https://files.pythonhosted.org/packages/c9/72/67e7a8ce17f1aea49df215564048efb49cc8c2b31a0e0fc30f36838f8516/regex-2026.9.29-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f93bc1c3486ef3747e07c9d7c1d0a147b8fbaab975f80e348aed6f71309dfaca", size = 805885, upload-time = "2026-09-29T00:46:43.373Z" }, + { url = "https://files.pythonhosted.org/packages/f6/78/25436bcfd4d2260b4b4090094d55d7ab53ec8a1ab4865a0b8bcb33c7d5c0/regex-2026.9.29-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e1d3a4cb7993b708f0ada8d0c84590efd853f169e7147d2202c9da503180242", size = 878344, upload-time = "2026-09-29T00:46:45.328Z" }, + { url = "https://files.pythonhosted.org/packages/97/e6/a09ec3a23ae41d6179880e67f0aace9284b2d95f2d7b326eff203f8eec5e/regex-2026.9.29-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dabee8f4935e731fb46b2a3091bdda0d3d94b3bbfb907d2b4f12eefce4009619", size = 919181, upload-time = "2026-09-29T00:46:47.041Z" }, + { url = "https://files.pythonhosted.org/packages/26/83/d2fbd2e4e3afb1167daa825187d196f313cbaa1a4768f311fb041bb0e3d2/regex-2026.9.29-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39ab5894d971f9ac68baa6eca5c50387db579cfcacf36ae8df3feceb1815e6d0", size = 807783, upload-time = "2026-09-29T00:46:48.894Z" }, + { url = "https://files.pythonhosted.org/packages/46/0b/eb429a7016610d44fc89a597163f8c9127505f0d7dc724dc9effbb6a3ac0/regex-2026.9.29-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c1a9a6651197fbed6f0212591418b9def774fc3f8324f78d1bf0e6a63e5f8aa1", size = 783465, upload-time = "2026-09-29T00:46:50.64Z" }, + { url = "https://files.pythonhosted.org/packages/1b/07/58a3c0153c7476898430f6a7cf3d9062a1d17fbea4f43399ecaf411c7b4c/regex-2026.9.29-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87fb80cbe3557e27e7b28b995c2b2eedf689b8886f941ab93e0e288f0976518a", size = 793519, upload-time = "2026-09-29T00:46:52.396Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e8/161b94d39164520e21a7befe0245569bf7fda4c7cf1fc4e2df2b5def49da/regex-2026.9.29-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3c5c2ef13797466aa64170cbb66ad98a32351dd4127694cea7199f80f213750d", size = 869293, upload-time = "2026-09-29T00:46:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/8f/07/3b02ed829aa2decdc1955d222bd1e2f99d1c8bb4873bbb9a66b2f0a36bff/regex-2026.9.29-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:59b49507f47479e299a9e1bc41b5cb83a7afda0540625f1dbae886615978acbf", size = 770239, upload-time = "2026-09-29T00:46:56.106Z" }, + { url = "https://files.pythonhosted.org/packages/42/5b/ba61f6fe062eb8562e742367d177bb75370434138ef6c9d2a27114f8d613/regex-2026.9.29-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0dd8af32e9f7b56b7f95cc1fd79b23054c3bdc172392ae560acc24d57b7ffe71", size = 861973, upload-time = "2026-09-29T00:46:57.665Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/767259b20e8a842948990f5e99138d6c077248fd42f8b5468b1d9ca4b814/regex-2026.9.29-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db5e82ba15c142425b8406690032df89e39cca4a2e8afbbb9a3d84edc2373ac3", size = 796470, upload-time = "2026-09-29T00:46:59.236Z" }, + { url = "https://files.pythonhosted.org/packages/a0/05/2566c4ba849b68a8ab81a6bf428fa79d20aae7ddee83979103c0381df254/regex-2026.9.29-cp312-cp312-win32.whl", hash = "sha256:d0c3082bf79bcd6a614d55916590ad4b8f93200e10b97f463ea5d9d07c9b5f23", size = 269327, upload-time = "2026-09-29T00:47:01.135Z" }, + { url = "https://files.pythonhosted.org/packages/93/19/489bc8db91196381c935752df01ba3f607140daece33b78d88573f028e64/regex-2026.9.29-cp312-cp312-win_amd64.whl", hash = "sha256:fdd88ed5e20b1bcdd234421e454962c971aa44b653bdb7f1ea9ef683e90fb649", size = 280334, upload-time = "2026-09-29T00:47:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/47/fb88ba779d0e5e7d4b0ec1aceeb13845948a2cb876bd572a2d1dfdba090b/regex-2026.9.29-cp312-cp312-win_arm64.whl", hash = "sha256:4fe97894d1b306c919b4e50def1e6f6c522f4d03a7283811f4d108f1ce5d3ac2", size = 279614, upload-time = "2026-09-29T00:47:06.541Z" }, + { url = "https://files.pythonhosted.org/packages/79/d5/6080f7d1a6e7e36aa720f806ac93c035ba39c209ae6cc510e8ef4c0279c6/regex-2026.9.29-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1a0d5117230dd46b399a30a38afa44f79c99f3168988fdc4f425c3f928b39df", size = 497622, upload-time = "2026-09-29T00:47:08.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/c87fc7a2e21a42f9d57489db32951c37eef56d153840459a80d464f0321d/regex-2026.9.29-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f0fe9834e5aeccaf19a0d8feb296d66a24be1a7c9922002f842a682cd5abb787", size = 296281, upload-time = "2026-09-29T00:47:09.764Z" }, + { url = "https://files.pythonhosted.org/packages/11/9e/aa0f4cde3bc4688c1d58b0cd8415edd708339bc0bc401a195b0b1e8c8f0c/regex-2026.9.29-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c90fcf7804ea0a54b896ce0f2b9565350220b8d4890fd0db461a476a4c687963", size = 293472, upload-time = "2026-09-29T00:47:11.723Z" }, + { url = "https://files.pythonhosted.org/packages/90/d4/e835c487850ed922a8d6074f953b888c8ea99775c76b9ed5f8a4d72eab92/regex-2026.9.29-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e11edba5bc344a32b029a7af9d4b3173982dd79eeafa0b9dbd787364414b0509", size = 805966, upload-time = "2026-09-29T00:47:13.235Z" }, + { url = "https://files.pythonhosted.org/packages/2c/57/ba8809847fbae8d2cbc71367c6ded510a7ec88bf52493c65efc1acf4effb/regex-2026.9.29-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb90e7177944b6684738c1fc36aabd2dd00d1de3be7dbe09f91e196f1bc0dc81", size = 878346, upload-time = "2026-09-29T00:47:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/e3da19fc3cc15ef67ab67e121e87887c3bccfdb683a7a9ec557c460ca5b7/regex-2026.9.29-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d06fcdecc10fc7954d7c8f27a03c96055fe525274dc84a7b0dbdc3d6b9e03dab", size = 919250, upload-time = "2026-09-29T00:47:16.622Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8e/c1ed81f55f992f6aa0b699a592a50c1ce9e6d44ff1aee2c14c0537dcef9c/regex-2026.9.29-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d49c18f1ea294cf4adde2e5ac256e98c82ea9d708462ce4bf799dffa7cfe8a2c", size = 807902, upload-time = "2026-09-29T00:47:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bc/5a6886eb470e41040e21e05b75024a18b6ebfe7ea400b72094a60f949101/regex-2026.9.29-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e778bfccd63075167709136afbc251c1f683758d5bf49c803c60ac3f894ce6b", size = 783514, upload-time = "2026-09-29T00:47:19.921Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/6d951d453b023c6edb880f1ba474291b53b8ce1cc438b96a9db6d791d991/regex-2026.9.29-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:686ac5350fceae63830bb98805fcb8039325bf4c06d9f6f048ff65229d5bffa5", size = 793466, upload-time = "2026-09-29T00:47:21.552Z" }, + { url = "https://files.pythonhosted.org/packages/99/b9/d5a41adc08360f5eee0dc4846c578f002366947211fc8af5a69a64ee7b9f/regex-2026.9.29-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:26ec4ccce55aa533fbd603d08911b01101a8fcfec987845ac3ae2c7087b2bde3", size = 869464, upload-time = "2026-09-29T00:47:23.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/d76c9d91f5d798e2e9e67f6f85ec4ae35445ac425f7454797311cecb80ca/regex-2026.9.29-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a655d34b2a6943af32401f3d94f72e9d731f6ad16285815550bf2b4ee69d420a", size = 770278, upload-time = "2026-09-29T00:47:25.193Z" }, + { url = "https://files.pythonhosted.org/packages/24/00/aeebdb540c620a0f7317f6d6fad80a47729ecf0599a24b5c34ec155351f5/regex-2026.9.29-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0c992c19cd45058a4b92f68f139c93db168b48fb1f322c9a7cd620806afb6b51", size = 861949, upload-time = "2026-09-29T00:47:27.005Z" }, + { url = "https://files.pythonhosted.org/packages/12/62/d0314bcedfd3586197e4596931fa220260eb2385bf53184e5b9ae67db24b/regex-2026.9.29-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ebb8912f565b8cdbbf27debfe00df04202c20e2f651b9e32767930c5eace3621", size = 796602, upload-time = "2026-09-29T00:47:29.233Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c7/d5a8c13a613facb03e0fb55c1ebaaf7bb35d8e2c1abe8bef8dca809fc1d9/regex-2026.9.29-cp313-cp313-win32.whl", hash = "sha256:4d7d93613b01b0199961330e49cfc52d479b3d5776c56c691db31130c0a07d91", size = 269306, upload-time = "2026-09-29T00:47:31.14Z" }, + { url = "https://files.pythonhosted.org/packages/80/a7/bf93a3a6afa5f7bc16b7afb94ae581b01cae620b8ad56bd8f9572a985959/regex-2026.9.29-cp313-cp313-win_amd64.whl", hash = "sha256:61956f074ecd123f55adca68ee3eab46e6a07ad3f8e64e6db95dfacb444f55c4", size = 280307, upload-time = "2026-09-29T00:47:32.709Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7d/388274e53605a86297f433a08102a7bbdcf9379d47683d307ccaefd88e2c/regex-2026.9.29-cp313-cp313-win_arm64.whl", hash = "sha256:bfc71e6d970419c1309b3640305298643e2a734cad3f7cfb6d2ddee4175ab53d", size = 279599, upload-time = "2026-09-29T00:47:34.674Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/d9dc6f02f569625faf67a4daec926cd5023472dcd69bb44286dccd5a5ab3/regex-2026.9.29-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:957bb708e8057ab1649ba566456429d691ec9b90d1c9ad1af1ba7ffbbeaf05f2", size = 497598, upload-time = "2026-09-29T00:47:36.541Z" }, + { url = "https://files.pythonhosted.org/packages/9c/83/9b693a3fd1451381e812031a8961ec5b3b8f0c8cc6871f14c5223642804d/regex-2026.9.29-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c9b602fae1e00b7c035d661ce85575365719192a7b46784bd71cf64c68053aa0", size = 296250, upload-time = "2026-09-29T00:47:38.233Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5f/52bc2abc3fef040cd9de76ab29c918d6a717a454ae2b9dd7938b0c95656d/regex-2026.9.29-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0166844493626c5015c6088ee15c9ca2fd060ca15b7641d1657da6a58432ae33", size = 293518, upload-time = "2026-09-29T00:47:39.957Z" }, + { url = "https://files.pythonhosted.org/packages/dc/fc/cf50671215ee0057046980b4571ef8646a005819bb67f0957e779ed107a5/regex-2026.9.29-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b97a38fb4c732b6832db6bf108963adbcd82ef1268ba2025dce390f45af75efa", size = 806037, upload-time = "2026-09-29T00:47:41.676Z" }, + { url = "https://files.pythonhosted.org/packages/14/4b/dddef8fc15c63e4347cc9efb138d0cd306f30e6c98acbcc81a8f780083b9/regex-2026.9.29-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a540abfab208e1b7ef2df231c40ef3b6cbb30a0aad6204e9b6a81c10a6794628", size = 878881, upload-time = "2026-09-29T00:47:43.755Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/38daabed32d28f7e58a06e9344ce00dc67952e9996bc578ed6a29fe1240e/regex-2026.9.29-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ddfa987262763c3c22a8367d2a49c244b018a74c3a8e3ab1a864119ad45c5633", size = 918684, upload-time = "2026-09-29T00:47:45.594Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4d/041d9458a645fee4fce4d642a89d27271a3cfcd91095104f6dde44da70bf/regex-2026.9.29-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f7f7aa47b229f2b39a2ae2596d2ad5625d77b5eb9856fac2dab3eb506cdd0a0", size = 807176, upload-time = "2026-09-29T00:47:47.372Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/4383eed7aa5aef67616cb1b3f3ad06b7c624c4e6cced48630cd5ce133d85/regex-2026.9.29-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d9b77b25b4f395f92de6099ab08e8ae2bc7e51dfe157f22900902243a5cc90c7", size = 784315, upload-time = "2026-09-29T00:47:49.518Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a6/0086ad31cebb183c637d3198547075aa493afde308e1ff61fccccb29ba6e/regex-2026.9.29-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:34b6925af9853bf461950e6508910f179fd6e9b1a7ec8548e069606b7e51a26b", size = 793748, upload-time = "2026-09-29T00:47:51.279Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/f9005cba3f629a859573fc5d1224ea4e1f97919ec8581d018e03a351a604/regex-2026.9.29-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:addd736a0547d553283adaf4e05d7104e7f2c7b0b092e9b4d28756825f14531f", size = 870302, upload-time = "2026-09-29T00:47:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/01/4f/e1a3e46bb5315a4e18b01a990e7a28e2a16595609d50c442baf2815a3c65/regex-2026.9.29-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fe3fa1dd453ed5c7f5ea23a26218329790ed7197a99b90e94330e313959a7f52", size = 770299, upload-time = "2026-09-29T00:47:55.606Z" }, + { url = "https://files.pythonhosted.org/packages/2c/fe/f303b4acfda44e1ff1379368748c1ef2dad04a6a8e9c0ecbc970b19d97ca/regex-2026.9.29-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0cc63b5e47c12a48d90c7e9d7de6a035dd14f62868aaedbb4e0ff8ba2b8bfe7b", size = 861570, upload-time = "2026-09-29T00:47:57.617Z" }, + { url = "https://files.pythonhosted.org/packages/60/b6/b4f7e99249f596017c60ccad5faf9310fc8e3e59bb2244940a90a1b0bdff/regex-2026.9.29-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:724184b4aafed865e4f13ca313fdcb43024300c028ec67319cfa16847d84685e", size = 795967, upload-time = "2026-09-29T00:47:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d3/fc865a4638d9f6762192b6bab5b7aa1f33a90e9e99578c2e111e2a63c8c3/regex-2026.9.29-cp314-cp314-win32.whl", hash = "sha256:c6c8fabf1dafc1f1ddcbb67896d3f93efb092e8c4b6322d7389b944e76a484e5", size = 274758, upload-time = "2026-09-29T00:48:01.8Z" }, + { url = "https://files.pythonhosted.org/packages/31/e2/c2b466924ccbeb874862968ca638051b15a8fd29d994a0e99004a5cbf78e/regex-2026.9.29-cp314-cp314-win_amd64.whl", hash = "sha256:1c2a0026062abcc321a53db4a185ceba0b59a66b5d37b0808917a88b55a5257f", size = 283817, upload-time = "2026-09-29T00:48:03.614Z" }, + { url = "https://files.pythonhosted.org/packages/c6/42/ea0f8dbaa924fa75c6338935eaee2f44dab369b27f02db1e03d74344b049/regex-2026.9.29-cp314-cp314-win_arm64.whl", hash = "sha256:121a76a0985db80ceae9e171c337f8c927868e37d01b54e3ce87bc87f9c6a208", size = 283663, upload-time = "2026-09-29T00:48:05.624Z" }, + { url = "https://files.pythonhosted.org/packages/44/48/d58e5081119f5c223bbb37d2340acde3d069e1df8e8cd166c37502eee4da/regex-2026.9.29-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e31f72490b7c12f7790e1e25c3afffd20503ee1bfb43461d7838b871ff244b19", size = 501393, upload-time = "2026-09-29T00:48:07.833Z" }, + { url = "https://files.pythonhosted.org/packages/72/3c/c49945287d4f9efee7d41f98072f8ad880efb8f430595a612fbdea996a4e/regex-2026.9.29-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:80ea96f5c1a30bf09007d48466521d9c294bebe197c708c3359096e3e3691632", size = 298237, upload-time = "2026-09-29T00:48:09.684Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1f/688cb61c3d4cf7bcc1ed444b5cc49399eba3e51c469ae285cf87fea3022e/regex-2026.9.29-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:554bffadcbcb6d5f4e5fb10a61cc52084b9a63d1dab5f10bcd2c4343972e8e2c", size = 295936, upload-time = "2026-09-29T00:48:11.454Z" }, + { url = "https://files.pythonhosted.org/packages/26/a3/de43ac6b877b7d09c19a3a426b1bd5acdd209eaaf68f406466f80439ccf6/regex-2026.9.29-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:864e9b87ac33c3fb9fb4ad48166d4fdb579c351d5c77deb0d34bccb36a775cd9", size = 816905, upload-time = "2026-09-29T00:48:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/62/14/9940763201c51d537786304984c67d0fc3d2ed18837ffb6f09a869f6b6c9/regex-2026.9.29-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:044265d77d94f5e3cb2fd72c76723807c429cb8c533e9d4672d0334a6f14f588", size = 881527, upload-time = "2026-09-29T00:48:15.313Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e1/c842d8df0b23245ebf202f8ab9c39fd48e2db39959454ec39a41c8c72082/regex-2026.9.29-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2089fe39c406784d90101c726755ffa1497bb74638fd434300d2b88006186de8", size = 923115, upload-time = "2026-09-29T00:48:17.328Z" }, + { url = "https://files.pythonhosted.org/packages/d8/c1/98622479e3c354a446a75232e522d747d2b3df23092dcd8a5309380a2020/regex-2026.9.29-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0def9fb6abac55492d6d51cddb7225d07d6f279e774e0adc08569a54a5fc8d46", size = 820674, upload-time = "2026-09-29T00:48:19.32Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d0/5808c95f9c79ed27b5eedaafc3df6239ec56a49f2e23ea8f831b18427c82/regex-2026.9.29-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:888d60953908dcf761aa320c3e390ab8556efbdb551ace63921de90f6ae0848d", size = 793306, upload-time = "2026-09-29T00:48:21.615Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d3/021ca2638671ad20603bcd9b4d5bfa35d2610cd216a043ea7f0b44ea39f6/regex-2026.9.29-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed511a0708e2297e1d6431e7fb217e3402791e491e02da800658ace4973df1bb", size = 803103, upload-time = "2026-09-29T00:48:23.871Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2d/755c6d13ef9c657378013676c391c7a402166b3f419a464a3e058dcbe533/regex-2026.9.29-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e1172147d28d8fbcf8cb8d26c41506169f5ad8fe9ec969cb116835a19d4d8eca", size = 872175, upload-time = "2026-09-29T00:48:26.255Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fc/e1cab183b9dafe8597f58c1c766da9bf96204d3b2f232bcf3eeb75ff7b6c/regex-2026.9.29-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:92f05c9c42bde5785dc48770bc2194d9f7442544156f951e19cd31b096cec562", size = 777362, upload-time = "2026-09-29T00:48:28.389Z" }, + { url = "https://files.pythonhosted.org/packages/06/7c/e10ea17fba31fb4a1f9d13ed53a2d2a9066a2aea58d7557e263f6d99e7b0/regex-2026.9.29-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f37964e4a5e993d2fd45147741e9dff7f34a2d8c00ab94c4ea0514a4677f959e", size = 865606, upload-time = "2026-09-29T00:48:30.4Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6e/69824d9aee1fd41c54ea7264654a47c8d9d84d8a228e11c2bcf4c201ed81/regex-2026.9.29-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:951733b1bbdb71e377cec567b409f1a7881b47cfcad84121aa74cb575fa425ea", size = 807945, upload-time = "2026-09-29T00:48:32.375Z" }, + { url = "https://files.pythonhosted.org/packages/89/22/857050a86e21ce60193e02a8ef662521f2e263a645c8b1b905fc136b61a7/regex-2026.9.29-cp314-cp314t-win32.whl", hash = "sha256:65b408d8fcb273e3499e7ef2ce796810da1becd208c7fb4373692a242d79d461", size = 276758, upload-time = "2026-09-29T00:48:34.72Z" }, + { url = "https://files.pythonhosted.org/packages/4d/96/56808fe029553d7d4c703414f2a527faad2ea2bfa9ca094a2e7f8762b530/regex-2026.9.29-cp314-cp314t-win_amd64.whl", hash = "sha256:bf48516e35cf848390ea68850aba53e7c333720d2945b4d2c25b69fc5171723f", size = 286527, upload-time = "2026-09-29T00:48:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/074e2cfb3d8101a6a764aba5f7c5d1e21de087483e35bdc0c4ce2eb60364/regex-2026.9.29-cp314-cp314t-win_arm64.whl", hash = "sha256:9173db3be74a35cb6731701094b98120f7ee4876a287882a59cdea1fa7da342f", size = 285954, upload-time = "2026-09-29T00:48:38.901Z" }, + { url = "https://files.pythonhosted.org/packages/a7/dc/d84990386c9dfdf8c377f00f371b241fdc9a2c8aea0e3d66941b2e51be0b/regex-2026.9.29-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:c3589f40749acce747510bf5d589d54e376cb0930ea58b35effac97e5312b0c1", size = 497836, upload-time = "2026-09-29T00:48:40.858Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ab/a569ebde875fa12ff8c6c9a30e07503620f195e4be4d54c3d3ee8eecc283/regex-2026.9.29-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:32ab11df9677ca80bcbb5fe4eb1da9109a5019239a054836efc6fa1c64e683cf", size = 296244, upload-time = "2026-09-29T00:48:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3e/7d548e82a108e7c8b2d5246650e397a2f8db599f9b2e975466939c5b4e70/regex-2026.9.29-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:7c03031610e3e6ed1768a2b7a8fc84637c1257b50c5eacaf094c6e17a84fc563", size = 293748, upload-time = "2026-09-29T00:48:44.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/34/a8e19a52f452bbb07b32a2bef70dcdf90c2737049749f74cc12d7486fb4f/regex-2026.9.29-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:42e82e578c904445d4c8a35b8f28052cf567593215fa5db06266fbc6f77aaa2e", size = 807840, upload-time = "2026-09-29T00:48:46.948Z" }, + { url = "https://files.pythonhosted.org/packages/88/7b/11fbd4640b3bb82b72822a63c20ade4013d562d291703a9debeedc24e682/regex-2026.9.29-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0b65c72739f981377c9c22e0c5c3cd7f42da7bd8a3c9209330fac772c7d893ed", size = 879330, upload-time = "2026-09-29T00:48:49.168Z" }, + { url = "https://files.pythonhosted.org/packages/f3/55/de58c74f1f4e31586d83eb39c56872d686c4e0d0966d151884c833b94ced/regex-2026.9.29-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4408b2b27a95ca8cc48b7411945753773353b5c93b307754781086c99d3a576f", size = 919251, upload-time = "2026-09-29T00:48:51.322Z" }, + { url = "https://files.pythonhosted.org/packages/81/42/a8c480f6dd5ac59fa28ddae79afd9d7ac7e596fdb61813adc65bb6e674b8/regex-2026.9.29-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a714befaacbd10092ffe4cea0d3c5f008fb9efe9bc322c715bcdfdee414b9a3d", size = 808808, upload-time = "2026-09-29T00:48:53.529Z" }, + { url = "https://files.pythonhosted.org/packages/68/60/0bc0d1ec8b37ad64be6fa30e035251f11de9667a0fac9e82ee74517d81be/regex-2026.9.29-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33026515aebc0e70d1c89978e53e8d695d35d9e472f8d5b34465ba3c74028650", size = 789907, upload-time = "2026-09-29T00:48:56.036Z" }, + { url = "https://files.pythonhosted.org/packages/da/84/116a3ef19b3acfe81077f0bf2cbc7714a5e94bc8935b7243ab61cb0f1c3c/regex-2026.9.29-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:31b003f9a070335e2a8233ee9b14a3ca8e6d792012ae011f741bf0aaf11744c5", size = 795770, upload-time = "2026-09-29T00:48:58.284Z" }, + { url = "https://files.pythonhosted.org/packages/96/ba/e38c3f203e7e7e18c957d48e6cb6dbf96c11e95a44efa4a480522afc5d6d/regex-2026.9.29-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:c03c6eb6ece86dfdcbb34799efaa339b093132e1aceed491ba5e08fe06cdf699", size = 870671, upload-time = "2026-09-29T00:49:00.506Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0f/9ee0b0cb76c55f63684bd7fff554978e8773b4fc86e2bcb2d50772dc1086/regex-2026.9.29-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:a5300757f8a68f5b6cc33f57338d72a0e3589c5cc9ad5f8504ea06f028be582a", size = 778631, upload-time = "2026-09-29T00:49:02.984Z" }, + { url = "https://files.pythonhosted.org/packages/b6/19/e6e3eeb226af5872c4958002f6edef4e4f40ea4cc5f5665023f2019eb045/regex-2026.9.29-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:80c7cadd3fd2bfde5df8aa0787e315812cad0c313a753095d02f4c2b6c01677b", size = 862187, upload-time = "2026-09-29T00:49:05.264Z" }, + { url = "https://files.pythonhosted.org/packages/5b/62/823c102e106bb2711d6b7dfe5981552fe4467b2969c46a20c5c383cf498c/regex-2026.9.29-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3f1e6cb402a89457582cd696f982559217d13484a193202c394015297968c86d", size = 798423, upload-time = "2026-09-29T00:49:07.644Z" }, + { url = "https://files.pythonhosted.org/packages/37/e0/e927776258fa70b2f6feffc3be584ffc85ba4c1e20a320f0aee9a632fc7d/regex-2026.9.29-cp315-cp315-win32.whl", hash = "sha256:a64b85a4760337cfefdb27d42da6ed8b58e8cde3f2d57b6ef43e76ef6ea9ef47", size = 274757, upload-time = "2026-09-29T00:49:10.513Z" }, + { url = "https://files.pythonhosted.org/packages/77/04/358de85d1860238e1b4fa98fc2c80c990124a25d2e14739e28cc02c25562/regex-2026.9.29-cp315-cp315-win_amd64.whl", hash = "sha256:b3e445b66c80b4eb4234e855ce94d9adc183eedbd632816228d89930b91b2c5b", size = 283824, upload-time = "2026-09-29T00:49:12.849Z" }, + { url = "https://files.pythonhosted.org/packages/92/d3/d5c5b264784a5ab2b0f8cf620c1eeb4dbf3440d306761905e7d99345bef5/regex-2026.9.29-cp315-cp315-win_arm64.whl", hash = "sha256:8f39588af4731c8923c26810eb3b33f76f17633985e40f59c3cd45a33805a895", size = 283664, upload-time = "2026-09-29T00:49:15.331Z" }, + { url = "https://files.pythonhosted.org/packages/02/dc/f63ec2c201445ce1150fe780f5c56f16a10124d9a9da3a93161dbb0d8892/regex-2026.9.29-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:fb99cc9d45f48895d9d67f6a0b8a57f08d39c174d9f25ad97a313e0470267b1c", size = 501549, upload-time = "2026-09-29T00:49:17.705Z" }, + { url = "https://files.pythonhosted.org/packages/9a/5c/d2a698dc6bfc11fbce03f1cb0249c13284e93b79ed11f893edf6fac431c9/regex-2026.9.29-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:720537c7ea6f80dc61913184edb0ce2497a306b39ef19f28505b322553d52bdb", size = 298187, upload-time = "2026-09-29T00:49:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/85/b7/88dcdb38cd3935d4ee9e9ce9b8e56cb3b3518d1f020acfa7dd62ad289bf8/regex-2026.9.29-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:0fd2c901cc307a745ad4bc87f20060d7a0825a3371d1e93488af22e7a387f78f", size = 296157, upload-time = "2026-09-29T00:49:22.342Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/ba6c01dde33a69fc294b38b43f6677baaa5735a6248f39708031a738158a/regex-2026.9.29-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b11b589e00095ec69cf79841a76360f9b079e95b0368a25b5ebb951ab0c157ff", size = 818468, upload-time = "2026-09-29T00:49:24.612Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f1/2586693e3a2d6b1247852593d37a6c17b42a92ee44f7cdcb9a0c1494e64a/regex-2026.9.29-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d7cab119d0df0b9413f106b4d7fc34f2872d3574ed3806fb48959c830b1537da", size = 882825, upload-time = "2026-09-29T00:49:26.996Z" }, + { url = "https://files.pythonhosted.org/packages/30/51/084f3e7bdcd0e9c33665c938cf5d134dc3548cbb4a75f0197ec7bfd754b1/regex-2026.9.29-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b89efc38431793d28b7cd91227e2f952ad7c48df19132b17f43a5fec3c14143b", size = 923314, upload-time = "2026-09-29T00:49:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f1/066c6fc23b7dc229789c21c880b5ba5ad689fb95fed12e078266f55a1f9b/regex-2026.9.29-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80a5ea3b4fd9d6a5b9a44f7976a9acaaab35aa3c1f6b29e5bd857dfabaded223", size = 822222, upload-time = "2026-09-29T00:49:32.404Z" }, + { url = "https://files.pythonhosted.org/packages/0a/56/592cd46fdb8f2f8682a1d7fd1310e4d0bcb93fbd0e6bbe4141ac28240227/regex-2026.9.29-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:19959129885356df0e97556856f77eb2888380dac18bed075a7c05c5128c618d", size = 794882, upload-time = "2026-09-29T00:49:35.076Z" }, + { url = "https://files.pythonhosted.org/packages/ee/4d/d65384bb071c864b01aa8314e3a6a687845ebd57588390976edc960c218b/regex-2026.9.29-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:6a1a824fbed817e0a891103886b68f063b1e83cc51bc97192a90a60195a9291f", size = 805887, upload-time = "2026-09-29T00:49:37.395Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/358de0d8f40d5178e4f7e7e121cfd5b961c812b77a055d11f5079e3f8fd7/regex-2026.9.29-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1ba8c6a416569ce0d37e83e28a254a61dc99a419084dfb6476cea02d997f74fa", size = 872901, upload-time = "2026-09-29T00:49:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/00/06/6bfded72d043240c6b52bbb5e16f639d81affbf7484b4fe2ec45f3d4afc9/regex-2026.9.29-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:446654b29bfaa30500d80947eda42cef1449dc8a87f4e3cf061cc8485d3a1f0b", size = 782970, upload-time = "2026-09-29T00:49:42.581Z" }, + { url = "https://files.pythonhosted.org/packages/5a/20/9f418a50baa78b3ed8308fcb0cc49e472dd000b7ef935a7295af202ea744/regex-2026.9.29-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:bf3c49863c23a1ad6da9c30351aed6cff8d5ddbeb63c5c8420ae54e98c7d0138", size = 865441, upload-time = "2026-09-29T00:49:45.238Z" }, + { url = "https://files.pythonhosted.org/packages/2c/29/817c7eacdeaf8463123e949bd394c39ad024eea1ec38ddf5ad141da2f3bd/regex-2026.9.29-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:01000ddf0e3ffef97f2413ceb514f6313040106b6d18a03ee00a4fe35c1eb1db", size = 809431, upload-time = "2026-09-29T00:49:47.878Z" }, + { url = "https://files.pythonhosted.org/packages/63/0b/83aab3b5b739947f744135a7a3a446e25433ebc92b05e01aae197ccbfdda/regex-2026.9.29-cp315-cp315t-win32.whl", hash = "sha256:c4e38dd8f39c43a91d2410ad2b85610701b0979342c3df1d69eaf8e838c757d8", size = 276964, upload-time = "2026-09-29T00:49:50.524Z" }, + { url = "https://files.pythonhosted.org/packages/72/f2/6314b5fc68789b5dcc38885bc6e3d6986b34fb3372b7231088ee5cecaa05/regex-2026.9.29-cp315-cp315t-win_amd64.whl", hash = "sha256:e2c89e9b762c57f59d5e99ee8b20202adb892e35f8d3485741340999ca55058e", size = 286487, upload-time = "2026-09-29T00:49:53.224Z" }, + { url = "https://files.pythonhosted.org/packages/56/bc/97b2245c8c7b2dd01f2db74f2bea003cd33c15009b4996a2447f46b5325c/regex-2026.9.29-cp315-cp315t-win_arm64.whl", hash = "sha256:e8c65ef3862a8ad6e86492b6ed9327805dd66904c012bd3649dc67d822ed6c34", size = 285955, upload-time = "2026-09-29T00:49:55.655Z" }, +] + [[package]] name = "reportlab" version = "4.5.1" @@ -2641,14 +2881,14 @@ wheels = [ [[package]] name = "s3transfer" -version = "0.13.0" +version = "0.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/5d/9dcc100abc6711e8247af5aa561fc07c4a046f72f659c3adea9a449e191a/s3transfer-0.13.0.tar.gz", hash = "sha256:f5e6db74eb7776a37208001113ea7aa97695368242b364d73e91c981ac522177", size = 150232, upload-time = "2025-05-22T19:24:50.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/43/35e4d8aa320bffe8287fe8f65f578fa2d2db0a64212f0e710dce58267854/s3transfer-0.19.2.tar.gz", hash = "sha256:ba0309fd86be3c27dbf78cdd813c13c5e1df16e5874b99d2535ebbdfb9892993", size = 165592, upload-time = "2026-07-22T19:30:44.432Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/17/22bf8155aa0ea2305eefa3a6402e040df7ebe512d1310165eda1e233c3f8/s3transfer-0.13.0-py3-none-any.whl", hash = "sha256:0148ef34d6dd964d0d8cf4311b2b21c474693e57c2e069ec708ce043d2b527be", size = 85152, upload-time = "2025-05-22T19:24:48.703Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e7/5c595c75e9f41a44f30e526eda465ea0b4eec93470e074e4a111b253f13a/s3transfer-0.19.2-py3-none-any.whl", hash = "sha256:d8168eccca828cbb2cd573675333f3bddd254313a9c42494b84c76b539e8ba25", size = 90216, upload-time = "2026-07-22T19:30:43.251Z" }, ] [[package]] @@ -2798,17 +3038,17 @@ wheels = [ [[package]] name = "typer" -version = "0.16.0" +version = "0.21.2" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-doc" }, { name = "click" }, { name = "rich" }, { name = "shellingham" }, - { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload-time = "2025-05-26T14:30:31.824Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/1e/a27cc02a0cd715118c71fa2aef2c687fdefc3c28d90fd0dd789c5118154c/typer-0.21.2.tar.gz", hash = "sha256:1abd95a3b675e17ff61b0838ac637fe9478d446d62ad17fa4bb81ea57cc54028", size = 120426, upload-time = "2026-02-10T19:33:46.182Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cc/d59f893fbdfb5f58770c05febfc4086a46875f1084453621c35605cec946/typer-0.21.2-py3-none-any.whl", hash = "sha256:c3d8de54d00347ef90b82131ca946274f017cffb46683ae3883c360fa958f55c", size = 56728, upload-time = "2026-02-10T19:33:48.01Z" }, ] [[package]] @@ -3112,84 +3352,135 @@ wheels = [ [[package]] name = "yarl" -version = "1.20.1" +version = "1.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", size = 186428, upload-time = "2025-06-10T00:46:09.923Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/18/893b50efc2350e47a874c5c2d67e55a0ea5df91186b2a6f5ac52eff887cd/yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e", size = 133833, upload-time = "2025-06-10T00:43:07.393Z" }, - { url = "https://files.pythonhosted.org/packages/89/ed/b8773448030e6fc47fa797f099ab9eab151a43a25717f9ac043844ad5ea3/yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b", size = 91070, upload-time = "2025-06-10T00:43:09.538Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e3/409bd17b1e42619bf69f60e4f031ce1ccb29bd7380117a55529e76933464/yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b", size = 89818, upload-time = "2025-06-10T00:43:11.575Z" }, - { url = "https://files.pythonhosted.org/packages/f8/77/64d8431a4d77c856eb2d82aa3de2ad6741365245a29b3a9543cd598ed8c5/yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4", size = 347003, upload-time = "2025-06-10T00:43:14.088Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d2/0c7e4def093dcef0bd9fa22d4d24b023788b0a33b8d0088b51aa51e21e99/yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1", size = 336537, upload-time = "2025-06-10T00:43:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f3/fc514f4b2cf02cb59d10cbfe228691d25929ce8f72a38db07d3febc3f706/yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833", size = 362358, upload-time = "2025-06-10T00:43:18.704Z" }, - { url = "https://files.pythonhosted.org/packages/ea/6d/a313ac8d8391381ff9006ac05f1d4331cee3b1efaa833a53d12253733255/yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d", size = 357362, upload-time = "2025-06-10T00:43:20.888Z" }, - { url = "https://files.pythonhosted.org/packages/00/70/8f78a95d6935a70263d46caa3dd18e1f223cf2f2ff2037baa01a22bc5b22/yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8", size = 348979, upload-time = "2025-06-10T00:43:23.169Z" }, - { url = "https://files.pythonhosted.org/packages/cb/05/42773027968968f4f15143553970ee36ead27038d627f457cc44bbbeecf3/yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf", size = 337274, upload-time = "2025-06-10T00:43:27.111Z" }, - { url = "https://files.pythonhosted.org/packages/05/be/665634aa196954156741ea591d2f946f1b78ceee8bb8f28488bf28c0dd62/yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e", size = 363294, upload-time = "2025-06-10T00:43:28.96Z" }, - { url = "https://files.pythonhosted.org/packages/eb/90/73448401d36fa4e210ece5579895731f190d5119c4b66b43b52182e88cd5/yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389", size = 358169, upload-time = "2025-06-10T00:43:30.701Z" }, - { url = "https://files.pythonhosted.org/packages/c3/b0/fce922d46dc1eb43c811f1889f7daa6001b27a4005587e94878570300881/yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f", size = 362776, upload-time = "2025-06-10T00:43:32.51Z" }, - { url = "https://files.pythonhosted.org/packages/f1/0d/b172628fce039dae8977fd22caeff3eeebffd52e86060413f5673767c427/yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845", size = 381341, upload-time = "2025-06-10T00:43:34.543Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9b/5b886d7671f4580209e855974fe1cecec409aa4a89ea58b8f0560dc529b1/yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1", size = 379988, upload-time = "2025-06-10T00:43:36.489Z" }, - { url = "https://files.pythonhosted.org/packages/73/be/75ef5fd0fcd8f083a5d13f78fd3f009528132a1f2a1d7c925c39fa20aa79/yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e", size = 371113, upload-time = "2025-06-10T00:43:38.592Z" }, - { url = "https://files.pythonhosted.org/packages/50/4f/62faab3b479dfdcb741fe9e3f0323e2a7d5cd1ab2edc73221d57ad4834b2/yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773", size = 81485, upload-time = "2025-06-10T00:43:41.038Z" }, - { url = "https://files.pythonhosted.org/packages/f0/09/d9c7942f8f05c32ec72cd5c8e041c8b29b5807328b68b4801ff2511d4d5e/yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e", size = 86686, upload-time = "2025-06-10T00:43:42.692Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9a/cb7fad7d73c69f296eda6815e4a2c7ed53fc70c2f136479a91c8e5fbdb6d/yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9", size = 133667, upload-time = "2025-06-10T00:43:44.369Z" }, - { url = "https://files.pythonhosted.org/packages/67/38/688577a1cb1e656e3971fb66a3492501c5a5df56d99722e57c98249e5b8a/yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a", size = 91025, upload-time = "2025-06-10T00:43:46.295Z" }, - { url = "https://files.pythonhosted.org/packages/50/ec/72991ae51febeb11a42813fc259f0d4c8e0507f2b74b5514618d8b640365/yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2", size = 89709, upload-time = "2025-06-10T00:43:48.22Z" }, - { url = "https://files.pythonhosted.org/packages/99/da/4d798025490e89426e9f976702e5f9482005c548c579bdae792a4c37769e/yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee", size = 352287, upload-time = "2025-06-10T00:43:49.924Z" }, - { url = "https://files.pythonhosted.org/packages/1a/26/54a15c6a567aac1c61b18aa0f4b8aa2e285a52d547d1be8bf48abe2b3991/yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819", size = 345429, upload-time = "2025-06-10T00:43:51.7Z" }, - { url = "https://files.pythonhosted.org/packages/d6/95/9dcf2386cb875b234353b93ec43e40219e14900e046bf6ac118f94b1e353/yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16", size = 365429, upload-time = "2025-06-10T00:43:53.494Z" }, - { url = "https://files.pythonhosted.org/packages/91/b2/33a8750f6a4bc224242a635f5f2cff6d6ad5ba651f6edcccf721992c21a0/yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6", size = 363862, upload-time = "2025-06-10T00:43:55.766Z" }, - { url = "https://files.pythonhosted.org/packages/98/28/3ab7acc5b51f4434b181b0cee8f1f4b77a65919700a355fb3617f9488874/yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd", size = 355616, upload-time = "2025-06-10T00:43:58.056Z" }, - { url = "https://files.pythonhosted.org/packages/36/a3/f666894aa947a371724ec7cd2e5daa78ee8a777b21509b4252dd7bd15e29/yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a", size = 339954, upload-time = "2025-06-10T00:43:59.773Z" }, - { url = "https://files.pythonhosted.org/packages/f1/81/5f466427e09773c04219d3450d7a1256138a010b6c9f0af2d48565e9ad13/yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38", size = 365575, upload-time = "2025-06-10T00:44:02.051Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e3/e4b0ad8403e97e6c9972dd587388940a032f030ebec196ab81a3b8e94d31/yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef", size = 365061, upload-time = "2025-06-10T00:44:04.196Z" }, - { url = "https://files.pythonhosted.org/packages/ac/99/b8a142e79eb86c926f9f06452eb13ecb1bb5713bd01dc0038faf5452e544/yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f", size = 364142, upload-time = "2025-06-10T00:44:06.527Z" }, - { url = "https://files.pythonhosted.org/packages/34/f2/08ed34a4a506d82a1a3e5bab99ccd930a040f9b6449e9fd050320e45845c/yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8", size = 381894, upload-time = "2025-06-10T00:44:08.379Z" }, - { url = "https://files.pythonhosted.org/packages/92/f8/9a3fbf0968eac704f681726eff595dce9b49c8a25cd92bf83df209668285/yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a", size = 383378, upload-time = "2025-06-10T00:44:10.51Z" }, - { url = "https://files.pythonhosted.org/packages/af/85/9363f77bdfa1e4d690957cd39d192c4cacd1c58965df0470a4905253b54f/yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004", size = 374069, upload-time = "2025-06-10T00:44:12.834Z" }, - { url = "https://files.pythonhosted.org/packages/35/99/9918c8739ba271dcd935400cff8b32e3cd319eaf02fcd023d5dcd487a7c8/yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5", size = 81249, upload-time = "2025-06-10T00:44:14.731Z" }, - { url = "https://files.pythonhosted.org/packages/eb/83/5d9092950565481b413b31a23e75dd3418ff0a277d6e0abf3729d4d1ce25/yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698", size = 86710, upload-time = "2025-06-10T00:44:16.716Z" }, - { url = "https://files.pythonhosted.org/packages/8a/e1/2411b6d7f769a07687acee88a062af5833cf1966b7266f3d8dfb3d3dc7d3/yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a", size = 131811, upload-time = "2025-06-10T00:44:18.933Z" }, - { url = "https://files.pythonhosted.org/packages/b2/27/584394e1cb76fb771371770eccad35de400e7b434ce3142c2dd27392c968/yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3", size = 90078, upload-time = "2025-06-10T00:44:20.635Z" }, - { url = "https://files.pythonhosted.org/packages/bf/9a/3246ae92d4049099f52d9b0fe3486e3b500e29b7ea872d0f152966fc209d/yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7", size = 88748, upload-time = "2025-06-10T00:44:22.34Z" }, - { url = "https://files.pythonhosted.org/packages/a3/25/35afe384e31115a1a801fbcf84012d7a066d89035befae7c5d4284df1e03/yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691", size = 349595, upload-time = "2025-06-10T00:44:24.314Z" }, - { url = "https://files.pythonhosted.org/packages/28/2d/8aca6cb2cabc8f12efcb82749b9cefecbccfc7b0384e56cd71058ccee433/yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31", size = 342616, upload-time = "2025-06-10T00:44:26.167Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e9/1312633d16b31acf0098d30440ca855e3492d66623dafb8e25b03d00c3da/yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28", size = 361324, upload-time = "2025-06-10T00:44:27.915Z" }, - { url = "https://files.pythonhosted.org/packages/bc/a0/688cc99463f12f7669eec7c8acc71ef56a1521b99eab7cd3abb75af887b0/yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653", size = 359676, upload-time = "2025-06-10T00:44:30.041Z" }, - { url = "https://files.pythonhosted.org/packages/af/44/46407d7f7a56e9a85a4c207724c9f2c545c060380718eea9088f222ba697/yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5", size = 352614, upload-time = "2025-06-10T00:44:32.171Z" }, - { url = "https://files.pythonhosted.org/packages/b1/91/31163295e82b8d5485d31d9cf7754d973d41915cadce070491778d9c9825/yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02", size = 336766, upload-time = "2025-06-10T00:44:34.494Z" }, - { url = "https://files.pythonhosted.org/packages/b4/8e/c41a5bc482121f51c083c4c2bcd16b9e01e1cf8729e380273a952513a21f/yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53", size = 364615, upload-time = "2025-06-10T00:44:36.856Z" }, - { url = "https://files.pythonhosted.org/packages/e3/5b/61a3b054238d33d70ea06ebba7e58597891b71c699e247df35cc984ab393/yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc", size = 360982, upload-time = "2025-06-10T00:44:39.141Z" }, - { url = "https://files.pythonhosted.org/packages/df/a3/6a72fb83f8d478cb201d14927bc8040af901811a88e0ff2da7842dd0ed19/yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04", size = 369792, upload-time = "2025-06-10T00:44:40.934Z" }, - { url = "https://files.pythonhosted.org/packages/7c/af/4cc3c36dfc7c077f8dedb561eb21f69e1e9f2456b91b593882b0b18c19dc/yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4", size = 382049, upload-time = "2025-06-10T00:44:42.854Z" }, - { url = "https://files.pythonhosted.org/packages/19/3a/e54e2c4752160115183a66dc9ee75a153f81f3ab2ba4bf79c3c53b33de34/yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b", size = 384774, upload-time = "2025-06-10T00:44:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/9c/20/200ae86dabfca89060ec6447649f219b4cbd94531e425e50d57e5f5ac330/yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1", size = 374252, upload-time = "2025-06-10T00:44:47.31Z" }, - { url = "https://files.pythonhosted.org/packages/83/75/11ee332f2f516b3d094e89448da73d557687f7d137d5a0f48c40ff211487/yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7", size = 81198, upload-time = "2025-06-10T00:44:49.164Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ba/39b1ecbf51620b40ab402b0fc817f0ff750f6d92712b44689c2c215be89d/yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c", size = 86346, upload-time = "2025-06-10T00:44:51.182Z" }, - { url = "https://files.pythonhosted.org/packages/43/c7/669c52519dca4c95153c8ad96dd123c79f354a376346b198f438e56ffeb4/yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d", size = 138826, upload-time = "2025-06-10T00:44:52.883Z" }, - { url = "https://files.pythonhosted.org/packages/6a/42/fc0053719b44f6ad04a75d7f05e0e9674d45ef62f2d9ad2c1163e5c05827/yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf", size = 93217, upload-time = "2025-06-10T00:44:54.658Z" }, - { url = "https://files.pythonhosted.org/packages/4f/7f/fa59c4c27e2a076bba0d959386e26eba77eb52ea4a0aac48e3515c186b4c/yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3", size = 92700, upload-time = "2025-06-10T00:44:56.784Z" }, - { url = "https://files.pythonhosted.org/packages/2f/d4/062b2f48e7c93481e88eff97a6312dca15ea200e959f23e96d8ab898c5b8/yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d", size = 347644, upload-time = "2025-06-10T00:44:59.071Z" }, - { url = "https://files.pythonhosted.org/packages/89/47/78b7f40d13c8f62b499cc702fdf69e090455518ae544c00a3bf4afc9fc77/yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c", size = 323452, upload-time = "2025-06-10T00:45:01.605Z" }, - { url = "https://files.pythonhosted.org/packages/eb/2b/490d3b2dc66f52987d4ee0d3090a147ea67732ce6b4d61e362c1846d0d32/yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1", size = 346378, upload-time = "2025-06-10T00:45:03.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/ad/775da9c8a94ce925d1537f939a4f17d782efef1f973039d821cbe4bcc211/yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce", size = 353261, upload-time = "2025-06-10T00:45:05.992Z" }, - { url = "https://files.pythonhosted.org/packages/4b/23/0ed0922b47a4f5c6eb9065d5ff1e459747226ddce5c6a4c111e728c9f701/yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3", size = 335987, upload-time = "2025-06-10T00:45:08.227Z" }, - { url = "https://files.pythonhosted.org/packages/3e/49/bc728a7fe7d0e9336e2b78f0958a2d6b288ba89f25a1762407a222bf53c3/yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be", size = 329361, upload-time = "2025-06-10T00:45:10.11Z" }, - { url = "https://files.pythonhosted.org/packages/93/8f/b811b9d1f617c83c907e7082a76e2b92b655400e61730cd61a1f67178393/yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16", size = 346460, upload-time = "2025-06-10T00:45:12.055Z" }, - { url = "https://files.pythonhosted.org/packages/70/fd/af94f04f275f95da2c3b8b5e1d49e3e79f1ed8b6ceb0f1664cbd902773ff/yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513", size = 334486, upload-time = "2025-06-10T00:45:13.995Z" }, - { url = "https://files.pythonhosted.org/packages/84/65/04c62e82704e7dd0a9b3f61dbaa8447f8507655fd16c51da0637b39b2910/yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f", size = 342219, upload-time = "2025-06-10T00:45:16.479Z" }, - { url = "https://files.pythonhosted.org/packages/91/95/459ca62eb958381b342d94ab9a4b6aec1ddec1f7057c487e926f03c06d30/yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390", size = 350693, upload-time = "2025-06-10T00:45:18.399Z" }, - { url = "https://files.pythonhosted.org/packages/a6/00/d393e82dd955ad20617abc546a8f1aee40534d599ff555ea053d0ec9bf03/yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458", size = 355803, upload-time = "2025-06-10T00:45:20.677Z" }, - { url = "https://files.pythonhosted.org/packages/9e/ed/c5fb04869b99b717985e244fd93029c7a8e8febdfcffa06093e32d7d44e7/yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", size = 341709, upload-time = "2025-06-10T00:45:23.221Z" }, - { url = "https://files.pythonhosted.org/packages/24/fd/725b8e73ac2a50e78a4534ac43c6addf5c1c2d65380dd48a9169cc6739a9/yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", size = 86591, upload-time = "2025-06-10T00:45:25.793Z" }, - { url = "https://files.pythonhosted.org/packages/94/c3/b2e9f38bc3e11191981d57ea08cab2166e74ea770024a646617c9cddd9f6/yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", size = 93003, upload-time = "2025-06-10T00:45:27.752Z" }, - { url = "https://files.pythonhosted.org/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", size = 46542, upload-time = "2025-06-10T00:46:07.521Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/75/16/e8be8e2fb175bbf41a0680381a319f1199fae256588241a2ac8677eafb49/yarl-1.25.1.tar.gz", hash = "sha256:03dd38de09bc213e9a8b29761eec33ee1d5318dac0e49d8af36e4d27830e23a7", size = 246245, upload-time = "2026-09-15T19:35:02.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/b3/2cea721d495ca57f8f414aa4867ee263f486b274e07463158cf52f02ba7f/yarl-1.25.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d693bf4bf534e9ba3ae2780cfd577f5135629f7b5ac653490859d0b77864865", size = 143794, upload-time = "2026-09-15T19:30:26.946Z" }, + { url = "https://files.pythonhosted.org/packages/55/e6/cd145cff8e5cf60b8b3c41fbecfa2a45028a8dec3fbc52bec03595ff3d3b/yarl-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ab2054c5531af2a9ba7b69b8ec91e4f884420e83a8c5e579b013084cb57e5e5d", size = 103993, upload-time = "2026-09-15T19:30:28.661Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7c/fbb40fe2d53747c40aa36a9e2bd2178a202f942bda0b670f3306d4aefbce/yarl-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:564fdc7085d2245ab84f88882fdb1d6ac0723124bff6ded35bfb1c00f812630d", size = 104010, upload-time = "2026-09-15T19:30:31.069Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0b/5a516f70641092283f57cf3670bdb75e7327bcc0dcb5038697e4dfbfd569/yarl-1.25.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acae6b45d1ace09b6ba3876da43b88366ef368f73b988c7f57e14231753d4420", size = 116444, upload-time = "2026-09-15T19:30:32.894Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/d1a627f827b0a404ae0f5647cab0534959081cde13b0756a783469fb3b5e/yarl-1.25.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1fb2a01ba8cd9c5d2c5dc1ec35e0fc951d04b4f037541d4ac090c993ce58b3d7", size = 107565, upload-time = "2026-09-15T19:30:35.188Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cf/c8e0aaec886840a6c4480fe44eaec7cd4319f79a563b79321473be79c56f/yarl-1.25.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e92b6bcc741b86d67606c40d3cb9c7cc8e6c737f81e31f4a94efc204456c92e3", size = 125006, upload-time = "2026-09-15T19:30:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/50/26/0cce366d54a93cdc8342965dc7663385e4db161625cc1e8b18e786753d24/yarl-1.25.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72c34ac7ad4314c19362d5ce27626dcc8429bd30bbf8c179f4234078851f9492", size = 128717, upload-time = "2026-09-15T19:30:38.904Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/a71501bbc1a674ff72c4d6c2b75f4d9a5af819f5244c3a7558080a8802c5/yarl-1.25.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5add7b4ca7afeea91d52e4d4e4db3b1fe9885b71f07054560d8c4296b7441a2", size = 117728, upload-time = "2026-09-15T19:30:40.809Z" }, + { url = "https://files.pythonhosted.org/packages/e7/6f/c3267ca01defeed9ed9c4ff9b17bd54915432c405945233265b707475d1c/yarl-1.25.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:def538065f9e4d4cf1ae164bd59aba00dfa84f03923e0de4c3788f252d6bcd17", size = 116224, upload-time = "2026-09-15T19:30:42.818Z" }, + { url = "https://files.pythonhosted.org/packages/8f/69/fad57ee52d648431718ee0f1f68966a99c1352c3924688ffbdcc9d3fe51a/yarl-1.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a191bfdb30a79b98e5d175d75285f9fcb78bf0e46ba5efda042e1c72071a0de", size = 116299, upload-time = "2026-09-15T19:30:44.966Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d4/6a8c1e29f33338687ca278cba0a8fbf6525a322c2c02a9a500ccbe041152/yarl-1.25.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:71f42c5b9a948c113bbdebfa544598321431d064ff959d32e99b1feb61d68345", size = 108625, upload-time = "2026-09-15T19:30:46.874Z" }, + { url = "https://files.pythonhosted.org/packages/e8/d2/3a35ae791c9cb6522c106923ff25c3230d999091e5e65511bca23bbd9914/yarl-1.25.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:72849d892954be4d09e569b8b831ac39ce58417fedc767d4308a0fe542018a40", size = 124515, upload-time = "2026-09-15T19:30:49.082Z" }, + { url = "https://files.pythonhosted.org/packages/be/fd/2b022109a6b4af0f7dc371cf7500af380b0d4f034010243e1b0ce218dc93/yarl-1.25.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:efb01a106f971cb3752856bca2318bbdf7f01bd8823779c461586cbe5ffd5258", size = 115711, upload-time = "2026-09-15T19:30:51.208Z" }, + { url = "https://files.pythonhosted.org/packages/18/59/f7586271136c3ddb0126bbfe661844699369b76b555fe38c4efe86870b2e/yarl-1.25.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a1daf47cd95a7c3a63456336bc5aaa8c86dd3a47d07ed3d0e76132ae4666a5a1", size = 122751, upload-time = "2026-09-15T19:30:53.535Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0b/07f7a2d881f7e16c385b47fc1753382600847cad305dcc7fa0c25828acf8/yarl-1.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9489e6abf47ba37f332075a91444c7cfedb03e6ce99fbb2f116bfe1ce810da3b", size = 117983, upload-time = "2026-09-15T19:30:55.277Z" }, + { url = "https://files.pythonhosted.org/packages/aa/9d/8cdceec66a9b940700cb45931741403f045b162afd79bcb93c41cadd0972/yarl-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7306dee25b8a0e737363f347362b875094b4dc4e367311470656ae420fdbf8e", size = 102894, upload-time = "2026-09-15T19:30:57.606Z" }, + { url = "https://files.pythonhosted.org/packages/17/f1/7ec357db1d3ad2863542d71e8fe64a126bbec17b134cd7d30951196809a5/yarl-1.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:abb1384477f5901d436b5d2e5465954de46ea6098f59163d243660b5c4461d35", size = 98609, upload-time = "2026-09-15T19:30:59.705Z" }, + { url = "https://files.pythonhosted.org/packages/75/b3/cd32ac66ae622b854c2df0ac52106dda220d361b65a64fde7d5b3684aa3f/yarl-1.25.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d7aa6debf92a1dd14cb5280b083a764169a13cfb23a452111160274ed989f4", size = 144798, upload-time = "2026-09-15T19:31:01.821Z" }, + { url = "https://files.pythonhosted.org/packages/61/fb/a2c52a8007c2051ba74662afb112ecf3d00346af4c25e33df9d80fd14fb8/yarl-1.25.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83d4a37e4b95da4d8bda930d6d35b75b4cdadbacbb4980cae290ea3100b5d51d", size = 104583, upload-time = "2026-09-15T19:31:04.05Z" }, + { url = "https://files.pythonhosted.org/packages/be/dd/ee38aec8e09fdf957e50d4085453fbe202f56c6c3b4cf07b81cdb4f09ee9/yarl-1.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e029648f9c951db30e98a7d7ec90835db88ec4b32820efe2a9bdc2287e032eb6", size = 104325, upload-time = "2026-09-15T19:31:06.338Z" }, + { url = "https://files.pythonhosted.org/packages/1e/b3/058dbfb1857b484c9cf9cc135659f50b85ce66e03c99e44dc2f7b6161f55/yarl-1.25.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d781294bb815ecb5ea57ff6bbf8038e0a31a95fdf3e1788f66e0dc100d64b58", size = 115358, upload-time = "2026-09-15T19:31:08.593Z" }, + { url = "https://files.pythonhosted.org/packages/db/39/29693446cf0cf6b15a0e2f75a5d40f93c56819b05b0622196f45e95b5cc0/yarl-1.25.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e12c538e00e7c1b286a07061046b90e8124e6a9793efae2c70db6a4aad07faad", size = 107658, upload-time = "2026-09-15T19:31:10.802Z" }, + { url = "https://files.pythonhosted.org/packages/86/b3/3c4dd7e1af43b931fba95e0a722737f2ea94a6d199c802585282831d7abd/yarl-1.25.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e4de3ac4adbad3d0bc7c6f4360a7dbff5de2f15e3b723be3198074e17fd9c40", size = 122660, upload-time = "2026-09-15T19:31:12.84Z" }, + { url = "https://files.pythonhosted.org/packages/bd/b5/1b60dbc3cfc9c5712b15148c206748f2bc93953ffdbe25ea75b63dfc89c9/yarl-1.25.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:419f392a1da624877975709e3864dfe833af6cc7671b39318086d456e288380c", size = 126506, upload-time = "2026-09-15T19:31:15.088Z" }, + { url = "https://files.pythonhosted.org/packages/bc/7b/ca212cbe170ac8b96e45317ecbcf9c3c3ecf0cdec98d5b088a9c4088929b/yarl-1.25.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6f117789d22dce188e5754e8bc65b7e6ebf8cb73963b9fa761f672a5883769d", size = 117050, upload-time = "2026-09-15T19:31:17.241Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c3/72b4938cdbe619ad71ac156182faef4908846b84dc3ca4dbb4c4e6f84014/yarl-1.25.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80e47012e730da131c9f059c80936783f9659aae22dc31c03c0595590d11ed54", size = 114174, upload-time = "2026-09-15T19:31:19.294Z" }, + { url = "https://files.pythonhosted.org/packages/e8/43/268717870f9ba0cc9701a95181587f6dc8c5f387aab4aeecc83158f38a79/yarl-1.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e80f557716fd765439577131e526b8942ffc2c07bdbc5e39fa62f660ba1e963f", size = 114944, upload-time = "2026-09-15T19:31:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/da/84/baa5bf504d51fe062c4bcaf62936da97fffb43285978d0b39984824231fd/yarl-1.25.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f61964f235a43738bfac50da46fc4254943a7eea3051aeb0b6fc7c992c29fadc", size = 108263, upload-time = "2026-09-15T19:31:23.388Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/779a2ed9e0152a601a27039bed9aead3f0b79797a67e2c44bfa444622dd8/yarl-1.25.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e546fe1d4a93ebc2910f0d768baff19faa09843ab3f2036a67ed6e69fae4419d", size = 122184, upload-time = "2026-09-15T19:31:25.343Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1f/118e9e5b8f07694d63fd3222e801d7782270003f1a222aa798df3f8d5933/yarl-1.25.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cce0727fd5ac04d372fa9bbfde9febc2bcf209aadfcf0468e45dec72719895d1", size = 114001, upload-time = "2026-09-15T19:31:27.465Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/a4cf1cf372313734b17996d4007f9f73596e7a178b9485802e5494ecf484/yarl-1.25.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af4ea5b37403ef4e30f3927eaed540db942bde01d8d3ff083527c0704d1c9c68", size = 120565, upload-time = "2026-09-15T19:31:29.47Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/ad94f93ca731bc9e44d321833ab96b82a4f9f5f63cf773f81a4aeea5ecc1/yarl-1.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:68782fdb4027b8d1eee25ec35e9a6db05e863b899eb0310b3a33b6c3fef55707", size = 117060, upload-time = "2026-09-15T19:31:31.367Z" }, + { url = "https://files.pythonhosted.org/packages/bb/cc/51a7b4abf4ac593b8e7eb3794b28e5a35ae26eed8bc04787628d215af82f/yarl-1.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d575b54cb3863ef9bc290ea4b009999d55dc237326131e4853cf33e888fee03", size = 102593, upload-time = "2026-09-15T19:31:33.329Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/0941a6b93a58b59a1ec75e5333bf06929b671309c43c0cd201c172d9c39f/yarl-1.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:bc3ac7bf569f6b64dad04dd7808c7872dae8a97df657856eac05e9b7e3614a85", size = 97697, upload-time = "2026-09-15T19:31:35.855Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ed/2f3129bbcc9a5c8ba12cc2b29d8060a3bab9c8043c456cfd4b5ca3188890/yarl-1.25.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:25868beca8b6765f8f7d0e11fe6dd7c66dd4b0793b9500286d20cc92352126a5", size = 143623, upload-time = "2026-09-15T19:31:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/17/e1/f1bc3390fdca352826676b531d0712736f156919090206700421d46b2c37/yarl-1.25.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:10b2fd95332f0d716d5eee3c9fb2ce8eada19082de7fee83d32e37992fd75c26", size = 104011, upload-time = "2026-09-15T19:31:40.25Z" }, + { url = "https://files.pythonhosted.org/packages/a8/aa/50acc5c3e5da04172ae3c281c75405af4d2ca911e16120ab0563f4dffb66/yarl-1.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f12afda4eea8c8994a76d4df1875c765194f5fbe8a9d197929ea303caee29ec", size = 103677, upload-time = "2026-09-15T19:31:42.46Z" }, + { url = "https://files.pythonhosted.org/packages/30/d2/7d1e0ab9f8390e1fbcede5a6dbf70d23c96ad09b8c5567f3a514d1ddb0e2/yarl-1.25.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14b79a30a93a3ce2e8832603fd0ab780ada281b0ba5110b519a634f2d7d7d1fc", size = 115392, upload-time = "2026-09-15T19:31:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/71/e1/5ba1e3a2a22139213655e760919038e8ed7e2d4a99826d0bbddb3beb96e5/yarl-1.25.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bd6340d20ae2c7ca719b87b426e808e90743b676d05d4c26c4fb5ca71f41184", size = 107493, upload-time = "2026-09-15T19:31:46.273Z" }, + { url = "https://files.pythonhosted.org/packages/f5/53/780653d5e0f73831f467cf13548912e5eec97f21dc49fc8daf21da027df4/yarl-1.25.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:126a2533570c554719ca40a1288fdee1700b6bc82e7131aa69fa85252d92e651", size = 122537, upload-time = "2026-09-15T19:31:48.654Z" }, + { url = "https://files.pythonhosted.org/packages/03/92/d54fa70236c6036271c9c9c09fd978df5cbe3ef49ef6c46e9b833476d215/yarl-1.25.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a3faadac7d812ddac258feb57b9846b60c1b437c4f4b9ad42595c6f6fe4390df", size = 126170, upload-time = "2026-09-15T19:31:50.872Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b7/a82a49bf88340b837ef6972b508a1604ae377b9e6904b46b10cf5f1cf925/yarl-1.25.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be80550d9bfe83d9b62398a37081a90434e6df2d978ec345c3d2820de6beddab", size = 117012, upload-time = "2026-09-15T19:31:53.189Z" }, + { url = "https://files.pythonhosted.org/packages/ef/78/5d684b411e3f3602464ee9b538db48205038f8605872985f61efb809ced0/yarl-1.25.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e07595c7d6f4db270ceede356a1bd1c07a34f1c26f958d1ed0cd7b48e0d2bba3", size = 114950, upload-time = "2026-09-15T19:31:55.694Z" }, + { url = "https://files.pythonhosted.org/packages/2f/11/51d82b852c64f7fad0fc7a7ff3031517204887e874c722bbca839c0b23ac/yarl-1.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eb96ed1ae6c7d072d60840c0434aef07a2df611812810807fbc54263a6053e9a", size = 115428, upload-time = "2026-09-15T19:31:57.966Z" }, + { url = "https://files.pythonhosted.org/packages/e4/49/9d1978049bf646b9ea918313926453c6901b71c92f097467777d47d36a88/yarl-1.25.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3feb99222553a8cbedfa52c2f59dd84c3f50d5b582c728d522caf8d72769a54b", size = 108428, upload-time = "2026-09-15T19:32:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/43/35/7b8f1ebb45d7ec3dda7d1909bf44f458de41ef91e2937f107733582a5166/yarl-1.25.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a2ed0ba415ccdf08f14bf544cb78346d0f76086707ffee24921a2c84dbf1305a", size = 121961, upload-time = "2026-09-15T19:32:02.436Z" }, + { url = "https://files.pythonhosted.org/packages/63/d6/d8b689ab7ca26edeb85f6ff28812aac7a25376eefc1780e303a7bfbaceff/yarl-1.25.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2b49375d22299b0a834c2bca72f39aaecc270d96fb24c30424899676f487b22a", size = 114961, upload-time = "2026-09-15T19:32:04.456Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d5/1a1798ea4dc6b7ee3260010a27907ebc697c95dae99817d817ed446d24aa/yarl-1.25.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ef74070ac553c59eb4f04258722066d6c6135b7baa03b2e9f2da65c096e96d98", size = 120036, upload-time = "2026-09-15T19:32:06.5Z" }, + { url = "https://files.pythonhosted.org/packages/91/8d/b1b35ed7903da6669b1d367cb2c09436acd4ff508029b4f39a0c0c2058fc/yarl-1.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0a66db89ea473abeac4b70523cafd94db3772380e565f9d28af7a179b7af71fa", size = 117276, upload-time = "2026-09-15T19:32:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8f/4db01cef62caff0d7a4593ed694fb8a41a27a11158cab80d290221f13e57/yarl-1.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:1f51020b2eb8a003c84925638ec63c21a750a4bddd3a22ec8eac6a742dadf1b9", size = 101945, upload-time = "2026-09-15T19:32:11.545Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5e/3ce00497c5c0babb74d4130c10c3828ccd215b4819d12020c42429f991ac/yarl-1.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:b10dd0557ba422715b5206b3743192135a6022acca8baec51aa127d0a75db8fe", size = 97270, upload-time = "2026-09-15T19:32:14.127Z" }, + { url = "https://files.pythonhosted.org/packages/80/cf/54023edfab7aa773b860503db0c56e962ccab0922803ee97988c176ea090/yarl-1.25.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:a9ca696eb02e5c02a8afd872ada510eba9b7fe6e68b9572c2e9a9b1941e31e2e", size = 143975, upload-time = "2026-09-15T19:32:16.416Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a8/e6c1be0e6761d0f2d10bbf33a3e1e02b99dc83874d92945d7b461a72481e/yarl-1.25.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a5877f2255aab518ebe528289037699201d5dc5f045f2396cb30aa02db22f57f", size = 104018, upload-time = "2026-09-15T19:32:18.364Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bb/dda344765ffd3430afe1a1c66c866a57fae67786537d4f14607df6505ac1/yarl-1.25.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7a5c3115595995779ee21f2567035793911c3802a43c74f3fbb0314929ec67ac", size = 104156, upload-time = "2026-09-15T19:32:20.459Z" }, + { url = "https://files.pythonhosted.org/packages/e5/5f/ed1538bcd06009fe990d6d283dd7667f639e62a81e35c6d8c6ef6c08fb3c/yarl-1.25.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77e5099b99b37f3cf79c246998ca9f7313a78054cd1809ec46bc1afad47e1c4c", size = 116025, upload-time = "2026-09-15T19:32:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/a2/af/2185daf56b99830d3356ecfada46faaa49945de6626e842b7728088d4980/yarl-1.25.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6efaf45df6a849cef613a03a94c845647456662f85438c886bb67a9c027c8c2c", size = 106985, upload-time = "2026-09-15T19:32:24.749Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/bc1ae564fb4b04a30b6a8f250e787772581c57e4c3d5cf07ac3359de3103/yarl-1.25.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5f90e44653c4e0f78501ed9bb7d3fce835a8d62b7c6ed0cb16557534087e743", size = 123030, upload-time = "2026-09-15T19:32:27.084Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3e/e2afcde10d74e53b3fa889960991efb3019beda2b1682a01de720a302056/yarl-1.25.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:632da579b2d879f6bad20f2cfa35ded1efe2f4f77f8abb26a6234a5b236acd2f", size = 126765, upload-time = "2026-09-15T19:32:29.332Z" }, + { url = "https://files.pythonhosted.org/packages/a2/be/415b00c0fe5a0615b062a456b26623d7ec91c2bee20faea1a14045aa0469/yarl-1.25.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:30eec96e8a91bd588ce897c9543f6d5d8d34b28fbcba28a4dedf20ebeae9fe57", size = 117199, upload-time = "2026-09-15T19:32:31.49Z" }, + { url = "https://files.pythonhosted.org/packages/97/27/3d8c63ddd3e8bcfd033748ab93876678ce59bacd66e4cb1ed851c9c5b37e/yarl-1.25.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:12b6bc4906e11f5e1a1cdcb12296e7afbd366c783cc8073403cd2fb74334e453", size = 115187, upload-time = "2026-09-15T19:32:34.137Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/7a81d0be1a502a26a0d4326c6f2ecb736c824f570ea1c6529f2b0b227b50/yarl-1.25.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9d6ed3d17bccce4c05343e1ca8da13bc5c02c812a4e7282ddd05e8769322d3fc", size = 116085, upload-time = "2026-09-15T19:32:36.438Z" }, + { url = "https://files.pythonhosted.org/packages/f0/69/39fff459916aa0fab42215dc47b759586fd80f94aa56dfc4a7c15ba6e0dc/yarl-1.25.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f38a70074041d3b7e138e452799f5174198bae5bd5ab2000917badf403908c5f", size = 107996, upload-time = "2026-09-15T19:32:38.959Z" }, + { url = "https://files.pythonhosted.org/packages/c0/39/80b9a55a3335590451d9ecf3eb593a8c635351f4c905ef056d7e8a8fd9e7/yarl-1.25.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca89e4e21854ed27ec753297dde84b16c9f8e53b14a4866fb44457d643c19f8", size = 122549, upload-time = "2026-09-15T19:32:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/42/7d/a179c6757818bb59372a4adafd09f7f26a3b4a0f04c3ae404b544c0b0c82/yarl-1.25.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:1ab7618921a93767387a4b83776f751588f5b5ae9bb5bc96620e2e2e00bca868", size = 115107, upload-time = "2026-09-15T19:32:43.072Z" }, + { url = "https://files.pythonhosted.org/packages/32/2b/a773ac867e4ab53a98ed98e5cefe3bae31e6f550252ca9d1de266f1a40c5/yarl-1.25.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0ae12ff2b805fa02c4dab838005caef735e39986322698c48588d3beacb65c62", size = 120666, upload-time = "2026-09-15T19:32:45.061Z" }, + { url = "https://files.pythonhosted.org/packages/bc/41/52be6505e85b0f76b4f85b01b5de7e06a0512201abc2c95e14e099549174/yarl-1.25.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90c30ed53546da833c700115c0064c22120d1b1560f474699fd31f22dd668233", size = 117505, upload-time = "2026-09-15T19:32:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/f5/01/349c0386caedbbe488d519f252df54efac8a1459282d466c474bdd84a620/yarl-1.25.1-cp314-cp314-win_amd64.whl", hash = "sha256:acfa7e22aa6c6e7a5996a41d275bfa01efa7ea56ab890590280e9063e2cf5c1b", size = 103446, upload-time = "2026-09-15T19:32:49.615Z" }, + { url = "https://files.pythonhosted.org/packages/5c/f0/8ec63180f77912f0dc4e5a42760cb8c08d20da1d5ace3578a01b84d1f3d8/yarl-1.25.1-cp314-cp314-win_arm64.whl", hash = "sha256:8e7d98cdbb6d71e726f7d525952867096053d1f290dd4e3c50d7d313a136f414", size = 99159, upload-time = "2026-09-15T19:32:51.686Z" }, + { url = "https://files.pythonhosted.org/packages/47/7d/92d2220d6886b70ab1ed8579533ac2af2dfac716d5d929001daff7986df9/yarl-1.25.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d21f0fa80a02d05299207eeaafef345d812ace96d5306e4ef265e1d419a615fa", size = 150071, upload-time = "2026-09-15T19:32:53.911Z" }, + { url = "https://files.pythonhosted.org/packages/64/fc/b245e448124bcda9340df38e3553fa222b50260fca027a84095e9bd8642d/yarl-1.25.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17c9877a89fb6e2bca6f9087eb24cd7fb434653946ef5075e470d23d49b52287", size = 106780, upload-time = "2026-09-15T19:32:56.443Z" }, + { url = "https://files.pythonhosted.org/packages/51/e2/9a6ce2e334ebf218a30335ae76fb1696459430d42f733b8cb0d7d65b84d3/yarl-1.25.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:29273edf1530e397bd07cb784db1fbe0d2590b77569f2e24679a9c0a2d763b94", size = 107361, upload-time = "2026-09-15T19:32:58.827Z" }, + { url = "https://files.pythonhosted.org/packages/ed/70/66e8c76b569b450d16e190f15071c916c3df70b0e33927e415ac497cf0c2/yarl-1.25.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7abffdf37af1cec6a2ad69b827aa84320db5894791bc8ed932dc93fb274b7e9", size = 114396, upload-time = "2026-09-15T19:33:02.24Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/0d82838a05c57fdc05bc8b66e8c92dcc0df15e27463a5f163142d521c682/yarl-1.25.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2239a02249d9326655419e0168a28ca9008938eaab31dc29fc875c217927a6c0", size = 104882, upload-time = "2026-09-15T19:33:04.494Z" }, + { url = "https://files.pythonhosted.org/packages/86/d4/ea08615c4edaa6049a13a2f1128944d068d1893abda7d708d4d7ea01599a/yarl-1.25.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:664ec6a520b74a1df2810666eb67695fcb77fa663e6ea0a25aaf2e529cb24dfa", size = 119485, upload-time = "2026-09-15T19:33:06.583Z" }, + { url = "https://files.pythonhosted.org/packages/1a/82/0898bdce9b1ae403b308b9c733d0d24af4a3464270c2c081f457b16c3e0d/yarl-1.25.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4f1c91f5a5980a937ff8e238e98e6897e1ad74a4b1e2c0d68c73b5ffbb3f5c0b", size = 122490, upload-time = "2026-09-15T19:33:08.653Z" }, + { url = "https://files.pythonhosted.org/packages/d1/38/97d79b81c342b78246cfedb74809e68841f3198d21653e10d3232bd9c622/yarl-1.25.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c88edaec8c349ad4c5ad4c486a3defcc4b80ceb2f074436ffa0a87caf5e76a6", size = 115336, upload-time = "2026-09-15T19:33:11.056Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9d/2577896554cd310dc470adb6da0b7dd0b435cb63e2565204a7ac240e504c/yarl-1.25.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:35dcbea443fafb3eece757ad4e514560ddeb6c34cfae1582c620d7b293d7feee", size = 111825, upload-time = "2026-09-15T19:33:13.204Z" }, + { url = "https://files.pythonhosted.org/packages/29/6b/7ac49d8ba84a5c4bd73415a4c949d22c749cb3762579b3d50e48019a78aa/yarl-1.25.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:882569ff613758cac762a457a5d72d6e211b28d4bcfea89d1d71ea942b02eac0", size = 114655, upload-time = "2026-09-15T19:33:15.553Z" }, + { url = "https://files.pythonhosted.org/packages/e5/18/e5942a16723f5b72f9b1297fd5a85a54f6300cd15c0dcb5005b90cd89156/yarl-1.25.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d0f1489233a254bb3643d2f05de7d59019254d81daeca6b9162fe9edef57e0c7", size = 106395, upload-time = "2026-09-15T19:33:17.599Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2d/549fa46240781513ebc47ae7eb418df428a163a2a3d644cc9cbb3ecb7846/yarl-1.25.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:f41753a76f4f63927d03a0d8ba8f5ce0f2083bec29a8cfaccc55371b1564b96b", size = 119277, upload-time = "2026-09-15T19:33:19.973Z" }, + { url = "https://files.pythonhosted.org/packages/76/16/4763f78dcdc0b3b9fb3842b04afe72b9320857c6a69300c62a0eab03d119/yarl-1.25.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fb0eb4955adf0579001581f2f71a126e8781ba61bcd120f127b0401163c6c2d", size = 112504, upload-time = "2026-09-15T19:33:22.464Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b4/974e3edfe0d188393ce1cb9de400111c63fe61f4eb3b772a500d84c970d1/yarl-1.25.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a1e32763e641a1566507d90a8d3b19bfc3cc04a9d4e5ae3e32189874ed4b58a3", size = 116243, upload-time = "2026-09-15T19:33:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/b0/aa/157b940428da80c104ca09666a740e51c94963df65d5b112e06b52e4d7a8/yarl-1.25.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65b5b2066651b7432d389e9799d979c703bcc6ef44266bb8153ef54e91e4aab3", size = 115822, upload-time = "2026-09-15T19:33:26.886Z" }, + { url = "https://files.pythonhosted.org/packages/7e/af/19fbdce41412e1b96825544cc52cd7029d3724655d0988237972f078bd29/yarl-1.25.1-cp314-cp314t-win_amd64.whl", hash = "sha256:734f6e5400352ac4254456003d462866c684703570929cff7a7bde015d0cb371", size = 107386, upload-time = "2026-09-15T19:33:29.009Z" }, + { url = "https://files.pythonhosted.org/packages/2a/99/f6431c8968e89be608d74b28ae2d024521b2953f27dd44e0dece5e04f67a/yarl-1.25.1-cp314-cp314t-win_arm64.whl", hash = "sha256:287e99ff5aa4dc1c7630bfc683ded6f106d756c99dec432a2d7f197a784f51c6", size = 102094, upload-time = "2026-09-15T19:33:31.151Z" }, + { url = "https://files.pythonhosted.org/packages/c7/3b/4f51eab40c2eabea6c3d5b121dff4b8988dc35087732ffede12d2be8b8dd/yarl-1.25.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9b1bdaae98bc016825dd3c9d8ee1832f829b3341f9cc6ebd1a1b0a7fef7367cc", size = 143875, upload-time = "2026-09-15T19:33:33.52Z" }, + { url = "https://files.pythonhosted.org/packages/41/05/bbd58fc063f5f299a883f810760b265ca26c8167c91cb9a494d0fe2387e1/yarl-1.25.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:e7011b8fb8c4054bf0c12e5edc6cd83778b0028e99ce59b18586ed036f92cfdc", size = 104028, upload-time = "2026-09-15T19:33:36.22Z" }, + { url = "https://files.pythonhosted.org/packages/12/ee/2fba0aecb52e7020e189f684148783aa0b9cfa3b3bfb0b400646eef70ad4/yarl-1.25.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f074e8d4aa0a5798920ddb6de3d08b228c614ff3724c3e8bd7577f4bafea867b", size = 104041, upload-time = "2026-09-15T19:33:38.86Z" }, + { url = "https://files.pythonhosted.org/packages/38/35/884beab53ed88c7247d1671972b5ef116f7351fe0c7e6de8c3558372cb16/yarl-1.25.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d42e7e3ca399555578b4d617e3a6ecf13371b3743a115995fa010c7bf341459", size = 116018, upload-time = "2026-09-15T19:33:44.265Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/1a91b685afb55cc18608443ace95280e96e263a97565811732b6788d3269/yarl-1.25.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aa4ed3dd308548f9e707d9caaf005d2d7f8c1e7868f858dfeb47fe76e16b391d", size = 107033, upload-time = "2026-09-15T19:33:46.45Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c1/58b379fcb1d68d907b7fcf75200c44321896509b2a6a74abbb4b19d864d2/yarl-1.25.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42a66563d8cc056ee32e6191e05097a7b2b3bc302e0bc3133daf8710eb18bd26", size = 123257, upload-time = "2026-09-15T19:33:48.631Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2d/1fe96cf5c2aeab10095e48f38585cf5a8451fb7253234822398e52aa5336/yarl-1.25.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:98d370568f393215d605304cdb77b3d5539bd192c75b623c7304c42c8d6d8273", size = 126745, upload-time = "2026-09-15T19:33:50.999Z" }, + { url = "https://files.pythonhosted.org/packages/ad/60/8674394ce43f4dadae573a1d6f451716438e9eab7d7fe8d643c673a32d85/yarl-1.25.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23bf5b403c879a54964e0feac7285688e04bb220074878d737d331522da0a5bf", size = 117255, upload-time = "2026-09-15T19:33:53.456Z" }, + { url = "https://files.pythonhosted.org/packages/2f/72/0faa30e02605d56127d42bb987dcc97da3863b7bf70b9bfbf5f739c05e30/yarl-1.25.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d45673badd08456d0340e9364eddafe1c53a9d2896424294de4d7dd71ad3ee57", size = 115166, upload-time = "2026-09-15T19:33:55.669Z" }, + { url = "https://files.pythonhosted.org/packages/8c/90/9a46eac564c437e128285c5c1d7bb385d268394e9209d84f6bf4a14471ef/yarl-1.25.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:0136d640dfa9b0523853e411430a99f8a91eca85774c6420285a33b755bc6de3", size = 116082, upload-time = "2026-09-15T19:33:57.78Z" }, + { url = "https://files.pythonhosted.org/packages/ad/38/4b1a686a3758878f93d2f1ea943f5a165f3555769cd16e761cfd0efdca17/yarl-1.25.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:59ba3a6e1aa8cfe5adf4bd270fd965db21955401b7ca6f1696010c55ed4daec2", size = 108048, upload-time = "2026-09-15T19:34:00.25Z" }, + { url = "https://files.pythonhosted.org/packages/da/14/f348eb967f31a58348612a2b93bd8a2ab664548e2b5e879cac7f592f7201/yarl-1.25.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:87796fedc3ba97ec14fab55acb48584276e6c1e4c1e89c422bda62c838e754a9", size = 122775, upload-time = "2026-09-15T19:34:02.455Z" }, + { url = "https://files.pythonhosted.org/packages/ab/e9/4f7b79700f88cb9e8bb66f8b54f9bce1844c013a2c39fdc47112e9334c95/yarl-1.25.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:bd0912757081f89b107d6c00b2ff8a194401b0b87eadcf4481de2b865a8fd44f", size = 115096, upload-time = "2026-09-15T19:34:05.283Z" }, + { url = "https://files.pythonhosted.org/packages/cf/37/f9cb020331997d3eb887bd28d5410ecfd3d80bf163c23d7cec490d78dade/yarl-1.25.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:b51c159a9794633f5e0db7ecec7b2b6e3734eca1f5d17dc989ff3552a43ff78b", size = 120655, upload-time = "2026-09-15T19:34:07.382Z" }, + { url = "https://files.pythonhosted.org/packages/12/83/52fceb22891a41f168db7ec22fd1d81e06b6a0b8d9f70921bd3e785defd0/yarl-1.25.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:319e070a01db9920fb63761843f96a104c8e2b9427266731810dc1e22595b17c", size = 117488, upload-time = "2026-09-15T19:34:09.988Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5c/ce6c4ff1247fcbe4b33d462c23a097106d909b173fde7042bc52290466e2/yarl-1.25.1-cp315-cp315-win_amd64.whl", hash = "sha256:a2059a2d891bd156bc5184e7ab7a56e78a84dfcfdeac8c501b552533ad1c36ee", size = 103434, upload-time = "2026-09-15T19:34:12.56Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/766a906b0704fb26d52b19dc22bed48a8ba0544203b70dcf44da350e8194/yarl-1.25.1-cp315-cp315-win_arm64.whl", hash = "sha256:a78b50b4f7918a3de71105d5c0b93bbc57bb8339a4d03a9dfd449f9068e76f3d", size = 99155, upload-time = "2026-09-15T19:34:15.132Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d3/a1d09b32cb6ab14f66b44939f5b4255b8b9e747aef3974af1d5d80ccc2fd/yarl-1.25.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:b5402a340723fa7da00b5cff987ddab61276be6d11251ea71ae02bcac54890d8", size = 149284, upload-time = "2026-09-15T19:34:17.452Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/fe554d879692650bca70bfbc0df124e82e4d2bb7456f698c7756f1279a96/yarl-1.25.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:eda19ea5ee88742f47a2340816e6f2d40b53bed3ab5b69794769f36af9f35bb4", size = 106399, upload-time = "2026-09-15T19:34:21.474Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4b/e7af56177ac8d40094c82d7728224c0b8472157d50d362e5fb3b014b2bc8/yarl-1.25.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:75baa6cf9b6d1c52f3e111a130e202fd8cf0a5b3a066c3f73d615e885092e4ec", size = 106968, upload-time = "2026-09-15T19:34:23.619Z" }, + { url = "https://files.pythonhosted.org/packages/da/4f/2df41fd738d46f23ef829ae8b4468d94bb6070038fc6dfab6165ed44fea8/yarl-1.25.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbcef5a9119ef653653132cccaf999b30a0af6f33bb0a4ba80bec30056868487", size = 114717, upload-time = "2026-09-15T19:34:25.879Z" }, + { url = "https://files.pythonhosted.org/packages/69/ea/002b66df53bbd1aed1c23358ff99c9bdc744fe3f4d2740e1b2fdd7192885/yarl-1.25.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7efc9f082dfed77c316edffa9deb52888e1bc6789171887cc1f68e06d65465c8", size = 105198, upload-time = "2026-09-15T19:34:28.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/7c/95c8bc0c8f97d71e59c94525ad60d76f5c57d3f2820f08137ca8b9f0542a/yarl-1.25.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fe01645169a2112aa1d4ebc3e4c5f029c5c8f97adfc32e5d37c993b39a994d75", size = 120271, upload-time = "2026-09-15T19:34:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7a/6fe9da56ec77927baa669fd86c39c567ce6205bab53d581082c6744c8ae7/yarl-1.25.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1c557dfd5e3db046053a0bdc72261ade790ebe8e2c7a41b36b0ca1f14cb95f3", size = 123572, upload-time = "2026-09-15T19:34:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/8b/83/35f222d17fa70a14c7c74fdf112ccf5515e0c2a87082b1f9b99f7693bf57/yarl-1.25.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ce4d6ccafb33d39bd78444612d14938ead674c25702ded2ee9c54a47735d225", size = 115228, upload-time = "2026-09-15T19:34:35.344Z" }, + { url = "https://files.pythonhosted.org/packages/da/6f/fbaaf619423578a7d898d0f226ae47bc1906c293865c416d83c17b828b0e/yarl-1.25.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80a063f8297fc796296f00f100be520f209b23dc98f93ce8eba6ee7122598209", size = 111618, upload-time = "2026-09-15T19:34:37.656Z" }, + { url = "https://files.pythonhosted.org/packages/ba/78/7383278f1b3cf8e0496bd95b3281a7b09b89217b6b428db24c6b99b3deca/yarl-1.25.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:7cb414a73e21a7ab58254926073f2930cb22f5b4314ea4260a687e2b3fd4dce3", size = 114839, upload-time = "2026-09-15T19:34:40.099Z" }, + { url = "https://files.pythonhosted.org/packages/62/49/5506e5b6d29aab91bd845cc9016d88c3d3f81b81bc242b8100bdd5737825/yarl-1.25.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:85a18376073f8a39aa07be34f9fc77e2869aa72c55c441efdd2cf79a0407504d", size = 106212, upload-time = "2026-09-15T19:34:42.768Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/19877c193b7c5929f4b07118c18bbe390f3fadd0f59dd98c0cd12b31fa5c/yarl-1.25.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:77716e245c90f058466a05e6a465bb8600f767a8f4b18b4d40f3aff958e5f73c", size = 119985, upload-time = "2026-09-15T19:34:44.976Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6c/0a46fbbf9ecbcbd0cc20d2193394254b9e19817f22c814aab60f99847400/yarl-1.25.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:1e80dcf1446e1b080b1932b0d103c464a04112f5bc31f0f983ad418172063cde", size = 112081, upload-time = "2026-09-15T19:34:47.45Z" }, + { url = "https://files.pythonhosted.org/packages/ef/30/93f5d471230c74ccd06255d0842739f86551f937f9e63a5e947853c6244a/yarl-1.25.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:bdc8d8b8c22e9e43ac68316b5e6cf083dec537f4ec213cb4aa967b583bc3fa64", size = 116995, upload-time = "2026-09-15T19:34:49.972Z" }, + { url = "https://files.pythonhosted.org/packages/2b/80/c386593035ee3f9c6c6af0847b5578f2830c674794a9d7701b744a3ebd42/yarl-1.25.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbf531053a0935f2e871bcd4753f90313688772ff8c017f5ea402e315a78c1f", size = 115570, upload-time = "2026-09-15T19:34:52.628Z" }, + { url = "https://files.pythonhosted.org/packages/38/02/eef443559563ef8f2e10469387b8b1e97cb5efee95b288a56da60801f7ee/yarl-1.25.1-cp315-cp315t-win_amd64.whl", hash = "sha256:b13b88747769537f3d32e89e3a735da10c0a9e35d7322928c701b5f93d3afffd", size = 106811, upload-time = "2026-09-15T19:34:54.935Z" }, + { url = "https://files.pythonhosted.org/packages/88/91/41e284ca2cf5211e05dae031d126a3668aea88fa759df56e7e35c6ad25ba/yarl-1.25.1-cp315-cp315t-win_arm64.whl", hash = "sha256:783dd1467083f4d3f7722ad6a313f24c173e7571372738fcb7a6e6d1ba48df25", size = 101804, upload-time = "2026-09-15T19:34:57.231Z" }, + { url = "https://files.pythonhosted.org/packages/54/22/318c7980066769c6bcd9221ed2248294f5698811da099013098c670565ed/yarl-1.25.1-py3-none-any.whl", hash = "sha256:681c758b0490f9e96b78e5fa8e8dc6e648e9185bb6eaebe73183c33ea0c445f3", size = 63617, upload-time = "2026-09-15T19:34:59.616Z" }, ] [[package]]