Skip to content

Explore reusable LangChain integration primitives for OpenUI #695

Description

@vishxrad

Summary

OpenUI should provide a supported way to reuse LangChain/LangGraph integration primitives so users do not need to copy and maintain adapter code inside each app or example.

This does not necessarily need to be a dedicated package. The first decision should be the right maintenance boundary: existing package exports, a small integration helper, docs/recipe code, or a separate package only if we are comfortable owning its dependency surface.

Problem

Integrating LangChain/LangGraph agents with OpenUI currently requires app-specific glue for several concerns:

  • converting LangChain protocol messages events into AG-UI/OpenUI stream events
  • forwarding OpenUI-compatible events over a custom stream channel
  • proxying browser requests through a server route into LangGraph protocol-v2 endpoints
  • converting browser/AG-UI message history into LangChain input messages
  • cleaning up internal tool-call history so stateless runs do not replay invalid partial tool transcripts

This is enough integration surface that it should be a clearer supported path rather than example-local code.

Proposal

Explore the smallest maintainable public surface for LangChain/LangGraph integration.

Desired agent-side shape could be:

import { openUIStreamTransformer } from "<openui-langchain-integration-export>";

export const graph = createDeepAgent({
  model: `openai:${MODEL}`,
  tools: [getWeather, getStockPrice, searchWeb],
  systemPrompt: SYSTEM_PROMPT,
  streamTransformers: [openUIStreamTransformer],
});

Desired route-handler shape could be:

import { createLangChainStreamResponse } from "<openui-langchain-integration-export>";
import { NextRequest } from "next/server";

export const runtime = "nodejs";

export async function POST(req: NextRequest) {
  return createLangChainStreamResponse(req, {
    apiUrl: process.env.LANGGRAPH_API_URL || "http://localhost:2024",
    assistantId: process.env.LANGGRAPH_ASSISTANT_ID || "agent",
    apiKey: process.env.LANGSMITH_API_KEY,
  });
}

Potential primitives:

  • openUIStreamTransformer / streamTransformer: LangChain/LangGraph stream transformer that emits AG-UI events on an OpenUI channel.
  • createLangChainStreamResponse: route helper that accepts an incoming chat request and returns a streaming Response.
  • streamOpenUI: lower-level helper for driving LangGraph protocol-v2 runs and relaying only the OpenUI custom channel.
  • message conversion/history cleanup helpers, if useful outside the route helper.

Design questions

  • What is the smallest supportable public API here?
  • Should this live in an existing package/export, a docs recipe, or a dedicated integration package?
  • If it is packaged, how do we avoid taking on an unbounded LangChain/LangGraph version matrix?
  • Should the API target LangGraph protocol-v2 directly, DeepAgents specifically, or any LangChain stream transformer-compatible agent?
  • How should this compose with AgentInterface and the ChatLLM API?
  • Should the route helper return AG-UI SSE directly, or expose an adapter that fits fetchLLM({ streamAdapter })?
  • How much should be supported for local LangGraph server vs LangGraph Cloud/Platform?
  • What test harness should lock down the stream transformation semantics?

Acceptance criteria

  • Decide the maintenance boundary and public API shape.
  • Add reusable primitives or documented recipe code for the stream transformer and server response/proxy path.
  • Update the LangChain/LangGraph example to consume the chosen primitive/recipe instead of maintaining unclear local copies.
  • Add docs showing the minimal agent setup and minimal route setup.
  • Cover stream conversion behavior with focused tests if the code is published as a supported API, especially text deltas, tool calls, errors, and finalization.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions