UNPKG

@agenite/openai

Version:
1 lines 12.2 kB
{"version":3,"sources":["../src/provider.ts"],"names":["BaseLLMProvider","OpenAI","convertStringToMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["import OpenAI from 'openai';\nimport { convertStringToMessages, BaseLLMProvider } from '@agenite/llm';\n\nimport type {\n BaseMessage,\n GenerateResponse,\n ContentBlock,\n StopReason,\n GenerateOptions,\n PartialReturn,\n} from '@agenite/llm';\nimport type { OpenAIConfig } from './types';\n\n/**\n * Maps OpenAI finish reasons to our standard stop reasons\n */\nfunction mapStopReason(finishReason: string | null): StopReason | undefined {\n if (!finishReason) return undefined;\n\n const stopReasonMap: Record<string, StopReason> = {\n stop: 'endTurn',\n length: 'maxTokens',\n tool_calls: 'toolUse',\n };\n\n return stopReasonMap[finishReason] || undefined;\n}\n\n/**\n * Maps OpenAI content to our standard content blocks\n */\nfunction mapContent(\n content: string | null,\n toolCalls?: OpenAI.Chat.ChatCompletionMessageToolCall[]\n): ContentBlock[] {\n const blocks: ContentBlock[] = [];\n\n if (content) {\n blocks.push({ type: 'text', text: content });\n }\n\n if (toolCalls) {\n toolCalls.forEach((toolCall) => {\n blocks.push({\n type: 'toolUse',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments),\n });\n });\n }\n\n return blocks;\n}\n\n/**\n * Converts our message format to OpenAI's format\n */\nfunction convertMessages(\n messages: BaseMessage[]\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n return messages.map((msg): OpenAI.Chat.ChatCompletionMessageParam => {\n const content = msg.content\n .map((block) => {\n if (block.type === 'text') return block.text;\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n\n return {\n role: msg.role,\n content,\n };\n });\n}\n\nexport class OpenAIProvider extends BaseLLMProvider {\n private client: OpenAI;\n private model: string;\n readonly name = 'OpenAI';\n readonly version = '1.0';\n\n constructor(config: OpenAIConfig) {\n super();\n this.client = new OpenAI({\n apiKey: config.apiKey,\n });\n this.model = config.model ?? 'gpt-4-turbo-preview';\n }\n\n async generate(\n input: string | BaseMessage[],\n options?: Partial<GenerateOptions>\n ): Promise<GenerateResponse> {\n try {\n const messageArray = convertStringToMessages(input);\n const transformedMessages = convertMessages(messageArray);\n\n if (options?.systemPrompt) {\n transformedMessages.unshift({\n role: 'system',\n content: options.systemPrompt,\n });\n }\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages: transformedMessages,\n temperature: options?.temperature,\n max_tokens: options?.maxTokens,\n stop: options?.stopSequences,\n tools: options?.tools?.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n })),\n });\n\n const choice = response.choices[0];\n if (!choice) throw new Error('No completion choice returned');\n\n return {\n content: mapContent(choice.message.content, choice.message.tool_calls),\n stopReason: mapStopReason(choice.finish_reason),\n tokenUsage: {\n model: response.model,\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n inputCost: 0,\n outputCost: 0,\n },\n };\n } catch (error) {\n console.error('OpenAI generation failed:', error);\n throw error instanceof Error\n ? new Error(`OpenAI generation failed: ${error.message}`)\n : new Error('OpenAI generation failed with unknown error');\n }\n }\n\n async *stream(\n input: string | BaseMessage[],\n options?: Partial<GenerateOptions>\n ): AsyncGenerator<PartialReturn, GenerateResponse, unknown> {\n try {\n const messageArray = convertStringToMessages(input);\n const transformedMessages = convertMessages(messageArray);\n\n if (options?.systemPrompt) {\n transformedMessages.unshift({\n role: 'system',\n content: options.systemPrompt,\n });\n }\n\n const streamResponse = await this.client.chat.completions.create({\n model: this.model,\n messages: transformedMessages,\n temperature: options?.temperature,\n max_tokens: options?.maxTokens,\n stop: options?.stopSequences,\n tools: options?.tools?.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n })),\n stream: true,\n });\n\n let buffer = '';\n for await (const chunk of streamResponse) {\n const content = chunk.choices[0]?.delta?.content;\n if (content) {\n buffer += content;\n\n if (buffer.length > 10) {\n yield {\n type: 'text',\n text: buffer,\n };\n buffer = '';\n }\n }\n }\n\n if (buffer.length > 0) {\n yield {\n type: 'text',\n text: buffer,\n };\n }\n\n // Get the final completion for metadata\n const completion = await this.client.chat.completions.create({\n model: this.model,\n messages: transformedMessages,\n temperature: options?.temperature,\n max_tokens: options?.maxTokens,\n stop: options?.stopSequences,\n tools: options?.tools?.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n })),\n });\n\n const choice = completion.choices[0];\n if (!choice) throw new Error('No completion choice returned');\n\n return {\n content: mapContent(choice.message.content, choice.message.tool_calls),\n stopReason: mapStopReason(choice.finish_reason),\n tokenUsage: {\n model: completion.model,\n inputTokens: completion.usage?.prompt_tokens ?? 0,\n outputTokens: completion.usage?.completion_tokens ?? 0,\n inputCost: 0,\n outputCost: 0,\n },\n };\n } catch (error) {\n console.error('OpenAI generation failed:', error);\n throw error instanceof Error\n ? new Error(`OpenAI generation failed: ${error.message}`)\n : new Error('OpenAI generation failed with unknown error');\n }\n }\n}\n"]}