Ticket: P1.5-S3-06
Type: Feature | Est: 0.5d
Goal: Operators switch LLM provider by changing one line in conf.yaml — zero code changes needed to deploy ARIA with Vertex AI instead of Claude Code.
Scope:
core/config.py: llm_provider() -> str reads llm.provider from conf (values: claude_code, anthropic, vertex_ai; default: claude_code)
api/dependencies.py: new get_llm_client(agent_num: str) -> LLMClientInterface factory function:
claude_code → ClaudeCodeLLMClient(model=resolve_model(agent_num))
anthropic → AnthropicLLMClient(model=resolve_model(agent_num)) (requires ANTHROPIC_API_KEY)
vertex_ai → VertexAILLMClient(model=resolve_model(agent_num), project_id=gcp_project_id(), location=gcp_region())
- Unknown value →
ValueError at startup with clear message
- Replace direct
LLMClient(model=...) construction in get_agent1(), get_agent3(), get_agent4(), get_pipeline() with get_llm_client(agent_num)
Acceptance criteria:
Ticket:
P1.5-S3-06Type: Feature | Est: 0.5d
Goal: Operators switch LLM provider by changing one line in
conf.yaml— zero code changes needed to deploy ARIA with Vertex AI instead of Claude Code.Scope:
core/config.py:llm_provider() -> strreadsllm.providerfrom conf (values:claude_code,anthropic,vertex_ai; default:claude_code)api/dependencies.py: newget_llm_client(agent_num: str) -> LLMClientInterfacefactory function:claude_code→ClaudeCodeLLMClient(model=resolve_model(agent_num))anthropic→AnthropicLLMClient(model=resolve_model(agent_num))(requiresANTHROPIC_API_KEY)vertex_ai→VertexAILLMClient(model=resolve_model(agent_num), project_id=gcp_project_id(), location=gcp_region())ValueErrorat startup with clear messageLLMClient(model=...)construction inget_agent1(),get_agent3(),get_agent4(),get_pipeline()withget_llm_client(agent_num)Acceptance criteria:
llm.provider: vertex_airoutes all agent LLM calls toVertexAILLMClientllm.provider: anthropicroutes toAnthropicLLMClientllm.provider: claude_code(or unset) routes toClaudeCodeLLMClientValueErrorat startup with clear message naming the valid options