Skip to content

Commit e51acda

Browse files
committed
fix: Handle content filter triggering
1 parent 68b96c2 commit e51acda

File tree

1 file changed

+25
-2
lines changed
  • src/server/services/langchain

1 file changed

+25
-2
lines changed

src/server/services/langchain/chat.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { BaseLanguageModelInput } from '@langchain/core/language_models/base'
22
import type { BaseChatModelCallOptions } from '@langchain/core/language_models/chat_models'
3-
import type { AIMessageChunk, BaseMessageLike } from '@langchain/core/messages'
3+
import { AIMessageChunk, BaseMessageLike } from '@langchain/core/messages'
44
import type { Runnable } from '@langchain/core/runnables'
55
import type { StructuredTool } from '@langchain/core/tools'
66
import { concat } from '@langchain/core/utils/stream'
@@ -146,7 +146,7 @@ export const streamChat = async ({
146146
* @returns An object with statistics about the chat turn and any tool calls made.
147147
*/
148148
const chatTurn = async (model: ChatModel, messages: BaseMessageLike[], toolsByName: Record<string, ChatTool>, writeEvent: WriteEventFunction, user: User) => {
149-
const stream = await model.stream(messages)
149+
const stream = await safelyStreamMessages(model, messages)
150150

151151
const startTS = Date.now()
152152
let firstTokenTS = 0
@@ -244,3 +244,26 @@ const chatTurn = async (model: ChatModel, messages: BaseMessageLike[], toolsByNa
244244
fullOutput,
245245
}
246246
}
247+
248+
const safelyStreamMessages = async (model: ChatModel, messages: BaseMessageLike[]) => {
249+
try {
250+
return await model.stream(messages)
251+
} catch (error) {
252+
if (error instanceof Error) {
253+
// Handle API errors specifically.
254+
// Handle content filter:
255+
if ("code" in error && error.code === 'content_filter') {
256+
const innerError = "error" in error ? error.error as { message: string } : null
257+
258+
const extraAzureInfo = innerError?.message ??
259+
'The response was not generated due to the prompt triggering content filters. No further details available.'
260+
261+
return [new AIMessageChunk({
262+
content: extraAzureInfo,
263+
})]
264+
}
265+
}
266+
267+
throw error
268+
}
269+
}

0 commit comments

Comments
 (0)