entorin

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 eventEntorin eventSide effect
TaskStartedEventnode.pre
TaskCompletedEventnode.post
TaskFailedEventrun.error
LLMCallStartedEventllm.call.pre
LLMCallCompletedEventllm.call.postLedger.debit from event.usage
LLMCallFailedEventllm.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.