diff --git a/tools/server/webui/src/lib/services/chat.service.ts b/tools/server/webui/src/lib/services/chat.service.ts index ee575c42cf..e17160fedd 100644 --- a/tools/server/webui/src/lib/services/chat.service.ts +++ b/tools/server/webui/src/lib/services/chat.service.ts @@ -1,7 +1,7 @@ import { getJsonHeaders, formatAttachmentText, isAbortError } from '$lib/utils'; import { AGENTIC_REGEX } from '$lib/constants/agentic'; import { AttachmentType, MessageRole, ReasoningFormat } from '$lib/enums'; -import type { ApiChatMessageContentPart } from '$lib/types/api'; +import type { ApiChatMessageContentPart, ApiChatCompletionToolCall } from '$lib/types/api'; import type { DatabaseMessageExtraMcpPrompt } from '$lib/types'; /** @@ -634,11 +634,34 @@ export class ChatService { static convertDbMessageToApiChatMessageData( message: DatabaseMessage & { extra?: DatabaseMessageExtra[] } ): ApiChatMessageData { - if (!message.extra || message.extra.length === 0) { + // Handle tool result messages (role: 'tool') + if (message.role === MessageRole.TOOL && message.toolCallId) { return { + role: MessageRole.TOOL, + content: message.content, + tool_call_id: message.toolCallId + }; + } + + // Parse tool calls for assistant messages + let toolCalls: ApiChatCompletionToolCall[] | undefined; + if (message.toolCalls) { + try { + toolCalls = JSON.parse(message.toolCalls); + } catch { + // Ignore parse errors for malformed tool calls + } + } + + if (!message.extra || message.extra.length === 0) { + const result: ApiChatMessageData = { role: message.role as MessageRole, content: message.content }; + if (toolCalls && toolCalls.length > 0) { + result.tool_calls = toolCalls; + } + return result; } const contentParts: ApiChatMessageContentPart[] = []; @@ -741,10 +764,14 @@ export class ChatService { }); } - return { + const result: ApiChatMessageData = { role: message.role as MessageRole, content: contentParts }; + if (toolCalls && toolCalls.length > 0) { + result.tool_calls = toolCalls; + } + return result; } /** diff --git a/tools/server/webui/src/lib/types/database.d.ts b/tools/server/webui/src/lib/types/database.d.ts index 927de3cb74..e4e24a6099 100644 --- a/tools/server/webui/src/lib/types/database.d.ts +++ b/tools/server/webui/src/lib/types/database.d.ts @@ -81,7 +81,10 @@ export interface DatabaseMessage { * @deprecated - left for backward compatibility */ thinking?: string; + /** Serialized JSON array of tool calls made by assistant messages */ toolCalls?: string; + /** Tool call ID for tool result messages (role: 'tool') */ + toolCallId?: string; children: string[]; extra?: DatabaseMessageExtra[]; timings?: ChatMessageTimings;