Skip to content

Commit be5dfc6

Browse files
authored
fix(openai/v1): better responses multimodal handling (#9169)
1 parent 1fddf7d commit be5dfc6

File tree

7 files changed

+529
-42
lines changed

7 files changed

+529
-42
lines changed

dependency_range_tests/scripts/with_standard_tests/openai/test-with-latest-deps.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ cd "$monorepo_openai_dir"
3737

3838
# Clean and reinstall to avoid dependency conflicts
3939
pnpm install --no-frozen-lockfile
40-
pnpm add @langchain/core
40+
pnpm add @langchain/core@alpha
4141
pnpm test

libs/providers/langchain-openai/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"zod": "^3.25.76 || ^4"
3636
},
3737
"peerDependencies": {
38-
"@langchain/core": "^1.0.0-alpha.1"
38+
"@langchain/core": "^1.0.0-alpha.6"
3939
},
4040
"devDependencies": {
4141
"@azure/identity": "^4.2.1",

libs/providers/langchain-openai/src/chat_models.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,10 +1626,10 @@ export class ChatOpenAIResponses<
16261626
protected _convertMessagesToResponsesParams(messages: BaseMessage[]) {
16271627
return messages.flatMap(
16281628
(lcMsg): ResponsesInputItem | ResponsesInputItem[] => {
1629-
if (
1630-
isAIMessage(lcMsg) &&
1631-
lcMsg.response_metadata?.output_version === "v1"
1632-
) {
1629+
const responseMetadata = lcMsg.response_metadata as
1630+
| Record<string, unknown>
1631+
| undefined;
1632+
if (responseMetadata?.output_version === "v1") {
16331633
return _convertToResponsesMessageFromV1(lcMsg);
16341634
}
16351635

@@ -1697,7 +1697,7 @@ export class ChatOpenAIResponses<
16971697
}
16981698

16991699
// Handle custom tool output
1700-
if (toolMessage.metadata?.customTool) {
1700+
if (toolMessage.additional_kwargs?.customTool) {
17011701
return {
17021702
type: "custom_tool_call_output",
17031703
call_id: toolMessage.tool_call_id,
@@ -1720,12 +1720,12 @@ export class ChatOpenAIResponses<
17201720
// if we have the original response items, just reuse them
17211721
if (
17221722
!this.zdrEnabled &&
1723-
lcMsg.response_metadata.output != null &&
1724-
Array.isArray(lcMsg.response_metadata.output) &&
1725-
lcMsg.response_metadata.output.length > 0 &&
1726-
lcMsg.response_metadata.output.every((item) => "type" in item)
1723+
responseMetadata?.output != null &&
1724+
Array.isArray(responseMetadata?.output) &&
1725+
responseMetadata?.output.length > 0 &&
1726+
responseMetadata?.output.every((item) => "type" in item)
17271727
) {
1728-
return lcMsg.response_metadata.output;
1728+
return responseMetadata?.output;
17291729
}
17301730

17311731
// otherwise, try to reconstruct the response from what we have
@@ -1827,9 +1827,9 @@ export class ChatOpenAIResponses<
18271827
}
18281828

18291829
const toolOutputs = (
1830-
lcMsg.response_metadata.output as Array<ResponsesInputItem>
1830+
responseMetadata?.output as Array<ResponsesInputItem>
18311831
)?.length
1832-
? lcMsg.response_metadata.output
1832+
? responseMetadata?.output
18331833
: additional_kwargs.tool_outputs;
18341834

18351835
const fallthroughCallTypes: ResponsesInputItem["type"][] = [

libs/providers/langchain-openai/src/utils/message_inputs.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ import type {
1919
import { _convertToCompletionsMessageFromV1 } from "./standard.js";
2020
import { isReasoningModel, messageToOpenAIRole } from "./misc.js";
2121

22-
export type ResponsesInputItem = OpenAIClient.Responses.ResponseInputItem;
23-
2422
export const completionsApiContentBlockConverter: StandardContentBlockConverter<{
2523
text: ChatCompletionContentPartText;
2624
image: ChatCompletionContentPartImage;
@@ -198,7 +196,7 @@ export function _convertMessagesToOpenAIParams(
198196
): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] {
199197
return messages.flatMap((message) => {
200198
if (
201-
isAIMessage(message) &&
199+
"output_version" in message.response_metadata &&
202200
message.response_metadata?.output_version === "v1"
203201
) {
204202
return _convertToCompletionsMessageFromV1(message);

libs/providers/langchain-openai/src/utils/misc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { OpenAI as OpenAIClient } from "openai";
2-
import type { BaseMessage, ChatMessage } from "@langchain/core/messages";
2+
import { BaseMessage, ChatMessage } from "@langchain/core/messages";
33

44
export const iife = <T>(fn: () => T) => fn();
55

0 commit comments

Comments
 (0)