Skip to content

v0.3.0 — Fase 9 (Extensibilidad)

Choose a tag to compare

@Ander-Labs Ander-Labs released this 15 Jul 15:14

Publicado en PyPI: pip install mana-ciel==0.3.0 (distribución mana-ciel,
import ciel). Verificado: install limpio + default_registry().list_providers()
expone openai/anthropic/gemini + toolset builtins.

Added

  • Plugin system (ciel.plugins): PluginRegistry + default_registry() que
    auto-registra builtins y descubre plugins de terceros vía entry points
    (ciel.providers, ciel.tools, ciel.agents). Permite extender el framework
    sin tocar el core (pip install mi-plugin-ciel).
  • Providers empaquetados: GeminiProvider (ciel.providers.gemini) se suma a
    OpenAICompatibleProvider y AnthropicProvider (ya existentes). Los tres se
    registran como builtins en default_registry().
  • Tools de fábrica (ciel.runtime.tools_builtins): toolset builtins con
    echo, datetime (offline), http_get (inyectable mock client), file_read,
    shell (sandboxeados vía ciel.sandbox).
  • ciel init: scaffold de proyecto (pyproject + agent + ciel.yaml),
    offline-safe e idempotente. El agente generado corre sin red ni API keys.
  • Bug fix en ToolRegistry.register_tool: el ToolsetSchema.tools ahora se
    mantiene sincronizado (antes get_toolset_schema().tools salía vacío).

Fixed

  • ToolProvider.execute no ejecutaba el callable de la tool (bug de raíz). El
    provider concreto ciel.runtime.ToolProvider (usado por DefaultToolDispatcher
    y por tanto por DefaultAgentRuntime.run_agent_loop) invocaba el callable con la
    firma equivocada callable_(context, **arguments)TypeError/output=None.
    Corregido a la firma OFICIAL documentada:
    callable_(arguments: dict, *, tool_call_id: str, tenant_id: str | None) -> ToolResult | dict | Any
    (await si es corrutina; excepciones se capturan en ToolResult.error; acepta
    ToolResult o valor crudo). Alineados examples/quickstart_agent.py,
    tests/gateway_fase4_test.py y tests/test_toolcalls_integration_test.py con
    la firma oficial. Verificado end-to-end vía dispatcher (no solo llamando el
    callable directo).

Verification

  • uv run pytest tests/230 passed, 2 skipped (215 base + 13 Fase 9 +
    2 regresión dispatch: test_fase9_plugins_test.py 8, test_fase9_tools_test.py 7).
  • Smoke: uv run ciel init /tmp/demo genera proyecto que corre offline
    (echo: hello). default_registry() expone openai/anthropic/gemini + toolset
    builtins. GeminiProvider offline (sin api_key lanza; con client mock devuelve
    texto). Docs DX externas en docs/guide/ (subagente).