`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.
31 lines
898 B
TOML
31 lines
898 B
TOML
[package]
|
|
name = "hammer-agent"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
authors.workspace = true
|
|
repository.workspace = true
|
|
description = "Cliente del bus + bucle agéntico (plan/build/try/verify/propose) para la IA."
|
|
|
|
[features]
|
|
default = []
|
|
# Traductor LLM real contra Claude API (anthropic-version 2023-06-01).
|
|
# Trae `ureq` con rustls; si no la habilitas, el crate sigue siendo dependency-free de red.
|
|
llm-claude = ["dep:ureq"]
|
|
|
|
[dependencies]
|
|
hammer-core.workspace = true
|
|
hammer-overlay.workspace = true
|
|
anyhow.workspace = true
|
|
thiserror.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
serde_yaml.workspace = true
|
|
tracing.workspace = true
|
|
ureq = { version = "2", optional = true, default-features = false, features = ["tls", "json"] }
|
|
|
|
[dev-dependencies]
|
|
tempfile.workspace = true
|
|
hammer-journal.workspace = true
|
|
base64.workspace = true
|