TypeScript framework for building LLM-powered applications with agents, tools, middleware, and model interoperability
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Complete guide to error types and error handling in LangChain agents.
/**
* Thrown when attempting to bind structured output to a model that already has tools bound
*/
class MultipleToolsBoundError extends Error {
name: "MultipleToolsBoundError";
message: "The model already has tools bound to it. Cannot bind structured output format.";
}
/**
* Thrown when multiple structured outputs are returned but only one was expected
*/
class MultipleStructuredOutputsError extends Error {
name: "MultipleStructuredOutputsError";
message: "Multiple structured outputs returned when one was expected";
outputs: any[];
}
/**
* Thrown when structured output parsing fails
*/
class StructuredOutputParsingError extends Error {
name: "StructuredOutputParsingError";
message: string;
cause?: Error;
rawOutput?: string;
}
/**
* Thrown when tool invocation fails
*/
class ToolInvocationError extends Error {
name: "ToolInvocationError";
message: string;
toolName: string;
toolInput: any;
cause?: Error;
}/**
* Thrown when tool call limit is exceeded
*/
class ToolCallLimitExceededError extends Error {
name: "ToolCallLimitExceededError";
limit: number;
actualCalls: number;
}
/**
* Thrown when PII detection fails
*/
class PIIDetectionError extends Error {
name: "PIIDetectionError";
cause?: Error;
}import { createAgent, ToolInvocationError } from "langchain";
const agent = createAgent({
model: "openai:gpt-4o",
tools: [/* tools */],
});
try {
const result = await agent.invoke({
messages: [{ role: "user", content: "Do something" }],
});
} catch (error) {
if (error instanceof ToolInvocationError) {
console.error(`Tool ${error.toolName} failed:`, error.message);
console.error("Input:", error.toolInput);
console.error("Cause:", error.cause);
} else {
console.error("Unknown error:", error);
}
}import {
createAgent,
StructuredOutputParsingError,
MultipleStructuredOutputsError,
} from "langchain";
import { z } from "zod";
const Schema = z.object({
value: z.number(),
label: z.string(),
});
const agent = createAgent({
model: "openai:gpt-4o",
tools: [],
responseFormat: Schema,
});
try {
const result = await agent.invoke({
messages: [{ role: "user", content: "Parse this data" }],
});
console.log(result.structuredResponse);
} catch (error) {
if (error instanceof StructuredOutputParsingError) {
console.error("Failed to parse structured output:");
console.error("Message:", error.message);
console.error("Raw output:", error.rawOutput);
console.error("Cause:", error.cause);
// Implement fallback logic
return fallbackResponse();
} else if (error instanceof MultipleStructuredOutputsError) {
console.error("Multiple outputs returned:");
console.error("Outputs:", error.outputs);
// Choose one or combine
return error.outputs[0];
} else {
throw error;
}
}import { tool, createAgent } from "langchain";
import { z } from "zod";
// Tool with error handling
const apiTool = tool(
async ({ endpoint }) => {
try {
const response = await fetch(endpoint);
if (!response.ok) {
return `Error: HTTP ${response.status} - ${response.statusText}`;
}
const data = await response.json();
return JSON.stringify(data);
} catch (error) {
return `Error: ${error.message}`;
}
},
{
name: "api_call",
description: "Call an API endpoint",
schema: z.object({
endpoint: z.string().url(),
}),
}
);
const agent = createAgent({
model: "openai:gpt-4o",
tools: [apiTool],
});
// Agent-level error handling
try {
const result = await agent.invoke({
messages: [{ role: "user", content: "Call the API" }],
});
} catch (error) {
if (error instanceof ToolInvocationError) {
console.error(`Tool ${error.toolName} failed completely:`, error.message);
// Notify user or implement retry
return handleToolFailure(error);
} else {
throw error;
}
}import { createMiddleware, createAgent } from "langchain";
// Error-handling middleware
const errorMiddleware = createMiddleware({
name: "error-handler",
wrapToolCall: async (request, handler, runtime) => {
try {
return await handler(request);
} catch (error) {
console.error(`Tool ${request.toolName} failed:`, error);
// Log to monitoring service
await logError({
type: "tool_error",
toolName: request.toolName,
args: request.args,
error: error.message,
});
// Return error as tool result (don't throw)
return {
content: `Error: ${error.message}`,
error: error.message,
};
}
},
wrapModelCall: async (state, handler, runtime) => {
try {
return await handler(state);
} catch (error) {
console.error("Model call failed:", error);
// Log error
await logError({
type: "model_error",
error: error.message,
});
// Re-throw for agent to handle
throw error;
}
},
});
const agent = createAgent({
model: "openai:gpt-4o",
tools: [],
middleware: [errorMiddleware],
});import {
createAgent,
toolCallLimitMiddleware,
ToolCallLimitExceededError,
} from "langchain";
const agent = createAgent({
model: "openai:gpt-4o",
tools: [/* tools */],
middleware: [
toolCallLimitMiddleware({
runLimit: 5,
errorMessage: "Maximum tool calls exceeded for this request",
}),
],
});
try {
const result = await agent.invoke({
messages: [{ role: "user", content: "Do many things" }],
});
} catch (error) {
if (error instanceof ToolCallLimitExceededError) {
console.error(`Limit exceeded: ${error.limit} calls`);
console.error(`Actual calls: ${error.actualCalls}`);
// Notify user
return {
error: "Too many operations required. Please simplify your request.",
};
} else {
throw error;
}
}import { createAgent } from "langchain";
async function callAgentWithFallback(input: string) {
const agent = createAgent({
model: "openai:gpt-4o",
tools: [/* tools */],
});
try {
// Try with tools
return await agent.invoke({
messages: [{ role: "user", content: input }],
});
} catch (error) {
console.warn("Agent with tools failed, trying without tools:", error);
// Fallback: agent without tools
const simpleAgent = createAgent({
model: "openai:gpt-4o",
tools: [],
});
try {
return await simpleAgent.invoke({
messages: [{ role: "user", content: input }],
});
} catch (fallbackError) {
console.error("Fallback agent also failed:", fallbackError);
// Final fallback: return error message
return {
messages: [
{
role: "assistant",
content: "I apologize, but I'm unable to process your request at this time.",
},
],
};
}
}
}async function invokeWithRetry(agent: ReactAgent, input: any, maxRetries = 3) {
let lastError: Error;
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await agent.invoke(input);
} catch (error) {
lastError = error;
console.warn(`Attempt ${attempt} failed:`, error);
if (attempt < maxRetries) {
// Exponential backoff
const delay = Math.pow(2, attempt) * 1000;
console.log(`Retrying in ${delay}ms...`);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
throw new Error(`Failed after ${maxRetries} attempts: ${lastError.message}`);
}
// Usage
try {
const result = await invokeWithRetry(agent, {
messages: [{ role: "user", content: "Hello" }],
});
} catch (error) {
console.error("All retry attempts failed:", error);
}docs