> your AI agent picks dependencies from memory; give it dated facts — try starlog.dev ↗ vet your agent's deps ↗ vibe-coding is fine. vibe-importing isn’t. — try starlog.dev ↗ vibe-importing isn’t fine ↗ your agent has never seen your private packages — try starlog.dev ↗ facts for private packages ↗ a linter for the dependencies your AI agent picks — try starlog.dev ↗ a linter for agent deps ↗

Back to Articles

Deep Agents UI: A Debugging Interface for LangGraph's Most Complex Agent Pattern

[ View on GitHub ]

Deep Agents UI: A Debugging Interface for LangGraph's Most Complex Agent Pattern

Hook

Most agent UIs hide what's happening under the hood. Deep Agents UI does the opposite—it exposes filesystem artifacts, execution steps, and internal state in real-time, turning a black box into a glass box.

Context

The rise of autonomous agents has created a new debugging problem. Unlike traditional applications where you can set breakpoints and inspect variables, agents make decisions asynchronously, spawn sub-tasks, interact with tools, and generate artifacts across multiple execution steps. When your agent fails to complete a task or produces unexpected results, traditional debugging approaches fall short. You need visibility into what the agent planned, what tools it invoked, what files it created, and where in the execution graph things went wrong.

Deep Agents UI emerged from LangChain's Deep Agents framework—a specific agent architecture that implements planning, computer access via browser automation and code execution, and hierarchical task delegation through sub-agents. This pattern creates particularly complex execution traces. An agent might plan a multi-step task, delegate subtasks to specialized agents, generate code files, execute them, capture results, and synthesize a final answer. Without proper tooling, debugging this cascade of operations becomes nearly impossible. Deep Agents UI provides a purpose-built chat interface that connects to LangGraph deployments and surfaces these internal operations, making the invisible visible.

Technical Insight

Deep Agents UI follows a straightforward architecture: it's a Next.js TypeScript application that communicates with a LangGraph server via HTTP streaming APIs. The application requires only two configuration parameters—a deployment URL and an assistant ID—making setup remarkably simple. This lightweight coupling means you can point it at any LangGraph deployment, whether running locally during development or deployed to LangSmith's cloud platform.

The core interaction model revolves around streaming responses from the LangGraph server. When you send a message, the UI doesn't just wait for a final response—it streams intermediate state updates, tool invocations, and artifacts as they're generated. This streaming architecture is crucial for debugging because it reveals the agent's thought process in real-time. Here's how you'd typically configure the connection:

// Configuration for connecting to a LangGraph deployment
const config = {
  deploymentUrl: process.env.LANGGRAPH_DEPLOYMENT_URL || 'http://localhost:8000',
  assistantId: process.env.ASSISTANT_ID,
  langsmithApiKey: process.env.LANGSMITH_API_KEY, // Optional, for deployed apps
};

// The UI handles streaming by consuming server-sent events
const streamResponse = async (threadId: string, message: string) => {
  const response = await fetch(`${config.deploymentUrl}/threads/${threadId}/runs/stream`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'x-api-key': config.langsmithApiKey,
    },
    body: JSON.stringify({
      assistant_id: config.assistantId,
      input: { messages: [{ role: 'user', content: message }] },
    }),
  });

  // Process streamed events for state updates, tool calls, and artifacts
  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    
    const chunk = decoder.decode(value);
    const events = parseStreamedEvents(chunk);
    
    for (const event of events) {
      if (event.type === 'artifact') {
        displayArtifact(event.data); // Show files, images, code
      } else if (event.type === 'step') {
        updateExecutionTrace(event.data); // Debug mode step visualization
      }
    }
  }
};

What sets Deep Agents UI apart is its artifact display system. When a Deep Agent generates a file—say, a Python script it wrote to analyze data or an image created by a visualization tool—the UI surfaces these artifacts alongside the conversation. This is implemented through a dedicated artifacts panel that monitors the agent's state for filesystem changes. The LangGraph server exposes these artifacts through its state API, and the UI polls or receives updates through the stream to display them.

The debug mode is where Deep Agents UI becomes truly powerful for development workflows. Instead of executing the entire agent graph in one shot, debug mode breaks execution into discrete steps corresponding to nodes in your LangGraph state machine. You can inspect the state before and after each node, see exactly what tools were called with what parameters, and identify where things diverged from expected behavior. This step-by-step execution is implemented by using LangGraph's interrupt points—the UI sends a request to execute until the next breakpoint, displays the state, then waits for you to continue.

The LangSmith integration deserves special mention. When you deploy a LangGraph application to LangSmith, Deep Agents UI can authenticate using your API key and automatically discover available assistants. This tight integration means you get observability traces, evaluation runs, and debugging all in one workflow. The UI essentially becomes a development console for your deployed agents, bridging local iteration with production monitoring.

Gotcha

The most significant limitation is ecosystem lock-in. Deep Agents UI is purpose-built for LangGraph and the Deep Agents pattern specifically. If you're using a different agent framework—AutoGPT, CrewAI, Microsoft's Semantic Kernel, or even custom agent architectures—this UI won't help you. It expects specific state structures, streaming protocols, and artifact formats that come from LangGraph deployments. There's no plugin system or adapter layer to make it work with other frameworks.

Customization is another pain point. While the UI is open-source TypeScript, extending it beyond the provided chat interface requires forking and modifying the codebase. There's no theming system, no plugin architecture for custom artifact renderers, and limited documentation on extension points. If you need to add authentication, user management, conversation history persistence, or custom UI components for domain-specific artifacts, you're writing custom code. For production deployments, this often means Deep Agents UI works best as a reference implementation that you'd rebuild rather than deploy directly. The lack of production-ready features like rate limiting, session management, and access controls reinforces that this is a development and debugging tool, not a production chat interface.

Verdict

Use Deep Agents UI if you're actively developing LangGraph agents that follow the Deep Agents pattern with planning and tool use, especially during the debugging and iteration phase where visibility into execution state and generated artifacts is crucial. It's excellent for demos, local development, and understanding how your agent architecture behaves under different inputs. The step-by-step debug mode alone justifies using it when building complex multi-step agents. Skip it if you're using a different agent framework, need a production-ready chat interface with authentication and user management, or require extensive UI customization beyond basic chat and artifact display. Also skip it if your agents are simple enough that standard logging and LangSmith traces give you sufficient observability—Deep Agents UI shines when complexity demands specialized debugging tools, not for straightforward chain-of-thought agents.