From db809e5a478cc05e899ff65c4531dc8e8a71f0a1 Mon Sep 17 00:00:00 2001 From: Matthieu Balmes Date: Wed, 21 Feb 2024 15:58:19 +0100 Subject: [PATCH] fix(thread): only convert tool call responses to string if they're not strings --- dist/index.cjs | 4 ++- dist/index.cjs.map | 2 +- dist/index.esm.js | 4 ++- dist/index.esm.js.map | 2 +- dist/index.js | 4 ++- dist/index.js.map | 2 +- dist/index.mjs | 4 ++- dist/index.mjs.map | 2 +- docs/README.md | 22 +++++++-------- docs/classes/AccessDeniedError.md | 2 +- docs/classes/Assistant.md | 18 ++++++------ docs/classes/ContentFilterError.md | 2 +- docs/classes/ContextLengthExceededError.md | 2 +- docs/classes/InvalidRequestError.md | 2 +- docs/classes/InvalidToolOutputsError.md | 2 +- docs/classes/RequiredAction.md | 8 +++--- docs/classes/Thread.md | 32 +++++++++++----------- docs/classes/ThreadMessageConverter.md | 4 +-- docs/classes/ToolEmulator.md | 6 ++-- docs/classes/UnknownError.md | 2 +- docs/interfaces/AssistantCreateParams.md | 14 +++++----- docs/interfaces/ToolOutput.md | 6 ++-- src/thread/thread.ts | 5 +++- types/thread/thread.d.ts.map | 2 +- 24 files changed, 82 insertions(+), 71 deletions(-) diff --git a/dist/index.cjs b/dist/index.cjs index f4f120a..082a43b 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -379,7 +379,9 @@ class Thread extends EventEmitter { for (const toolOutput of toolOutputs) { const message = { role: 'tool', - content: JSON.stringify(toolOutput.value), + content: typeof toolOutput.value === 'string' + ? toolOutput.value + : JSON.stringify(toolOutput.value), toolCallId: toolOutput.callId, }; if (toolOutput.metadata !== void 0) { diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 2bf4337..492f4a8 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content: JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":["Readable","stream"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.cjs","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content:\n typeof toolOutput.value === 'string'\n ? toolOutput.value\n : JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":["Readable","stream"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.esm.js b/dist/index.esm.js index fa98077..892d8fc 100644 --- a/dist/index.esm.js +++ b/dist/index.esm.js @@ -377,7 +377,9 @@ class Thread extends EventEmitter { for (const toolOutput of toolOutputs) { const message = { role: 'tool', - content: JSON.stringify(toolOutput.value), + content: typeof toolOutput.value === 'string' + ? toolOutput.value + : JSON.stringify(toolOutput.value), toolCallId: toolOutput.callId, }; if (toolOutput.metadata !== void 0) { diff --git a/dist/index.esm.js.map b/dist/index.esm.js.map index c8f66fe..18b9368 100644 --- a/dist/index.esm.js.map +++ b/dist/index.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"index.esm.js","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content: JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.esm.js","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content:\n typeof toolOutput.value === 'string'\n ? toolOutput.value\n : JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 51b1b4d..4af8865 100644 --- a/dist/index.js +++ b/dist/index.js @@ -379,7 +379,9 @@ class Thread extends EventEmitter { for (const toolOutput of toolOutputs) { const message = { role: 'tool', - content: JSON.stringify(toolOutput.value), + content: typeof toolOutput.value === 'string' + ? toolOutput.value + : JSON.stringify(toolOutput.value), toolCallId: toolOutput.callId, }; if (toolOutput.metadata !== void 0) { diff --git a/dist/index.js.map b/dist/index.js.map index 6d12bf1..49431b3 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content: JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":["Readable","stream"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content:\n typeof toolOutput.value === 'string'\n ? toolOutput.value\n : JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":["Readable","stream"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index 621e6db..e6be093 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -377,7 +377,9 @@ class Thread extends EventEmitter { for (const toolOutput of toolOutputs) { const message = { role: 'tool', - content: JSON.stringify(toolOutput.value), + content: typeof toolOutput.value === 'string' + ? toolOutput.value + : JSON.stringify(toolOutput.value), toolCallId: toolOutput.callId, }; if (toolOutput.metadata !== void 0) { diff --git a/dist/index.mjs.map b/dist/index.mjs.map index d377a39..40b0f33 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"file":"index.mjs","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content: JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.mjs","sources":["../src/assistant/assistant.ts","../src/thread/errors.ts","../src/thread/tool.emulator.ts","../src/thread/message.converter.ts","../src/thread/thread.ts"],"sourcesContent":["import type {\n ChatRequestMessage,\n ChatRequestSystemMessage,\n GetChatCompletionsOptions,\n OpenAIClient,\n} from '@azure/openai';\nimport type { ChatCompletionsToolDefinition } from '@azure/openai/types/src/models/models';\nimport { Readable } from 'stream';\n\nexport interface AssistantCreateParams {\n client: OpenAIClient;\n instructions: string;\n tools: ChatCompletionsToolDefinition[];\n deployment: string;\n useLegacyFunctions?: boolean;\n temperature?: number;\n topP?: number;\n}\n\nexport class Assistant {\n public readonly client: OpenAIClient;\n\n private readonly instructions: string;\n private readonly tools: ChatCompletionsToolDefinition[];\n private readonly deployment: string;\n private readonly temperature: number | undefined;\n private readonly topP: number | undefined;\n private readonly useLegacyFunctions: boolean;\n\n constructor(params: AssistantCreateParams) {\n this.client = params.client;\n this.instructions = params.instructions;\n this.tools = params.tools;\n this.deployment = params.deployment;\n\n this.temperature = params.temperature;\n this.topP = params.topP;\n\n this.useLegacyFunctions = params.useLegacyFunctions ?? false;\n }\n\n async streamChatCompletions(\n messages: ChatRequestMessage[],\n ): Promise {\n // Prepend the messages with our instructions as a \"system\" message\n const systemMessage: ChatRequestSystemMessage = {\n role: 'system',\n content: this.instructions,\n };\n messages = [systemMessage, ...messages];\n\n const options: GetChatCompletionsOptions = {};\n\n if (this.temperature !== undefined) {\n options.temperature = this.temperature;\n }\n\n if (this.topP !== undefined) {\n options.topP = this.topP;\n }\n\n if (this.tools.length > 0) {\n if (this.useLegacyFunctions) {\n // Convert tools to functions\n options.functions = this.tools.map((tool) => {\n return tool.function;\n });\n } else {\n options.tools = this.tools;\n }\n }\n const events = await this.client.streamChatCompletions(\n this.deployment,\n messages,\n options,\n );\n\n return Readable.from(events);\n }\n}\n","/**\n * See https://stackoverflow.com/a/41102306/674722 and\n * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n * for why we need to set the prototype of the error classes.\n */\n\nexport class AccessDeniedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContextLengthExceededError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ContentFilterError extends InvalidRequestError {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class UnknownError extends Error {\n constructor(message: string = 'Unknown error') {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class InvalidToolOutputsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import type { FunctionCall } from '@azure/openai';\n\nconst EMULATED_CALL_PREFIX = 'emulated_call_';\n\n/**\n * Helps with the conversion of tool calls to function calls and vice versa.\n */\nexport class ToolEmulator {\n generateEmulatedToolCallId(functionCall: FunctionCall): string {\n return `${EMULATED_CALL_PREFIX}${functionCall.name}`;\n }\n\n isEmulatedToolCallId(toolCallId: string): boolean {\n return toolCallId.startsWith(EMULATED_CALL_PREFIX);\n }\n\n extractFunctionNameFromEmulatedToolCallId(toolCallId: string): string {\n return toolCallId.replace(EMULATED_CALL_PREFIX, '');\n }\n}\n","import type {\n ChatRequestAssistantMessage,\n ChatRequestFunctionMessage,\n ChatRequestMessage,\n ChatRequestSystemMessage,\n ChatRequestToolMessage,\n ChatRequestUserMessage,\n} from '@azure/openai';\nimport type {\n ChatMessage,\n ChatRequestSystemMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n ChatRequestUserMessageWithMetadata,\n ChatResponseMessageWithMetadata,\n} from '../message';\nimport { ToolEmulator } from './tool.emulator';\n\nexport class ThreadMessageConverter {\n private readonly toolEmulator = new ToolEmulator();\n\n /**\n * Convert the mix of ChatRequestMessages and ChatResponseMessages to ChatRequestMessages only\n * so they can be sent again to the LLM.\n */\n convert(messages: ChatMessage[]): ChatRequestMessage[] {\n return messages.map((m) => {\n switch (m.role) {\n case 'system': {\n const systemMessage =\n m as ChatRequestSystemMessageWithMetadata;\n return {\n role: 'system',\n content: systemMessage.content,\n } as ChatRequestSystemMessage;\n }\n case 'user': {\n const userMessage = m as ChatRequestUserMessageWithMetadata;\n return {\n role: 'user',\n content: userMessage.content,\n name: userMessage.name,\n } as ChatRequestUserMessage;\n }\n case 'tool': {\n const toolMessage = m as ChatRequestToolMessageWithMetadata;\n if (\n this.toolEmulator.isEmulatedToolCallId(\n toolMessage.toolCallId,\n )\n ) {\n return {\n role: 'function',\n content: toolMessage.content,\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n toolMessage.toolCallId,\n ),\n } as ChatRequestFunctionMessage;\n }\n return {\n role: 'tool',\n content: toolMessage.content,\n toolCallId: toolMessage.toolCallId,\n } as ChatRequestToolMessage;\n }\n case 'assistant': {\n const assistantMessage =\n m as ChatResponseMessageWithMetadata;\n\n if (\n assistantMessage.toolCalls[0] &&\n this.toolEmulator.isEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n )\n ) {\n // This is a function call\n return {\n role: 'assistant',\n content: assistantMessage.content,\n functionCall: {\n name: this.toolEmulator.extractFunctionNameFromEmulatedToolCallId(\n assistantMessage.toolCalls[0].id,\n ),\n arguments:\n assistantMessage.toolCalls[0].function\n .arguments,\n },\n } as ChatRequestAssistantMessage;\n }\n\n return {\n role: 'assistant',\n content: assistantMessage.content,\n toolCalls: assistantMessage.toolCalls,\n } as ChatRequestAssistantMessage;\n }\n default:\n throw new Error(`Unknown message role ${m.role}`);\n }\n });\n }\n}\n","import type {\n ChatCompletions,\n ChatCompletionsToolCall,\n ChatRequestMessage,\n ChatResponseMessage,\n FunctionCall,\n} from '@azure/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n ChatMessage,\n ChatRequestMessageWithMetadata,\n ChatRequestToolMessageWithMetadata,\n} from '../message';\nimport {\n AccessDeniedError,\n ContentFilterError,\n ContextLengthExceededError,\n InvalidRequestError,\n InvalidToolOutputsError,\n UnknownError,\n} from './errors';\nimport { ThreadMessageConverter } from './message.converter';\nimport { ToolEmulator } from './tool.emulator';\n\ninterface MultiToolUseParallelArguments {\n tool_uses: {\n recipient_name: string;\n parameters: string;\n }[];\n}\n\nexport class Thread extends EventEmitter {\n private _stream: Readable | null = null;\n private readonly _messages: ChatMessage[] = [];\n private readonly converter = new ThreadMessageConverter();\n private readonly toolEmulator = new ToolEmulator();\n\n constructor(\n public readonly id: string,\n messages: ChatMessage[] = [],\n ) {\n super();\n this._messages = messages;\n }\n\n get stream(): Readable | null {\n return this._stream;\n }\n\n get messages(): ChatMessage[] {\n // TODO Return a deep copy\n return this._messages;\n }\n\n addMessage(message: ChatRequestMessageWithMetadata): void {\n this.doAddMessage(message);\n }\n\n async run(assistant: Assistant): Promise {\n try {\n return await this.doRun(assistant);\n } catch (e) {\n this.emitImmediate('error', e);\n }\n }\n\n private async doRun(assistant: Assistant): Promise {\n if (this._stream) {\n this._stream.push(null);\n }\n\n this._stream = new Readable({\n read: () => {},\n });\n\n this.emitImmediate('in_progress');\n\n const messages = this.converter.convert(this._messages);\n\n let stream: Readable;\n\n try {\n stream = await assistant.streamChatCompletions(messages);\n } catch (e) {\n const error = this.buildError(e);\n return this.emitImmediate('error', error);\n }\n\n let content: string | null = null;\n const toolCalls: ChatCompletionsToolCall[] = [];\n let functionCall: FunctionCall | undefined = undefined;\n\n stream.on('data', (completion: ChatCompletions) => {\n if (!completion.id || completion.id === '') {\n // First completion is empty when using old models like gpt-35-turbo\n return;\n }\n const choice = completion.choices[0];\n if (!choice) {\n const err = new Error('No completions returned');\n return this.emitImmediate('error', err);\n }\n\n const delta = choice.delta;\n if (!delta) {\n const err = new Error('No delta returned');\n return this.emitImmediate('error', err);\n }\n\n if (delta.content) {\n content = content ? content + delta.content : delta.content;\n\n // Write also to the stream of the thread\n this._stream?.push(delta.content);\n }\n\n // Merge toolCalls\n if (delta.toolCalls) {\n for (const toolCall of delta.toolCalls) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const index = toolCall['index']; // Not typed yet by the @azure/openai package\n const existingToolCall = toolCalls[index];\n\n if (existingToolCall) {\n existingToolCall.function.arguments +=\n toolCall.function.arguments;\n } else {\n toolCalls.push({\n type: toolCall.type,\n function: toolCall.function,\n id: toolCall.id,\n });\n }\n }\n }\n\n // Merge functionCalls\n if (delta.functionCall) {\n if (functionCall) {\n functionCall.arguments += delta.functionCall.arguments;\n } else {\n functionCall = {\n ...delta.functionCall,\n arguments: '',\n };\n }\n }\n\n if (choice.finishReason === null) {\n return;\n }\n\n let finalToolCalls: ChatCompletionsToolCall[];\n\n if (toolCalls.length > 0) {\n if (\n toolCalls.length === 1 &&\n toolCalls[0] &&\n toolCalls[0].type === 'function' &&\n toolCalls[0].function.name === 'multi_tool_use.parallel'\n ) {\n /**\n * That seems to be an hallucination from the model,\n * we convert the payload into regular tool calls\n * See https://community.openai.com/t/model-tries-to-call-unknown-function-multi-tool-use-parallel/490653/8\n */\n const toolCall = toolCalls[0];\n const args = JSON.parse(\n toolCall.function.arguments,\n ) as MultiToolUseParallelArguments;\n /**\n * The arguments follow the structure:\n * {\n * tool_uses: [\n * {\n * recipient_name: \"functions.actual_tool_name\",\n * parameters: {\n * foo: \"bar\",\n * baz: true,\n * }\n * },\n * ...\n * ]\n * }\n */\n finalToolCalls = args.tool_uses.map(\n (\n toolUse: {\n recipient_name: string;\n parameters: unknown;\n },\n index,\n ) => {\n return {\n type: 'function',\n function: {\n name: toolUse.recipient_name.replace(\n 'functions.',\n '',\n ),\n arguments: JSON.stringify(\n toolUse.parameters,\n ),\n },\n id: `${toolCall.id}_${index}`,\n };\n },\n );\n } else {\n finalToolCalls = [...toolCalls];\n }\n } else if (functionCall) {\n /**\n * We received a legacy function call, we convert it to a tool call with an emulated ID\n */\n const toolCall: ChatCompletionsToolCall = {\n type: 'function',\n function: functionCall,\n id: this.toolEmulator.generateEmulatedToolCallId(\n functionCall,\n ),\n };\n finalToolCalls = [toolCall];\n } else {\n finalToolCalls = [];\n }\n\n const message: ChatResponseMessage = {\n role: 'assistant',\n content,\n toolCalls: finalToolCalls,\n };\n\n content = null;\n toolCalls.splice(0, toolCalls.length);\n functionCall = undefined;\n\n this.doAddMessage(message);\n\n switch (choice.finishReason) {\n case 'stop':\n this._stream?.push(null);\n this.emitImmediate('completed');\n break;\n case 'tool_calls':\n case 'function_call': {\n this.dispatchRequiredAction(message.toolCalls, assistant);\n break;\n }\n default: {\n const err = new Error(\n `Unknown finish reason ${choice.finishReason}`,\n );\n return this.emitImmediate('error', err);\n }\n }\n });\n }\n\n private dispatchRequiredAction(\n toolCalls: ChatCompletionsToolCall[],\n assistant: Assistant,\n ): void {\n const callback = async (toolOutputs: ToolOutput[]) =>\n this.handleSubmittedToolOutputs(toolOutputs, assistant);\n const requiredAction = new RequiredAction(toolCalls, callback);\n this.emitImmediate('requires_action', requiredAction);\n }\n\n private async handleSubmittedToolOutputs(\n toolOutputs: ToolOutput[],\n assistant: Assistant,\n ): Promise {\n try {\n // Adds the tool outputs to the messages\n for (const toolOutput of toolOutputs) {\n const message: ChatRequestToolMessageWithMetadata = {\n role: 'tool',\n content:\n typeof toolOutput.value === 'string'\n ? toolOutput.value\n : JSON.stringify(toolOutput.value),\n toolCallId: toolOutput.callId,\n };\n if (toolOutput.metadata !== void 0) {\n message.metadata = toolOutput.metadata;\n }\n this.doAddMessage(message);\n }\n\n return this.doRun(assistant);\n } catch (e) {\n if (e instanceof Error) {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(e.message),\n );\n } else {\n this.emitImmediate(\n 'error',\n new InvalidToolOutputsError(String(e)),\n );\n }\n }\n }\n\n private doAddMessage(\n message: ChatRequestMessage | ChatResponseMessage,\n ): void {\n this._messages.push(message);\n\n this.emitImmediate('message', message);\n\n if (isChatRequestMessage(message)) {\n this.emitImmediate('message:request', message);\n } else {\n this.emitImmediate('message:response', message);\n }\n }\n\n private emitImmediate(event: string, ...args: unknown[]): void {\n if (event === 'error') {\n this.emit(event, ...args);\n } else {\n setImmediate(() => {\n this.emit(event, ...args);\n });\n }\n }\n\n /**\n * Errors come in all shapes and sizes depending on whether they are raised by the API (authn & authz errors),\n * the model (invalid tool definitions, maximum content length exceeded, etc.) or by the Azure content filtering\n *\n * We try here to handle most of them and return a consistent error type\n */\n private buildError(e: unknown): Error {\n if (!e) {\n return new UnknownError();\n }\n\n if (typeof e === 'string') {\n return new UnknownError(e);\n }\n\n if (\n typeof e === 'object' &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n /**\n * The errors that I know of have the following structure:\n * {\n * message: string;\n * type: string | null;\n * code: string | null;\n * param: string | null;\n * status?: number;\n * }\n *\n * For HTTP errors, only the \"code\" is present and looks like \"401\", \"403\", etc.\n * For model errors, the \"type\" seems always present and looks like \"invalid_request_error\" while the \"code\" may be present and provide more details on why the request is invalid\n * For content filtering errors, the \"code\" is \"content_filter\", the \"type\" is null and status = 400 (which is why we return a ContentFilterError that extends InvalidRequestError)\n */\n\n if ('code' in e && typeof e.code === 'string') {\n if (isNaN(parseInt(e.code, 10))) {\n if (e.code === 'content_filter') {\n return new ContentFilterError(e.message);\n }\n } else {\n const code = parseInt(e.code, 10);\n switch (code) {\n case 400:\n return new InvalidRequestError(e.message);\n case 401:\n case 403: // I know the difference, we just don't care here\n return new AccessDeniedError(e.message);\n default:\n return new UnknownError(e.message);\n }\n }\n }\n\n if ('type' in e && typeof e.type === 'string') {\n if (e.type === 'invalid_request_error') {\n if ('code' in e && typeof e.code === 'string') {\n if (e.code === 'context_length_exceeded') {\n return new ContextLengthExceededError(e.message);\n }\n }\n return new InvalidRequestError(e.message);\n }\n }\n }\n\n return new UnknownError(String(e));\n }\n}\n\nexport class RequiredAction extends EventEmitter {\n constructor(\n public readonly toolCalls: ChatCompletionsToolCall[],\n private readonly callback: (toolOutputs: ToolOutput[]) => Promise,\n ) {\n super();\n }\n\n submitToolOutputs(toolOutputs: ToolOutput[]): Promise {\n return this.callback(toolOutputs);\n }\n}\n\nexport interface ToolOutput {\n callId: string;\n value: unknown;\n metadata?: unknown;\n}\n\nexport function isChatResponseMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatResponseMessage {\n return 'toolCalls' in m;\n}\n\nexport function isChatRequestMessage(\n m: ChatRequestMessage | ChatResponseMessage,\n): m is ChatRequestMessage {\n return !isChatResponseMessage(m);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index d3325e5..29308c2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -48,7 +48,7 @@ LLobotoMy for Azure #### Defined in -[src/message/message.ts:32](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L32) +[src/message/message.ts:32](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L32) ___ @@ -58,7 +58,7 @@ ___ #### Defined in -[src/message/message.ts:16](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L16) +[src/message/message.ts:16](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L16) ___ @@ -68,7 +68,7 @@ ___ #### Defined in -[src/message/message.ts:20](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L20) +[src/message/message.ts:20](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L20) ___ @@ -78,7 +78,7 @@ ___ #### Defined in -[src/message/message.ts:25](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L25) +[src/message/message.ts:25](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L25) ___ @@ -88,7 +88,7 @@ ___ #### Defined in -[src/message/message.ts:12](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L12) +[src/message/message.ts:12](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L12) ___ @@ -98,7 +98,7 @@ ___ #### Defined in -[src/message/message.ts:18](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L18) +[src/message/message.ts:18](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L18) ___ @@ -108,7 +108,7 @@ ___ #### Defined in -[src/message/message.ts:14](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L14) +[src/message/message.ts:14](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L14) ___ @@ -118,7 +118,7 @@ ___ #### Defined in -[src/message/message.ts:23](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L23) +[src/message/message.ts:23](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L23) ___ @@ -135,7 +135,7 @@ ___ #### Defined in -[src/message/message.ts:10](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/message/message.ts#L10) +[src/message/message.ts:10](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/message/message.ts#L10) ## Functions @@ -155,7 +155,7 @@ m is ChatRequestMessage #### Defined in -[src/thread/thread.ts:426](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L426) +[src/thread/thread.ts:429](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L429) ___ @@ -175,4 +175,4 @@ m is ChatResponseMessage #### Defined in -[src/thread/thread.ts:420](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L420) +[src/thread/thread.ts:423](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L423) diff --git a/docs/classes/AccessDeniedError.md b/docs/classes/AccessDeniedError.md index fe7529e..8438408 100644 --- a/docs/classes/AccessDeniedError.md +++ b/docs/classes/AccessDeniedError.md @@ -48,7 +48,7 @@ Error.constructor #### Defined in -[src/thread/errors.ts:8](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/errors.ts#L8) +[src/thread/errors.ts:8](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/errors.ts#L8) ## Properties diff --git a/docs/classes/Assistant.md b/docs/classes/Assistant.md index f99e167..cfc8640 100644 --- a/docs/classes/Assistant.md +++ b/docs/classes/Assistant.md @@ -36,7 +36,7 @@ #### Defined in -[src/assistant/assistant.ts:30](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L30) +[src/assistant/assistant.ts:30](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L30) ## Properties @@ -46,7 +46,7 @@ #### Defined in -[src/assistant/assistant.ts:21](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L21) +[src/assistant/assistant.ts:21](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L21) ___ @@ -56,7 +56,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:25](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L25) +[src/assistant/assistant.ts:25](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L25) ___ @@ -66,7 +66,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:23](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L23) +[src/assistant/assistant.ts:23](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L23) ___ @@ -76,7 +76,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:26](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L26) +[src/assistant/assistant.ts:26](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L26) ___ @@ -86,7 +86,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:24](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L24) +[src/assistant/assistant.ts:24](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L24) ___ @@ -96,7 +96,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:27](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L27) +[src/assistant/assistant.ts:27](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L27) ___ @@ -106,7 +106,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:28](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L28) +[src/assistant/assistant.ts:28](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L28) ## Methods @@ -126,4 +126,4 @@ ___ #### Defined in -[src/assistant/assistant.ts:42](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L42) +[src/assistant/assistant.ts:42](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L42) diff --git a/docs/classes/ContentFilterError.md b/docs/classes/ContentFilterError.md index b238476..462c0bc 100644 --- a/docs/classes/ContentFilterError.md +++ b/docs/classes/ContentFilterError.md @@ -44,7 +44,7 @@ #### Defined in -[src/thread/errors.ts:32](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/errors.ts#L32) +[src/thread/errors.ts:32](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/errors.ts#L32) ## Properties diff --git a/docs/classes/ContextLengthExceededError.md b/docs/classes/ContextLengthExceededError.md index 1188414..4cfdc4a 100644 --- a/docs/classes/ContextLengthExceededError.md +++ b/docs/classes/ContextLengthExceededError.md @@ -44,7 +44,7 @@ #### Defined in -[src/thread/errors.ts:24](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/errors.ts#L24) +[src/thread/errors.ts:24](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/errors.ts#L24) ## Properties diff --git a/docs/classes/InvalidRequestError.md b/docs/classes/InvalidRequestError.md index 2fe68c2..351d6a6 100644 --- a/docs/classes/InvalidRequestError.md +++ b/docs/classes/InvalidRequestError.md @@ -48,7 +48,7 @@ Error.constructor #### Defined in -[src/thread/errors.ts:16](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/errors.ts#L16) +[src/thread/errors.ts:16](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/errors.ts#L16) ## Properties diff --git a/docs/classes/InvalidToolOutputsError.md b/docs/classes/InvalidToolOutputsError.md index 257dfe6..d9f82b0 100644 --- a/docs/classes/InvalidToolOutputsError.md +++ b/docs/classes/InvalidToolOutputsError.md @@ -44,7 +44,7 @@ Error.constructor #### Defined in -[src/thread/errors.ts:48](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/errors.ts#L48) +[src/thread/errors.ts:48](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/errors.ts#L48) ## Properties diff --git a/docs/classes/RequiredAction.md b/docs/classes/RequiredAction.md index 17901ec..1bb93fc 100644 --- a/docs/classes/RequiredAction.md +++ b/docs/classes/RequiredAction.md @@ -69,7 +69,7 @@ EventEmitter.constructor #### Defined in -[src/thread/thread.ts:402](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L402) +[src/thread/thread.ts:405](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L405) ## Properties @@ -93,7 +93,7 @@ EventEmitter.constructor #### Defined in -[src/thread/thread.ts:404](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L404) +[src/thread/thread.ts:407](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L407) ___ @@ -103,7 +103,7 @@ ___ #### Defined in -[src/thread/thread.ts:403](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L403) +[src/thread/thread.ts:406](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L406) ___ @@ -960,7 +960,7 @@ ___ #### Defined in -[src/thread/thread.ts:409](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L409) +[src/thread/thread.ts:412](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L412) ___ diff --git a/docs/classes/Thread.md b/docs/classes/Thread.md index b32b05b..d3f0abf 100644 --- a/docs/classes/Thread.md +++ b/docs/classes/Thread.md @@ -84,7 +84,7 @@ EventEmitter.constructor #### Defined in -[src/thread/thread.ts:40](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L40) +[src/thread/thread.ts:40](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L40) ## Properties @@ -94,7 +94,7 @@ EventEmitter.constructor #### Defined in -[src/thread/thread.ts:36](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L36) +[src/thread/thread.ts:36](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L36) ___ @@ -104,7 +104,7 @@ ___ #### Defined in -[src/thread/thread.ts:35](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L35) +[src/thread/thread.ts:35](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L35) ___ @@ -114,7 +114,7 @@ ___ #### Defined in -[src/thread/thread.ts:37](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L37) +[src/thread/thread.ts:37](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L37) ___ @@ -124,7 +124,7 @@ ___ #### Defined in -[src/thread/thread.ts:41](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L41) +[src/thread/thread.ts:41](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L41) ___ @@ -134,7 +134,7 @@ ___ #### Defined in -[src/thread/thread.ts:38](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L38) +[src/thread/thread.ts:38](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L38) ___ @@ -267,7 +267,7 @@ node_modules/@types/node/events.d.ts:395 #### Defined in -[src/thread/thread.ts:52](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L52) +[src/thread/thread.ts:52](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L52) ___ @@ -281,7 +281,7 @@ ___ #### Defined in -[src/thread/thread.ts:48](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L48) +[src/thread/thread.ts:48](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L48) ## Methods @@ -358,7 +358,7 @@ ___ #### Defined in -[src/thread/thread.ts:57](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L57) +[src/thread/thread.ts:57](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L57) ___ @@ -383,7 +383,7 @@ We try here to handle most of them and return a consistent error type #### Defined in -[src/thread/thread.ts:337](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L337) +[src/thread/thread.ts:340](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L340) ___ @@ -404,7 +404,7 @@ ___ #### Defined in -[src/thread/thread.ts:263](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L263) +[src/thread/thread.ts:263](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L263) ___ @@ -424,7 +424,7 @@ ___ #### Defined in -[src/thread/thread.ts:307](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L307) +[src/thread/thread.ts:310](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L310) ___ @@ -444,7 +444,7 @@ ___ #### Defined in -[src/thread/thread.ts:69](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L69) +[src/thread/thread.ts:69](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L69) ___ @@ -532,7 +532,7 @@ ___ #### Defined in -[src/thread/thread.ts:321](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L321) +[src/thread/thread.ts:324](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L324) ___ @@ -617,7 +617,7 @@ ___ #### Defined in -[src/thread/thread.ts:273](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L273) +[src/thread/thread.ts:273](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L273) ___ @@ -1132,7 +1132,7 @@ ___ #### Defined in -[src/thread/thread.ts:61](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L61) +[src/thread/thread.ts:61](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L61) ___ diff --git a/docs/classes/ThreadMessageConverter.md b/docs/classes/ThreadMessageConverter.md index 32d79f6..1d4750b 100644 --- a/docs/classes/ThreadMessageConverter.md +++ b/docs/classes/ThreadMessageConverter.md @@ -30,7 +30,7 @@ #### Defined in -[src/thread/message.converter.ts:19](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/message.converter.ts#L19) +[src/thread/message.converter.ts:19](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/message.converter.ts#L19) ## Methods @@ -53,4 +53,4 @@ so they can be sent again to the LLM. #### Defined in -[src/thread/message.converter.ts:25](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/message.converter.ts#L25) +[src/thread/message.converter.ts:25](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/message.converter.ts#L25) diff --git a/docs/classes/ToolEmulator.md b/docs/classes/ToolEmulator.md index c9ce2b1..ce2a47f 100644 --- a/docs/classes/ToolEmulator.md +++ b/docs/classes/ToolEmulator.md @@ -40,7 +40,7 @@ Helps with the conversion of tool calls to function calls and vice versa. #### Defined in -[src/thread/tool.emulator.ts:17](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/tool.emulator.ts#L17) +[src/thread/tool.emulator.ts:17](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/tool.emulator.ts#L17) ___ @@ -60,7 +60,7 @@ ___ #### Defined in -[src/thread/tool.emulator.ts:9](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/tool.emulator.ts#L9) +[src/thread/tool.emulator.ts:9](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/tool.emulator.ts#L9) ___ @@ -80,4 +80,4 @@ ___ #### Defined in -[src/thread/tool.emulator.ts:13](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/tool.emulator.ts#L13) +[src/thread/tool.emulator.ts:13](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/tool.emulator.ts#L13) diff --git a/docs/classes/UnknownError.md b/docs/classes/UnknownError.md index 8a1f5ae..e10c526 100644 --- a/docs/classes/UnknownError.md +++ b/docs/classes/UnknownError.md @@ -44,7 +44,7 @@ Error.constructor #### Defined in -[src/thread/errors.ts:40](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/errors.ts#L40) +[src/thread/errors.ts:40](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/errors.ts#L40) ## Properties diff --git a/docs/interfaces/AssistantCreateParams.md b/docs/interfaces/AssistantCreateParams.md index b92115e..4913963 100644 --- a/docs/interfaces/AssistantCreateParams.md +++ b/docs/interfaces/AssistantCreateParams.md @@ -22,7 +22,7 @@ #### Defined in -[src/assistant/assistant.ts:11](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L11) +[src/assistant/assistant.ts:11](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L11) ___ @@ -32,7 +32,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:14](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L14) +[src/assistant/assistant.ts:14](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L14) ___ @@ -42,7 +42,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:12](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L12) +[src/assistant/assistant.ts:12](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L12) ___ @@ -52,7 +52,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:16](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L16) +[src/assistant/assistant.ts:16](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L16) ___ @@ -62,7 +62,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:13](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L13) +[src/assistant/assistant.ts:13](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L13) ___ @@ -72,7 +72,7 @@ ___ #### Defined in -[src/assistant/assistant.ts:17](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L17) +[src/assistant/assistant.ts:17](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L17) ___ @@ -82,4 +82,4 @@ ___ #### Defined in -[src/assistant/assistant.ts:15](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/assistant/assistant.ts#L15) +[src/assistant/assistant.ts:15](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/assistant/assistant.ts#L15) diff --git a/docs/interfaces/ToolOutput.md b/docs/interfaces/ToolOutput.md index 9c08b57..ac997fd 100644 --- a/docs/interfaces/ToolOutput.md +++ b/docs/interfaces/ToolOutput.md @@ -18,7 +18,7 @@ #### Defined in -[src/thread/thread.ts:415](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L415) +[src/thread/thread.ts:418](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L418) ___ @@ -28,7 +28,7 @@ ___ #### Defined in -[src/thread/thread.ts:417](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L417) +[src/thread/thread.ts:420](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L420) ___ @@ -38,4 +38,4 @@ ___ #### Defined in -[src/thread/thread.ts:416](https://github.com/paztek/llobotomy-azure/blob/dd7663a/src/thread/thread.ts#L416) +[src/thread/thread.ts:419](https://github.com/paztek/llobotomy-azure/blob/e7a9b63/src/thread/thread.ts#L419) diff --git a/src/thread/thread.ts b/src/thread/thread.ts index 31dddfb..6cbe16c 100644 --- a/src/thread/thread.ts +++ b/src/thread/thread.ts @@ -279,7 +279,10 @@ export class Thread extends EventEmitter { for (const toolOutput of toolOutputs) { const message: ChatRequestToolMessageWithMetadata = { role: 'tool', - content: JSON.stringify(toolOutput.value), + content: + typeof toolOutput.value === 'string' + ? toolOutput.value + : JSON.stringify(toolOutput.value), toolCallId: toolOutput.callId, }; if (toolOutput.metadata !== void 0) { diff --git a/types/thread/thread.d.ts.map b/types/thread/thread.d.ts.map index 39884bf..7df8f4b 100644 --- a/types/thread/thread.d.ts.map +++ b/types/thread/thread.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/thread/thread.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,EAER,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EACR,WAAW,EACX,8BAA8B,EAEjC,MAAM,YAAY,CAAC;AAmBpB,qBAAa,MAAO,SAAQ,YAAY;aAOhB,EAAE,EAAE,MAAM;IAN9B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAG/B,EAAE,EAAE,MAAM,EAC1B,QAAQ,GAAE,WAAW,EAAO;IAMhC,IAAI,MAAM,IAAI,QAAQ,GAAG,IAAI,CAE5B;IAED,IAAI,QAAQ,IAAI,WAAW,EAAE,CAG5B;IAED,UAAU,CAAC,OAAO,EAAE,8BAA8B,GAAG,IAAI;IAInD,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAQhC,KAAK;IAkMnB,OAAO,CAAC,sBAAsB;YAUhB,0BAA0B;IAkCxC,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,aAAa;IAUrB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;CA8DrB;AAED,qBAAa,cAAe,SAAQ,YAAY;aAExB,SAAS,EAAE,uBAAuB,EAAE;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADT,SAAS,EAAE,uBAAuB,EAAE,EACnC,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC;IAK3E,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CACjC,CAAC,EAAE,kBAAkB,GAAG,mBAAmB,GAC5C,CAAC,IAAI,mBAAmB,CAE1B;AAED,wBAAgB,oBAAoB,CAChC,CAAC,EAAE,kBAAkB,GAAG,mBAAmB,GAC5C,CAAC,IAAI,kBAAkB,CAEzB"} \ No newline at end of file +{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/thread/thread.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,EAER,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EACR,WAAW,EACX,8BAA8B,EAEjC,MAAM,YAAY,CAAC;AAmBpB,qBAAa,MAAO,SAAQ,YAAY;aAOhB,EAAE,EAAE,MAAM;IAN9B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAG/B,EAAE,EAAE,MAAM,EAC1B,QAAQ,GAAE,WAAW,EAAO;IAMhC,IAAI,MAAM,IAAI,QAAQ,GAAG,IAAI,CAE5B;IAED,IAAI,QAAQ,IAAI,WAAW,EAAE,CAG5B;IAED,UAAU,CAAC,OAAO,EAAE,8BAA8B,GAAG,IAAI;IAInD,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAQhC,KAAK;IAkMnB,OAAO,CAAC,sBAAsB;YAUhB,0BAA0B;IAqCxC,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,aAAa;IAUrB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;CA8DrB;AAED,qBAAa,cAAe,SAAQ,YAAY;aAExB,SAAS,EAAE,uBAAuB,EAAE;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADT,SAAS,EAAE,uBAAuB,EAAE,EACnC,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC;IAK3E,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CACjC,CAAC,EAAE,kBAAkB,GAAG,mBAAmB,GAC5C,CAAC,IAAI,mBAAmB,CAE1B;AAED,wBAAgB,oBAAoB,CAChC,CAAC,EAAE,kBAAkB,GAAG,mBAAmB,GAC5C,CAAC,IAAI,kBAAkB,CAEzB"} \ No newline at end of file