{"version":3,"file":"index.mjs","sources":["../src/assistant/assistant.ts","../src/thread/errors.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\n    /**\n     * If provided and if there is no \"system\" message at the beginning of an array of messages,\n     * then the assistant will prepend a \"system\" message with these instructions.\n     */\n    instructions?: string;\n    tools: ChatCompletionsToolDefinition[];\n    deployment: string;\n    temperature?: number;\n    topP?: number;\n}\n\nexport class Assistant {\n    public readonly client: OpenAIClient;\n\n    private readonly instructions: string | undefined;\n    private readonly tools: ChatCompletionsToolDefinition[];\n    private readonly deployment: string;\n    private readonly temperature: number | undefined;\n    private readonly topP: number | undefined;\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\n    async streamChatCompletions(\n        messages: ChatRequestMessage[],\n    ): Promise<Readable> {\n        if (\n            this.instructions &&\n            messages.length >= 1 &&\n            messages[0]?.role !== 'system'\n        ) {\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\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            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 {\n    ChatRequestAssistantMessage,\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';\n\nexport class ThreadMessageConverter {\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                    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                    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    ChatRequestMessage,\n    ChatResponseMessage,\n} from '@azure/openai';\nimport type { ChatCompletionsFunctionToolCall } from '@azure/openai/types/openai';\nimport EventEmitter from 'events';\nimport { Readable } from 'stream';\nimport { Assistant } from '../assistant';\nimport type {\n    ChatMessage,\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';\n\nconst TOKEN_JSON_START = '{\"';\n\nexport class Thread extends EventEmitter {\n    private _stream: Readable | null = null;\n    private readonly _messages: ChatMessage[] = [];\n    private readonly converter = new ThreadMessageConverter();\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: ChatMessage): void {\n        this.doAddMessage(message);\n    }\n\n    async run(assistant: Assistant): Promise<void> {\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<void> {\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        let toolCalls: ChatCompletionsFunctionToolCall[] = [];\n\n        let inHallucinatedToolCallInContent = false;\n        let hallucinatedJSONInContent = '';\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 && delta.content.length) {\n                if (\n                    content === null &&\n                    !inHallucinatedToolCallInContent &&\n                    delta.content.startsWith(TOKEN_JSON_START)\n                ) {\n                    inHallucinatedToolCallInContent = true;\n                    hallucinatedJSONInContent += delta.content;\n                    return;\n                }\n\n                if (content === null && inHallucinatedToolCallInContent) {\n                    hallucinatedJSONInContent += delta.content;\n\n                    // If the hallucinated JSON becomes parseable, it means we're at the end of the hallucinated tool call\n                    try {\n                        JSON.parse(hallucinatedJSONInContent);\n                        inHallucinatedToolCallInContent = false;\n                        hallucinatedJSONInContent = '';\n                        return;\n                    } catch (e) {\n                        return;\n                    }\n                }\n\n                /**\n                 * Sometimes, especially after some hallucinated JSON, the LLM adds a line break before the actual content\n                 */\n                if (content === null && delta.content.startsWith('\\n')) {\n                    delta.content = delta.content.slice(1);\n                }\n\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 as ChatCompletionsFunctionToolCall[]) {\n                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n                    // @ts-ignore\n                    const index = toolCall['index'] as number; // Not typed yet by the @azure/openai package\n                    const existingToolCall = toolCalls[index] as\n                        | ChatCompletionsFunctionToolCall\n                        | undefined;\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            if (choice.finishReason === null) {\n                return;\n            }\n\n            const message: ChatResponseMessage = {\n                role: 'assistant',\n                content,\n                toolCalls,\n            };\n\n            content = null;\n            toolCalls = [];\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                    this.dispatchRequiredAction(\n                        message.toolCalls as ChatCompletionsFunctionToolCall[],\n                        assistant,\n                    );\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: ChatCompletionsFunctionToolCall[],\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<void> {\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(message: ChatMessage): 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: ChatCompletionsFunctionToolCall[],\n        private readonly callback: (toolOutputs: ToolOutput[]) => Promise<void>,\n    ) {\n        super();\n    }\n\n    submitToolOutputs(toolOutputs: ToolOutput[]): Promise<void> {\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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"}