Ciel Agent Framework - Enterprise multi-agent harness, model-agnostic, deploy-agnostic
Project description
Ciel Agent Framework
Enterprise-grade framework to build model-agnostic, deploy-agnostic autonomous agents and multi-agent systems with harness-first principles.
Packages
| Package | Purpose |
|---|---|
ciel |
Public SDK, CLI entrypoint |
ciel.providers |
Model provider interface + adapters |
ciel.runtime |
Agent runtime, tooling, memory, skills |
ciel.orchestration |
Multi-agent orchestration, durable state, supervisor |
ciel.gateway |
Platform adapters, messaging gateway |
ciel.security |
Approvals, secret redaction, PII scrubber, sandbox |
ciel.observability |
Traces, logs, metrics, audit |
ciel.entorno |
Execution backends: local, docker, ssh, processpool |
ciel.acp |
ACP server for IDE integrations |
Installation
pip install mana-ciel # PyPI distribution name
# or, with uv:
uv pip install mana-ciel
The import name stays ciel; the CLI command is ciel:
ciel --help
Note: the PyPI package is named mana-ciel (the name
cielwas already taken on PyPI). You stillimport cieland runciel— only the install name differs.
Quick start
pip install mana-ciel
ciel init my-agent # scaffold a runnable project (offline-safe)
cd my-agent && uv run python my_agent_agent.py
Ciel is extensible via plugins: install a third-party package exposing a
ciel.plugins entry point and its providers/tools are auto-discovered — no core
edits. See docs/guide/ for the developer guide.
Requirements
- Python >= 3.11
- Package manager/distribution: uv (recommended) or pip
Example
End-to-end offline demo: examples/end_to_end.py
uv run examples/end_to_end.py
Covers:
- wiring 3 tools through
ciel.runtime.tools - running
DefaultAgentRuntime - persisting state with
MemoryStore - checkpoint/restore with
CheckpointStore
Status
Fase 1 — Runtime básico: ✅ Cerrada
ciel.providersOpenAI-compatible y Anthropic- runtime agent loop con tool_calls
- tool registry/schema/dispatcher
- memoria SQLite + FTS5
- skills markdown + frontmatter
- checkpoint store
- project context discovery y render
- context compression head/tail/rewrite
- CLI:
ciel run,ciel chat -q,ciel compression,ciel checkpointsyciel info
Fase 2 — Gobierno enterprise: ✅ Cerrada
- políticas de approval (manual / smart / yolo) y redacción integradas al runtime
- redacción de secretos + PII scrubber
- auditoría JSONL por session/tenant, traces por tool call
- multi-tenancy en providers/sinks y validación explícita de
tenant_id - credential pools, rotación, sandbox de ejecución
Fase 3 — Multiagente durable: ✅ Cerrada
- orquestación durable por spec YAML (
AgentSpec/AgentStep), supervisor con budget/rate-limit y topologías pipeline/fan-out/debate KanbanBoardcon filtros por status, assignee y tenant; métricas e índicesDurableQueueSQLite WAL- CLI:
ciel swarm run,ciel board add/list/show/assign
Fase 4 — Superficies y despliegue: ✅ Cerrada
ciel serve(FastAPI compuesta: control gateway + host MCP/mcp+ router webhook), offline-safe con echo providerciel.gateway.mcp(cliente/servidor),ciel.acp(IDE)- Dockerfile multi-stage (uv),
docker-compose.yml, Helm chartdeploy/helm/ciel deploy/example-enterprise, docs SDK públicas- release v0.1.0 (wheels + CHANGELOG)
Fase 5 — Orquestación best-of-breed: ✅ Cerrada (graph, flows, chat, root, session entregados)
ADK.sub_agents + LangGraph + AutoGen.GroupChat + CrewAI.Flows.
Entregado en esta sesión:
ciel.orchestration.graph: grafo de estado explícito (nodes/edges/estado) con checkpoint + reanudación/time-travel estilo LangGraph, montado sobre elSupervisorexistente (hereda retry/timeout/budget).ciel.orchestration.flows(CrewAI.Flows): flows event-driven conadd_start/add_listen/add_router/add_branch, estado mutable compartido yresumede long-running tras interrupción, sobreSupervisor.ciel.orchestration.chat(AutoGen.GroupChat):GroupChat+GroupChatManagermulti-agente conversable, modelo-agnóstico y OFFLINE-SAFE (participantes = funciones locales sobre el transcripto; soportamax_rounds,selector,terminate_keyword,terminate_if).ciel.orchestration.root(ADK.sub_agents):RootAgentcon ROUTING aSpecialistagents sobreSupervisor(router(prompt) -> nombre | None, conroot_handlerde respaldo).ciel.cli.graph:ciel graph demo|run|resume(offline-safe).ciel.cli.flow:ciel flow run|resume(offline-safe, checkpointer opcional).ciel.cli.chat:ciel chat group(demo offline de 3 agentes que converge con TERMINATE).- Checkpoint stores (
Graph/Flow/GroupChat/Root) persisten sobreMemoryStore(multitenancy nativo). ciel.orchestration.session(ADK.session_state):SessionStore— session state persistente por tenant entre turnos, sobreMemoryStore(keys namespacedsession:), conappend_turn/history,save_state/load_state,link_board_task/board_links(integración board+session) ylist_sessions.ciel.RootRunner.route(prompt, *, session_id, session_store, tenant_id)mantiene el historial de turnos entre invocaciones (rehidrataRootState.history).ciel.cli.root:ciel root route <prompt>(offline-safe, demo con 2 specialists + root handler; opciones--db/--session-id/--tenantpara session state persistente).- Tests de Fase 5: 37 tests verdes (graph 6, flows 6, chat 7, root 7, session 6, root+session 5).
Verificación actual: uv run pytest tests/ → 153 passed, 1 skipped. uv run ciel graph demo, uv run ciel flow run, uv run ciel chat group y uv run ciel root route ejecutan offline.
Fase 6 — Agencia autónoma en bucle: ✅ Cerrada (agent entregado)
AutoGen/ADK: EventLoop durable + AutonomousAgent sobre Supervisor y SessionStore.
Entregado en esta sesión:
ciel.orchestration.agent(AutoGen/ADK): agencia autónoma en bucle montada SOBRESupervisor(cada intento de tarea hereda retry/timeout/budget) y SOBRESessionStore(estado por tenant).Task: unidad de trabajo durable (goal,payload,status,attempts,result,error) consnapshot()/from_snapshot()ymark_running()/mark_succeeded()/mark_failed().EventLoop: bucle durable con reintentos exponenciales (backoffbase_delay_s * 2^(n-1)capped).run(task, handler, *, run_id)ejecuta con reintentos y persiste checkpoint tras cada intento;resume(run_id, handler)rehidrata desdeMemoryStorey continúa, completando la tarea tras reinicio (criterio Fase 6). Idempotente si el checkpoint ya estásucceeded/failed.EventLoopCheckpointStore: persistencia del estado del loop sobreMemoryStore(claveloop:<run_id>, multitenancy nativo).AutonomousAgent: orquestador de nivel superior;run_goal(goal, handler, *, plan=None)descompone el objetivo en tareas y las ejecuta víaEventLoop, persistiendo turnos de session por tenant.
ciel.cli.loop:ciel loop run <goal>(offline-safe, handler echo local;--run-id/--db/--tenant/--session-id) yciel loop resume --run-id <id> --db <db>(reanuda tras reinicio).- Tests de Fase 6: batería verde en
tests/test_agent_fase6_test.py.
Verificación actual: uv run pytest tests/ → 153 + N passed, 1 skipped. uv run ciel loop run "..." --db /tmp/l.sqlite3 --tenant t1 y uv run ciel loop resume --run-id <id> --db /tmp/l.sqlite3 ejecutan offline.
Fase 7 — Enterprise duro: ✅ Cerrada (enterprise entregado)
RBAC/OIDC, audit inmutable, cost governance, secrets, rate-limit transversal.
Entregado en esta sesión:
ciel.enterprise(OFFLINE-SAFE, sin dependencias duras): paquete de enterprise duro.ciel.enterprise.rbac:RBACEngine(roles admin/operator/viewer; permisos con comodíncategory:*; orden tenant>global>denegado) +OIDCVerifier(JWT local,OIDC_AVAILABLEpor detección de PyJWT). ExcepcionesRBACError,FeatureUnavailable.ciel.enterprise.audit:HashChainAuditSink(JsonlAuditSink)— audit INMUTABLE (append-only hash-chained SHA-256);verify()detecta alteración;last_hash()para encadenar.ciel.enterprise.cost:CostGovernor(presupuesto por modelo/tenant, alertas y corte) —estimate/record/spent/budget_of/remaining/allowed/check_budget(lanzaBudgetExceededError) /alerted. Capa transversal (no acopla alSupervisor).ciel.enterprise.secrets:SecretStorecon backends pluggable por prioridad —EnvSecretBackend,KubernetesSecretBackend(OFFLINE-SAFE),VaultSecretBackend(requierehvac; degrada aFeatureUnavailablesi falta).get/require(lanzaSecretError).ciel.enterprise.ratelimit:TenantRateLimiter— cuotas transversales por tenant/usuario con ventana deslizante en memoria;check/consume(lanzaRateLimitError) /reset/remaining.
ciel rbac/ciel cost: CLI offline-safe (Typer + Rich).ciel rbac check|assign|list-roles;ciel cost record|status|check.- Tests de Fase 7: 29 tests verdes (rbac 7, audit 5, cost 6, secrets 5, ratelimit 6).
Verificación actual: uv run pytest tests/ → 194 passed, 1 skipped. uv run ciel rbac list-roles y uv run ciel cost status --tenant t1 ejecutan offline.
Fase 8 — Deploy HA + observabilidad + madurez: 🔄 EN PROGRESO
Helm HA, OTel centralizado, adapters de canal y HIL en grafo ya entregados y verificados por smoke test; tests formales, runbooks y release v0.2.0 en curso.
Entregado en esta sesión:
- Helm HA: chart
deploy/helm/cielconreplicaCount: 2,PodDisruptionBudget(minAvailable 1),HorizontalPodAutoscaler(2–10 réplicas),podAntiAffinityytopologySpreadConstraints. - OTel centralizado (
ciel.observability.otel):init_tracing(*, otlp_endpoint)(OTLP o in-memory offline-safe),current_tracer(),span_count()(corregido para opentelemetry-sdk 1.x). Comandociel observey flag--otel/--otel-endpointenciel serve. - Adapters de canal (
ciel.adapters):TeamsAdapter,DiscordAdapter,WebUIAdapter+FakeAdapter(offline-safe). - Routers de gateway (
ciel.gateway.messaging):create_teams_webhook_router,create_discord_webhook_router,create_webui_router, montados enciel serve. - Human-in-the-loop (HIL) en
ciel.orchestration.graph:GraphNode.require_approval,GraphRunner.approve()/deny()con chequeo RBAC (approve:*). Pausa y reanuda tras aprobación de rol autorizado. - Runbooks (
docs/runbooks/): deploy, incidente, rollback, backup de audit/board, escalado HPA.
Verificación actual (smoke): ciel observe confirma exporter; grafo con require_approval pausa y reanuda tras approve:*; tests formales de Fase 8 en curso (test_fase8_hil_otel_test.py, test_fase8_adapters_test.py).
License
- Core framework: AGPL-3.0-or-later
- Commercial dual license available for regulated deployments.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mana_ciel-0.3.0.tar.gz.
File metadata
- Download URL: mana_ciel-0.3.0.tar.gz
- Upload date:
- Size: 153.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
772d6365282e71f700f41798868fa60a3c83fa5bdb51eabcd7a3632f37dbf4fa
|
|
| MD5 |
1f615cae5f45e30e11ef38fdeda1c746
|
|
| BLAKE2b-256 |
d4ccdca1975711157c122d9e596675e1dd2405699a5df972065e2ee0c03791cc
|
File details
Details for the file mana_ciel-0.3.0-py3-none-any.whl.
File metadata
- Download URL: mana_ciel-0.3.0-py3-none-any.whl
- Upload date:
- Size: 148.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
21c5bce56c5ebc5ab35f33d2d73a8c7e9158c341f841ca0eb85933e28db4cc39
|
|
| MD5 |
d14f1a7753aef2fea517f734b107675d
|
|
| BLAKE2b-256 |
fb27e6c064042041f3752f523b4d12fd6f4c810b522aff00736bf3594e1bc37e
|