From 4ca586b3228ac1856ed578320974178210e0ec91 Mon Sep 17 00:00:00 2001 From: Mason Daugherty Date: Mon, 9 Feb 2026 14:50:09 -0500 Subject: [PATCH] feat(model-profiles): add `text_inputs` and `text_outputs` (#35084) - Add `text_inputs` and `text_outputs` fields to `ModelProfile` - Regenerate `_profiles.py` for all providers ## Why models.dev data includes `'text'` as both an input and output modality, but we didn't capture it. models.dev broadly contains models without text input (Whisper/ASR) and without text output (image generators, TTS). Without this, downstream consumers can't filter on model text support (e.g. preventing users from passing text input to an audio-only model). --- We'd need to also run for Google, AWS and cut releases for all to propagate --- .../language_models/model_profile.py | 6 + .../langchain_model_profiles/cli.py | 7 +- .../tests/unit_tests/test_cli.py | 32 +++- libs/model-profiles/uv.lock | 10 +- .../langchain_anthropic/data/_profiles.py | 46 +++++- .../langchain_deepseek/data/_profiles.py | 4 + .../langchain_fireworks/data/_profiles.py | 110 +++++++++++++- .../groq/langchain_groq/data/_profiles.py | 47 +++++- .../langchain_huggingface/data/_profiles.py | 118 +++++++++++---- .../langchain_mistralai/data/_profiles.py | 142 +++++++++++++++++- .../openai/langchain_openai/data/_profiles.py | 100 ++++++++++++ .../langchain_perplexity/data/_profiles.py | 18 +-- .../xai/langchain_xai/data/_profiles.py | 44 ++++++ 13 files changed, 624 insertions(+), 60 deletions(-) diff --git a/libs/core/langchain_core/language_models/model_profile.py b/libs/core/langchain_core/language_models/model_profile.py index 06b91552309..8e1c6b4e21a 100644 --- a/libs/core/langchain_core/language_models/model_profile.py +++ b/libs/core/langchain_core/language_models/model_profile.py @@ -19,6 +19,9 @@ class ModelProfile(TypedDict, total=False): max_input_tokens: int """Maximum context window (tokens)""" + text_inputs: bool + """Whether text inputs are supported.""" + image_inputs: bool """Whether image inputs are supported.""" # TODO: add more detail about formats? @@ -56,6 +59,9 @@ class ModelProfile(TypedDict, total=False): reasoning_output: bool """Whether the model supports [reasoning / chain-of-thought](https://docs.langchain.com/oss/python/langchain/models#reasoning)""" + text_outputs: bool + """Whether text outputs are supported.""" + image_outputs: bool """Whether [image outputs](https://docs.langchain.com/oss/python/langchain/models#multimodal) are supported.""" diff --git a/libs/model-profiles/langchain_model_profiles/cli.py b/libs/model-profiles/langchain_model_profiles/cli.py index 772793f4df1..946d9d82e5e 100644 --- a/libs/model-profiles/langchain_model_profiles/cli.py +++ b/libs/model-profiles/langchain_model_profiles/cli.py @@ -2,6 +2,7 @@ import argparse import json +import re import sys import tempfile from pathlib import Path @@ -107,10 +108,12 @@ def _model_data_to_profile(model_data: dict[str, Any]) -> dict[str, Any]: profile = { "max_input_tokens": limit.get("context"), "max_output_tokens": limit.get("output"), + "text_inputs": "text" in input_modalities, "image_inputs": "image" in input_modalities, "audio_inputs": "audio" in input_modalities, "pdf_inputs": "pdf" in input_modalities or model_data.get("pdf_inputs"), "video_inputs": "video" in input_modalities, + "text_outputs": "text" in output_modalities, "image_outputs": "image" in output_modalities, "audio_outputs": "audio" in output_modalities, "video_outputs": "video" in output_modalities, @@ -305,7 +308,7 @@ def refresh(provider: str, data_dir: Path) -> None: # noqa: C901, PLR0915 # Write as Python module output_file = data_dir / "_profiles.py" print(f"Writing to {output_file}...") - module_content = [f'"""{MODULE_ADMONITION}"""\n', "from typing import Any\n\n"] + module_content = [f'"""{MODULE_ADMONITION}"""\n\n', "from typing import Any\n\n"] module_content.append("_PROFILES: dict[str, dict[str, Any]] = ") json_str = json.dumps(profiles, indent=4) json_str = ( @@ -313,6 +316,8 @@ def refresh(provider: str, data_dir: Path) -> None: # noqa: C901, PLR0915 .replace("false", "False") .replace("null", "None") ) + # Add trailing commas for ruff format compliance + json_str = re.sub(r"([^\s,{\[])(\n\s*[\}\]])", r"\1,\2", json_str) module_content.append(f"{json_str}\n") _write_profiles_file(output_file, "".join(module_content)) diff --git a/libs/model-profiles/tests/unit_tests/test_cli.py b/libs/model-profiles/tests/unit_tests/test_cli.py index a68a388d1f1..8cfdddc4f94 100644 --- a/libs/model-profiles/tests/unit_tests/test_cli.py +++ b/libs/model-profiles/tests/unit_tests/test_cli.py @@ -6,7 +6,7 @@ from unittest.mock import Mock, patch import pytest -from langchain_model_profiles.cli import refresh +from langchain_model_profiles.cli import _model_data_to_profile, refresh @pytest.fixture @@ -214,3 +214,33 @@ max_input_tokens = 123 assert ( module._PROFILES["custom-offline-model"]["max_input_tokens"] == 123 # type: ignore[index] ) + + +def test_model_data_to_profile_text_modalities() -> None: + """Test that text input/output modalities are correctly mapped.""" + # Model with text in both input and output + model_with_text = { + "modalities": {"input": ["text", "image"], "output": ["text"]}, + "limit": {"context": 128000, "output": 4096}, + } + profile = _model_data_to_profile(model_with_text) + assert profile["text_inputs"] is True + assert profile["text_outputs"] is True + + # Model without text input (e.g., Whisper-like audio model) + audio_only_model = { + "modalities": {"input": ["audio"], "output": ["text"]}, + "limit": {"context": 0, "output": 0}, + } + profile = _model_data_to_profile(audio_only_model) + assert profile["text_inputs"] is False + assert profile["text_outputs"] is True + + # Model without text output (e.g., image generator) + image_gen_model = { + "modalities": {"input": ["text"], "output": ["image"]}, + "limit": {}, + } + profile = _model_data_to_profile(image_gen_model) + assert profile["text_inputs"] is True + assert profile["text_outputs"] is False diff --git a/libs/model-profiles/uv.lock b/libs/model-profiles/uv.lock index 1e33746ed01..1d98b8322c2 100644 --- a/libs/model-profiles/uv.lock +++ b/libs/model-profiles/uv.lock @@ -459,7 +459,7 @@ wheels = [ [[package]] name = "langchain" -version = "1.2.7" +version = "1.2.9" source = { editable = "../langchain_v1" } dependencies = [ { name = "langchain-core" }, @@ -474,7 +474,7 @@ openai = [ [package.metadata] requires-dist = [ - { name = "langchain-anthropic", marker = "extra == 'anthropic'" }, + { name = "langchain-anthropic", marker = "extra == 'anthropic'", editable = "../partners/anthropic" }, { name = "langchain-aws", marker = "extra == 'aws'" }, { name = "langchain-azure-ai", marker = "extra == 'azure-ai'" }, { name = "langchain-community", marker = "extra == 'community'" }, @@ -517,7 +517,7 @@ test-integration = [ { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "langchainhub", specifier = ">=0.1.16,<1.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0,<2.0.0" }, - { name = "vcrpy", specifier = ">=7.0.0,<8.0.0" }, + { name = "vcrpy", specifier = ">=8.0.0,<9.0.0" }, { name = "wrapt", specifier = ">=1.15.0,<2.0.0" }, ] typing = [ @@ -527,7 +527,7 @@ typing = [ [[package]] name = "langchain-core" -version = "1.2.7" +version = "1.2.9" source = { editable = "../core" } dependencies = [ { name = "jsonpatch" }, @@ -689,7 +689,7 @@ test = [ { name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" }, { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, - { name = "vcrpy", specifier = ">=7.0.0,<8.0.0" }, + { name = "vcrpy", specifier = ">=8.0.0,<9.0.0" }, ] test-integration = [ { name = "httpx", specifier = ">=0.27.0,<1.0.0" }, diff --git a/libs/partners/anthropic/langchain_anthropic/data/_profiles.py b/libs/partners/anthropic/langchain_anthropic/data/_profiles.py index f18d575d583..0992dec8e46 100644 --- a/libs/partners/anthropic/langchain_anthropic/data/_profiles.py +++ b/libs/partners/anthropic/langchain_anthropic/data/_profiles.py @@ -19,10 +19,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-opus-4-0": { "max_input_tokens": 200000, "max_output_tokens": 32000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -36,10 +38,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-5-sonnet-20241022": { "max_input_tokens": 200000, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -53,10 +57,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-opus-4-1": { "max_input_tokens": 200000, "max_output_tokens": 32000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -70,10 +76,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-haiku-4-5": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -87,10 +95,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-5-sonnet-20240620": { "max_input_tokens": 200000, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -102,12 +112,14 @@ _PROFILES: dict[str, dict[str, Any]] = { "structured_output": False, }, "claude-opus-4-6": { - "max_input_tokens": 1000000, + "max_input_tokens": 200000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -121,10 +133,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-5-haiku-latest": { "max_input_tokens": 200000, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -138,10 +152,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-opus-4-5": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -155,10 +171,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-opus-20240229": { "max_input_tokens": 200000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -172,10 +190,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-opus-4-5-20251101": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -189,10 +209,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-sonnet-4-5": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -206,10 +228,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-sonnet-4-5-20250929": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -223,10 +247,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-sonnet-4-20250514": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -240,10 +266,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-opus-4-20250514": { "max_input_tokens": 200000, "max_output_tokens": 32000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -257,10 +285,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-5-haiku-20241022": { "max_input_tokens": 200000, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -274,10 +304,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-haiku-20240307": { "max_input_tokens": 200000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -291,10 +323,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-7-sonnet-20250219": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -308,10 +342,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-7-sonnet-latest": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -325,10 +361,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-sonnet-4-0": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -342,10 +380,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-opus-4-1-20250805": { "max_input_tokens": 200000, "max_output_tokens": 32000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -359,10 +399,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-3-sonnet-20240229": { "max_input_tokens": 200000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -376,10 +418,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "claude-haiku-4-5-20251001": { "max_input_tokens": 200000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/deepseek/langchain_deepseek/data/_profiles.py b/libs/partners/deepseek/langchain_deepseek/data/_profiles.py index 4fce50276d9..f24a7b99074 100644 --- a/libs/partners/deepseek/langchain_deepseek/data/_profiles.py +++ b/libs/partners/deepseek/langchain_deepseek/data/_profiles.py @@ -19,9 +19,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "deepseek-chat": { "max_input_tokens": 128000, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -31,9 +33,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "deepseek-reasoner": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/fireworks/langchain_fireworks/data/_profiles.py b/libs/partners/fireworks/langchain_fireworks/data/_profiles.py index 0c58dfd315c..51cf1a365b1 100644 --- a/libs/partners/fireworks/langchain_fireworks/data/_profiles.py +++ b/libs/partners/fireworks/langchain_fireworks/data/_profiles.py @@ -19,9 +19,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/deepseek-r1-0528": { "max_input_tokens": 160000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -31,9 +33,25 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/deepseek-v3p1": { "max_input_tokens": 163840, "max_output_tokens": 163840, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, + "accounts/fireworks/models/deepseek-v3p2": { + "max_input_tokens": 160000, + "max_output_tokens": 160000, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -41,11 +59,41 @@ _PROFILES: dict[str, dict[str, Any]] = { "tool_calling": True, }, "accounts/fireworks/models/minimax-m2": { - "max_input_tokens": 128000, - "max_output_tokens": 16384, + "max_input_tokens": 192000, + "max_output_tokens": 192000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, + "accounts/fireworks/models/minimax-m2p1": { + "max_input_tokens": 200000, + "max_output_tokens": 200000, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, + "accounts/fireworks/models/glm-4p7": { + "max_input_tokens": 198000, + "max_output_tokens": 198000, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -55,33 +103,81 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/deepseek-v3-0324": { "max_input_tokens": 160000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, }, + "accounts/fireworks/models/glm-4p6": { + "max_input_tokens": 198000, + "max_output_tokens": 198000, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, + "accounts/fireworks/models/kimi-k2-thinking": { + "max_input_tokens": 256000, + "max_output_tokens": 256000, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, "accounts/fireworks/models/kimi-k2-instruct": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, }, + "accounts/fireworks/models/kimi-k2p5": { + "max_input_tokens": 256000, + "max_output_tokens": 256000, + "text_inputs": True, + "image_inputs": True, + "audio_inputs": False, + "video_inputs": True, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, "accounts/fireworks/models/qwen3-235b-a22b": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -91,9 +187,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/gpt-oss-20b": { "max_input_tokens": 131072, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -103,9 +201,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/gpt-oss-120b": { "max_input_tokens": 131072, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -115,9 +215,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/glm-4p5-air": { "max_input_tokens": 131072, "max_output_tokens": 131072, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -127,9 +229,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/qwen3-coder-480b-a35b-instruct": { "max_input_tokens": 256000, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -139,9 +243,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "accounts/fireworks/models/glm-4p5": { "max_input_tokens": 131072, "max_output_tokens": 131072, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/groq/langchain_groq/data/_profiles.py b/libs/partners/groq/langchain_groq/data/_profiles.py index 8b30a1e6699..fe0c338b254 100644 --- a/libs/partners/groq/langchain_groq/data/_profiles.py +++ b/libs/partners/groq/langchain_groq/data/_profiles.py @@ -18,10 +18,12 @@ from typing import Any _PROFILES: dict[str, dict[str, Any]] = { "llama-3.1-8b-instant": { "max_input_tokens": 131072, - "max_output_tokens": 8192, + "max_output_tokens": 131072, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -31,9 +33,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "mistral-saba-24b": { "max_input_tokens": 32768, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -43,9 +47,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "llama3-8b-8192": { "max_input_tokens": 8192, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -55,9 +61,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "qwen-qwq-32b": { "max_input_tokens": 131072, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -67,9 +75,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "llama3-70b-8192": { "max_input_tokens": 8192, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -79,9 +89,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "deepseek-r1-distill-llama-70b": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -91,9 +103,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "llama-guard-3-8b": { "max_input_tokens": 8192, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -103,9 +117,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gemma2-9b-it": { "max_input_tokens": 8192, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -115,9 +131,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "llama-3.3-70b-versatile": { "max_input_tokens": 131072, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -127,21 +145,26 @@ _PROFILES: dict[str, dict[str, Any]] = { "moonshotai/kimi-k2-instruct-0905": { "max_input_tokens": 262144, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, + "structured_output": True, }, "moonshotai/kimi-k2-instruct": { "max_input_tokens": 131072, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -150,34 +173,42 @@ _PROFILES: dict[str, dict[str, Any]] = { }, "openai/gpt-oss-20b": { "max_input_tokens": 131072, - "max_output_tokens": 32768, + "max_output_tokens": 65536, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": True, "tool_calling": True, + "structured_output": True, }, "openai/gpt-oss-120b": { "max_input_tokens": 131072, - "max_output_tokens": 32768, + "max_output_tokens": 65536, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": True, "tool_calling": True, + "structured_output": True, }, "qwen/qwen3-32b": { "max_input_tokens": 131072, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -187,33 +218,41 @@ _PROFILES: dict[str, dict[str, Any]] = { "meta-llama/llama-4-scout-17b-16e-instruct": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, + "structured_output": True, }, "meta-llama/llama-4-maverick-17b-128e-instruct": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, + "structured_output": True, }, "meta-llama/llama-guard-4-12b": { "max_input_tokens": 131072, - "max_output_tokens": 128, + "max_output_tokens": 1024, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/huggingface/langchain_huggingface/data/_profiles.py b/libs/partners/huggingface/langchain_huggingface/data/_profiles.py index 15487fc2d59..1dfe9e391a3 100644 --- a/libs/partners/huggingface/langchain_huggingface/data/_profiles.py +++ b/libs/partners/huggingface/langchain_huggingface/data/_profiles.py @@ -19,33 +19,81 @@ _PROFILES: dict[str, dict[str, Any]] = { "moonshotai/Kimi-K2-Instruct": { "max_input_tokens": 131072, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, }, + "moonshotai/Kimi-K2.5": { + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "text_inputs": True, + "image_inputs": True, + "audio_inputs": False, + "video_inputs": True, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, "moonshotai/Kimi-K2-Instruct-0905": { "max_input_tokens": 262144, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, }, - "MiniMaxAI/MiniMax-M2": { - "max_input_tokens": 204800, - "max_output_tokens": 204800, + "moonshotai/Kimi-K2-Thinking": { + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, + "MiniMaxAI/MiniMax-M2.1": { + "max_input_tokens": 204800, + "max_output_tokens": 131072, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, + "XiaomiMiMo/MiMo-V2-Flash": { + "max_input_tokens": 262144, + "max_output_tokens": 4096, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -55,9 +103,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "Qwen/Qwen3-Embedding-8B": { "max_input_tokens": 32000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -67,9 +117,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "Qwen/Qwen3-Embedding-4B": { "max_input_tokens": 32000, "max_output_tokens": 2048, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -79,9 +131,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "Qwen/Qwen3-Coder-480B-A35B-Instruct": { "max_input_tokens": 262144, "max_output_tokens": 66536, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -91,9 +145,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "Qwen/Qwen3-235B-A22B-Thinking-2507": { "max_input_tokens": 262144, "max_output_tokens": 131072, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -103,9 +159,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "Qwen/Qwen3-Next-80B-A3B-Instruct": { "max_input_tokens": 262144, "max_output_tokens": 66536, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -115,69 +173,67 @@ _PROFILES: dict[str, dict[str, Any]] = { "Qwen/Qwen3-Next-80B-A3B-Thinking": { "max_input_tokens": 262144, "max_output_tokens": 131072, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, }, - "zai-org/GLM-4.5": { - "max_input_tokens": 131072, - "max_output_tokens": 98304, + "zai-org/GLM-4.7": { + "max_input_tokens": 204800, + "max_output_tokens": 131072, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": True, "tool_calling": True, }, - "zai-org/GLM-4.6": { + "zai-org/GLM-4.7-Flash": { "max_input_tokens": 200000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": True, "tool_calling": True, }, - "zai-org/GLM-4.5-Air": { - "max_input_tokens": 128000, - "max_output_tokens": 96000, - "image_inputs": False, - "audio_inputs": False, - "video_inputs": False, - "image_outputs": False, - "audio_outputs": False, - "video_outputs": False, - "reasoning_output": True, - "tool_calling": True, - }, - "deepseek-ai/Deepseek-V3-0324": { - "max_input_tokens": 16384, - "max_output_tokens": 8192, - "image_inputs": False, - "audio_inputs": False, - "video_inputs": False, - "image_outputs": False, - "audio_outputs": False, - "video_outputs": False, - "reasoning_output": False, - "tool_calling": True, - }, "deepseek-ai/DeepSeek-R1-0528": { "max_input_tokens": 163840, "max_output_tokens": 163840, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + }, + "deepseek-ai/DeepSeek-V3.2": { + "max_input_tokens": 163840, + "max_output_tokens": 65536, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/mistralai/langchain_mistralai/data/_profiles.py b/libs/partners/mistralai/langchain_mistralai/data/_profiles.py index 23e83f47007..176f90b6c80 100644 --- a/libs/partners/mistralai/langchain_mistralai/data/_profiles.py +++ b/libs/partners/mistralai/langchain_mistralai/data/_profiles.py @@ -19,9 +19,25 @@ _PROFILES: dict[str, dict[str, Any]] = { "devstral-medium-2507": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": False, + "tool_calling": True, + }, + "mistral-large-2512": { + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "text_inputs": True, + "image_inputs": True, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -31,9 +47,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "open-mixtral-8x22b": { "max_input_tokens": 64000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -43,9 +61,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "ministral-8b-latest": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -55,9 +75,39 @@ _PROFILES: dict[str, dict[str, Any]] = { "pixtral-large-latest": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": False, + "tool_calling": True, + }, + "mistral-small-2506": { + "max_input_tokens": 128000, + "max_output_tokens": 16384, + "text_inputs": True, + "image_inputs": True, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": False, + "tool_calling": True, + }, + "devstral-2512": { + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -67,9 +117,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "ministral-3b-latest": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -79,9 +131,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "pixtral-12b": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -91,9 +145,39 @@ _PROFILES: dict[str, dict[str, Any]] = { "mistral-medium-2505": { "max_input_tokens": 131072, "max_output_tokens": 131072, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": False, + "tool_calling": True, + }, + "labs-devstral-small-2512": { + "max_input_tokens": 256000, + "max_output_tokens": 256000, + "text_inputs": True, + "image_inputs": True, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": False, + "tool_calling": True, + }, + "devstral-medium-latest": { + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -103,9 +187,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "devstral-small-2505": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -115,21 +201,39 @@ _PROFILES: dict[str, dict[str, Any]] = { "mistral-medium-2508": { "max_input_tokens": 262144, "max_output_tokens": 262144, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, "reasoning_output": False, "tool_calling": True, }, + "mistral-embed": { + "max_input_tokens": 8000, + "max_output_tokens": 3072, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": False, + "tool_calling": False, + }, "mistral-small-latest": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -139,9 +243,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "magistral-small": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -151,9 +257,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "devstral-small-2507": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -163,9 +271,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "codestral-latest": { "max_input_tokens": 256000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -175,9 +285,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "open-mixtral-8x7b": { "max_input_tokens": 32000, "max_output_tokens": 32000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -187,9 +299,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "mistral-nemo": { "max_input_tokens": 128000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -199,9 +313,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "open-mistral-7b": { "max_input_tokens": 8000, "max_output_tokens": 8000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -209,11 +325,13 @@ _PROFILES: dict[str, dict[str, Any]] = { "tool_calling": True, }, "mistral-large-latest": { - "max_input_tokens": 131072, - "max_output_tokens": 16384, - "image_inputs": False, + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "text_inputs": True, + "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -223,9 +341,25 @@ _PROFILES: dict[str, dict[str, Any]] = { "mistral-medium-latest": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": False, + "tool_calling": True, + }, + "mistral-large-2411": { + "max_input_tokens": 131072, + "max_output_tokens": 16384, + "text_inputs": True, + "image_inputs": False, + "audio_inputs": False, + "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -235,9 +369,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "magistral-medium-latest": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/openai/langchain_openai/data/_profiles.py b/libs/partners/openai/langchain_openai/data/_profiles.py index 38100d9c3fd..9a5955bac1f 100644 --- a/libs/partners/openai/langchain_openai/data/_profiles.py +++ b/libs/partners/openai/langchain_openai/data/_profiles.py @@ -19,9 +19,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4.1-nano": { "max_input_tokens": 1047576, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -37,9 +39,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "text-embedding-3-small": { "max_input_tokens": 8191, "max_output_tokens": 1536, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -54,9 +58,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4": { "max_input_tokens": 8192, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -72,9 +78,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o1-pro": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -90,9 +98,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4o-2024-05-13": { "max_input_tokens": 128000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -108,10 +118,12 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.2-codex": { "max_input_tokens": 400000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "pdf_inputs": True, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -126,9 +138,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.1-codex": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -144,9 +158,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4o-2024-08-06": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -162,9 +178,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4.1-mini": { "max_input_tokens": 1047576, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -180,9 +198,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o3-deep-research": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -197,9 +217,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-3.5-turbo": { "max_input_tokens": 16385, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -215,9 +237,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.2-pro": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -233,9 +257,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "text-embedding-3-large": { "max_input_tokens": 8191, "max_output_tokens": 3072, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -250,9 +276,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4-turbo": { "max_input_tokens": 128000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -268,9 +296,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o1-preview": { "max_input_tokens": 128000, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -285,9 +315,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.1-codex-mini": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -303,9 +335,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o3-mini": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -321,9 +355,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.2-chat-latest": { "max_input_tokens": 272000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -339,9 +375,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.1": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -357,9 +395,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "codex-mini-latest": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -374,9 +414,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5-nano": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -392,9 +434,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5-codex": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -410,9 +454,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4o": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -428,9 +474,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4.1": { "max_input_tokens": 1047576, "max_output_tokens": 32768, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -446,9 +494,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o4-mini": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -464,9 +514,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o1": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -479,12 +531,34 @@ _PROFILES: dict[str, dict[str, Any]] = { "image_tool_message": True, "tool_choice": True, }, + "gpt-5.3-codex": { + "max_input_tokens": 400000, + "max_output_tokens": 128000, + "text_inputs": True, + "image_inputs": True, + "audio_inputs": False, + "pdf_inputs": True, + "video_inputs": False, + "text_outputs": True, + "image_outputs": False, + "audio_outputs": False, + "video_outputs": False, + "reasoning_output": True, + "tool_calling": True, + "structured_output": True, + "image_url_inputs": True, + "pdf_tool_message": True, + "image_tool_message": True, + "tool_choice": True, + }, "gpt-5-mini": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -500,9 +574,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o1-mini": { "max_input_tokens": 128000, "max_output_tokens": 65536, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -518,9 +594,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "text-embedding-ada-002": { "max_input_tokens": 8192, "max_output_tokens": 1536, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -535,9 +613,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o3-pro": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -553,9 +633,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4o-2024-11-20": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -571,9 +653,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.1-codex-max": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -589,9 +673,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o3": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -607,9 +693,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "o4-mini-deep-research": { "max_input_tokens": 200000, "max_output_tokens": 100000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -624,9 +712,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5-chat-latest": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -642,9 +732,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-4o-mini": { "max_input_tokens": 128000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -660,9 +752,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -678,9 +772,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5-pro": { "max_input_tokens": 272000, "max_output_tokens": 272000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -696,9 +792,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.2": { "max_input_tokens": 272000, "max_output_tokens": 128000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -714,9 +812,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "gpt-5.1-chat-latest": { "max_input_tokens": 272000, "max_output_tokens": 16384, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/perplexity/langchain_perplexity/data/_profiles.py b/libs/partners/perplexity/langchain_perplexity/data/_profiles.py index d277e7da9cc..9caac20bedb 100644 --- a/libs/partners/perplexity/langchain_perplexity/data/_profiles.py +++ b/libs/partners/perplexity/langchain_perplexity/data/_profiles.py @@ -16,24 +16,14 @@ https://docs.langchain.com/oss/python/langchain/models#updating-or-overwriting-p from typing import Any _PROFILES: dict[str, dict[str, Any]] = { - "sonar-reasoning": { - "max_input_tokens": 128000, - "max_output_tokens": 4096, - "image_inputs": False, - "audio_inputs": False, - "video_inputs": False, - "image_outputs": False, - "audio_outputs": False, - "video_outputs": False, - "reasoning_output": True, - "tool_calling": False, - }, "sonar": { "max_input_tokens": 128000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -43,9 +33,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "sonar-pro": { "max_input_tokens": 200000, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -55,9 +47,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "sonar-reasoning-pro": { "max_input_tokens": 128000, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, diff --git a/libs/partners/xai/langchain_xai/data/_profiles.py b/libs/partners/xai/langchain_xai/data/_profiles.py index 909247953d9..43e4d4d98b9 100644 --- a/libs/partners/xai/langchain_xai/data/_profiles.py +++ b/libs/partners/xai/langchain_xai/data/_profiles.py @@ -19,9 +19,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-4-fast-non-reasoning": { "max_input_tokens": 2000000, "max_output_tokens": 30000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -31,9 +33,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3-fast": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -43,9 +47,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-4": { "max_input_tokens": 256000, "max_output_tokens": 64000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -55,9 +61,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-2-vision": { "max_input_tokens": 8192, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -67,9 +75,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-code-fast-1": { "max_input_tokens": 256000, "max_output_tokens": 10000, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -79,9 +89,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-2": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -91,9 +103,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3-mini-fast-latest": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -103,9 +117,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-2-vision-1212": { "max_input_tokens": 8192, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -115,9 +131,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -127,9 +145,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-4-fast": { "max_input_tokens": 2000000, "max_output_tokens": 30000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -139,9 +159,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-2-latest": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -151,9 +173,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-4-1-fast": { "max_input_tokens": 2000000, "max_output_tokens": 30000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -163,9 +187,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-2-1212": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -175,9 +201,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3-fast-latest": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -187,9 +215,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3-latest": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -199,9 +229,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-2-vision-latest": { "max_input_tokens": 8192, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -211,9 +243,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-vision-beta": { "max_input_tokens": 8192, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -223,9 +257,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3-mini": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -235,9 +271,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-beta": { "max_input_tokens": 131072, "max_output_tokens": 4096, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -247,9 +285,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3-mini-latest": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -259,9 +299,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-4-1-fast-non-reasoning": { "max_input_tokens": 2000000, "max_output_tokens": 30000, + "text_inputs": True, "image_inputs": True, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False, @@ -271,9 +313,11 @@ _PROFILES: dict[str, dict[str, Any]] = { "grok-3-mini-fast": { "max_input_tokens": 131072, "max_output_tokens": 8192, + "text_inputs": True, "image_inputs": False, "audio_inputs": False, "video_inputs": False, + "text_outputs": True, "image_outputs": False, "audio_outputs": False, "video_outputs": False,