Skip to content

Commit f320e11

Browse files
authored
core[minor]: Standardize tool calling (langchain-ai#5019)
* Beef up tool message support * Fix build * Relax types * Plumb in partner packages * Fix lint * Lint * Add new tool calling agent * Fix build * Fix build * Coerce OpenAI request params from input tool messages * Few shotting support * Remove log * Only populate tool params if sensible * Fix agent flows
1 parent 1c270f4 commit f320e11

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+3345
-1733
lines changed

docs/core_docs/.gitignore

+22-20
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,6 @@ docs/use_cases/query_analysis/quickstart.md
5757
docs/use_cases/query_analysis/quickstart.mdx
5858
docs/use_cases/query_analysis/index.md
5959
docs/use_cases/query_analysis/index.mdx
60-
docs/use_cases/extraction/quickstart.md
61-
docs/use_cases/extraction/quickstart.mdx
62-
docs/use_cases/extraction/index.md
63-
docs/use_cases/extraction/index.mdx
64-
docs/use_cases/extraction/guidelines.md
65-
docs/use_cases/extraction/guidelines.mdx
6660
docs/use_cases/graph/semantic.md
6761
docs/use_cases/graph/semantic.mdx
6862
docs/use_cases/graph/quickstart.md
@@ -73,18 +67,14 @@ docs/use_cases/graph/mapping.md
7367
docs/use_cases/graph/mapping.mdx
7468
docs/use_cases/graph/index.md
7569
docs/use_cases/graph/index.mdx
76-
docs/use_cases/query_analysis/techniques/structuring.md
77-
docs/use_cases/query_analysis/techniques/structuring.mdx
78-
docs/use_cases/query_analysis/techniques/step_back.md
79-
docs/use_cases/query_analysis/techniques/step_back.mdx
80-
docs/use_cases/query_analysis/techniques/routing.md
81-
docs/use_cases/query_analysis/techniques/routing.mdx
82-
docs/use_cases/query_analysis/techniques/hyde.md
83-
docs/use_cases/query_analysis/techniques/hyde.mdx
84-
docs/use_cases/query_analysis/techniques/expansion.md
85-
docs/use_cases/query_analysis/techniques/expansion.mdx
86-
docs/use_cases/query_analysis/techniques/decomposition.md
87-
docs/use_cases/query_analysis/techniques/decomposition.mdx
70+
docs/use_cases/graph/construction.md
71+
docs/use_cases/graph/construction.mdx
72+
docs/use_cases/extraction/quickstart.md
73+
docs/use_cases/extraction/quickstart.mdx
74+
docs/use_cases/extraction/index.md
75+
docs/use_cases/extraction/index.mdx
76+
docs/use_cases/extraction/guidelines.md
77+
docs/use_cases/extraction/guidelines.mdx
8878
docs/use_cases/query_analysis/how_to/no_queries.md
8979
docs/use_cases/query_analysis/how_to/no_queries.mdx
9080
docs/use_cases/query_analysis/how_to/multiple_retrievers.md
@@ -97,6 +87,18 @@ docs/use_cases/query_analysis/how_to/few_shot.md
9787
docs/use_cases/query_analysis/how_to/few_shot.mdx
9888
docs/use_cases/query_analysis/how_to/constructing_filters.md
9989
docs/use_cases/query_analysis/how_to/constructing_filters.mdx
90+
docs/use_cases/query_analysis/techniques/structuring.md
91+
docs/use_cases/query_analysis/techniques/structuring.mdx
92+
docs/use_cases/query_analysis/techniques/step_back.md
93+
docs/use_cases/query_analysis/techniques/step_back.mdx
94+
docs/use_cases/query_analysis/techniques/routing.md
95+
docs/use_cases/query_analysis/techniques/routing.mdx
96+
docs/use_cases/query_analysis/techniques/hyde.md
97+
docs/use_cases/query_analysis/techniques/hyde.mdx
98+
docs/use_cases/query_analysis/techniques/expansion.md
99+
docs/use_cases/query_analysis/techniques/expansion.mdx
100+
docs/use_cases/query_analysis/techniques/decomposition.md
101+
docs/use_cases/query_analysis/techniques/decomposition.mdx
100102
docs/use_cases/extraction/how_to/parse.md
101103
docs/use_cases/extraction/how_to/parse.mdx
102104
docs/use_cases/extraction/how_to/handle_long_text.md
@@ -105,12 +107,12 @@ docs/use_cases/extraction/how_to/handle_files.md
105107
docs/use_cases/extraction/how_to/handle_files.mdx
106108
docs/use_cases/extraction/how_to/examples.md
107109
docs/use_cases/extraction/how_to/examples.mdx
108-
docs/modules/memory/chat_messages/custom.md
109-
docs/modules/memory/chat_messages/custom.mdx
110110
docs/modules/model_io/output_parsers/custom.md
111111
docs/modules/model_io/output_parsers/custom.mdx
112112
docs/modules/model_io/chat/function_calling.md
113113
docs/modules/model_io/chat/function_calling.mdx
114+
docs/modules/memory/chat_messages/custom.md
115+
docs/modules/memory/chat_messages/custom.mdx
114116
docs/modules/data_connection/vectorstores/custom.md
115117
docs/modules/data_connection/vectorstores/custom.mdx
116118
docs/modules/model_io/output_parsers/types/openai_tools.md

langchain-core/.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ messages.cjs
6262
messages.js
6363
messages.d.ts
6464
messages.d.cts
65+
messages/tool.cjs
66+
messages/tool.js
67+
messages/tool.d.ts
68+
messages/tool.d.cts
6569
output_parsers.cjs
6670
output_parsers.js
6771
output_parsers.d.ts

langchain-core/langchain.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const config = {
2828
"load/serializable": "load/serializable",
2929
memory: "memory",
3030
messages: "messages/index",
31+
"messages/tool": "messages/tool",
3132
output_parsers: "output_parsers/index",
3233
"output_parsers/openai_tools": "output_parsers/openai_tools/index",
3334
"output_parsers/openai_functions": "output_parsers/openai_functions/index",

langchain-core/package.json

+13
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,15 @@
237237
"import": "./messages.js",
238238
"require": "./messages.cjs"
239239
},
240+
"./messages/tool": {
241+
"types": {
242+
"import": "./messages/tool.d.ts",
243+
"require": "./messages/tool.d.cts",
244+
"default": "./messages/tool.d.ts"
245+
},
246+
"import": "./messages/tool.js",
247+
"require": "./messages/tool.cjs"
248+
},
240249
"./output_parsers": {
241250
"types": {
242251
"import": "./output_parsers.d.ts",
@@ -620,6 +629,10 @@
620629
"messages.js",
621630
"messages.d.ts",
622631
"messages.d.cts",
632+
"messages/tool.cjs",
633+
"messages/tool.js",
634+
"messages/tool.d.ts",
635+
"messages/tool.d.cts",
623636
"output_parsers.cjs",
624637
"output_parsers.js",
625638
"output_parsers.d.ts",

langchain-core/src/agents.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export type AgentAction = {
22
tool: string;
3-
toolInput: string;
3+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
4+
toolInput: string | Record<string, any>;
45
log: string;
56
};
67

langchain-core/src/language_models/chat_models.ts

+23-6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import {
2828
} from "../callbacks/manager.js";
2929
import type { RunnableConfig } from "../runnables/config.js";
3030
import type { BaseCache } from "../caches.js";
31+
import { StructuredToolInterface } from "../tools.js";
32+
import { RunnableInterface } from "../runnables/types.js";
3133

3234
/**
3335
* Represents a serialized chat model.
@@ -94,8 +96,10 @@ interface ChatModelGenerateCachedParameters<
9496
* provides methods for generating chat based on input messages.
9597
*/
9698
export abstract class BaseChatModel<
97-
CallOptions extends BaseChatModelCallOptions = BaseChatModelCallOptions
98-
> extends BaseLanguageModel<BaseMessageChunk, CallOptions> {
99+
CallOptions extends BaseChatModelCallOptions = BaseChatModelCallOptions,
100+
// TODO: Fix the parameter order on the next minor version.
101+
OutputMessageType extends BaseMessageChunk = BaseMessageChunk
102+
> extends BaseLanguageModel<OutputMessageType, CallOptions> {
99103
declare ParsedCallOptions: Omit<
100104
CallOptions,
101105
keyof RunnableConfig & "timeout"
@@ -123,6 +127,19 @@ export abstract class BaseChatModel<
123127
return [runnableConfig, callOptions as this["ParsedCallOptions"]];
124128
}
125129

130+
/**
131+
* Bind tool-like objects to this chat model.
132+
*
133+
* @param tools A list of tool definitions to bind to this chat model.
134+
* Can be a structured tool or an object matching the provider's
135+
* specific tool schema.
136+
* @param kwargs Any additional parameters to bind.
137+
*/
138+
bindTools?(
139+
tools: (StructuredToolInterface | Record<string, unknown>)[],
140+
kwargs?: Partial<CallOptions>
141+
): RunnableInterface<BaseLanguageModelInput, OutputMessageType, CallOptions>;
142+
126143
/**
127144
* Invokes the chat model with a single input.
128145
* @param input The input for the language model.
@@ -132,7 +149,7 @@ export abstract class BaseChatModel<
132149
async invoke(
133150
input: BaseLanguageModelInput,
134151
options?: CallOptions
135-
): Promise<BaseMessageChunk> {
152+
): Promise<OutputMessageType> {
136153
const promptValue = BaseChatModel._convertInputToPromptValue(input);
137154
const result = await this.generatePrompt(
138155
[promptValue],
@@ -141,7 +158,7 @@ export abstract class BaseChatModel<
141158
);
142159
const chatGeneration = result.generations[0][0] as ChatGeneration;
143160
// TODO: Remove cast after figuring out inheritance
144-
return chatGeneration.message as BaseMessageChunk;
161+
return chatGeneration.message as OutputMessageType;
145162
}
146163

147164
// eslint-disable-next-line require-yield
@@ -156,7 +173,7 @@ export abstract class BaseChatModel<
156173
async *_streamIterator(
157174
input: BaseLanguageModelInput,
158175
options?: CallOptions
159-
): AsyncGenerator<BaseMessageChunk> {
176+
): AsyncGenerator<OutputMessageType> {
160177
// Subclass check required to avoid double callbacks with default implementation
161178
if (
162179
this._streamResponseChunks ===
@@ -203,7 +220,7 @@ export abstract class BaseChatModel<
203220
...chunk.generationInfo,
204221
...chunk.message.response_metadata,
205222
};
206-
yield chunk.message;
223+
yield chunk.message as OutputMessageType;
207224
if (!generationChunk) {
208225
generationChunk = chunk;
209226
} else {

0 commit comments

Comments
 (0)