# TITAN-4-DESIGN Dataset Factory Configuration (FAST 20, stacked mega prompt + premium polish)
#
# Goal: quick end-to-end validation with ~20 tasks while:
# - Accepting anything that builds + renders (no winners/scoring).
# - Discarding ONLY clearly broken renders via a conservative Gemini broken gate.
# - Optionally labeling "premium" (boolean) and running a single polish pass on
# confidently-non-premium renders (reverts if polish breaks anything).
#
# Usage:
# export GOOGLE_CLOUD_PROJECT=<billed-project>
# ./.venv/bin/titan-factory run --public-only --max-tasks 20 \
# --run-id oss_stacked_fast20_premium_polish \
# --config config/config-vertex-oss-mixed-stacked-fast-20-premium-polish.yaml
#
# Preview:
# ./.venv/bin/titan-factory gallery --run-id oss_stacked_fast20_premium_polish
# python -m http.server 3001 --directory out/oss_stacked_fast20_premium_polish
# # open http://localhost:3001/gallery/index.html
models:
planner:
provider: vertex
model: deepseek-ai/deepseek-v3.2-maas
publishable: true
max_tokens: 2000
temperature: 0.7
# Keep this small for a fast “20 task” test run.
ui_generators:
- provider: vertex
model: moonshotai/kimi-k2-thinking-maas
publishable: true
variants: 1
max_tokens: 65000
temperature: 0.8
# Build-fix patcher (compile-only)
patcher:
provider: vertex
model: deepseek-ai/deepseek-v3.2-maas
publishable: true
max_tokens: 16000
temperature: 0.2
# Quality polisher (can improve design/copy; still must stay build-safe)
polisher:
provider: vertex
model: deepseek-ai/deepseek-v3.2-maas
publishable: true
max_tokens: 9000
temperature: 0.5
# Vision judge for broken gate + premium gate (boolean gates)
vision_judge:
provider: gemini
model: gemini-3-flash-preview
publishable: false
max_tokens: 900
temperature: 0.0
pipeline:
skip_judge: true
generate_edit_tasks: false
# Planner prompts (what kinds of pages we ask for)
task_prompt_pack: mixed
# Mega prompt stack for UIGEN (all prompt rules applied together)
uigen_prompt_variants:
- id: stacked_all
input_mode: both
parts:
- source: builtin
- source: file
path: prompts/titan_ui_system_long.txt
- source: inline
text: |
GLOBAL OVERRIDES (APPLY EVEN IF OTHER PROMPTS CONFLICT):
- No emojis in any text. If an icon is needed, use simple inline SVG (keep icons minimal).
- Output must be STRICT: <think>...</think> followed by ONE valid JSON object.
- Quality bar: if the result looks "basic", revise inside <think> before output. Ship-ready first pass.
# Broken-only vision gate (conservative). If you want zero vision calls, set false.
broken_vision_gate_enabled: true
broken_vision_gate_min_confidence: 0.90
# Premium (boolean) vision gate + polish loop (does NOT discard for aesthetics)
premium_vision_gate_enabled: true
premium_vision_gate_min_confidence: 0.75
polish_loop_enabled: true
polish_max_rounds: 1
polish_max_candidates_per_task: 1
max_fix_rounds: 1
vision_score_threshold: 0.0
# Landing only for fast iteration
page_type_filter: ["landing"]
tasks_per_niche: 2
total_niches: 100
shuffle_tasks: true
task_shuffle_seed: 1337
model_timeout_ms: 120000
build_timeout_ms: 240000
render_timeout_ms: 90000
budget:
task_concurrency: 5
concurrency_vertex: 10
concurrency_openrouter: 10
concurrency_gemini: 2
concurrency_build: 4
concurrency_render: 1
requests_per_min_vertex: 60
requests_per_min_openrouter: 100
max_total_tasks: null
stop_after_usd: null
export:
holdout_niches: 0
validation_split: 0.0
holdout_niche_ids: []
gcs:
bucket: null
prefix: titan-factory-outputs
upload_interval_tasks: 50
vertex:
endpoint_template: "https://{region}-aiplatform.googleapis.com/v1/projects/{project}/locations/{region}/endpoints/openapi/chat/completions"
openrouter:
base_url: "https://openrouter.ai/api/v1/chat/completions"