Issue: ALL-43 - Allow user to choose model (opus or sonnet) in the builder UI
Date: 2026-01-15
AllSpark Builder uses multiple AI models across different services. This document maps out which services use which models, whether they have user-configurable model selection, and identifies where model selection should be added.
These services power the main "Builder UI" where users build their target applications.
| Service | Location | Default Model | Configurable? |
|---|---|---|---|
ClaudeCodeRubyService |
app/services/claude_code_ruby_service.rb:765 |
CLAUDE_CODE_MODEL env → claude-opus-4-1-20250805 |
NO - env var only |
ClaudeCodeApiService |
app/services/claude_code_api_service.rb:104 |
CLAUDE_MODEL env → claude-3-5-sonnet-20241022 |
NO - env var only |
Key Finding: The primary build session service defaults to Opus but has no UI for users to select between Opus and Sonnet.
These generate artifacts (PRDs, personas, user stories, etc.) for the target application being built.
| Service | Location | Default Provider | Default Model | Configurable? |
|---|---|---|---|---|
Llm::PrdGeneratorService |
app/services/llm/prd_generator_service.rb:29 |
gemini |
gemini-2.5-flash | NO |
Ai::PersonaGenerator |
app/services/ai/persona_generator.rb:22 |
openrouter |
google/gemini-3-pro-preview | NO |
Ai::StoryGenerator |
app/services/ai/story_generator.rb:36 |
gemini |
gemini-2.5-flash | NO |
Ai::BusinessCaseGenerator |
app/services/ai/business_case_generator.rb:20 |
gemini |
gemini-2.5-pro | NO |
Ai::JourneyFlowGenerator |
app/services/ai/journey_flow_generator.rb:11 |
openai |
gpt-4o-mini | NO |
Ai::JourneyDiscoveryService |
app/services/ai/journey_discovery_service.rb:11 |
openai |
gpt-4o-mini | NO |
Ai::SitemapGeneratorV3 |
app/services/ai/sitemap_generator_v3.rb:16 |
openai |
(provider default) | NO |
Ai::DomainModelGenerator |
app/services/ai/domain_model_generator.rb:11 |
openai |
(provider default) | NO |
Ai::DomainModelAssistant |
app/services/ai/domain_model_assistant.rb:21 |
gemini |
(provider default) | NO |
Ai::ScreenDesigner |
app/services/ai/screen_designer.rb:78 |
gemini |
(provider default) | NO |
| Service | Location | Default Model | Configurable? |
|---|---|---|---|
ScreenDesign::GeneratorService |
app/services/screen_design/generator_service.rb:248 |
claude-3-5-sonnet-20241022 |
NO |
ScreenDesign::TemplateCustomizer |
app/services/screen_design/template_customizer.rb:177 |
claude-sonnet-4-5-20250929 |
NO |
| Service | Location | Default Provider/Model | Configurable? |
|---|---|---|---|
Llm::ClaudeMdGeneratorService |
app/services/llm/claude_md_generator_service.rb:314 |
claude or openai | NO |
Llm::MarketingPageGeneratorService |
app/services/llm/marketing_page_generator_service.rb:12 |
gemini |
NO |
Llm::LogoGeneratorService |
app/services/llm/logo_generator_service.rb:21 |
openai |
NO |
SprintZero::LlmEnrichmentService |
app/services/sprint_zero/phase_generators/llm_enrichment_service.rb:111 |
gpt-4-turbo-preview |
NO |
The Assistant model is the only service with built-in model selection.
| Service | Location | Configurable? | Selection Method |
|---|---|---|---|
Assistant |
app/models/assistant.rb:211-314 |
YES | llm_model_name + model_provider attributes |
Capabilities:
llm_model_nameattribute - stores the model name (e.g., "claude-3-5-sonnet-20241022")model_providerattribute - explicit provider selection (openrouter, google, anthropic, openai)- Auto-detects provider from model name if not explicitly set
- Supports: OpenRouter, Google Gemini, Anthropic Claude, OpenAI
Model defaults are centralized in app/services/llm/configuration.rb:
# Default models (can be overridden via ENV)
openrouter_model: ENV.fetch("OPENROUTER_MODEL", "google/gemini-3-pro-preview")
openai_model: ENV.fetch("OPENAI_MODEL", "gpt-5")
claude_model: ENV.fetch("CLAUDE_MODEL", "claude-sonnet-4-5-20250929")
gemini_model: ENV.fetch("GEMINI_MODEL", "gemini-2.5-flash")| Variable | Purpose | Default |
|---|---|---|
LLM_PROVIDER |
Primary provider for most services | openai |
CLAUDE_CODE_MODEL |
Build sessions (Claude Code SDK) | claude-opus-4-1-20250805 |
CLAUDE_MODEL |
Claude API calls | claude-sonnet-4-5-20250929 |
OPENAI_MODEL |
OpenAI API calls | gpt-5 |
GEMINI_MODEL |
Gemini API calls | gemini-2.5-flash |
OPENROUTER_MODEL |
OpenRouter API calls | google/gemini-3-pro-preview |
The build session is the main "builder UI" where users interact with Claude to build their applications. Currently:
ClaudeCodeRubyServiceusesCLAUDE_CODE_MODELenv var (defaults to Opus)- No UI exists to let users choose between models
- Model selection could be added at:
- BuildSession level - per-session model choice
- AppProject level - default model for all sessions in a project
- User level - user's preferred default model
- Add model field to BuildSession or ClaudeCodeSession model
- Add UI selector in build session creation/settings
- Pass model to
ClaudeCodeRubyServicevia options
For Claude models via the Claude Code SDK:
claude-opus-4-1-20250805(current default - most capable, higher cost)claude-sonnet-4-5-20250929(faster, lower cost)
┌─────────────────────────────────────────────────────────────┐
│ BUILDER APPLICATION │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ BUILD SESSIONS (Claude Code SDK) │ │
│ │ ClaudeCodeRubyService → CLAUDE_CODE_MODEL (opus) │◄───┼── NEEDS MODEL SELECTOR
│ │ ClaudeCodeApiService → CLAUDE_MODEL (sonnet) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ SPRINT ZERO SERVICES │ │
│ │ PrdGenerator, PersonaGenerator, StoryGenerator... │ │
│ │ (Various providers: gemini, openai, openrouter) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ASSISTANT MODEL │ │
│ │ Has llm_model_name + model_provider attributes │◄───┼── ALREADY HAS SELECTOR
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘