v0.3.0 — Fase 9 (Extensibilidad)
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
OpenAICompatibleProvideryAnthropicProvider(ya existentes). Los tres se
registran como builtins endefault_registry(). - Tools de fábrica (
ciel.runtime.tools_builtins): toolsetbuiltinscon
echo,datetime(offline),http_get(inyectable mock client),file_read,
shell(sandboxeados víaciel.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: elToolsetSchema.toolsahora se
mantiene sincronizado (antesget_toolset_schema().toolssalía vacío).
Fixed
ToolProvider.executeno ejecutaba el callable de la tool (bug de raíz). El
provider concretociel.runtime.ToolProvider(usado porDefaultToolDispatcher
y por tanto porDefaultAgentRuntime.run_agent_loop) invocaba el callable con la
firma equivocadacallable_(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 enToolResult.error; acepta
ToolResulto valor crudo). Alineadosexamples/quickstart_agent.py,
tests/gateway_fase4_test.pyytests/test_toolcalls_integration_test.pycon
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.py8,test_fase9_tools_test.py7).- Smoke:
uv run ciel init /tmp/demogenera proyecto que corre offline
(echo: hello).default_registry()expone openai/anthropic/gemini + toolset
builtins.GeminiProvideroffline (sin api_key lanza; con client mock devuelve
texto). Docs DX externas endocs/guide/(subagente).