CrewAI
Bridge CrewAI's event bus into Entorin. Every Task and LLM event translates into the v1 taxonomy; the run-shared Ledger ticks on every LLM completion.
instrument_crew is a context manager that registers handlers on crewai.events.crewai_event_bus. Inside the with, every CrewAI Task / LLM event is translated into the Entorin event taxonomy and budget telemetry. Handlers are deregistered on exit so subsequent runs in the same process don’t accumulate state.
from decimal import Decimal
from pydantic import SecretStr
from adapters.crewai import instrument_crew
from entorin.auth import Capability, Principal
from entorin.budget import MemoryLedger, OverflowPolicy
from entorin.context import RunContext
from entorin.events import EventBus
from entorin.model.pricing import ConstPricing, Rate
principal = Principal(
user_id="alice",
caps=(Capability(kind="model.openai.key", value=SecretStr("sk-...")),),
)
ctx = RunContext(run_id="run-1", principal=principal)
bus = EventBus()
ledger = MemoryLedger()
ledger.set_cap("alice", Decimal("0.50"),
bucket_id="research-crew",
overflow_policy=OverflowPolicy.FINISH_RUN)
pricing = ConstPricing({"gpt-4o-mini": Rate(
input_per_mtok=Decimal("0.15"), output_per_mtok=Decimal("0.60"),
)})
with instrument_crew(
ctx=ctx, bus=bus, ledger=ledger, pricing=pricing,
bucket_id="research-crew",
):
crew.kickoff(...) # CrewAI events auto-translate
Event mapping
| CrewAI event | Entorin event | Side effect |
|---|---|---|
TaskStartedEvent | node.pre | — |
TaskCompletedEvent | node.post | — |
TaskFailedEvent | run.error | — |
LLMCallStartedEvent | llm.call.pre | — |
LLMCallCompletedEvent | llm.call.post | Ledger.debit from event.usage |
LLMCallFailedEvent | llm.call.error | — |
Task name fallback: when the Task has no name, node_name falls back to the task id.
Budget enforcement caveat
A runnable demo with synthetic CrewAI events: examples/crewai_qa.py.