UNPKG

mock-openai-api

Version:

A mock OpenAI Compatible Provider API server

166 lines 6.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handleGetModels = handleGetModels; exports.handleChatCompletion = handleChatCompletion; exports.handleImageGeneration = handleImageGeneration; exports.handleHealthCheck = handleHealthCheck; const openaiService_1 = require("../services/openaiService"); const helpers_1 = require("../utils/helpers"); /** * Get model list */ function handleGetModels(req, res) { try { const models = (0, openaiService_1.getModels)(); res.json(models); } catch (error) { console.error('Get model list error:', error); res.status(500).json({ error: { message: 'Internal server error', type: 'api_error', code: 'internal_error' } }); } } /** * Handle chat completion request */ function handleChatCompletion(req, res) { try { const request = req.body; // Basic validation if (!request.model) { return res.status(400).json({ error: { message: 'Missing required parameter: model', type: 'invalid_request_error', code: 'missing_parameter' } }); } if (!request.messages || !Array.isArray(request.messages) || request.messages.length === 0) { return res.status(400).json({ error: { message: 'Missing required parameter: messages', type: 'invalid_request_error', code: 'missing_parameter' } }); } // Check if this is a tool-calls model and if we need to simulate the two-phase process const model = (0, helpers_1.findModelById)(request.model); const isToolCallModel = model && model.type === 'tool-calls'; // Check if this is a request with tool results (second phase) const hasToolResults = request.messages.some(msg => msg.role === 'tool'); // Streaming response if (request.stream) { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Headers', 'Cache-Control'); // Flush headers to ensure client receives headers immediately res.flushHeaders(); if (isToolCallModel && hasToolResults) { // This is the second phase of tool call - generate final response const toolMessage = request.messages.find(msg => msg.role === 'tool'); const toolCallResponseStream = (0, openaiService_1.createToolCallResponseStream)(request, toolMessage?.tool_call_id || '', toolMessage?.content || ''); for (const chunk of toolCallResponseStream) { res.write(chunk); } } else if (isToolCallModel && !hasToolResults) { // This is the first phase of tool call - but for demo purposes, // we'll simulate both phases automatically with a delay const firstPhaseStream = (0, openaiService_1.createChatCompletionStream)(request); for (const chunk of firstPhaseStream) { res.write(chunk); } // Simulate a delay and automatic second phase setTimeout(() => { console.log('Loop iteration 2 for event simulated_event_id'); // Create a simulated second phase request const secondPhaseRequest = { ...request }; const toolCallResponseStream = (0, openaiService_1.createToolCallResponseStream)(secondPhaseRequest, 'call_0_8a90fac8-b281-49a0-bcc9-55d7f4603891', 'simulated tool result'); for (const chunk of toolCallResponseStream) { res.write(chunk); } res.end(); }, 1000); // 1 second delay to simulate external tool execution return; // Don't end the response yet } else { // Normal streaming for non-tool-call models const stream = (0, openaiService_1.createChatCompletionStream)(request); for (const chunk of stream) { res.write(chunk); } } res.end(); } else { // Non-streaming response const completion = (0, openaiService_1.createChatCompletion)(request); // Check if it's an error response if ('error' in completion) { return res.status(400).json(completion); } res.json(completion); } } catch (error) { console.error('Chat completion request error:', error); res.status(500).json({ error: { message: 'Internal server error', type: 'api_error', code: 'internal_error' } }); } } /** * Handle image generation request */ function handleImageGeneration(req, res) { try { const request = req.body; // Basic validation if (!request.prompt) { return res.status(400).json({ error: { message: 'Missing required parameter: prompt', type: 'invalid_request_error', code: 'missing_parameter' } }); } const imageResponse = (0, openaiService_1.generateImage)(request); res.json(imageResponse); } catch (error) { console.error('Image generation request error:', error); res.status(500).json({ error: { message: 'Internal server error', type: 'api_error', code: 'internal_error' } }); } } /** * Handle health check */ function handleHealthCheck(req, res) { res.json({ status: 'ok', message: 'Mock OpenAI API server is running', timestamp: new Date().toISOString(), version: '1.0.0' }); } //# sourceMappingURL=openaiController.js.map