Referencia de configuración

Sistema de capas

La configuración se resuelve en 4 capas (menor a mayor prioridad):

1. Defaults de Pydantic (código)

2. Archivo YAML (-c config.yaml)

3. Variables de entorno (ARCHITECT_*)

4. Flags de CLI (--model, --workspace, etc.)

El deep_merge() de config/loader.py combina las capas de forma recursiva: los dicts anidados se fusionan en lugar de reemplazarse. Así puedes sobreescribir llm.model desde CLI sin perder llm.timeout del YAML.


Variables de entorno

VariableCampo de configEjemplo
LITELLM_API_KEYLeída por LiteLLM directamente (no por architect)sk-...
ARCHITECT_MODELllm.modelgpt-4o
ARCHITECT_API_BASEllm.api_basehttp://localhost:8000
ARCHITECT_LOG_LEVELlogging.leveldebug
ARCHITECT_WORKSPACEworkspace.root/home/user/project

LITELLM_API_KEY es la API key por defecto. Si necesitas una variable diferente, configura llm.api_key_env en el YAML.


Flags de CLI que sobreescriben config

FlagCampo sobrescrito
--model MODELllm.model
--api-base URLllm.api_base
--api-key KEYllm.api_key_env → key directa
--timeout NTimeout total de sesión (watchdog). No sobreescribe llm.timeout (per-request)
--no-streamllm.stream = False
--workspace PATHworkspace.root
--max-steps Nagent_config.max_steps
--mode MODEagent_config.confirm_mode
-v / -vv / -vvvlogging.verbose (count)
--log-level LEVELlogging.level
--log-file PATHlogging.file
--self-eval MODEevaluation.mode (off/basic/full)
--allow-commandscommands.enabled = True
--no-commandscommands.enabled = False
--budget FLOATcosts.budget_usd
--cachellm_cache.enabled = True
--no-cachellm_cache.enabled = False

Schema YAML completo

# ==============================================================================
# LLM
# ==============================================================================
llm:
  provider: litellm        # siempre "litellm"
  mode: direct             # "direct" | "proxy" (LiteLLM Proxy Server)
  model: gpt-4o-mini       # cualquier modelo LiteLLM

  # api_base: http://localhost:8000   # custom endpoint (Proxy, Ollama, etc.)

  api_key_env: LITELLM_API_KEY       # env var con la API key

  timeout: 60              # segundos por llamada al LLM
  retries: 2               # reintentos en errores transitorios (no auth)
  stream: true             # streaming por defecto; desactivado con --no-stream/--json/--quiet
  prompt_caching: false    # marca system prompt con cache_control → ahorro 50-90% en Anthropic/OpenAI

# ==============================================================================
# Agentes (custom o overrides de defaults)
# ==============================================================================
agents:
  # Override parcial de un default:
  build:
    confirm_mode: confirm-all    # solo sobreescribe este campo
    max_steps: 10

  # Agente completamente nuevo:
  deploy:
    system_prompt: |
      Eres un agente de deployment especializado.
      ...
    allowed_tools:
      - read_file
      - list_files
      - write_file
    confirm_mode: confirm-all
    max_steps: 15

# ==============================================================================
# Logging
# ==============================================================================
logging:
  level: human             # "debug" | "info" | "human" | "warn" | "error"
                           # v3: "human" muestra la trazabilidad del agente
  verbose: 0               # 0=solo human logs, 1=info, 2=debug, 3+=all
  # file: logs/architect.jsonl   # JSON Lines; DEBUG completo siempre

# ==============================================================================
# Workspace
# ==============================================================================
workspace:
  root: .                  # directorio raíz; todas las ops de archivos confinadas aquí
  allow_delete: false      # true = habilitar delete_file tool

# ==============================================================================
# MCP (Model Context Protocol — herramientas remotas)
# ==============================================================================
mcp:
  servers:
    - name: github
      url: http://localhost:3001
      token_env: GITHUB_TOKEN         # env var con Bearer token

    - name: database
      url: https://mcp.example.com/db
      token_env: DB_TOKEN

    # token inline (no recomendado en producción):
    # - name: internal
    #   url: http://internal:8080
    #   token: "hardcoded-token"

# ==============================================================================
# Indexer — árbol del repositorio en el system prompt (F10)
# ==============================================================================
indexer:
  enabled: true            # false = sin árbol en el prompt; las search tools siguen disponibles
  max_file_size: 1000000   # bytes; archivos más grandes se omiten del índice
  exclude_dirs: []         # dirs adicionales a excluir (además de .git, node_modules, etc.)
  # exclude_dirs:
  #   - vendor
  #   - .terraform
  exclude_patterns: []     # patrones adicionales a excluir (además de *.pyc, *.min.js, etc.)
  # exclude_patterns:
  #   - "*.generated.py"
  #   - "*.pb.go"
  use_cache: true          # caché del índice en disco, TTL de 5 minutos

# ==============================================================================
# Context — gestión del context window (F11)
# ==============================================================================
context:
  # Nivel 1: truncar tool results largos
  max_tool_result_tokens: 2000   # ~4 chars/token; 0 = desactivar truncado

  # Nivel 2: comprimir pasos antiguos con el LLM
  summarize_after_steps: 8       # 0 = desactivar compresión
  keep_recent_steps: 4           # pasos recientes a preservar íntegros

  # Nivel 3: hard limit del context window total
  max_context_tokens: 80000      # 0 = sin límite (peligroso para tareas largas)
  # Referencia: gpt-4o/mini → 80000, claude-sonnet-4-6 → 150000

  # Tool calls paralelas
  parallel_tools: true           # false = siempre secuencial

# ==============================================================================
# Evaluation — auto-evaluación del resultado (F12)
# ==============================================================================
evaluation:
  mode: off                # "off" | "basic" | "full"
                           # Override desde CLI: --self-eval basic|full
  max_retries: 2           # reintentos en modo "full" (rango: 1-5)
  confidence_threshold: 0.8  # umbral de confianza para aceptar resultado (0.0-1.0)

# ==============================================================================
# Commands — ejecución de comandos del sistema (F13)
# ==============================================================================
commands:
  enabled: true            # false = no registrar run_command; --allow-commands/--no-commands
  default_timeout: 30      # segundos por defecto (1-600)
  max_output_lines: 200    # líneas de stdout/stderr antes de truncar (10-5000)
  blocked_patterns: []     # regexes extra a bloquear (además de los built-in)
  # blocked_patterns:
  #   - "git push --force"
  #   - "docker rm"
  safe_commands: []        # comandos adicionales clasificados como 'safe'
  allowed_only: false      # si true, solo safe/dev; dangerous rechazados en execute()

# ==============================================================================
# Costs — seguimiento de costes de llamadas al LLM (F14)
# ==============================================================================
costs:
  enabled: true            # false = sin tracking de costes
  # prices_file: my_prices.json  # precios custom (mismo formato que default_prices.json)
  # budget_usd: 1.0        # detener si se superan $1.00; Override: --budget 1.0
  # warn_at_usd: 0.5       # log warning al alcanzar $0.50

# ==============================================================================
# LLM Cache — cache local de respuestas LLM para desarrollo (F14)
# ==============================================================================
llm_cache:
  enabled: false           # true = activar; Override: --cache / --no-cache
  dir: ~/.architect/cache  # directorio donde guardar las entradas
  ttl_hours: 24            # validez de cada entrada (1-8760 horas)

# ==============================================================================
# Hooks — lifecycle completo (v4-A1, retrocompat v3-M4)
# ==============================================================================
hooks:
  # Pre-hooks: se ejecutan ANTES de la acción. Exit code 2 = BLOCK.
  pre_tool_use:
    - name: validate-secrets
      command: "bash scripts/check-secrets.sh"
      matcher: "write_file|edit_file"      # regex para filtrar tools
      file_patterns: ["*.py", "*.env"]
      timeout: 5

  # Post-hooks: se ejecutan DESPUÉS de la acción.
  post_tool_use:
    - name: python-lint
      command: "ruff check {file} --no-fix"    # {file} se reemplaza con el path editado
      file_patterns: ["*.py"]                    # patrones glob
      timeout: 15                                # segundos (1-300, default: 10)
      enabled: true                              # false = ignorar este hook
    - name: python-typecheck
      command: "mypy {file} --no-error-summary"
      file_patterns: ["*.py"]
      timeout: 30

  # Hooks de sesión (notificación, no pueden bloquear)
  session_start: []
  session_end: []
  on_error: []
  agent_complete: []
  budget_warning: []
  context_compress: []

  # Pre/post LLM call
  pre_llm_call: []
  post_llm_call: []

  # Retrocompatibilidad v3-M4: post_edit se mapea a post_tool_use
  # con matcher automático para edit_file/write_file/apply_patch
  post_edit:
    - name: legacy-lint
      command: "ruff check {file}"
      file_patterns: ["*.py"]
      timeout: 15

  # Campos de cada hook:
  # name:          str           — nombre descriptivo
  # command:       str           — comando shell ({file} se reemplaza)
  # matcher:       str = "*"    — regex/glob para filtrar tools
  # file_patterns: list[str]    — patrones glob para filtrar archivos
  # timeout:       int = 10     — segundos (1-300)
  # async:         bool = false — true = ejecutar en background sin bloquear
  # enabled:       bool = true  — false = ignorar

# ==============================================================================
# Guardrails — seguridad determinista (v4-A2)
# ==============================================================================
guardrails:
  enabled: false              # true = activar guardrails
  protected_files: []         # globs: [".env", "*.pem", "secrets/**"]
  blocked_commands: []        # regexes: ["git push --force", "docker rm"]
  max_files_modified: null    # límite de archivos distintos por sesión (null = sin límite)
  max_lines_changed: null     # límite de líneas cambiadas acumuladas
  max_commands_executed: null  # límite de comandos ejecutados
  require_test_after_edit: false  # forzar test cada N ediciones

  code_rules: []              # reglas de análisis estático simple
  # - pattern: "eval\\("
  #   message: "Uso de eval() detectado"
  #   severity: block          # block | warn

  quality_gates: []           # verificación final al completar
  # - name: tests
  #   command: "pytest tests/ -x"
  #   required: true           # true = bloquea si falla
  #   timeout: 120

# ==============================================================================
# Skills — contexto de proyecto y workflows (v4-A3)
# ==============================================================================
skills:
  auto_discover: true         # descubrir skills en .architect/skills/ automáticamente
  inject_by_glob: true        # inyectar skills según archivos activos

# ==============================================================================
# Memory — memoria procedural (v4-A4)
# ==============================================================================
memory:
  enabled: false              # true = activar detección de correcciones
  auto_detect_corrections: true  # detectar correcciones automáticamente en mensajes del usuario

Función load_config()

def load_config(
    config_path: Path | None = None,
    cli_args: dict | None = None,
) -> AppConfig:
    # 1. Carga YAML (vacío si config_path=None)
    yaml_dict = load_yaml_config(config_path)

    # 2. Lee env vars ARCHITECT_*
    env_dict = load_env_overrides()

    # 3. Fusiona: yaml ← env
    merged = deep_merge(yaml_dict, env_dict)

    # 4. Aplica CLI flags
    if cli_args:
        merged = apply_cli_overrides(merged, cli_args)

    # 5. Valida con Pydantic (extra="forbid")
    return AppConfig(**merged)

Si el YAML tiene claves desconocidas, Pydantic lanza ValidationError → CLI muestra el error y sale con código 3 (EXIT_CONFIG_ERROR).


Ejemplos de configuraciones comunes

Mínima (solo API key en env)

export LITELLM_API_KEY=sk-...
architect run "analiza el proyecto" -a resume

OpenAI con config explícita

llm:
  model: gpt-4o
  api_key_env: OPENAI_API_KEY
  timeout: 120
  retries: 3

workspace:
  root: /mi/proyecto
  allow_delete: false

Anthropic Claude

llm:
  model: claude-sonnet-4-6
  api_key_env: ANTHROPIC_API_KEY
  stream: true

context:
  max_context_tokens: 150000   # Claude tiene ventana más grande

Ollama (local, sin API key)

llm:
  model: ollama/llama3
  api_base: http://localhost:11434
  retries: 0    # local, sin necesidad de reintentos
  timeout: 300  # modelos locales pueden ser lentos

context:
  parallel_tools: false   # sin paralelismo en modelos locales lentos

LiteLLM Proxy (equipos)

llm:
  mode: proxy
  model: gpt-4o-mini
  api_base: http://proxy.interno:8000
  api_key_env: LITELLM_PROXY_KEY

CI/CD (modo yolo, sin confirmaciones, con evaluación)

llm:
  model: gpt-4o-mini
  timeout: 120
  retries: 3
  stream: false

workspace:
  root: .

logging:
  verbose: 0
  level: warn

evaluation:
  mode: basic              # evalúa el resultado en CI
  confidence_threshold: 0.7  # menos estricto que en interactivo
architect run "actualiza imports obsoletos en src/" \
  --mode yolo --quiet --json \
  -c ci/architect.yaml

Repos grandes (con optimización de contexto)

indexer:
  exclude_dirs:
    - vendor
    - .terraform
    - coverage
  exclude_patterns:
    - "*.generated.py"
    - "*.pb.go"
  use_cache: true

context:
  max_tool_result_tokens: 1000   # más agresivo en repos grandes
  summarize_after_steps: 5       # comprimir más rápido
  keep_recent_steps: 3
  max_context_tokens: 60000      # más conservador
  parallel_tools: true

Con ejecución de comandos (F13) y costes (F14)

llm:
  model: claude-sonnet-4-6
  api_key_env: ANTHROPIC_API_KEY
  prompt_caching: true     # ahorra tokens en llamadas repetidas al mismo system prompt

commands:
  enabled: true
  default_timeout: 60
  max_output_lines: 200
  safe_commands:
    - "pnpm test"
    - "cargo check"

costs:
  enabled: true
  budget_usd: 2.0          # máximo $2 por ejecución
  warn_at_usd: 1.0         # aviso al alcanzar $1

# Cache local para desarrollo: evita llamadas repetidas al LLM
llm_cache:
  enabled: false           # activar con --cache en CLI durante desarrollo
  ttl_hours: 24
# Con cache local activo y presupuesto desde CLI
architect run "PROMPT" -a build --cache --budget 1.5 --show-costs

Con hooks del lifecycle (v4-A1)

hooks:
  post_tool_use:
    - name: python-lint
      command: "ruff check {file} --no-fix"
      file_patterns: ["*.py"]
      timeout: 15
    - name: python-typecheck
      command: "mypy {file} --no-error-summary"
      file_patterns: ["*.py"]
      timeout: 30
  pre_tool_use:
    - name: no-secrets
      command: "bash scripts/check-secrets.sh"
      matcher: "write_file|edit_file"
      timeout: 5
# Los hooks se ejecutan automaticamente — el LLM ve el output de lint/typecheck
# y puede auto-corregir errores. Pre-hooks pueden bloquear acciones.
architect run "refactoriza utils.py" -a build --mode yolo -c config.yaml

Con guardrails (v4-A2)

guardrails:
  enabled: true
  protected_files: [".env", "*.pem", "deploy/**"]
  blocked_commands: ["git push", "docker rm"]
  max_files_modified: 10
  max_lines_changed: 500
  require_test_after_edit: true
  code_rules:
    - pattern: "eval\\("
      message: "No usar eval()"
      severity: block
  quality_gates:
    - name: tests
      command: "pytest tests/ -x"
      required: true
      timeout: 120

Con skills y memoria (v4-A3/A4)

skills:
  auto_discover: true
  inject_by_glob: true

memory:
  enabled: true
  auto_detect_corrections: true

Config completa con self-eval

llm:
  model: gpt-4o
  api_key_env: OPENAI_API_KEY
  timeout: 120

workspace:
  root: .

indexer:
  enabled: true
  use_cache: true

context:
  max_tool_result_tokens: 2000
  summarize_after_steps: 8
  max_context_tokens: 80000
  parallel_tools: true

evaluation:
  mode: full               # reintentar automáticamente si falla
  max_retries: 2
  confidence_threshold: 0.85
# O usar solo el flag de CLI (ignora evaluation.mode del YAML)
architect run "genera tests para src/auth.py" -a build --self-eval full