¶Cookbook: curriculum offline con MockProvider
Ejemplo mínimo, 100% offline (sin red ni API keys), de la Fase 20: descomponer un objetivo en sub-tareas, persistir el curriculum versionado y consultarlo desde el registry.
¶Con la API de Python
from ciel import CurriculumRegistry, MockProvider, decompose_goal
from ciel.runtime.state_backend import SqliteStateBackend
goal = "leer el CSV de ventas, limpiar los datos y luego generar el informe"
# 1) Descomponer el goal en sub-tareas.
# Sin provider: heurística determinista offline (split por cláusulas).
plan = decompose_goal(goal)
print(plan)
# ['leer el CSV de ventas, limpiar los datos', 'generar el informe']
# Opcional: con un provider (MockProvider es determinista y offline);
# si su respuesta no sirve, hace fallback a la heurística.
plan = decompose_goal(goal, provider=MockProvider(mode="fixed", response=""))
# 2) Persistir el curriculum versionado (multitenant).
backend = SqliteStateBackend(":memory:") # o una ruta de fichero
registry = CurriculumRegistry(backend)
cur = registry.create(goal, plan, tenant_id="acme")
print(cur.version, cur.sha256[:12]) # 0.0.0 <hash>
# 3) Consultar el registry.
vigente = registry.get(goal, tenant_id="acme")
historial = registry.history(goal, tenant_id="acme")
arbol = registry.evolution_tree(goal, tenant_id="acme")
print(arbol["lineage"]) # ['0.0.0']
# Un segundo create del mismo goal bumpea la versión (patch) y encadena linaje:
registry.create(goal, plan + ["publicar el informe"], tenant_id="acme")
print([c.version for c in registry.history(goal, tenant_id="acme")])
# ['0.0.0', '0.0.1']
¶Con el Agent
install_curriculum_support(Agent) engancha el soporte de curriculum de forma
aditiva e idempotente (kwargs curriculum= / curriculum_config= y método
run_curriculum):
import asyncio
from ciel import Agent, install_curriculum_support
install_curriculum_support(Agent) # idempotente
agent = Agent(model="mock", curriculum=True)
resultado = asyncio.run(agent.run_curriculum(
"leer datos y luego generar informe", tenant_id="acme"
))
print(resultado["succeeded"], resultado["curriculum"]["version"])
¶Con la CLI
ciel curriculum run --goal "leer datos y luego generar informe" --provider mock
ciel curriculum show --goal "leer datos y luego generar informe"
ciel curriculum history --goal "leer datos y luego generar informe"
Todo el flujo es offline-safe: --provider mock usa
ciel.providers.MockProvider (determinista, sin red) y la persistencia usa el
StateBackend (SQLite por defecto), con aislamiento estricto por tenant_id.