From 62967bcca056be52d4882ae9c8844c6aed0755f9 Mon Sep 17 00:00:00 2001 From: Ari Webb Date: Mon, 23 Feb 2026 11:33:14 -0800 Subject: [PATCH] feat: parallel tool calling minimax provider [LET-7647] (#9613) * feat: parallel tool calling minimax provider * stage publish api --- fern/openapi.json | 246 +++++++++++++++++++++++++++++ letta/agents/letta_agent_v3.py | 4 +- letta/schemas/providers/minimax.py | 2 + 3 files changed, 250 insertions(+), 2 deletions(-) diff --git a/fern/openapi.json b/fern/openapi.json index e96ad63d..03fe544f 100644 --- a/fern/openapi.json +++ b/fern/openapi.json @@ -31649,6 +31649,88 @@ "type": "array", "title": "Isolated Block Ids", "description": "IDs of blocks that are isolated (specific to this conversation, overriding agent defaults)." + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model", + "description": "The model handle for this conversation (overrides agent's model). Format: provider/model-name." + }, + "model_settings": { + "anyOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/OpenAIModelSettings" + }, + { + "$ref": "#/components/schemas/AnthropicModelSettings" + }, + { + "$ref": "#/components/schemas/GoogleAIModelSettings" + }, + { + "$ref": "#/components/schemas/GoogleVertexModelSettings" + }, + { + "$ref": "#/components/schemas/AzureModelSettings" + }, + { + "$ref": "#/components/schemas/XAIModelSettings" + }, + { + "$ref": "#/components/schemas/ZAIModelSettings" + }, + { + "$ref": "#/components/schemas/GroqModelSettings" + }, + { + "$ref": "#/components/schemas/DeepseekModelSettings" + }, + { + "$ref": "#/components/schemas/TogetherModelSettings" + }, + { + "$ref": "#/components/schemas/BedrockModelSettings" + }, + { + "$ref": "#/components/schemas/OpenRouterModelSettings" + }, + { + "$ref": "#/components/schemas/ChatGPTOAuthModelSettings" + } + ], + "discriminator": { + "propertyName": "provider_type", + "mapping": { + "anthropic": "#/components/schemas/AnthropicModelSettings", + "azure": "#/components/schemas/AzureModelSettings", + "bedrock": "#/components/schemas/BedrockModelSettings", + "chatgpt_oauth": "#/components/schemas/ChatGPTOAuthModelSettings", + "deepseek": "#/components/schemas/DeepseekModelSettings", + "google_ai": "#/components/schemas/GoogleAIModelSettings", + "google_vertex": "#/components/schemas/GoogleVertexModelSettings", + "groq": "#/components/schemas/GroqModelSettings", + "openai": "#/components/schemas/OpenAIModelSettings", + "openrouter": "#/components/schemas/OpenRouterModelSettings", + "together": "#/components/schemas/TogetherModelSettings", + "xai": "#/components/schemas/XAIModelSettings", + "zai": "#/components/schemas/ZAIModelSettings" + } + } + }, + { + "type": "null" + } + ], + "title": "Model Settings", + "description": "The model settings for this conversation (overrides agent's model settings)." } }, "additionalProperties": false, @@ -32960,6 +33042,88 @@ ], "title": "Isolated Block Labels", "description": "List of block labels that should be isolated (conversation-specific) rather than shared across conversations. New blocks will be created as copies of the agent's blocks with these labels." + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model", + "description": "The model handle for this conversation (overrides agent's model). Format: provider/model-name." + }, + "model_settings": { + "anyOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/OpenAIModelSettings" + }, + { + "$ref": "#/components/schemas/AnthropicModelSettings" + }, + { + "$ref": "#/components/schemas/GoogleAIModelSettings" + }, + { + "$ref": "#/components/schemas/GoogleVertexModelSettings" + }, + { + "$ref": "#/components/schemas/AzureModelSettings" + }, + { + "$ref": "#/components/schemas/XAIModelSettings" + }, + { + "$ref": "#/components/schemas/ZAIModelSettings" + }, + { + "$ref": "#/components/schemas/GroqModelSettings" + }, + { + "$ref": "#/components/schemas/DeepseekModelSettings" + }, + { + "$ref": "#/components/schemas/TogetherModelSettings" + }, + { + "$ref": "#/components/schemas/BedrockModelSettings" + }, + { + "$ref": "#/components/schemas/OpenRouterModelSettings" + }, + { + "$ref": "#/components/schemas/ChatGPTOAuthModelSettings" + } + ], + "discriminator": { + "propertyName": "provider_type", + "mapping": { + "anthropic": "#/components/schemas/AnthropicModelSettings", + "azure": "#/components/schemas/AzureModelSettings", + "bedrock": "#/components/schemas/BedrockModelSettings", + "chatgpt_oauth": "#/components/schemas/ChatGPTOAuthModelSettings", + "deepseek": "#/components/schemas/DeepseekModelSettings", + "google_ai": "#/components/schemas/GoogleAIModelSettings", + "google_vertex": "#/components/schemas/GoogleVertexModelSettings", + "groq": "#/components/schemas/GroqModelSettings", + "openai": "#/components/schemas/OpenAIModelSettings", + "openrouter": "#/components/schemas/OpenRouterModelSettings", + "together": "#/components/schemas/TogetherModelSettings", + "xai": "#/components/schemas/XAIModelSettings", + "zai": "#/components/schemas/ZAIModelSettings" + } + } + }, + { + "type": "null" + } + ], + "title": "Model Settings", + "description": "The model settings for this conversation (overrides agent's model settings)." } }, "type": "object", @@ -47553,6 +47717,88 @@ ], "title": "Summary", "description": "A summary of the conversation." + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model", + "description": "The model handle for this conversation (overrides agent's model). Format: provider/model-name." + }, + "model_settings": { + "anyOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/OpenAIModelSettings" + }, + { + "$ref": "#/components/schemas/AnthropicModelSettings" + }, + { + "$ref": "#/components/schemas/GoogleAIModelSettings" + }, + { + "$ref": "#/components/schemas/GoogleVertexModelSettings" + }, + { + "$ref": "#/components/schemas/AzureModelSettings" + }, + { + "$ref": "#/components/schemas/XAIModelSettings" + }, + { + "$ref": "#/components/schemas/ZAIModelSettings" + }, + { + "$ref": "#/components/schemas/GroqModelSettings" + }, + { + "$ref": "#/components/schemas/DeepseekModelSettings" + }, + { + "$ref": "#/components/schemas/TogetherModelSettings" + }, + { + "$ref": "#/components/schemas/BedrockModelSettings" + }, + { + "$ref": "#/components/schemas/OpenRouterModelSettings" + }, + { + "$ref": "#/components/schemas/ChatGPTOAuthModelSettings" + } + ], + "discriminator": { + "propertyName": "provider_type", + "mapping": { + "anthropic": "#/components/schemas/AnthropicModelSettings", + "azure": "#/components/schemas/AzureModelSettings", + "bedrock": "#/components/schemas/BedrockModelSettings", + "chatgpt_oauth": "#/components/schemas/ChatGPTOAuthModelSettings", + "deepseek": "#/components/schemas/DeepseekModelSettings", + "google_ai": "#/components/schemas/GoogleAIModelSettings", + "google_vertex": "#/components/schemas/GoogleVertexModelSettings", + "groq": "#/components/schemas/GroqModelSettings", + "openai": "#/components/schemas/OpenAIModelSettings", + "openrouter": "#/components/schemas/OpenRouterModelSettings", + "together": "#/components/schemas/TogetherModelSettings", + "xai": "#/components/schemas/XAIModelSettings", + "zai": "#/components/schemas/ZAIModelSettings" + } + } + }, + { + "type": "null" + } + ], + "title": "Model Settings", + "description": "The model settings for this conversation (overrides agent's model settings)." } }, "type": "object", diff --git a/letta/agents/letta_agent_v3.py b/letta/agents/letta_agent_v3.py index 9b074ad1..75581d76 100644 --- a/letta/agents/letta_agent_v3.py +++ b/letta/agents/letta_agent_v3.py @@ -930,8 +930,8 @@ class LettaAgentV3(LettaAgentV2): or len([t for t in self.agent_state.tool_rules if t.type != "requires_approval"]) == 0 ) - # Anthropic/Bedrock parallel tool use - if self.agent_state.llm_config.model_endpoint_type in ["anthropic", "bedrock"]: + # Anthropic/Bedrock/MiniMax parallel tool use (MiniMax uses Anthropic-compatible API) + if self.agent_state.llm_config.model_endpoint_type in ["anthropic", "bedrock", "minimax"]: if ( isinstance(request_data.get("tool_choice"), dict) and "disable_parallel_tool_use" in request_data["tool_choice"] diff --git a/letta/schemas/providers/minimax.py b/letta/schemas/providers/minimax.py index 097ca5d4..28e83681 100644 --- a/letta/schemas/providers/minimax.py +++ b/letta/schemas/providers/minimax.py @@ -104,6 +104,8 @@ class MiniMaxProvider(Provider): max_tokens=model["max_output"], # MiniMax models support native thinking, similar to Claude's extended thinking put_inner_thoughts_in_kwargs=True, + # MiniMax models support parallel tool calling via Anthropic-compatible API + parallel_tool_calls=True, provider_name=self.name, provider_category=self.provider_category, )