chore: auto-commit (286 archivos)
- .claude/agents/fn-orquestador/SKILL.md - .claude/commands/fn_claude.md - .claude/rules/INDEX.md - .claude/rules/cpp_apps.md - .claude/rules/ids_naming.md - CHANGELOG.md - apps/dag_engine/README.md - apps/dag_engine/api.go - apps/dag_engine/dags_migrated/example.yaml - apps/dag_engine/dags_migrated/example_lineage_tracking.yaml - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
"""Invoca `claude -p` via subprocess y devuelve la respuesta como string."""
|
||||
|
||||
import shutil
|
||||
import subprocess
|
||||
|
||||
|
||||
def claude_cli_prompt(
|
||||
prompt: str,
|
||||
timeout_s: int = 60,
|
||||
model: str | None = None,
|
||||
max_chars_response: int = 200_000,
|
||||
extra_args: list[str] | None = None,
|
||||
) -> str:
|
||||
"""Invoca `claude -p "<prompt>"` via subprocess.
|
||||
|
||||
Args:
|
||||
prompt: Texto del prompt a enviar a Claude.
|
||||
timeout_s: Timeout en segundos antes de raise TimeoutExpired.
|
||||
model: Modelo a usar (ej. "claude-opus-4-5"). None usa el default de `claude -p`.
|
||||
max_chars_response: Trunca stdout a este numero de caracteres.
|
||||
extra_args: Argumentos adicionales para el CLI (ej. ["--output-format", "json"]).
|
||||
|
||||
Returns:
|
||||
Respuesta de Claude como texto (stdout), truncada a max_chars_response.
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: Si `claude` no esta en PATH.
|
||||
RuntimeError: Si exit code != 0 (incluye primeros 500 chars de stderr).
|
||||
subprocess.TimeoutExpired: Si la llamada supera timeout_s segundos.
|
||||
"""
|
||||
if shutil.which("claude") is None:
|
||||
raise FileNotFoundError(
|
||||
"'claude' CLI no encontrado en PATH. Instala Claude Code."
|
||||
)
|
||||
|
||||
cmd = ["claude", "-p", prompt]
|
||||
if model:
|
||||
cmd.extend(["--model", model])
|
||||
if extra_args:
|
||||
cmd.extend(extra_args)
|
||||
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=timeout_s,
|
||||
)
|
||||
|
||||
if result.returncode != 0:
|
||||
stderr_snippet = result.stderr[:500] if result.stderr else "(sin stderr)"
|
||||
raise RuntimeError(
|
||||
f"claude -p failed (exit {result.returncode}): {stderr_snippet}"
|
||||
)
|
||||
|
||||
stdout = result.stdout
|
||||
if len(stdout) > max_chars_response:
|
||||
stdout = stdout[:max_chars_response]
|
||||
|
||||
return stdout
|
||||
Reference in New Issue
Block a user