Skip to Content
Agent Integration

Agent Integration

Reference patterns for OpenAI Responses/Agents and LangChain/LangGraph using DriftGate canonical session execution.

OpenAI Responses + DriftGate (TypeScript)

import OpenAI from "openai"; import { DriftGateClient } from "@driftgate/sdk"; const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! }); const executionRouteId = process.env.DRIFTGATE_EXECUTION_ROUTE_ID!; const driftgate = new DriftGateClient({ sessionToken: process.env.DRIFTGATE_SESSION_TOKEN!, baseUrl: "https://api-staging.driftgate.ai" }); const session = await driftgate.session.start({ agent: "support-agent", executionRouteId }); const execution = await session.execute({ input: { prompt: "Summarize refund policy for order #123" }, executionRouteId }); if (!execution.ok || !execution.data) throw new Error(execution.error?.code ?? "INTERNAL"); const response = await openai.responses.create({ model: "gpt-4.1-mini", input: [ { role: "system", content: "Use the governance payload as ground truth." }, { role: "user", content: JSON.stringify(execution.data) } ] }); console.log(response.output_text);

LangChain Middleware (TypeScript)

import { DriftGateClient } from "@driftgate/sdk"; import { ChatOpenAI } from "@langchain/openai"; const dg = new DriftGateClient({ sessionToken: process.env.DRIFTGATE_SESSION_TOKEN! }); const llm = new ChatOpenAI({ model: "gpt-4.1-mini" }); const executionRouteId = process.env.DRIFTGATE_EXECUTION_ROUTE_ID!; const session = await dg.session.start({ agent: "claims-agent", executionRouteId }); const gated = await session.execute({ input: { claimId: "C-42" }, executionRouteId }); if (!gated.ok || !gated.data) throw new Error(gated.error?.code ?? "INTERNAL"); const answer = await llm.invoke([ ["system", "Answer only with approved details from payload."], ["human", JSON.stringify(gated.data)] ]); console.log(answer.content);

LangGraph Guardrail Node (Python)

import os from driftgate_sdk import DriftGateClient from langgraph.graph import StateGraph client = DriftGateClient( bearer_token=os.environ["DRIFTGATE_SESSION_TOKEN"], base_url="https://api-staging.driftgate.ai", ) execution_route_id = os.environ["DRIFTGATE_EXECUTION_ROUTE_ID"] def gate_node(state: dict) -> dict: session = client.session.start( agent="review-agent", execution_route_id=execution_route_id, ) result = session.execute( input=state["input"], execution_route_id=execution_route_id, ) if not result.ok or result.data is None: raise RuntimeError(result.error.code if result.error else "INTERNAL") state["driftgate"] = result.data return state graph = StateGraph(dict) graph.add_node("gate", gate_node) graph.set_entry_point("gate") app = graph.compile() print(app.invoke({"input": {"ticket_id": "T-100"}}))

Expected Envelope

{ "ok": true, "data": { "execution": { "id": "exec_123", "executionRouteId": "routev_123", "state": "queued" } }, "meta": { "requestId": "req_123", "executionId": "exec_123", "timingMs": { "total": 128 } }, "error": null }

Downstream frameworks should branch on error and only consume governed payload from data.

Runtime auth note:

  • session.start / execute use bearer session auth.
  • Service-account keys (dgk_* via x-driftgate-api-key) are for admin/config APIs, not runtime sessions.
Last updated on