Fase 6 — traductor LLM real (Claude API) detrás de feature llm-claude
`ClaudeTranslator` implementa el trait `IntentTranslator` igual que el `MockTranslator`, así que el `Orchestrator` no cambia: se traduce una intención NL a un `.swm` válido vía `/v1/messages`. Diseño: - Síncrono (ureq + rustls), consistente con `AgentClient`. Tokio entraría sólo si el resto del crate lo pidiera. - Trait `HttpClient` inyectable ⇒ tests sin red contra una fake que captura el request y devuelve un body pre-armado. - Modelo por defecto: `claude-opus-4-8` (Opus 4.8, el más capaz al día de hoy). Adaptive thinking + `effort=high` por defecto. Override por env (`HAMMER_LLM_MODEL`, `HAMMER_LLM_EFFORT`, `HAMMER_LLM_BASE_URL`). - System prompt documenta el shape exacto del `.swm` (4 variantes de mutación) y obliga JSON puro. Parseamos con `serde_json::from_str:: <Swm>` + `verify_schema()` como gate adicional. Manejamos `refusal`, error envelopes de la API y code-fence markdown. Activación: - Sin feature: el módulo declara los tipos pero `ClaudeTranslator::new` está bajo cfg. El binario compila sin red. - Con `--features llm-claude`: trae `ureq` con rustls, y la CLI activa `hammer ai --llm`. CLI: - `hammer ai` gana `--llm` (mutuamente excluyente con `--catalog`). Refactor de `run_ai` en helpers `run_with_mock_translator` / `run_with_llm_translator` para mantener legible el dispatch. - Sin la feature, `--llm` falla con un mensaje claro pidiendo recompilar. Tests (7 unit): happy path con verificación de URL/headers/body, unwrap de markdown, `refusal`, error envelope, SWM mal formado, verify_schema, helpers de strip_code_fence.
This commit is contained in:
+5
-1
@@ -117,7 +117,11 @@ pre-requisito de validación.
|
||||
- 3 e2e del bucle agéntico (prefix tmp → archivos esperados en disco).
|
||||
- 1 e2e del cliente contra un *stub* del bus (handshake + Compile→BuildReady + Modified
|
||||
asíncrono).
|
||||
- [ ] Traductor LLM real (Claude API u otro), opcional vía feature flag o crate aparte.
|
||||
- [x] Traductor LLM real (Claude API u otro), opcional vía feature flag o crate aparte.
|
||||
`ClaudeTranslator` detrás de la feature `llm-claude`, con `ureq + rustls`. Modelo
|
||||
por defecto `claude-opus-4-8`, adaptive thinking + `effort=high`. Trait `HttpClient`
|
||||
inyectable para tests sin red. CLI: `hammer ai --llm` (mutuamente excluyente con
|
||||
`--catalog`). Sin la feature, el flag falla con mensaje claro.
|
||||
- [x] Lenguaje de consulta del sistema (SDD 08 §6) para que la IA refiera servicios y
|
||||
archivos sin rutas frágiles. Forma `kind:value` (`bin`, `file`, `pin`, `service`,
|
||||
`depends`), evaluable local (`hammer query <expr>`) y remoto vía bus
|
||||
|
||||
Reference in New Issue
Block a user