diff --git a/docs/docs/getting-started/guide-llm.mdx b/docs/docs/getting-started/guide-llm.mdx index 36ec781e7ac8..a5af86038c5a 100644 --- a/docs/docs/getting-started/guide-llm.mdx +++ b/docs/docs/getting-started/guide-llm.mdx @@ -172,7 +172,7 @@ Now we can get started! ```typescript import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; @@ -186,11 +186,9 @@ const tools = [ new Calculator(), ]; -const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" -); +const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", +}); console.log("Loaded agent."); const input = diff --git a/docs/docs/modules/agents/executor/getting-started.md b/docs/docs/modules/agents/executor/getting-started.md index f84af780928c..77fc8af7fc7f 100644 --- a/docs/docs/modules/agents/executor/getting-started.md +++ b/docs/docs/modules/agents/executor/getting-started.md @@ -25,7 +25,7 @@ Now we can get started! ```typescript import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; @@ -39,11 +39,9 @@ const tools = [ new Calculator(), ]; -const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" -); +const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", +}); console.log("Loaded agent."); const input = diff --git a/docs/docs/modules/agents/tools/agents_with_vectorstores.md b/docs/docs/modules/agents/tools/agents_with_vectorstores.md index 946d27c353d4..d0a8f74b3781 100644 --- a/docs/docs/modules/agents/tools/agents_with_vectorstores.md +++ b/docs/docs/modules/agents/tools/agents_with_vectorstores.md @@ -8,7 +8,7 @@ First, you'll want to import the relevant modules: ```typescript import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI, ChainTool } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; import { VectorDBQAChain } from "langchain/chains"; @@ -57,11 +57,9 @@ const tools = [ qaTool, ]; -const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" -); +const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", +}); console.log("Loaded agent."); const input = `What did biden say about ketanji brown jackson is the state of the union address?`; diff --git a/docs/docs/modules/agents/tools/index.mdx b/docs/docs/modules/agents/tools/index.mdx index 1a97869803d8..d2b1ae8fa1f2 100644 --- a/docs/docs/modules/agents/tools/index.mdx +++ b/docs/docs/modules/agents/tools/index.mdx @@ -48,7 +48,7 @@ See below for an example of defining and using `DynamicTool`s. ```typescript import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { DynamicTool } from "langchain/tools"; export const run = async () => { @@ -68,11 +68,9 @@ export const run = async () => { }), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + }); console.log("Loaded agent."); diff --git a/docs/docs/modules/agents/tools/lambda_agent.md b/docs/docs/modules/agents/tools/lambda_agent.md index 4a0fe79c693f..bbdc0d5a2f7f 100644 --- a/docs/docs/modules/agents/tools/lambda_agent.md +++ b/docs/docs/modules/agents/tools/lambda_agent.md @@ -21,10 +21,10 @@ This quick start will demonstrate how an Agent could use a Lambda function to se - The IAM role corresponding to those credentials must have permission to invoke the lambda function. ```typescript -import { OpenAI } from "langchain"; +import { OpenAI } from "langchain/llms/openai"; import { SerpAPI } from "langchain/tools"; import { AWSLambda } from "langchain/tools/aws_lambda"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; const model = new OpenAI({ temperature: 0 }); const emailSenderTool = new AWSLambda({ @@ -38,11 +38,9 @@ const emailSenderTool = new AWSLambda({ functionName: "SendEmailViaSES", // the function name as seen in AWS Console }); const tools = [emailSenderTool, new SerpAPI("api_key_goes_here")]; -const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" -); +const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", +}); const input = `Find out the capital of Croatia. Once you have it, email the answer to testing123@gmail.com.`; const result = await executor.call({ input }); diff --git a/docs/docs/modules/agents/tools/zapier_agent.md b/docs/docs/modules/agents/tools/zapier_agent.md index 847c8fd30e67..84ab8b371af2 100644 --- a/docs/docs/modules/agents/tools/zapier_agent.md +++ b/docs/docs/modules/agents/tools/zapier_agent.md @@ -2,7 +2,7 @@ Full docs here: https://nla.zapier.com/api/v1/dynamic/docs -**Zapier Natural Language Actions** gives you access to the 5k+ apps, 20k+ actions on Zapier's platform through a natural language API interface. +**Zapier Natural Language Actions** gives you access to the 5k+ apps and 20k+ actions on Zapier's platform through a natural language API interface. NLA supports apps like Gmail, Salesforce, Trello, Slack, Asana, HubSpot, Google Sheets, Microsoft Teams, and thousands more apps: https://zapier.com/apps @@ -16,11 +16,14 @@ User-facing (Oauth): for production scenarios where you are deploying an end-use This quick start will focus on the server-side use case for brevity. Review full docs or reach out to nla@zapier.com for user-facing oauth developer support. -This example goes over how to use the Zapier integration an Agent. In code, below: +The example below demonstrates how to use the Zapier integration as an Agent: ```typescript import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor, ZapierToolKit } from "langchain/agents"; +import { + initializeAgentExecutorWithOptions, + ZapierToolKit, +} from "langchain/agents"; import { ZapierNLAWrapper } from "langchain/tools"; export const run = async () => { @@ -28,11 +31,13 @@ export const run = async () => { const zapier = new ZapierNLAWrapper(); const toolkit = await ZapierToolKit.fromZapierNLAWrapper(zapier); - const executor = await initializeAgentExecutor( + const executor = await initializeAgentExecutorWithOptions( toolkit.tools, model, - "zero-shot-react-description", - true + { + agentType: "zero-shot-react-description", + verbose: true, + } ); console.log("Loaded agent."); diff --git a/docs/docs/production/tracing.md b/docs/docs/production/tracing.md index 14b126fb3d14..b42e823ccd0a 100644 --- a/docs/docs/production/tracing.md +++ b/docs/docs/production/tracing.md @@ -10,7 +10,7 @@ Here's an example of how to use tracing in `langchain.js`. All that needs to be ```typescript import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; import process from "process"; @@ -27,12 +27,10 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; @@ -49,7 +47,7 @@ We are actively working on improving tracing to work better with concurrency. Fo ```typescript import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; import process from "process"; @@ -71,12 +69,10 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; @@ -115,13 +111,11 @@ export const run = async () => { for (const tool of tools) { tool.callbackManager = callbackManager; } - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true, - callbackManager - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + callbackManager, + }); executor.agent.llmChain.callbackManager = callbackManager; executors.push(executor); } diff --git a/examples/src/agents/aiplugin-tool.ts b/examples/src/agents/aiplugin-tool.ts index 43e835ca3ec8..02b3ed2c44fa 100644 --- a/examples/src/agents/aiplugin-tool.ts +++ b/examples/src/agents/aiplugin-tool.ts @@ -1,5 +1,5 @@ import { ChatOpenAI } from "langchain/chat_models/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { RequestsGetTool, RequestsPostTool, @@ -14,11 +14,10 @@ export const run = async () => { "https://www.klarna.com/.well-known/ai-plugin.json" ), ]; - const agent = await initializeAgentExecutor( + const agent = await initializeAgentExecutorWithOptions( tools, new ChatOpenAI({ temperature: 0 }), - "chat-zero-shot-react-description", - true + { agentType: "chat-zero-shot-react-description", verbose: true } ); const result = await agent.call({ diff --git a/examples/src/agents/chat_convo_with_tracing.ts b/examples/src/agents/chat_convo_with_tracing.ts index c449e9711a51..ad47f4020cff 100644 --- a/examples/src/agents/chat_convo_with_tracing.ts +++ b/examples/src/agents/chat_convo_with_tracing.ts @@ -1,8 +1,7 @@ import { ChatOpenAI } from "langchain/chat_models/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; -import { BufferMemory } from "langchain/memory"; export const run = async () => { process.env.LANGCHAIN_HANDLER = "langchain"; @@ -16,16 +15,13 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "chat-conversational-react-description", - true - ); - executor.memory = new BufferMemory({ - returnMessages: true, - memoryKey: "chat_history", - inputKey: "input", + // Passing "chat-conversational-react-description" as the agent type + // automatically creates and uses BufferMemory with the executor. + // If you would like to override this, you can pass in a custom + // memory option, but the memoryKey set on it must be "chat_history". + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "chat-conversational-react-description", + verbose: true, }); console.log("Loaded agent."); diff --git a/examples/src/agents/chat_mrkl.ts b/examples/src/agents/chat_mrkl.ts index 406d4068abcf..474d3145ca98 100644 --- a/examples/src/agents/chat_mrkl.ts +++ b/examples/src/agents/chat_mrkl.ts @@ -1,4 +1,4 @@ -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { ChatOpenAI } from "langchain/chat_models/openai"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; @@ -14,11 +14,9 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "chat-zero-shot-react-description" - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "chat-zero-shot-react-description", + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; diff --git a/examples/src/agents/chat_mrkl_with_tracing.ts b/examples/src/agents/chat_mrkl_with_tracing.ts index 925302b0053c..14fb21e16151 100644 --- a/examples/src/agents/chat_mrkl_with_tracing.ts +++ b/examples/src/agents/chat_mrkl_with_tracing.ts @@ -1,5 +1,5 @@ import { ChatOpenAI } from "langchain/chat_models/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; @@ -15,12 +15,10 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "chat-zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "chat-zero-shot-react-description", + verbose: true, + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; diff --git a/examples/src/agents/concurrent_mrkl.ts b/examples/src/agents/concurrent_mrkl.ts index 506ed3433937..0db4dfd05994 100644 --- a/examples/src/agents/concurrent_mrkl.ts +++ b/examples/src/agents/concurrent_mrkl.ts @@ -1,5 +1,5 @@ import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor, Agent } from "langchain/agents"; +import { initializeAgentExecutorWithOptions, Agent } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; import process from "process"; @@ -21,12 +21,10 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; @@ -65,13 +63,11 @@ export const run = async () => { for (const tool of tools) { tool.callbackManager = callbackManager; } - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true, - callbackManager - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + callbackManager, + }); const agent = executor.agent as Agent; agent.llmChain.callbackManager = callbackManager; executors.push(executor); diff --git a/examples/src/agents/custom_tool.ts b/examples/src/agents/custom_tool.ts index 0cd549dc11c9..d8c0336b60b9 100644 --- a/examples/src/agents/custom_tool.ts +++ b/examples/src/agents/custom_tool.ts @@ -1,5 +1,5 @@ import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { DynamicTool } from "langchain/tools"; export const run = async () => { @@ -25,11 +25,9 @@ export const run = async () => { }), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + }); console.log("Loaded agent."); diff --git a/examples/src/agents/mrkl.ts b/examples/src/agents/mrkl.ts index c61b318e03bb..ab8daf7da325 100644 --- a/examples/src/agents/mrkl.ts +++ b/examples/src/agents/mrkl.ts @@ -1,4 +1,4 @@ -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { OpenAI } from "langchain/llms/openai"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; @@ -14,12 +14,10 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; diff --git a/examples/src/agents/mrkl_browser.ts b/examples/src/agents/mrkl_browser.ts index 09c87df519a3..b25821ece38f 100644 --- a/examples/src/agents/mrkl_browser.ts +++ b/examples/src/agents/mrkl_browser.ts @@ -1,5 +1,5 @@ import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { OpenAIEmbeddings } from "langchain/embeddings/openai"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; @@ -18,12 +18,10 @@ export const run = async () => { new WebBrowser({ model, embeddings }), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + }); console.log("Loaded agent."); const input = `What is the word of the day on merriam webster. What is the top result on google for that word`; diff --git a/examples/src/agents/mrkl_with_tracing.ts b/examples/src/agents/mrkl_with_tracing.ts index cfae736d43bd..2eba364a0ff6 100644 --- a/examples/src/agents/mrkl_with_tracing.ts +++ b/examples/src/agents/mrkl_with_tracing.ts @@ -1,5 +1,5 @@ import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor } from "langchain/agents"; +import { initializeAgentExecutorWithOptions } from "langchain/agents"; import { SerpAPI } from "langchain/tools"; import { Calculator } from "langchain/tools/calculator"; import process from "process"; @@ -16,12 +16,10 @@ export const run = async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; diff --git a/examples/src/agents/zapier_mrkl.ts b/examples/src/agents/zapier_mrkl.ts index b9c01a5a5e79..28f28ec157dd 100644 --- a/examples/src/agents/zapier_mrkl.ts +++ b/examples/src/agents/zapier_mrkl.ts @@ -1,5 +1,8 @@ import { OpenAI } from "langchain/llms/openai"; -import { initializeAgentExecutor, ZapierToolKit } from "langchain/agents"; +import { + initializeAgentExecutorWithOptions, + ZapierToolKit, +} from "langchain/agents"; import { ZapierNLAWrapper } from "langchain/tools"; export const run = async () => { @@ -7,11 +10,13 @@ export const run = async () => { const zapier = new ZapierNLAWrapper(); const toolkit = await ZapierToolKit.fromZapierNLAWrapper(zapier); - const executor = await initializeAgentExecutor( + const executor = await initializeAgentExecutorWithOptions( toolkit.tools, model, - "zero-shot-react-description", - true + { + agentType: "zero-shot-react-description", + verbose: true, + } ); console.log("Loaded agent."); diff --git a/langchain/src/agents/chat/index.ts b/langchain/src/agents/chat/index.ts index 30c88f6e3e22..75aae7424ad5 100644 --- a/langchain/src/agents/chat/index.ts +++ b/langchain/src/agents/chat/index.ts @@ -36,7 +36,7 @@ export class ChatAgent extends Agent { } _agentType() { - return "zero-shot-react-description" as const; + return "chat-zero-shot-react-description" as const; } observationPrefix() { diff --git a/langchain/src/agents/chat_convo/index.ts b/langchain/src/agents/chat_convo/index.ts index b6ede4ab1f7a..4c0d857d4565 100644 --- a/langchain/src/agents/chat_convo/index.ts +++ b/langchain/src/agents/chat_convo/index.ts @@ -18,7 +18,12 @@ import { Optional } from "../../types/type-utils.js"; import { Agent, AgentArgs } from "../agent.js"; import { AgentActionOutputParser, AgentInput } from "../types.js"; import { ChatConversationalAgentOutputParser } from "./outputParser.js"; -import { PREFIX, SUFFIX, TEMPLATE_TOOL_RESPONSE } from "./prompt.js"; +import { + PREFIX_END, + DEFAULT_PREFIX, + DEFAULT_SUFFIX, + TEMPLATE_TOOL_RESPONSE, +} from "./prompt.js"; export type CreatePromptArgs = { /** String to put after the list of tools. */ @@ -44,9 +49,8 @@ export class ChatConversationalAgent extends Agent { super({ ...input, outputParser }); } - _agentType(): string { - /** Not turning on serialization until more sure of abstractions. */ - throw new Error("Method not implemented."); + _agentType() { + return "chat-conversational-react-description" as const; } observationPrefix() { @@ -91,19 +95,18 @@ export class ChatConversationalAgent extends Agent { } /** - * Create prompt in the style of the zero shot agent. + * Create prompt in the style of the ChatConversationAgent. * * @param tools - List of tools the agent will have access to, used to format the prompt. * @param args - Arguments to create the prompt with. - * @param args.suffix - String to put after the list of tools. - * @param args.prefix - String to put before the list of tools. + * @param args.systemMessage - String to put before the list of tools. + * @param args.humanMessage - String to put after the list of tools. */ static createPrompt(tools: Tool[], args?: CreatePromptArgs) { - const { - systemMessage = PREFIX, - humanMessage = SUFFIX, - outputParser = new ChatConversationalAgentOutputParser(), - } = args ?? {}; + const systemMessage = (args?.systemMessage ?? DEFAULT_PREFIX) + PREFIX_END; + const humanMessage = args?.humanMessage ?? DEFAULT_SUFFIX; + const outputParser = + args?.outputParser ?? new ChatConversationalAgentOutputParser(); const toolStrings = tools .map((tool) => `${tool.name}: ${tool.description}`) .join("\n"); diff --git a/langchain/src/agents/chat_convo/prompt.ts b/langchain/src/agents/chat_convo/prompt.ts index 89fdfd35971c..f8a2d4c15a80 100644 --- a/langchain/src/agents/chat_convo/prompt.ts +++ b/langchain/src/agents/chat_convo/prompt.ts @@ -1,4 +1,4 @@ -export const PREFIX = `Assistant is a large language model trained by OpenAI. +export const DEFAULT_PREFIX = `Assistant is a large language model trained by OpenAI. Assistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand. @@ -6,6 +6,8 @@ Assistant is constantly learning and improving, and its capabilities are constan Overall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.`; +export const PREFIX_END = ` However, above all else, all responses must adhere to the format of RESPONSE FORMAT INSTRUCTIONS.`; + export const FORMAT_INSTRUCTIONS = `RESPONSE FORMAT INSTRUCTIONS ---------------------------- @@ -32,7 +34,7 @@ Use this if you want to respond directly to the human. Markdown code snippet for }}}} \`\`\``; -export const SUFFIX = `TOOLS +export const DEFAULT_SUFFIX = `TOOLS ------ Assistant can ask the user to use tools to look up information that may be helpful in answering the users original question. The tools the human can use are: @@ -46,7 +48,7 @@ Here is the user's input (remember to respond with a markdown code snippet of a {{{{input}}}}`; -export const TEMPLATE_TOOL_RESPONSE = `TOOL RESPONSE: +export const TEMPLATE_TOOL_RESPONSE = `TOOL RESPONSE: --------------------- {observation} diff --git a/langchain/src/agents/index.ts b/langchain/src/agents/index.ts index 3e56d4e4b10d..f500a0519dfe 100644 --- a/langchain/src/agents/index.ts +++ b/langchain/src/agents/index.ts @@ -22,7 +22,10 @@ export { } from "./chat_convo/index.js"; export { ChatConversationalAgentOutputParser } from "./chat_convo/outputParser.js"; export { AgentExecutor } from "./executor.js"; -export { initializeAgentExecutor } from "./initialize.js"; +export { + initializeAgentExecutor, + initializeAgentExecutorWithOptions, +} from "./initialize.js"; export { ZeroShotAgent } from "./mrkl/index.js"; export { ZeroShotAgentOutputParser } from "./mrkl/outputParser.js"; export { diff --git a/langchain/src/agents/initialize.ts b/langchain/src/agents/initialize.ts index 62ec9b49c229..c60d0b73e661 100644 --- a/langchain/src/agents/initialize.ts +++ b/langchain/src/agents/initialize.ts @@ -1,5 +1,6 @@ import { BaseLanguageModel } from "../base_language/index.js"; import { CallbackManager, getCallbackManager } from "../callbacks/index.js"; +import { BufferMemory } from "../memory/buffer_memory.js"; import { Tool } from "../tools/base.js"; import { ChatAgent } from "./chat/index.js"; import { ChatConversationalAgent } from "./chat_convo/index.js"; @@ -49,3 +50,75 @@ export const initializeAgentExecutor = async ( throw new Error("Unknown agent type"); } }; + +type AgentExecutorOptions = + | ({ + agentType: "zero-shot-react-description"; + agentArgs?: Parameters[2]; + } & Omit< + Parameters[0], + "agent" | "tools" | "memory" + >) + | ({ + agentType: "chat-zero-shot-react-description"; + agentArgs?: Parameters[2]; + } & Omit< + Parameters[0], + "agent" | "tools" | "memory" + >) + | ({ + agentType: "chat-conversational-react-description"; + agentArgs?: Parameters[2]; + } & Omit< + Parameters[0], + "agent" | "tools" + >); + +export const initializeAgentExecutorWithOptions = async ( + tools: Tool[], + llm: BaseLanguageModel, + options: AgentExecutorOptions = { + agentType: + llm._modelType() === "base_chat_model" + ? "chat-zero-shot-react-description" + : "zero-shot-react-description", + } +): Promise => { + switch (options.agentType) { + case "zero-shot-react-description": { + const { agentArgs, ...rest } = options; + return AgentExecutor.fromAgentAndTools({ + agent: ZeroShotAgent.fromLLMAndTools(llm, tools, agentArgs), + tools, + ...rest, + }); + } + case "chat-zero-shot-react-description": { + const { agentArgs, ...rest } = options; + return AgentExecutor.fromAgentAndTools({ + agent: ChatAgent.fromLLMAndTools(llm, tools, agentArgs), + tools, + ...rest, + }); + } + case "chat-conversational-react-description": { + const { agentArgs, memory, ...rest } = options; + const executor = AgentExecutor.fromAgentAndTools({ + agent: ChatConversationalAgent.fromLLMAndTools(llm, tools, agentArgs), + tools, + memory: + memory ?? + new BufferMemory({ + returnMessages: true, + memoryKey: "chat_history", + inputKey: "input", + }), + ...rest, + }); + return executor; + } + default: { + throw new Error("Unknown agent type"); + } + } +}; diff --git a/langchain/src/agents/mrkl/index.ts b/langchain/src/agents/mrkl/index.ts index e2d6f59a77e2..801fbcb900d4 100644 --- a/langchain/src/agents/mrkl/index.ts +++ b/langchain/src/agents/mrkl/index.ts @@ -23,7 +23,7 @@ export type CreatePromptArgs = { inputVariables?: string[]; }; -type ZeroShotAgentInput = Optional; +export type ZeroShotAgentInput = Optional; /** * Agent for the MRKL chain. diff --git a/langchain/src/agents/tests/agent.int.test.ts b/langchain/src/agents/tests/agent.int.test.ts index 72a91325933e..613a2c8d2530 100644 --- a/langchain/src/agents/tests/agent.int.test.ts +++ b/langchain/src/agents/tests/agent.int.test.ts @@ -6,7 +6,7 @@ import { loadAgent } from "../load.js"; import { AgentExecutor, Tool } from "../index.js"; import { SerpAPI } from "../../tools/serpapi.js"; import { Calculator } from "../../tools/calculator.js"; -import { initializeAgentExecutor } from "../initialize.js"; +import { initializeAgentExecutorWithOptions } from "../initialize.js"; import { WebBrowser } from "../../tools/webbrowser.js"; test("Run agent from hub", async () => { @@ -46,11 +46,9 @@ test("Run agent locally", async () => { new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + }); console.log("Loaded agent."); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; @@ -73,11 +71,10 @@ test("Run tool web-browser", async () => { new WebBrowser({ model, embeddings: new OpenAIEmbeddings() }), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description" - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + returnIntermediateSteps: true, + }); console.log("Loaded agent."); const input = `What is the word of the day on merriam webster`; diff --git a/langchain/src/agents/tests/chat_convo_agent.int.test.ts b/langchain/src/agents/tests/chat_convo_agent.int.test.ts new file mode 100644 index 000000000000..75482ac10b28 --- /dev/null +++ b/langchain/src/agents/tests/chat_convo_agent.int.test.ts @@ -0,0 +1,39 @@ +import { test } from "@jest/globals"; +import { ChatOpenAI } from "../../chat_models/openai.js"; +import { BufferMemory } from "../../memory/index.js"; +import { Calculator } from "../../tools/calculator.js"; +import { initializeAgentExecutorWithOptions } from "../initialize.js"; + +test("Run conversational agent with memory", async () => { + const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo" }); + const tools = [new Calculator()]; + + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "chat-conversational-react-description", + verbose: true, + memory: new BufferMemory({ + returnMessages: true, + memoryKey: "chat_history", + inputKey: "input", + }), + }); + console.log("Loaded agent."); + + const input0 = `"how is your day going?"`; + + const result0 = await executor.call({ input: input0 }); + + console.log(`Got output ${result0.output}`); + + const input1 = `"whats is 9 to the 2nd power?"`; + + const result1 = await executor.call({ input: input1 }); + + console.log(`Got output ${result1.output}`); + + const input2 = `"whats is that result divided by 10?"`; + + const result2 = await executor.call({ input: input2 }); + + console.log(`Got output ${result2.output}`); +}); diff --git a/langchain/src/callbacks/tests/langchain_tracer.int.test.ts b/langchain/src/callbacks/tests/langchain_tracer.int.test.ts index c88fbdb3ef4d..89cec9490df8 100644 --- a/langchain/src/callbacks/tests/langchain_tracer.int.test.ts +++ b/langchain/src/callbacks/tests/langchain_tracer.int.test.ts @@ -5,7 +5,7 @@ import { LangChainTracer } from "../tracers.js"; import { OpenAI } from "../../llms/openai.js"; import { SerpAPI } from "../../tools/index.js"; import { Calculator } from "../../tools/calculator.js"; -import { initializeAgentExecutor } from "../../agents/index.js"; +import { initializeAgentExecutorWithOptions } from "../../agents/index.js"; test("Test LangChain tracer", async () => { const tracer = new LangChainTracer(); @@ -36,12 +36,10 @@ test.skip("Test Traced Agent with concurrency (skipped until we fix concurrency) new Calculator(), ]; - const executor = await initializeAgentExecutor( - tools, - model, - "zero-shot-react-description", - true - ); + const executor = await initializeAgentExecutorWithOptions(tools, model, { + agentType: "zero-shot-react-description", + verbose: true, + }); const input = `Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?`; diff --git a/langchain/src/chains/tests/simple_sequential_chain.int.test.ts b/langchain/src/chains/tests/simple_sequential_chain.int.test.ts index 830b3fc0abec..8b7c29221b51 100644 --- a/langchain/src/chains/tests/simple_sequential_chain.int.test.ts +++ b/langchain/src/chains/tests/simple_sequential_chain.int.test.ts @@ -39,13 +39,9 @@ test("Test SimpleSequentialChain example usage", async () => { verbose: true, }); const review = await overallChain.run("Tragedy at sunset on the beach"); - expect(review.trim()).toMatchInlineSnapshot(` - "Tragedy at Sunset on the Beach is a powerful and moving story of love, loss, and redemption. The play follows the story of two young lovers, Jack and Jill, whose plans for a future together are tragically cut short when Jack is killed in a car accident. The play follows Jill as she struggles to cope with her grief and eventually finds solace in the arms of another man. - - The play is beautifully written and the performances are outstanding. The actors bring the characters to life with their heartfelt performances, and the audience is taken on an emotional journey as Jill is forced to confront her grief and make a difficult decision between her past and her future. The play culminates in a powerful climax that will leave the audience in tears. - - Overall, Tragedy at Sunset on the Beach is a powerful and moving story that will stay with you long after the curtain falls. It is a must-see for anyone looking for an emotionally charged and thought-provoking experience." - `); + expect(review.trim().toLowerCase()).toContain( + "tragedy at sunset on the beach" + ); }); test("Test SimpleSequentialChain serialize/deserialize", async () => { @@ -80,7 +76,6 @@ test("Test SimpleSequentialChain serialize/deserialize", async () => { serializedChain ); expect(deserializedChain.chains.length).toEqual(2); - expect(deserializedChain._chainType).toEqual("simple_sequential_chain"); - const review = await deserializedChain.run("test"); - expect(review.trim()).toMatchInlineSnapshot(`"Test."`); + expect(deserializedChain._chainType()).toEqual("simple_sequential_chain"); + await deserializedChain.run("test"); });