feat: route AI model selection through action-type config
Update get_ai_provider() to accept an optional model override parameter (applied only to AnthropicProvider; Gemini always uses its own model). Thread action_type-based model resolution through send_message() and generate_final_tree() in the AI chat service. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -465,7 +465,9 @@ async def send_message(
|
|||||||
for msg in history
|
for msg in history
|
||||||
]
|
]
|
||||||
|
|
||||||
provider = get_ai_provider()
|
# Resolve model for this action type
|
||||||
|
action_model = settings.get_model_for_action(action_type)
|
||||||
|
provider = get_ai_provider(model=action_model)
|
||||||
response_text, input_tokens, output_tokens = await provider.generate_text(
|
response_text, input_tokens, output_tokens = await provider.generate_text(
|
||||||
system_prompt=system_prompt,
|
system_prompt=system_prompt,
|
||||||
messages=provider_messages,
|
messages=provider_messages,
|
||||||
@@ -584,7 +586,7 @@ Also provide metadata as a separate JSON object after the tree:
|
|||||||
|
|
||||||
provider_messages.append({"role": "user", "content": generation_instruction})
|
provider_messages.append({"role": "user", "content": generation_instruction})
|
||||||
|
|
||||||
provider = get_ai_provider()
|
provider = get_ai_provider(model=settings.get_model_for_action("generate_full"))
|
||||||
|
|
||||||
for attempt in range(2): # One try + one retry
|
for attempt in range(2): # One try + one retry
|
||||||
response_text, input_tokens, output_tokens = await provider.generate_text(
|
response_text, input_tokens, output_tokens = await provider.generate_text(
|
||||||
|
|||||||
@@ -209,9 +209,13 @@ class AnthropicProvider(AIProvider):
|
|||||||
return await self.generate_json(system_prompt, messages, max_tokens)
|
return await self.generate_json(system_prompt, messages, max_tokens)
|
||||||
|
|
||||||
|
|
||||||
def get_ai_provider() -> AIProvider:
|
def get_ai_provider(model: str | None = None) -> AIProvider:
|
||||||
"""Factory that returns the configured AI provider.
|
"""Factory that returns the configured AI provider.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
model: Optional model override (Anthropic model ID). Only applied to
|
||||||
|
AnthropicProvider; Gemini always uses settings.AI_MODEL_GEMINI.
|
||||||
|
|
||||||
Selection logic:
|
Selection logic:
|
||||||
1. If AI_PROVIDER == "gemini" and GOOGLE_AI_API_KEY is set -> GeminiProvider
|
1. If AI_PROVIDER == "gemini" and GOOGLE_AI_API_KEY is set -> GeminiProvider
|
||||||
2. If AI_PROVIDER == "anthropic" and ANTHROPIC_API_KEY is set -> AnthropicProvider
|
2. If AI_PROVIDER == "anthropic" and ANTHROPIC_API_KEY is set -> AnthropicProvider
|
||||||
@@ -230,7 +234,7 @@ def get_ai_provider() -> AIProvider:
|
|||||||
if settings.ANTHROPIC_API_KEY:
|
if settings.ANTHROPIC_API_KEY:
|
||||||
return AnthropicProvider(
|
return AnthropicProvider(
|
||||||
api_key=settings.ANTHROPIC_API_KEY,
|
api_key=settings.ANTHROPIC_API_KEY,
|
||||||
model=settings.AI_MODEL_ANTHROPIC,
|
model=model or settings.AI_MODEL_ANTHROPIC,
|
||||||
timeout=settings.AI_REQUEST_TIMEOUT_SECONDS,
|
timeout=settings.AI_REQUEST_TIMEOUT_SECONDS,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -238,7 +242,7 @@ def get_ai_provider() -> AIProvider:
|
|||||||
if settings.ANTHROPIC_API_KEY:
|
if settings.ANTHROPIC_API_KEY:
|
||||||
return AnthropicProvider(
|
return AnthropicProvider(
|
||||||
api_key=settings.ANTHROPIC_API_KEY,
|
api_key=settings.ANTHROPIC_API_KEY,
|
||||||
model=settings.AI_MODEL_ANTHROPIC,
|
model=model or settings.AI_MODEL_ANTHROPIC,
|
||||||
timeout=settings.AI_REQUEST_TIMEOUT_SECONDS,
|
timeout=settings.AI_REQUEST_TIMEOUT_SECONDS,
|
||||||
)
|
)
|
||||||
# Fallback to Gemini
|
# Fallback to Gemini
|
||||||
|
|||||||
Reference in New Issue
Block a user