Architecture

How to manage AI agents across frameworks

Run and govern agents across LangGraph, OpenAI Agents SDK, CrewAI, n8n, and Claude Code with one control layer.

As organizations adopt more than one agent framework, the hard problem shifts from building an agent to operating many of them together.

Key takeaways

  • Most companies end up running 2-4 agent frameworks - one control layer is cheaper than rebuilding approvals four times.
  • Per-framework adapters are fine; per-framework policy is not. Policy lives in one place.
  • The same approval request format works across LangGraph, OpenAI Agents, CrewAI, n8n, and Claude Code.
  • Consistency in the operator console matters more than consistency inside each framework.
  • One audit trail across frameworks is what enterprise buyers will ask about first.

Why multi-framework is normal

One team may use LangGraph for durable agent flows, another may use n8n for operational automation, and another may use Claude Code for supervised engineering tasks. Asking everyone to consolidate on one framework is rarely productive - each framework has a local optimum for a specific kind of work.

The real challenge is not framework choice. It is creating consistent control, ownership, and auditability across all of them.

Shared control layer requirements

  • One request model - same fields regardless of which framework raised the request
  • Consistent approval semantics - approve, reject, timeout, escalate
  • Role and shift routing that ignores framework origin
  • Unified audit trail - one place to answer "who approved X"
  • Framework-specific adapters with framework-agnostic policy

The same approval, four ways

Here is the same refund-approval request raised from four different frameworks. The control layer sees them identically - the reviewer does not know or care which framework the run came from.

langgraph_node.py
from centcom_langgraph import create_centcom_approval

def refund_node(state):
    request = create_centcom_approval(
        workflow_id="refund_workflow",
        external_request_id=f"{state['run_id']}::refund",
        title=f"Refund ${state['amount']} on order #{state['order_id']}",
        context={"order_id": state["order_id"], "amount": state["amount"]},
        required_role="cs_lead",
        deadline_minutes=15,
    )
    return {"approval_request_id": request.id}
openai_agents_bridge.py
from centcom_openai_agents import bridge_interruption

async def on_interruption(run, interruption):
    await bridge_interruption(
        run_id=run.id,
        interruption_id=interruption.id,
        title=f"Refund ${interruption.args['amount']}",
        context=interruption.args,
        required_role="cs_lead",
        deadline_minutes=15,
    )
crewai_bridge.py
from centcom_crewai import request_human_review

def refund_task(inputs):
    return request_human_review(
        workflow_id="refund_workflow",
        external_request_id=f"{inputs['run_id']}::refund",
        title=f"Refund ${inputs['amount']}",
        context=inputs,
        required_role="cs_lead",
        deadline_minutes=15,
    )
request_payload.json
{
  "workflow_id": "refund_workflow",
  "external_request_id": "{{ $json.run_id }}::refund",
  "title": "Refund ${{ $json.amount }} on order #{{ $json.order_id }}",
  "context": { "order_id": "{{ $json.order_id }}", "amount": "{{ $json.amount }}" },
  "required_role": "cs_lead",
  "deadline_minutes": 15
}

Department examples

  • Marketing agents approving budget changes above a threshold.
  • HR agents routing compensation changes to the accountable manager.
  • Finance agents flagging invoice and transfer mismatches before write-back.
  • CS agents gating refunds and account closures by tier and amount.

Where the adapters live

Per-framework adapters are open source in the contro1-hq GitHub organization: one repo per framework, each with a slim bridge to the Contro1 request API. Your policy - thresholds, routing, deadlines - is configured centrally, not per framework.

LangGraph docs · OpenAI Agents docs · CrewAI docs · n8n docs · Claude Code docs

The enterprise question

The first question an enterprise buyer will ask is "if a customer calls and asks who approved action X at time Y, can you answer?" With one control layer across frameworks the answer is yes, with one query. Without it, the answer depends on which team owned the agent that did the action - and the audit trails are in five different formats.

Frequently asked questions

Can one company really run many agent frameworks at once?

Yes. That is increasingly common because different teams optimize for different tools, runtimes, and ownership models.

Should I consolidate on one framework?

Usually not. The cost of forcing every team onto one framework is higher than the cost of adding a shared control layer on top of several.

Does Contro1 lock me into a framework?

No. The adapters are open source, the request API is framework-agnostic, and a workflow can migrate between frameworks without changing its approval policy.

What about frameworks you do not support?

Any framework that can call an HTTP API can integrate. The adapters are small (under 400 lines each) - a custom one is usually a day of work.

How is the audit trail unified?

Every approval from every framework writes to the same Contro1 store with the same schema. One query answers "who approved action X" regardless of which framework raised it.