Skip to content

Commit 267bd6a

Browse files
committed
fix: 修复 OpenAI Langfuse 类型检查
1 parent ecb5339 commit 267bd6a

2 files changed

Lines changed: 17 additions & 15 deletions

File tree

src/services/api/openai/index.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
StreamEvent,
66
SystemAPIErrorMessage,
77
AssistantMessage,
8+
UserMessage,
89
} from '../../../types/message.js'
910
import type { AgentId } from '../../../types/ids.js'
1011
import type { Tools } from '../../../Tool.js'
@@ -56,11 +57,11 @@ import {
5657
* ToolSearchTool to load their full schemas.
5758
*/
5859
function prependDeferredToolListIfNeeded(
59-
messages: Message[],
60+
messages: (AssistantMessage | UserMessage)[],
6061
tools: Tools,
6162
deferredToolNames: Set<string>,
6263
useToolSearch: boolean,
63-
): Message[] {
64+
): (AssistantMessage | UserMessage)[] {
6465
if (!useToolSearch || isDeferredToolsDeltaEnabled()) return messages
6566

6667
const deferredToolList = tools
@@ -80,6 +81,10 @@ function prependDeferredToolListIfNeeded(
8081
]
8182
}
8283

84+
function isOpenAIConvertibleMessage(msg: Message): msg is AssistantMessage | UserMessage {
85+
return msg.type === 'assistant' || msg.type === 'user'
86+
}
87+
8388
/**
8489
* Assemble the final AssistantMessage (and optional max_tokens error) from
8590
* accumulated stream state. Extracted to avoid duplication between the
@@ -212,8 +217,9 @@ export async function* queryModelOpenAI(
212217

213218
// 8. Convert messages and tools to OpenAI format
214219
const enableThinking = isOpenAIThinkingEnabled(openaiModel)
220+
const openAIConvertibleMessages = messagesForAPI.filter(isOpenAIConvertibleMessage)
215221
const messagesWithDeferredToolList = prependDeferredToolListIfNeeded(
216-
messagesForAPI,
222+
openAIConvertibleMessages,
217223
tools,
218224
deferredToolNames,
219225
useToolSearch,

src/services/langfuse/convert.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* - tool_result blocks → separate { role: 'tool' } messages
1111
*/
1212

13-
import type { Message, AssistantMessage, UserMessage } from 'src/types/message.js'
13+
import type { AssistantMessage } from 'src/types/message.js'
1414

1515
type LangfuseContentPart =
1616
| { type: 'text'; text: string }
@@ -42,11 +42,6 @@ function isLangfuseRole(value: unknown): value is LangfuseChatMessage['role'] {
4242
}
4343
}
4444

45-
type LangfuseInputMessage =
46-
| UserMessage
47-
| AssistantMessage
48-
| LangfuseChatMessage
49-
5045
function isRecord(value: unknown): value is Record<string, unknown> {
5146
return value !== null && typeof value === 'object' && !Array.isArray(value)
5247
}
@@ -175,15 +170,15 @@ function collapseContent(parts: LangfuseContentPart[]): string | LangfuseContent
175170
return parts
176171
}
177172

178-
function toRole(msg: Message): 'user' | 'assistant' | 'system' {
173+
function toRoleFromWrappedMessage(msg: Record<string, unknown>): 'user' | 'assistant' | 'system' {
179174
if (msg.type === 'assistant') return 'assistant'
180175
if (msg.type === 'system') return 'system'
181176
return 'user'
182177
}
183178

184179
/** Convert internal or OpenAI-style messages → Langfuse input format */
185180
export function convertMessagesToLangfuse(
186-
messages: LangfuseInputMessage[],
181+
messages: readonly unknown[],
187182
systemPrompt?: readonly string[],
188183
): LangfuseChatMessage[] {
189184
const result: LangfuseChatMessage[] = []
@@ -193,11 +188,12 @@ export function convertMessagesToLangfuse(
193188
}
194189
}
195190
for (const msg of messages) {
196-
const isWrappedMessage = 'message' in msg
197-
const inner = isWrappedMessage ? msg.message : msg
198-
if (!inner) continue
191+
if (!isRecord(msg)) continue
192+
const wrappedMessage = msg.message
193+
const isWrappedMessage = isRecord(wrappedMessage)
194+
const inner = isWrappedMessage ? wrappedMessage : msg
199195
const role =
200-
isLangfuseRole(inner.role) ? inner.role : isWrappedMessage ? toRole(msg) : 'user'
196+
isLangfuseRole(inner.role) ? inner.role : isWrappedMessage ? toRoleFromWrappedMessage(msg) : 'user'
201197
const rawContent = inner.content
202198
if (typeof rawContent === 'string' || !Array.isArray(rawContent)) {
203199
const toolCalls = getToolCalls(inner.tool_calls)

0 commit comments

Comments
 (0)