@perkos/service-ai 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -207,7 +207,7 @@ declare class AIService {
|
|
|
207
207
|
private getChatClient;
|
|
208
208
|
private getChatModel;
|
|
209
209
|
analyzeImage(imageInput: string, question?: string): Promise<string>;
|
|
210
|
-
generateImage(prompt: string, size?: "1024x1024"): Promise<ImageGenerateResult>;
|
|
210
|
+
generateImage(prompt: string, size?: "1024x1024" | "1792x1024" | "1024x1792"): Promise<ImageGenerateResult>;
|
|
211
211
|
private generateImageWithReplicate;
|
|
212
212
|
transcribeAudio(audioInput: File | Blob | string): Promise<string>;
|
|
213
213
|
private transcribeWithReplicate;
|
package/dist/index.d.ts
CHANGED
|
@@ -207,7 +207,7 @@ declare class AIService {
|
|
|
207
207
|
private getChatClient;
|
|
208
208
|
private getChatModel;
|
|
209
209
|
analyzeImage(imageInput: string, question?: string): Promise<string>;
|
|
210
|
-
generateImage(prompt: string, size?: "1024x1024"): Promise<ImageGenerateResult>;
|
|
210
|
+
generateImage(prompt: string, size?: "1024x1024" | "1792x1024" | "1024x1792"): Promise<ImageGenerateResult>;
|
|
211
211
|
private generateImageWithReplicate;
|
|
212
212
|
transcribeAudio(audioInput: File | Blob | string): Promise<string>;
|
|
213
213
|
private transcribeWithReplicate;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/service.ts"],"sourcesContent":["/**\n * @perkos/ai-service\n * Multi-provider AI service abstraction with OpenRouter, Replicate, and OpenAI support\n */\n\nexport { AIService } from \"./service\";\nexport type {\n AIServiceConfig,\n AIProvider,\n ImageGenerateResult,\n TranscriptionResult,\n TranslationResult,\n SentimentResult,\n ModerationResult,\n EntityExtractionResult,\n CodeGenerationResult,\n CodeReviewResult,\n OCRResult,\n QuizResult,\n ImageAnalysisOptions,\n ImageGenerateOptions,\n TranscribeOptions,\n SpeechOptions,\n SummarizeOptions,\n TranslateOptions,\n SentimentOptions,\n ModerationOptions,\n SimplifyOptions,\n EntityOptions,\n EmailOptions,\n ProductDescriptionOptions,\n SEOOptions,\n CodeGenerateOptions,\n CodeReviewOptions,\n SQLQueryOptions,\n RegexOptions,\n APIDocsOptions,\n OCROptions,\n QuizOptions,\n} from \"./types\";\n","/**\n * AI Service Implementation\n * Multi-provider AI service with OpenRouter, Replicate, and OpenAI support\n */\n\nimport OpenAI from \"openai\";\nimport Replicate from \"replicate\";\nimport type {\n AIServiceConfig,\n ImageGenerateResult,\n TranslationResult,\n SentimentResult,\n ModerationResult,\n EntityResult,\n EmailResult,\n CodeGenerateResult,\n CodeReviewResult,\n SQLResult,\n RegexResult,\n SEOResult,\n APIDocsResult,\n OCRResult,\n QuizResult,\n SummaryLength,\n ReadingLevel,\n EmailTone,\n Difficulty,\n Voice,\n} from \"./types\";\n\nexport class AIService {\n private openai: OpenAI;\n private openrouter: OpenAI;\n private replicate: Replicate | null = null;\n private useOpenRouter: boolean;\n private useReplicate: boolean;\n\n private imageModel: string;\n private ttsModel: string;\n private whisperModel: string;\n private moderationModel: string;\n private chatModel: string;\n\n constructor(config: AIServiceConfig = {}) {\n const openrouterKey = config.openrouterApiKey || process.env.OPENROUTER_API_KEY;\n const openaiKey = config.openaiApiKey || process.env.OPENAI_API_KEY;\n const replicateToken = config.replicateApiToken || process.env.REPLICATE_API_TOKEN;\n\n this.useOpenRouter = !!openrouterKey;\n this.useReplicate = !!replicateToken;\n\n // Model configuration\n this.imageModel = config.imageModel || process.env.OPENAI_IMAGE_MODEL || \"dall-e-3\";\n this.ttsModel = config.ttsModel || process.env.OPENAI_TTS_MODEL || \"tts-1\";\n this.whisperModel = config.whisperModel || process.env.OPENAI_WHISPER_MODEL || \"whisper-1\";\n this.moderationModel = config.moderationModel || process.env.OPENAI_MODERATION_MODEL || \"omni-moderation-latest\";\n this.chatModel = config.chatModel || \"openai/gpt-4o\";\n\n if (openrouterKey) {\n this.openrouter = new OpenAI({\n apiKey: openrouterKey,\n baseURL: config.openrouterBaseUrl || process.env.OPENROUTER_BASE_URL || \"https://openrouter.ai/api/v1\",\n defaultHeaders: {\n \"HTTP-Referer\": config.openrouterReferer || process.env.OPENROUTER_REFERER || \"http://localhost:3000\",\n \"X-Title\": config.openrouterTitle || process.env.OPENROUTER_TITLE || \"PerkOS AI Service\",\n },\n });\n } else {\n this.openrouter = new OpenAI({ apiKey: \"dummy\" });\n }\n\n if (replicateToken) {\n this.replicate = new Replicate({ auth: replicateToken });\n }\n\n if (openaiKey) {\n this.openai = new OpenAI({ apiKey: openaiKey });\n } else if (!openrouterKey) {\n throw new Error(\"Either OPENROUTER_API_KEY or OPENAI_API_KEY must be set\");\n } else {\n this.openai = new OpenAI({ apiKey: \"dummy\" });\n }\n }\n\n private getChatClient(): OpenAI {\n return this.useOpenRouter ? this.openrouter : this.openai;\n }\n\n private getChatModel(): string {\n return this.useOpenRouter ? this.chatModel : \"gpt-4o\";\n }\n\n // Vision & Audio Methods\n\n async analyzeImage(imageInput: string, question: string = \"What is in this image?\"): Promise<string> {\n let url = imageInput;\n if (!imageInput.startsWith(\"http\") && !imageInput.startsWith(\"data:\")) {\n url = `data:image/jpeg;base64,${imageInput}`;\n }\n\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [{ role: \"user\", content: [{ type: \"text\", text: question }, { type: \"image_url\", image_url: { url } }] }],\n });\n\n return response.choices[0].message.content || \"Unable to analyze the image\";\n }\n\n async generateImage(prompt: string, size: \"1024x1024\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n try {\n const response = await this.openai.images.generate({\n model: this.imageModel,\n prompt, n: 1, size, response_format: \"b64_json\",\n });\n if (!response.data || response.data.length === 0) throw new Error(\"No image generated\");\n const image = response.data[0];\n return { base64: image.b64_json, revisedPrompt: image.revised_prompt };\n } catch (error: any) {\n if ((error?.status === 403 || error?.message?.includes(\"does not have access\")) && this.useReplicate && this.replicate) {\n return this.generateImageWithReplicate(prompt, size);\n }\n throw error;\n }\n }\n\n private async generateImageWithReplicate(prompt: string, size: \"1024x1024\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const [width, height] = size.split(\"x\").map(Number);\n const aspectRatio = width === height ? \"1:1\" : width > height ? \"16:9\" : \"9:16\";\n\n const output = await this.replicate.run(\n \"black-forest-labs/flux-schnell\",\n { input: { prompt, aspect_ratio: aspectRatio, output_format: \"png\", output_quality: 90 } }\n ) as string[];\n\n if (!output || output.length === 0) throw new Error(\"No image generated by Replicate\");\n\n const imageUrl = output[0];\n const imageResponse = await fetch(imageUrl);\n const arrayBuffer = await imageResponse.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n\n return { base64, url: imageUrl, revisedPrompt: prompt };\n }\n\n async transcribeAudio(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate API token required for audio transcription\");\n return this.transcribeWithReplicate(audioInput);\n }\n\n private async transcribeWithReplicate(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n let dataUri: string;\n\n if (typeof audioInput === \"string\") {\n if (audioInput.startsWith(\"http\")) {\n const response = await fetch(audioInput);\n const arrayBuffer = await response.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = response.headers.get(\"content-type\") || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n } else if (audioInput.startsWith(\"data:\")) {\n dataUri = audioInput;\n } else {\n throw new Error(\"Invalid string input for transcription\");\n }\n } else {\n const arrayBuffer = await audioInput.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = audioInput.type || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n }\n\n const output = await this.replicate.run(\n \"openai/whisper:4d50797290df275329f202e48c76360b3f22b08d28c196cbc54600319435f8d2\",\n { input: { audio: dataUri, model: \"large-v3\", language: \"en\", translate: false } }\n ) as { transcription: string };\n\n return output.transcription || \"\";\n }\n\n async synthesizeSpeech(text: string, voice: Voice = \"alloy\"): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate API token required for speech synthesis\");\n return this.synthesizeWithReplicate(text);\n }\n\n private async synthesizeWithReplicate(text: string): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const output = await this.replicate.run(\n \"minimax/speech-02-turbo\",\n { input: { text, voice_id: \"Friendly_Person\" } }\n ) as unknown as string;\n\n if (!output) throw new Error(\"No audio generated by Replicate\");\n\n const audioResponse = await fetch(output);\n const arrayBuffer = await audioResponse.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n // NLP Methods\n\n async summarizeText(text: string, length: SummaryLength = \"medium\"): Promise<string> {\n const lengthInstructions = { short: \"in 2-3 sentences\", medium: \"in 1-2 paragraphs\", long: \"in 3-4 paragraphs with key points\" };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"You are a professional summarization assistant.\" },\n { role: \"user\", content: `Summarize the following text ${lengthInstructions[length]}:\\n\\n${text}` }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || \"Unable to generate summary\";\n }\n\n async translateText(text: string, sourceLang: string, targetLang: string): Promise<TranslationResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Translate accurately from ${sourceLang} to ${targetLang}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.2,\n });\n return { translation: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async analyzeSentiment(text: string): Promise<SentimentResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze sentiment. Respond with JSON: {\"sentiment\": \"positive\"|\"negative\"|\"neutral\", \"score\": 0.0-1.0, \"emotions\": []}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n const result = JSON.parse(response.choices[0].message.content || \"{}\");\n return { sentiment: result.sentiment || \"neutral\", score: result.score || 0.5, emotions: result.emotions || [] };\n }\n\n async moderateContent(content: string): Promise<ModerationResult> {\n try {\n const moderation = await this.openai.moderations.create({ input: content, model: this.moderationModel });\n const result = moderation.results[0];\n return {\n flagged: result.flagged,\n categories: result.categories as unknown as Record<string, boolean>,\n categoryScores: result.category_scores as unknown as Record<string, number>,\n };\n } catch {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze content for policy violations. Respond with JSON: {\"flagged\": bool, \"categories\": {}, \"categoryScores\": {}}' },\n { role: \"user\", content: `Analyze: ${content}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"flagged\":false,\"categories\":{},\"categoryScores\":{}}');\n }\n }\n\n async simplifyText(text: string, readingLevel: ReadingLevel = \"middle\"): Promise<string> {\n const levelInstructions = {\n elementary: \"5th grade reading level\",\n middle: \"8th grade reading level\",\n high: \"high school reading level\"\n };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Rewrite at ${levelInstructions[readingLevel]}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || text;\n }\n\n async extractEntities(text: string): Promise<EntityResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Extract entities. Respond with JSON: {\"entities\": [{\"text\": \"\", \"type\": \"\", \"position\": 0}]}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"entities\":[]}');\n }\n\n // Business Tools\n\n async generateEmail(purpose: string, tone: EmailTone = \"formal\", keyPoints: string[]): Promise<EmailResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${tone} email. Respond with JSON: {\"subject\": \"\", \"body\": \"\"}` },\n { role: \"user\", content: `Purpose: ${purpose}\\nKey points:\\n${keyPoints.map(p => `- ${p}`).join('\\n')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"subject\":\"\",\"body\":\"\"}');\n }\n\n async generateProductDescription(productName: string, features: string[], targetAudience?: string): Promise<string> {\n const audienceText = targetAudience ? `\\nTarget audience: ${targetAudience}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Create compelling, SEO-optimized product descriptions.\" },\n { role: \"user\", content: `Product: ${productName}\\nFeatures:\\n${features.map(f => `- ${f}`).join('\\n')}${audienceText}` }\n ],\n temperature: 0.5,\n });\n return response.choices[0].message.content || \"\";\n }\n\n async optimizeSEO(content: string, keywords: string[]): Promise<SEOResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Optimize for SEO. Respond with JSON: {\"optimizedContent\": \"\", \"analysis\": \"\"}' },\n { role: \"user\", content: `Content:\\n${content}\\n\\nKeywords: ${keywords.join(', ')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"optimizedContent\":\"\",\"analysis\":\"\"}');\n }\n\n // Developer Tools\n\n async generateCode(description: string, language: string, framework?: string): Promise<CodeGenerateResult> {\n const frameworkText = framework ? ` using ${framework}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${language} code. Respond with JSON: {\"code\": \"\", \"explanation\": \"\"}` },\n { role: \"user\", content: `Generate ${language} code${frameworkText}: ${description}` }\n ],\n temperature: 0.2,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"code\":\"\",\"explanation\":\"\"}');\n }\n\n async reviewCode(code: string, language: string): Promise<CodeReviewResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Review ${language} code. Respond with JSON: {\"issues\": [], \"suggestions\": [], \"securityConcerns\": []}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"issues\":[],\"suggestions\":[],\"securityConcerns\":[]}');\n }\n\n async generateSQLQuery(schema: string, query: string): Promise<SQLResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate SQL. Respond with JSON: {\"query\": \"\", \"explanation\": \"\"}' },\n { role: \"user\", content: `Schema:\\n${schema}\\n\\nGenerate SQL for: ${query}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"query\":\"\",\"explanation\":\"\"}');\n }\n\n async generateRegex(description: string): Promise<RegexResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate regex. Respond with JSON: {\"pattern\": \"\", \"explanation\": \"\", \"examples\": []}' },\n { role: \"user\", content: description }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"pattern\":\"\",\"explanation\":\"\",\"examples\":[]}');\n }\n\n async generateAPIDocs(code: string, framework: string): Promise<APIDocsResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate API docs for ${framework}. Respond with JSON: {\"documentation\": \"\", \"openapi\": \"\"}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.3,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"documentation\":\"\"}');\n }\n\n async extractTextOCR(image: string): Promise<OCRResult> {\n const url = image.startsWith(\"data:image\") ? image : `data:image/jpeg;base64,${image}`;\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Extract all text from the image accurately.\" },\n { role: \"user\", content: [{ type: \"text\", text: \"Extract all text:\" }, { type: \"image_url\", image_url: { url } }] }\n ],\n });\n return { text: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async generateQuiz(topic: string, numQuestions: number = 5, difficulty: Difficulty = \"medium\"): Promise<QuizResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${difficulty} quiz. Respond with JSON: {\"questions\": [{\"question\": \"\", \"options\": [], \"correctIndex\": 0, \"explanation\": \"\"}]}` },\n { role: \"user\", content: `Topic: ${topic}\\nQuestions: ${numQuestions}` }\n ],\n temperature: 0.5,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"questions\":[]}');\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,oBAAmB;AACnB,uBAAsB;AAwBf,IAAM,YAAN,MAAgB;AAAA,EAarB,YAAY,SAA0B,CAAC,GAAG;AAV1C,SAAQ,YAA8B;AAWpC,UAAM,gBAAgB,OAAO,oBAAoB,QAAQ,IAAI;AAC7D,UAAM,YAAY,OAAO,gBAAgB,QAAQ,IAAI;AACrD,UAAM,iBAAiB,OAAO,qBAAqB,QAAQ,IAAI;AAE/D,SAAK,gBAAgB,CAAC,CAAC;AACvB,SAAK,eAAe,CAAC,CAAC;AAGtB,SAAK,aAAa,OAAO,cAAc,QAAQ,IAAI,sBAAsB;AACzE,SAAK,WAAW,OAAO,YAAY,QAAQ,IAAI,oBAAoB;AACnE,SAAK,eAAe,OAAO,gBAAgB,QAAQ,IAAI,wBAAwB;AAC/E,SAAK,kBAAkB,OAAO,mBAAmB,QAAQ,IAAI,2BAA2B;AACxF,SAAK,YAAY,OAAO,aAAa;AAErC,QAAI,eAAe;AACjB,WAAK,aAAa,IAAI,cAAAA,QAAO;AAAA,QAC3B,QAAQ;AAAA,QACR,SAAS,OAAO,qBAAqB,QAAQ,IAAI,uBAAuB;AAAA,QACxE,gBAAgB;AAAA,UACd,gBAAgB,OAAO,qBAAqB,QAAQ,IAAI,sBAAsB;AAAA,UAC9E,WAAW,OAAO,mBAAmB,QAAQ,IAAI,oBAAoB;AAAA,QACvE;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,WAAK,aAAa,IAAI,cAAAA,QAAO,EAAE,QAAQ,QAAQ,CAAC;AAAA,IAClD;AAEA,QAAI,gBAAgB;AAClB,WAAK,YAAY,IAAI,iBAAAC,QAAU,EAAE,MAAM,eAAe,CAAC;AAAA,IACzD;AAEA,QAAI,WAAW;AACb,WAAK,SAAS,IAAI,cAAAD,QAAO,EAAE,QAAQ,UAAU,CAAC;AAAA,IAChD,WAAW,CAAC,eAAe;AACzB,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E,OAAO;AACL,WAAK,SAAS,IAAI,cAAAA,QAAO,EAAE,QAAQ,QAAQ,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,gBAAwB;AAC9B,WAAO,KAAK,gBAAgB,KAAK,aAAa,KAAK;AAAA,EACrD;AAAA,EAEQ,eAAuB;AAC7B,WAAO,KAAK,gBAAgB,KAAK,YAAY;AAAA,EAC/C;AAAA;AAAA,EAIA,MAAM,aAAa,YAAoB,WAAmB,0BAA2C;AACnG,QAAI,MAAM;AACV,QAAI,CAAC,WAAW,WAAW,MAAM,KAAK,CAAC,WAAW,WAAW,OAAO,GAAG;AACrE,YAAM,0BAA0B,UAAU;AAAA,IAC5C;AAEA,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,SAAS,GAAG,EAAE,MAAM,aAAa,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,IACrH,CAAC;AAED,WAAO,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW;AAAA,EAChD;AAAA,EAEA,MAAM,cAAc,QAAgB,OAAoB,aAA2C;AACjG,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,OAAO,OAAO,SAAS;AAAA,QACjD,OAAO,KAAK;AAAA,QACZ;AAAA,QAAQ,GAAG;AAAA,QAAG;AAAA,QAAM,iBAAiB;AAAA,MACvC,CAAC;AACD,UAAI,CAAC,SAAS,QAAQ,SAAS,KAAK,WAAW,EAAG,OAAM,IAAI,MAAM,oBAAoB;AACtF,YAAM,QAAQ,SAAS,KAAK,CAAC;AAC7B,aAAO,EAAE,QAAQ,MAAM,UAAU,eAAe,MAAM,eAAe;AAAA,IACvE,SAAS,OAAY;AACnB,WAAK,OAAO,WAAW,OAAO,OAAO,SAAS,SAAS,sBAAsB,MAAM,KAAK,gBAAgB,KAAK,WAAW;AACtH,eAAO,KAAK,2BAA2B,QAAQ,IAAI;AAAA,MACrD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,2BAA2B,QAAgB,OAAoB,aAA2C;AACtH,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,kCAAkC;AAEvE,UAAM,CAAC,OAAO,MAAM,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAClD,UAAM,cAAc,UAAU,SAAS,QAAQ,QAAQ,SAAS,SAAS;AAEzE,UAAM,SAAS,MAAM,KAAK,UAAU;AAAA,MAClC;AAAA,MACA,EAAE,OAAO,EAAE,QAAQ,cAAc,aAAa,eAAe,OAAO,gBAAgB,GAAG,EAAE;AAAA,IAC3F;AAEA,QAAI,CAAC,UAAU,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,iCAAiC;AAErF,UAAM,WAAW,OAAO,CAAC;AACzB,UAAM,gBAAgB,MAAM,MAAM,QAAQ;AAC1C,UAAM,cAAc,MAAM,cAAc,YAAY;AACpD,UAAM,SAAS,OAAO,KAAK,WAAW,EAAE,SAAS,QAAQ;AAEzD,WAAO,EAAE,QAAQ,KAAK,UAAU,eAAe,OAAO;AAAA,EACxD;AAAA,EAEA,MAAM,gBAAgB,YAAmD;AACvE,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,sDAAsD;AAC3F,WAAO,KAAK,wBAAwB,UAAU;AAAA,EAChD;AAAA,EAEA,MAAc,wBAAwB,YAAmD;AACvF,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,kCAAkC;AAEvE,QAAI;AAEJ,QAAI,OAAO,eAAe,UAAU;AAClC,UAAI,WAAW,WAAW,MAAM,GAAG;AACjC,cAAM,WAAW,MAAM,MAAM,UAAU;AACvC,cAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,cAAM,SAAS,OAAO,KAAK,WAAW,EAAE,SAAS,QAAQ;AACzD,cAAM,WAAW,SAAS,QAAQ,IAAI,cAAc,KAAK;AACzD,kBAAU,QAAQ,QAAQ,WAAW,MAAM;AAAA,MAC7C,WAAW,WAAW,WAAW,OAAO,GAAG;AACzC,kBAAU;AAAA,MACZ,OAAO;AACL,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAAA,IACF,OAAO;AACL,YAAM,cAAc,MAAM,WAAW,YAAY;AACjD,YAAM,SAAS,OAAO,KAAK,WAAW,EAAE,SAAS,QAAQ;AACzD,YAAM,WAAW,WAAW,QAAQ;AACpC,gBAAU,QAAQ,QAAQ,WAAW,MAAM;AAAA,IAC7C;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU;AAAA,MAClC;AAAA,MACA,EAAE,OAAO,EAAE,OAAO,SAAS,OAAO,YAAY,UAAU,MAAM,WAAW,MAAM,EAAE;AAAA,IACnF;AAEA,WAAO,OAAO,iBAAiB;AAAA,EACjC;AAAA,EAEA,MAAM,iBAAiB,MAAc,QAAe,SAA0B;AAC5E,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,mDAAmD;AACxF,WAAO,KAAK,wBAAwB,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAc,wBAAwB,MAA+B;AACnE,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,kCAAkC;AAEvE,UAAM,SAAS,MAAM,KAAK,UAAU;AAAA,MAClC;AAAA,MACA,EAAE,OAAO,EAAE,MAAM,UAAU,kBAAkB,EAAE;AAAA,IACjD;AAEA,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,iCAAiC;AAE9D,UAAM,gBAAgB,MAAM,MAAM,MAAM;AACxC,UAAM,cAAc,MAAM,cAAc,YAAY;AACpD,WAAO,OAAO,KAAK,WAAW;AAAA,EAChC;AAAA;AAAA,EAIA,MAAM,cAAc,MAAc,SAAwB,UAA2B;AACnF,UAAM,qBAAqB,EAAE,OAAO,oBAAoB,QAAQ,qBAAqB,MAAM,oCAAoC;AAC/H,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,kDAAkD;AAAA,QAC7E,EAAE,MAAM,QAAQ,SAAS,gCAAgC,mBAAmB,MAAM,CAAC;AAAA;AAAA,EAAQ,IAAI,GAAG;AAAA,MACpG;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AACD,WAAO,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW;AAAA,EAChD;AAAA,EAEA,MAAM,cAAc,MAAc,YAAoB,YAAgD;AACpG,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,6BAA6B,UAAU,OAAO,UAAU,IAAI;AAAA,QACvF,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AACD,WAAO,EAAE,aAAa,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,IAAI,YAAY,KAAK;AAAA,EACpF;AAAA,EAEA,MAAM,iBAAiB,MAAwC;AAC7D,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,yHAAyH;AAAA,QACpJ,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,UAAM,SAAS,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,IAAI;AACrE,WAAO,EAAE,WAAW,OAAO,aAAa,WAAW,OAAO,OAAO,SAAS,KAAK,UAAU,OAAO,YAAY,CAAC,EAAE;AAAA,EACjH;AAAA,EAEA,MAAM,gBAAgB,SAA4C;AAChE,QAAI;AACF,YAAM,aAAa,MAAM,KAAK,OAAO,YAAY,OAAO,EAAE,OAAO,SAAS,OAAO,KAAK,gBAAgB,CAAC;AACvG,YAAM,SAAS,WAAW,QAAQ,CAAC;AACnC,aAAO;AAAA,QACL,SAAS,OAAO;AAAA,QAChB,YAAY,OAAO;AAAA,QACnB,gBAAgB,OAAO;AAAA,MACzB;AAAA,IACF,QAAQ;AACN,YAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,QAClE,OAAO,KAAK,aAAa;AAAA,QACzB,UAAU;AAAA,UACR,EAAE,MAAM,UAAU,SAAS,sHAAsH;AAAA,UACjJ,EAAE,MAAM,QAAQ,SAAS,YAAY,OAAO,GAAG;AAAA,QACjD;AAAA,QACA,aAAa;AAAA,QACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,MACzC,CAAC;AACD,aAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,uDAAuD;AAAA,IAClH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAc,eAA6B,UAA2B;AACvF,UAAM,oBAAoB;AAAA,MACxB,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AACA,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,cAAc,kBAAkB,YAAY,CAAC,IAAI;AAAA,QAC5E,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AACD,WAAO,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW;AAAA,EAChD;AAAA,EAEA,MAAM,gBAAgB,MAAqC;AACzD,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,+FAA+F;AAAA,QAC1H,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,iBAAiB;AAAA,EAC5E;AAAA;AAAA,EAIA,MAAM,cAAc,SAAiB,OAAkB,UAAU,WAA2C;AAC1G,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,YAAY,IAAI,yDAAyD;AAAA,QACpG,EAAE,MAAM,QAAQ,SAAS,YAAY,OAAO;AAAA;AAAA,EAAkB,UAAU,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,MAC1G;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,0BAA0B;AAAA,EACrF;AAAA,EAEA,MAAM,2BAA2B,aAAqB,UAAoB,gBAA0C;AAClH,UAAM,eAAe,iBAAiB;AAAA,mBAAsB,cAAc,KAAK;AAC/E,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,yDAAyD;AAAA,QACpF,EAAE,MAAM,QAAQ,SAAS,YAAY,WAAW;AAAA;AAAA,EAAgB,SAAS,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG;AAAA,MAC1H;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AACD,WAAO,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW;AAAA,EAChD;AAAA,EAEA,MAAM,YAAY,SAAiB,UAAwC;AACzE,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,gFAAgF;AAAA,QAC3G,EAAE,MAAM,QAAQ,SAAS;AAAA,EAAa,OAAO;AAAA;AAAA,YAAiB,SAAS,KAAK,IAAI,CAAC,GAAG;AAAA,MACtF;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,uCAAuC;AAAA,EAClG;AAAA;AAAA,EAIA,MAAM,aAAa,aAAqB,UAAkB,WAAiD;AACzG,UAAM,gBAAgB,YAAY,UAAU,SAAS,KAAK;AAC1D,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,YAAY,QAAQ,4DAA4D;AAAA,QAC3G,EAAE,MAAM,QAAQ,SAAS,YAAY,QAAQ,QAAQ,aAAa,KAAK,WAAW,GAAG;AAAA,MACvF;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,8BAA8B;AAAA,EACzF;AAAA,EAEA,MAAM,WAAW,MAAc,UAA6C;AAC1E,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,UAAU,QAAQ,sFAAsF;AAAA,QACnI,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,sDAAsD;AAAA,EACjH;AAAA,EAEA,MAAM,iBAAiB,QAAgB,OAAmC;AACxE,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,oEAAoE;AAAA,QAC/F,EAAE,MAAM,QAAQ,SAAS;AAAA,EAAY,MAAM;AAAA;AAAA,oBAAyB,KAAK,GAAG;AAAA,MAC9E;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,+BAA+B;AAAA,EAC1F;AAAA,EAEA,MAAM,cAAc,aAA2C;AAC7D,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,wFAAwF;AAAA,QACnH,EAAE,MAAM,QAAQ,SAAS,YAAY;AAAA,MACvC;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,+CAA+C;AAAA,EAC1G;AAAA,EAEA,MAAM,gBAAgB,MAAc,WAA2C;AAC7E,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,yBAAyB,SAAS,4DAA4D;AAAA,QACzH,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,sBAAsB;AAAA,EACjF;AAAA,EAEA,MAAM,eAAe,OAAmC;AACtD,UAAM,MAAM,MAAM,WAAW,YAAY,IAAI,QAAQ,0BAA0B,KAAK;AACpF,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,8CAA8C;AAAA,QACzE,EAAE,MAAM,QAAQ,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,oBAAoB,GAAG,EAAE,MAAM,aAAa,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE;AAAA,MACpH;AAAA,IACF,CAAC;AACD,WAAO,EAAE,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,IAAI,YAAY,KAAK;AAAA,EAC7E;AAAA,EAEA,MAAM,aAAa,OAAe,eAAuB,GAAG,aAAyB,UAA+B;AAClH,UAAM,WAAW,MAAM,KAAK,cAAc,EAAE,KAAK,YAAY,OAAO;AAAA,MAClE,OAAO,KAAK,aAAa;AAAA,MACzB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,YAAY,UAAU,mHAAmH;AAAA,QACpK,EAAE,MAAM,QAAQ,SAAS,UAAU,KAAK;AAAA,aAAgB,YAAY,GAAG;AAAA,MACzE;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,EAAE,MAAM,cAAc;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,MAAM,SAAS,QAAQ,CAAC,EAAE,QAAQ,WAAW,kBAAkB;AAAA,EAC7E;AACF;","names":["OpenAI","Replicate"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/service.ts"],"sourcesContent":["/**\n * @perkos/ai-service\n * Multi-provider AI service abstraction with OpenRouter, Replicate, and OpenAI support\n */\n\nexport { AIService } from \"./service\";\nexport type {\n AIServiceConfig,\n AIProvider,\n ImageGenerateResult,\n TranscriptionResult,\n TranslationResult,\n SentimentResult,\n ModerationResult,\n EntityExtractionResult,\n CodeGenerationResult,\n CodeReviewResult,\n OCRResult,\n QuizResult,\n ImageAnalysisOptions,\n ImageGenerateOptions,\n TranscribeOptions,\n SpeechOptions,\n SummarizeOptions,\n TranslateOptions,\n SentimentOptions,\n ModerationOptions,\n SimplifyOptions,\n EntityOptions,\n EmailOptions,\n ProductDescriptionOptions,\n SEOOptions,\n CodeGenerateOptions,\n CodeReviewOptions,\n SQLQueryOptions,\n RegexOptions,\n APIDocsOptions,\n OCROptions,\n QuizOptions,\n} from \"./types\";\n","/**\n * AI Service Implementation\n * Multi-provider AI service with OpenRouter, Replicate, and OpenAI support\n */\n\nimport OpenAI from \"openai\";\nimport Replicate from \"replicate\";\nimport type {\n AIServiceConfig,\n ImageGenerateResult,\n TranslationResult,\n SentimentResult,\n ModerationResult,\n EntityResult,\n EmailResult,\n CodeGenerateResult,\n CodeReviewResult,\n SQLResult,\n RegexResult,\n SEOResult,\n APIDocsResult,\n OCRResult,\n QuizResult,\n SummaryLength,\n ReadingLevel,\n EmailTone,\n Difficulty,\n Voice,\n} from \"./types\";\n\nexport class AIService {\n private openai: OpenAI;\n private openrouter: OpenAI;\n private replicate: Replicate | null = null;\n private useOpenRouter: boolean;\n private useReplicate: boolean;\n\n private imageModel: string;\n private ttsModel: string;\n private whisperModel: string;\n private moderationModel: string;\n private chatModel: string;\n\n constructor(config: AIServiceConfig = {}) {\n const openrouterKey = config.openrouterApiKey || process.env.OPENROUTER_API_KEY;\n const openaiKey = config.openaiApiKey || process.env.OPENAI_API_KEY;\n const replicateToken = config.replicateApiToken || process.env.REPLICATE_API_TOKEN;\n\n this.useOpenRouter = !!openrouterKey;\n this.useReplicate = !!replicateToken;\n\n // Model configuration\n this.imageModel = config.imageModel || process.env.OPENAI_IMAGE_MODEL || \"dall-e-3\";\n this.ttsModel = config.ttsModel || process.env.OPENAI_TTS_MODEL || \"tts-1\";\n this.whisperModel = config.whisperModel || process.env.OPENAI_WHISPER_MODEL || \"whisper-1\";\n this.moderationModel = config.moderationModel || process.env.OPENAI_MODERATION_MODEL || \"omni-moderation-latest\";\n this.chatModel = config.chatModel || \"openai/gpt-4o\";\n\n if (openrouterKey) {\n this.openrouter = new OpenAI({\n apiKey: openrouterKey,\n baseURL: config.openrouterBaseUrl || process.env.OPENROUTER_BASE_URL || \"https://openrouter.ai/api/v1\",\n defaultHeaders: {\n \"HTTP-Referer\": config.openrouterReferer || process.env.OPENROUTER_REFERER || \"http://localhost:3000\",\n \"X-Title\": config.openrouterTitle || process.env.OPENROUTER_TITLE || \"PerkOS AI Service\",\n },\n });\n } else {\n this.openrouter = new OpenAI({ apiKey: \"dummy\" });\n }\n\n if (replicateToken) {\n this.replicate = new Replicate({ auth: replicateToken });\n }\n\n if (openaiKey) {\n this.openai = new OpenAI({ apiKey: openaiKey });\n } else if (!openrouterKey) {\n throw new Error(\"Either OPENROUTER_API_KEY or OPENAI_API_KEY must be set\");\n } else {\n this.openai = new OpenAI({ apiKey: \"dummy\" });\n }\n }\n\n private getChatClient(): OpenAI {\n return this.useOpenRouter ? this.openrouter : this.openai;\n }\n\n private getChatModel(): string {\n return this.useOpenRouter ? this.chatModel : \"gpt-4o\";\n }\n\n // Vision & Audio Methods\n\n async analyzeImage(imageInput: string, question: string = \"What is in this image?\"): Promise<string> {\n let url = imageInput;\n if (!imageInput.startsWith(\"http\") && !imageInput.startsWith(\"data:\")) {\n url = `data:image/jpeg;base64,${imageInput}`;\n }\n\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [{ role: \"user\", content: [{ type: \"text\", text: question }, { type: \"image_url\", image_url: { url } }] }],\n });\n\n return response.choices[0].message.content || \"Unable to analyze the image\";\n }\n\n async generateImage(prompt: string, size: \"1024x1024\" | \"1792x1024\" | \"1024x1792\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n try {\n const response = await this.openai.images.generate({\n model: this.imageModel,\n prompt, n: 1, size, response_format: \"b64_json\",\n });\n if (!response.data || response.data.length === 0) throw new Error(\"No image generated\");\n const image = response.data[0];\n return { base64: image.b64_json, revisedPrompt: image.revised_prompt };\n } catch (error: any) {\n if ((error?.status === 403 || error?.message?.includes(\"does not have access\")) && this.useReplicate && this.replicate) {\n return this.generateImageWithReplicate(prompt, size);\n }\n throw error;\n }\n }\n\n private async generateImageWithReplicate(prompt: string, size: \"1024x1024\" | \"1792x1024\" | \"1024x1792\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const [width, height] = size.split(\"x\").map(Number);\n const aspectRatio = width === height ? \"1:1\" : width > height ? \"16:9\" : \"9:16\";\n\n const output = await this.replicate.run(\n \"black-forest-labs/flux-schnell\",\n { input: { prompt, aspect_ratio: aspectRatio, output_format: \"png\", output_quality: 90 } }\n ) as string[];\n\n if (!output || output.length === 0) throw new Error(\"No image generated by Replicate\");\n\n const imageUrl = output[0];\n const imageResponse = await fetch(imageUrl);\n const arrayBuffer = await imageResponse.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n\n return { base64, url: imageUrl, revisedPrompt: prompt };\n }\n\n async transcribeAudio(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate API token required for audio transcription\");\n return this.transcribeWithReplicate(audioInput);\n }\n\n private async transcribeWithReplicate(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n let dataUri: string;\n\n if (typeof audioInput === \"string\") {\n if (audioInput.startsWith(\"http\")) {\n const response = await fetch(audioInput);\n const arrayBuffer = await response.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = response.headers.get(\"content-type\") || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n } else if (audioInput.startsWith(\"data:\")) {\n dataUri = audioInput;\n } else {\n throw new Error(\"Invalid string input for transcription\");\n }\n } else {\n const arrayBuffer = await audioInput.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = audioInput.type || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n }\n\n const output = await this.replicate.run(\n \"openai/whisper:4d50797290df275329f202e48c76360b3f22b08d28c196cbc54600319435f8d2\",\n { input: { audio: dataUri, model: \"large-v3\", language: \"en\", translate: false } }\n ) as { transcription: string };\n\n return output.transcription || \"\";\n }\n\n async synthesizeSpeech(text: string, voice: Voice = \"alloy\"): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate API token required for speech synthesis\");\n return this.synthesizeWithReplicate(text);\n }\n\n private async synthesizeWithReplicate(text: string): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const output = await this.replicate.run(\n \"minimax/speech-02-turbo\",\n { input: { text, voice_id: \"Friendly_Person\" } }\n ) as unknown as string;\n\n if (!output) throw new Error(\"No audio generated by Replicate\");\n\n const audioResponse = await fetch(output);\n const arrayBuffer = await audioResponse.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n // NLP Methods\n\n async summarizeText(text: string, length: SummaryLength = \"medium\"): Promise<string> {\n const lengthInstructions = { short: \"in 2-3 sentences\", medium: \"in 1-2 paragraphs\", long: \"in 3-4 paragraphs with key points\" };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"You are a professional summarization assistant.\" },\n { role: \"user\", content: `Summarize the following text ${lengthInstructions[length]}:\\n\\n${text}` }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || \"Unable to generate summary\";\n }\n\n async translateText(text: string, sourceLang: string, targetLang: string): Promise<TranslationResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Translate accurately from ${sourceLang} to ${targetLang}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.2,\n });\n return { translation: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async analyzeSentiment(text: string): Promise<SentimentResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze sentiment. Respond with JSON: {\"sentiment\": \"positive\"|\"negative\"|\"neutral\", \"score\": 0.0-1.0, \"emotions\": []}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n const result = JSON.parse(response.choices[0].message.content || \"{}\");\n return { sentiment: result.sentiment || \"neutral\", score: result.score || 0.5, emotions: result.emotions || [] };\n }\n\n async moderateContent(content: string): Promise<ModerationResult> {\n try {\n const moderation = await this.openai.moderations.create({ input: content, model: this.moderationModel });\n const result = moderation.results[0];\n return {\n flagged: result.flagged,\n categories: result.categories as unknown as Record<string, boolean>,\n categoryScores: result.category_scores as unknown as Record<string, number>,\n };\n } catch {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze content for policy violations. Respond with JSON: {\"flagged\": bool, \"categories\": {}, \"categoryScores\": {}}' },\n { role: \"user\", content: `Analyze: ${content}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"flagged\":false,\"categories\":{},\"categoryScores\":{}}');\n }\n }\n\n async simplifyText(text: string, readingLevel: ReadingLevel = \"middle\"): Promise<string> {\n const levelInstructions = {\n elementary: \"5th grade reading level\",\n middle: \"8th grade reading level\",\n high: \"high school reading level\"\n };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Rewrite at ${levelInstructions[readingLevel]}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || text;\n }\n\n async extractEntities(text: string): Promise<EntityResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Extract entities. Respond with JSON: {\"entities\": [{\"text\": \"\", \"type\": \"\", \"position\": 0}]}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"entities\":[]}');\n }\n\n // Business Tools\n\n async generateEmail(purpose: string, tone: EmailTone = \"formal\", keyPoints: string[]): Promise<EmailResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${tone} email. Respond with JSON: {\"subject\": \"\", \"body\": \"\"}` },\n { role: \"user\", content: `Purpose: ${purpose}\\nKey points:\\n${keyPoints.map(p => `- ${p}`).join('\\n')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"subject\":\"\",\"body\":\"\"}');\n }\n\n async generateProductDescription(productName: string, features: string[], targetAudience?: string): Promise<string> {\n const audienceText = targetAudience ? `\\nTarget audience: ${targetAudience}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Create compelling, SEO-optimized product descriptions.\" },\n { role: \"user\", content: `Product: ${productName}\\nFeatures:\\n${features.map(f => `- ${f}`).join('\\n')}${audienceText}` }\n ],\n temperature: 0.5,\n });\n return response.choices[0].message.content || \"\";\n }\n\n async optimizeSEO(content: string, keywords: string[]): Promise<SEOResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Optimize for SEO. Respond with JSON: {\"optimizedContent\": \"\", \"analysis\": \"\"}' },\n { role: \"user\", content: `Content:\\n${content}\\n\\nKeywords: ${keywords.join(', ')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"optimizedContent\":\"\",\"analysis\":\"\"}');\n }\n\n // Developer Tools\n\n async generateCode(description: string, language: string, framework?: string): Promise<CodeGenerateResult> {\n const frameworkText = framework ? ` using ${framework}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${language} code. Respond with JSON: {\"code\": \"\", \"explanation\": \"\"}` },\n { role: \"user\", content: `Generate ${language} code${frameworkText}: ${description}` }\n ],\n temperature: 0.2,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"code\":\"\",\"explanation\":\"\"}');\n }\n\n async reviewCode(code: string, language: string): Promise<CodeReviewResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Review ${language} code. Respond with JSON: {\"issues\": [], \"suggestions\": [], \"securityConcerns\": []}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"issues\":[],\"suggestions\":[],\"securityConcerns\":[]}');\n }\n\n async generateSQLQuery(schema: string, query: string): Promise<SQLResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate SQL. Respond with JSON: {\"query\": \"\", \"explanation\": \"\"}' },\n { role: \"user\", content: `Schema:\\n${schema}\\n\\nGenerate SQL for: ${query}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"query\":\"\",\"explanation\":\"\"}');\n }\n\n async generateRegex(description: string): Promise<RegexResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate regex. Respond with JSON: {\"pattern\": \"\", \"explanation\": \"\", \"examples\": []}' },\n { role: \"user\", content: description }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"pattern\":\"\",\"explanation\":\"\",\"examples\":[]}');\n }\n\n async generateAPIDocs(code: string, framework: string): Promise<APIDocsResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate API docs for ${framework}. Respond with JSON: {\"documentation\": \"\", \"openapi\": \"\"}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.3,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"documentation\":\"\"}');\n }\n\n async extractTextOCR(image: string): Promise<OCRResult> {\n const url = image.startsWith(\"data:image\") ? image : `data:image/jpeg;base64,${image}`;\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Extract all text from the image accurately.\" },\n { role: \"user\", content: [{ type: \"text\", text: \"Extract all text:\" }, { type: \"image_url\", image_url: { url } }] }\n ],\n });\n return { text: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async generateQuiz(topic: string, numQuestions: number = 5, difficulty: Difficulty = \"medium\"): Promise<QuizResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${difficulty} quiz. Respond with JSON: {\"questions\": [{\"question\": \"\", \"options\": [], \"correctIndex\": 0, \"explanation\": \"\"}]}` },\n { role: \"user\", content: `Topic: ${topic}\\nQuestions: ${numQuestions}` }\n ],\n temperature: 0.5,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"questions\":[]}');\n }\n}\n"],"mappings":"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","names":["OpenAI","Replicate"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/service.ts"],"sourcesContent":["/**\n * AI Service Implementation\n * Multi-provider AI service with OpenRouter, Replicate, and OpenAI support\n */\n\nimport OpenAI from \"openai\";\nimport Replicate from \"replicate\";\nimport type {\n AIServiceConfig,\n ImageGenerateResult,\n TranslationResult,\n SentimentResult,\n ModerationResult,\n EntityResult,\n EmailResult,\n CodeGenerateResult,\n CodeReviewResult,\n SQLResult,\n RegexResult,\n SEOResult,\n APIDocsResult,\n OCRResult,\n QuizResult,\n SummaryLength,\n ReadingLevel,\n EmailTone,\n Difficulty,\n Voice,\n} from \"./types\";\n\nexport class AIService {\n private openai: OpenAI;\n private openrouter: OpenAI;\n private replicate: Replicate | null = null;\n private useOpenRouter: boolean;\n private useReplicate: boolean;\n\n private imageModel: string;\n private ttsModel: string;\n private whisperModel: string;\n private moderationModel: string;\n private chatModel: string;\n\n constructor(config: AIServiceConfig = {}) {\n const openrouterKey = config.openrouterApiKey || process.env.OPENROUTER_API_KEY;\n const openaiKey = config.openaiApiKey || process.env.OPENAI_API_KEY;\n const replicateToken = config.replicateApiToken || process.env.REPLICATE_API_TOKEN;\n\n this.useOpenRouter = !!openrouterKey;\n this.useReplicate = !!replicateToken;\n\n // Model configuration\n this.imageModel = config.imageModel || process.env.OPENAI_IMAGE_MODEL || \"dall-e-3\";\n this.ttsModel = config.ttsModel || process.env.OPENAI_TTS_MODEL || \"tts-1\";\n this.whisperModel = config.whisperModel || process.env.OPENAI_WHISPER_MODEL || \"whisper-1\";\n this.moderationModel = config.moderationModel || process.env.OPENAI_MODERATION_MODEL || \"omni-moderation-latest\";\n this.chatModel = config.chatModel || \"openai/gpt-4o\";\n\n if (openrouterKey) {\n this.openrouter = new OpenAI({\n apiKey: openrouterKey,\n baseURL: config.openrouterBaseUrl || process.env.OPENROUTER_BASE_URL || \"https://openrouter.ai/api/v1\",\n defaultHeaders: {\n \"HTTP-Referer\": config.openrouterReferer || process.env.OPENROUTER_REFERER || \"http://localhost:3000\",\n \"X-Title\": config.openrouterTitle || process.env.OPENROUTER_TITLE || \"PerkOS AI Service\",\n },\n });\n } else {\n this.openrouter = new OpenAI({ apiKey: \"dummy\" });\n }\n\n if (replicateToken) {\n this.replicate = new Replicate({ auth: replicateToken });\n }\n\n if (openaiKey) {\n this.openai = new OpenAI({ apiKey: openaiKey });\n } else if (!openrouterKey) {\n throw new Error(\"Either OPENROUTER_API_KEY or OPENAI_API_KEY must be set\");\n } else {\n this.openai = new OpenAI({ apiKey: \"dummy\" });\n }\n }\n\n private getChatClient(): OpenAI {\n return this.useOpenRouter ? this.openrouter : this.openai;\n }\n\n private getChatModel(): string {\n return this.useOpenRouter ? this.chatModel : \"gpt-4o\";\n }\n\n // Vision & Audio Methods\n\n async analyzeImage(imageInput: string, question: string = \"What is in this image?\"): Promise<string> {\n let url = imageInput;\n if (!imageInput.startsWith(\"http\") && !imageInput.startsWith(\"data:\")) {\n url = `data:image/jpeg;base64,${imageInput}`;\n }\n\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [{ role: \"user\", content: [{ type: \"text\", text: question }, { type: \"image_url\", image_url: { url } }] }],\n });\n\n return response.choices[0].message.content || \"Unable to analyze the image\";\n }\n\n async generateImage(prompt: string, size: \"1024x1024\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n try {\n const response = await this.openai.images.generate({\n model: this.imageModel,\n prompt, n: 1, size, response_format: \"b64_json\",\n });\n if (!response.data || response.data.length === 0) throw new Error(\"No image generated\");\n const image = response.data[0];\n return { base64: image.b64_json, revisedPrompt: image.revised_prompt };\n } catch (error: any) {\n if ((error?.status === 403 || error?.message?.includes(\"does not have access\")) && this.useReplicate && this.replicate) {\n return this.generateImageWithReplicate(prompt, size);\n }\n throw error;\n }\n }\n\n private async generateImageWithReplicate(prompt: string, size: \"1024x1024\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const [width, height] = size.split(\"x\").map(Number);\n const aspectRatio = width === height ? \"1:1\" : width > height ? \"16:9\" : \"9:16\";\n\n const output = await this.replicate.run(\n \"black-forest-labs/flux-schnell\",\n { input: { prompt, aspect_ratio: aspectRatio, output_format: \"png\", output_quality: 90 } }\n ) as string[];\n\n if (!output || output.length === 0) throw new Error(\"No image generated by Replicate\");\n\n const imageUrl = output[0];\n const imageResponse = await fetch(imageUrl);\n const arrayBuffer = await imageResponse.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n\n return { base64, url: imageUrl, revisedPrompt: prompt };\n }\n\n async transcribeAudio(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate API token required for audio transcription\");\n return this.transcribeWithReplicate(audioInput);\n }\n\n private async transcribeWithReplicate(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n let dataUri: string;\n\n if (typeof audioInput === \"string\") {\n if (audioInput.startsWith(\"http\")) {\n const response = await fetch(audioInput);\n const arrayBuffer = await response.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = response.headers.get(\"content-type\") || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n } else if (audioInput.startsWith(\"data:\")) {\n dataUri = audioInput;\n } else {\n throw new Error(\"Invalid string input for transcription\");\n }\n } else {\n const arrayBuffer = await audioInput.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = audioInput.type || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n }\n\n const output = await this.replicate.run(\n \"openai/whisper:4d50797290df275329f202e48c76360b3f22b08d28c196cbc54600319435f8d2\",\n { input: { audio: dataUri, model: \"large-v3\", language: \"en\", translate: false } }\n ) as { transcription: string };\n\n return output.transcription || \"\";\n }\n\n async synthesizeSpeech(text: string, voice: Voice = \"alloy\"): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate API token required for speech synthesis\");\n return this.synthesizeWithReplicate(text);\n }\n\n private async synthesizeWithReplicate(text: string): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const output = await this.replicate.run(\n \"minimax/speech-02-turbo\",\n { input: { text, voice_id: \"Friendly_Person\" } }\n ) as unknown as string;\n\n if (!output) throw new Error(\"No audio generated by Replicate\");\n\n const audioResponse = await fetch(output);\n const arrayBuffer = await audioResponse.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n // NLP Methods\n\n async summarizeText(text: string, length: SummaryLength = \"medium\"): Promise<string> {\n const lengthInstructions = { short: \"in 2-3 sentences\", medium: \"in 1-2 paragraphs\", long: \"in 3-4 paragraphs with key points\" };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"You are a professional summarization assistant.\" },\n { role: \"user\", content: `Summarize the following text ${lengthInstructions[length]}:\\n\\n${text}` }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || \"Unable to generate summary\";\n }\n\n async translateText(text: string, sourceLang: string, targetLang: string): Promise<TranslationResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Translate accurately from ${sourceLang} to ${targetLang}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.2,\n });\n return { translation: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async analyzeSentiment(text: string): Promise<SentimentResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze sentiment. Respond with JSON: {\"sentiment\": \"positive\"|\"negative\"|\"neutral\", \"score\": 0.0-1.0, \"emotions\": []}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n const result = JSON.parse(response.choices[0].message.content || \"{}\");\n return { sentiment: result.sentiment || \"neutral\", score: result.score || 0.5, emotions: result.emotions || [] };\n }\n\n async moderateContent(content: string): Promise<ModerationResult> {\n try {\n const moderation = await this.openai.moderations.create({ input: content, model: this.moderationModel });\n const result = moderation.results[0];\n return {\n flagged: result.flagged,\n categories: result.categories as unknown as Record<string, boolean>,\n categoryScores: result.category_scores as unknown as Record<string, number>,\n };\n } catch {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze content for policy violations. Respond with JSON: {\"flagged\": bool, \"categories\": {}, \"categoryScores\": {}}' },\n { role: \"user\", content: `Analyze: ${content}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"flagged\":false,\"categories\":{},\"categoryScores\":{}}');\n }\n }\n\n async simplifyText(text: string, readingLevel: ReadingLevel = \"middle\"): Promise<string> {\n const levelInstructions = {\n elementary: \"5th grade reading level\",\n middle: \"8th grade reading level\",\n high: \"high school reading level\"\n };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Rewrite at ${levelInstructions[readingLevel]}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || text;\n }\n\n async extractEntities(text: string): Promise<EntityResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Extract entities. Respond with JSON: {\"entities\": [{\"text\": \"\", \"type\": \"\", \"position\": 0}]}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"entities\":[]}');\n }\n\n // Business Tools\n\n async generateEmail(purpose: string, tone: EmailTone = \"formal\", keyPoints: string[]): Promise<EmailResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${tone} email. Respond with JSON: {\"subject\": \"\", \"body\": \"\"}` },\n { role: \"user\", content: `Purpose: ${purpose}\\nKey points:\\n${keyPoints.map(p => `- ${p}`).join('\\n')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"subject\":\"\",\"body\":\"\"}');\n }\n\n async generateProductDescription(productName: string, features: string[], targetAudience?: string): Promise<string> {\n const audienceText = targetAudience ? `\\nTarget audience: ${targetAudience}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Create compelling, SEO-optimized product descriptions.\" },\n { role: \"user\", content: `Product: ${productName}\\nFeatures:\\n${features.map(f => `- ${f}`).join('\\n')}${audienceText}` }\n ],\n temperature: 0.5,\n });\n return response.choices[0].message.content || \"\";\n }\n\n async optimizeSEO(content: string, keywords: string[]): Promise<SEOResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Optimize for SEO. Respond with JSON: {\"optimizedContent\": \"\", \"analysis\": \"\"}' },\n { role: \"user\", content: `Content:\\n${content}\\n\\nKeywords: ${keywords.join(', ')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"optimizedContent\":\"\",\"analysis\":\"\"}');\n }\n\n // Developer Tools\n\n async generateCode(description: string, language: string, framework?: string): Promise<CodeGenerateResult> {\n const frameworkText = framework ? ` using ${framework}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${language} code. Respond with JSON: {\"code\": \"\", \"explanation\": \"\"}` },\n { role: \"user\", content: `Generate ${language} code${frameworkText}: ${description}` }\n ],\n temperature: 0.2,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"code\":\"\",\"explanation\":\"\"}');\n }\n\n async reviewCode(code: string, language: string): Promise<CodeReviewResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Review ${language} code. Respond with JSON: {\"issues\": [], \"suggestions\": [], \"securityConcerns\": []}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"issues\":[],\"suggestions\":[],\"securityConcerns\":[]}');\n }\n\n async generateSQLQuery(schema: string, query: string): Promise<SQLResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate SQL. Respond with JSON: {\"query\": \"\", \"explanation\": \"\"}' },\n { role: \"user\", content: `Schema:\\n${schema}\\n\\nGenerate SQL for: ${query}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"query\":\"\",\"explanation\":\"\"}');\n }\n\n async generateRegex(description: string): Promise<RegexResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate regex. Respond with JSON: {\"pattern\": \"\", \"explanation\": \"\", \"examples\": []}' },\n { role: \"user\", content: description }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"pattern\":\"\",\"explanation\":\"\",\"examples\":[]}');\n }\n\n async generateAPIDocs(code: string, framework: string): Promise<APIDocsResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate API docs for ${framework}. Respond with JSON: {\"documentation\": \"\", \"openapi\": \"\"}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.3,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"documentation\":\"\"}');\n }\n\n async extractTextOCR(image: string): Promise<OCRResult> {\n const url = image.startsWith(\"data:image\") ? image : `data:image/jpeg;base64,${image}`;\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Extract all text from the image accurately.\" },\n { role: \"user\", content: [{ type: \"text\", text: \"Extract all text:\" }, { type: \"image_url\", image_url: { url } }] }\n ],\n });\n return { text: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async generateQuiz(topic: string, numQuestions: number = 5, difficulty: Difficulty = \"medium\"): Promise<QuizResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${difficulty} quiz. Respond with JSON: {\"questions\": [{\"question\": \"\", \"options\": [], \"correctIndex\": 0, \"explanation\": \"\"}]}` },\n { role: \"user\", content: `Topic: ${topic}\\nQuestions: ${numQuestions}` }\n ],\n temperature: 0.5,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"questions\":[]}');\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/service.ts"],"sourcesContent":["/**\n * AI Service Implementation\n * Multi-provider AI service with OpenRouter, Replicate, and OpenAI support\n */\n\nimport OpenAI from \"openai\";\nimport Replicate from \"replicate\";\nimport type {\n AIServiceConfig,\n ImageGenerateResult,\n TranslationResult,\n SentimentResult,\n ModerationResult,\n EntityResult,\n EmailResult,\n CodeGenerateResult,\n CodeReviewResult,\n SQLResult,\n RegexResult,\n SEOResult,\n APIDocsResult,\n OCRResult,\n QuizResult,\n SummaryLength,\n ReadingLevel,\n EmailTone,\n Difficulty,\n Voice,\n} from \"./types\";\n\nexport class AIService {\n private openai: OpenAI;\n private openrouter: OpenAI;\n private replicate: Replicate | null = null;\n private useOpenRouter: boolean;\n private useReplicate: boolean;\n\n private imageModel: string;\n private ttsModel: string;\n private whisperModel: string;\n private moderationModel: string;\n private chatModel: string;\n\n constructor(config: AIServiceConfig = {}) {\n const openrouterKey = config.openrouterApiKey || process.env.OPENROUTER_API_KEY;\n const openaiKey = config.openaiApiKey || process.env.OPENAI_API_KEY;\n const replicateToken = config.replicateApiToken || process.env.REPLICATE_API_TOKEN;\n\n this.useOpenRouter = !!openrouterKey;\n this.useReplicate = !!replicateToken;\n\n // Model configuration\n this.imageModel = config.imageModel || process.env.OPENAI_IMAGE_MODEL || \"dall-e-3\";\n this.ttsModel = config.ttsModel || process.env.OPENAI_TTS_MODEL || \"tts-1\";\n this.whisperModel = config.whisperModel || process.env.OPENAI_WHISPER_MODEL || \"whisper-1\";\n this.moderationModel = config.moderationModel || process.env.OPENAI_MODERATION_MODEL || \"omni-moderation-latest\";\n this.chatModel = config.chatModel || \"openai/gpt-4o\";\n\n if (openrouterKey) {\n this.openrouter = new OpenAI({\n apiKey: openrouterKey,\n baseURL: config.openrouterBaseUrl || process.env.OPENROUTER_BASE_URL || \"https://openrouter.ai/api/v1\",\n defaultHeaders: {\n \"HTTP-Referer\": config.openrouterReferer || process.env.OPENROUTER_REFERER || \"http://localhost:3000\",\n \"X-Title\": config.openrouterTitle || process.env.OPENROUTER_TITLE || \"PerkOS AI Service\",\n },\n });\n } else {\n this.openrouter = new OpenAI({ apiKey: \"dummy\" });\n }\n\n if (replicateToken) {\n this.replicate = new Replicate({ auth: replicateToken });\n }\n\n if (openaiKey) {\n this.openai = new OpenAI({ apiKey: openaiKey });\n } else if (!openrouterKey) {\n throw new Error(\"Either OPENROUTER_API_KEY or OPENAI_API_KEY must be set\");\n } else {\n this.openai = new OpenAI({ apiKey: \"dummy\" });\n }\n }\n\n private getChatClient(): OpenAI {\n return this.useOpenRouter ? this.openrouter : this.openai;\n }\n\n private getChatModel(): string {\n return this.useOpenRouter ? this.chatModel : \"gpt-4o\";\n }\n\n // Vision & Audio Methods\n\n async analyzeImage(imageInput: string, question: string = \"What is in this image?\"): Promise<string> {\n let url = imageInput;\n if (!imageInput.startsWith(\"http\") && !imageInput.startsWith(\"data:\")) {\n url = `data:image/jpeg;base64,${imageInput}`;\n }\n\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [{ role: \"user\", content: [{ type: \"text\", text: question }, { type: \"image_url\", image_url: { url } }] }],\n });\n\n return response.choices[0].message.content || \"Unable to analyze the image\";\n }\n\n async generateImage(prompt: string, size: \"1024x1024\" | \"1792x1024\" | \"1024x1792\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n try {\n const response = await this.openai.images.generate({\n model: this.imageModel,\n prompt, n: 1, size, response_format: \"b64_json\",\n });\n if (!response.data || response.data.length === 0) throw new Error(\"No image generated\");\n const image = response.data[0];\n return { base64: image.b64_json, revisedPrompt: image.revised_prompt };\n } catch (error: any) {\n if ((error?.status === 403 || error?.message?.includes(\"does not have access\")) && this.useReplicate && this.replicate) {\n return this.generateImageWithReplicate(prompt, size);\n }\n throw error;\n }\n }\n\n private async generateImageWithReplicate(prompt: string, size: \"1024x1024\" | \"1792x1024\" | \"1024x1792\" = \"1024x1024\"): Promise<ImageGenerateResult> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const [width, height] = size.split(\"x\").map(Number);\n const aspectRatio = width === height ? \"1:1\" : width > height ? \"16:9\" : \"9:16\";\n\n const output = await this.replicate.run(\n \"black-forest-labs/flux-schnell\",\n { input: { prompt, aspect_ratio: aspectRatio, output_format: \"png\", output_quality: 90 } }\n ) as string[];\n\n if (!output || output.length === 0) throw new Error(\"No image generated by Replicate\");\n\n const imageUrl = output[0];\n const imageResponse = await fetch(imageUrl);\n const arrayBuffer = await imageResponse.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n\n return { base64, url: imageUrl, revisedPrompt: prompt };\n }\n\n async transcribeAudio(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate API token required for audio transcription\");\n return this.transcribeWithReplicate(audioInput);\n }\n\n private async transcribeWithReplicate(audioInput: File | Blob | string): Promise<string> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n let dataUri: string;\n\n if (typeof audioInput === \"string\") {\n if (audioInput.startsWith(\"http\")) {\n const response = await fetch(audioInput);\n const arrayBuffer = await response.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = response.headers.get(\"content-type\") || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n } else if (audioInput.startsWith(\"data:\")) {\n dataUri = audioInput;\n } else {\n throw new Error(\"Invalid string input for transcription\");\n }\n } else {\n const arrayBuffer = await audioInput.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n const mimeType = audioInput.type || \"audio/mpeg\";\n dataUri = `data:${mimeType};base64,${base64}`;\n }\n\n const output = await this.replicate.run(\n \"openai/whisper:4d50797290df275329f202e48c76360b3f22b08d28c196cbc54600319435f8d2\",\n { input: { audio: dataUri, model: \"large-v3\", language: \"en\", translate: false } }\n ) as { transcription: string };\n\n return output.transcription || \"\";\n }\n\n async synthesizeSpeech(text: string, voice: Voice = \"alloy\"): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate API token required for speech synthesis\");\n return this.synthesizeWithReplicate(text);\n }\n\n private async synthesizeWithReplicate(text: string): Promise<Buffer> {\n if (!this.replicate) throw new Error(\"Replicate client not initialized\");\n\n const output = await this.replicate.run(\n \"minimax/speech-02-turbo\",\n { input: { text, voice_id: \"Friendly_Person\" } }\n ) as unknown as string;\n\n if (!output) throw new Error(\"No audio generated by Replicate\");\n\n const audioResponse = await fetch(output);\n const arrayBuffer = await audioResponse.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n // NLP Methods\n\n async summarizeText(text: string, length: SummaryLength = \"medium\"): Promise<string> {\n const lengthInstructions = { short: \"in 2-3 sentences\", medium: \"in 1-2 paragraphs\", long: \"in 3-4 paragraphs with key points\" };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"You are a professional summarization assistant.\" },\n { role: \"user\", content: `Summarize the following text ${lengthInstructions[length]}:\\n\\n${text}` }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || \"Unable to generate summary\";\n }\n\n async translateText(text: string, sourceLang: string, targetLang: string): Promise<TranslationResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Translate accurately from ${sourceLang} to ${targetLang}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.2,\n });\n return { translation: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async analyzeSentiment(text: string): Promise<SentimentResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze sentiment. Respond with JSON: {\"sentiment\": \"positive\"|\"negative\"|\"neutral\", \"score\": 0.0-1.0, \"emotions\": []}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n const result = JSON.parse(response.choices[0].message.content || \"{}\");\n return { sentiment: result.sentiment || \"neutral\", score: result.score || 0.5, emotions: result.emotions || [] };\n }\n\n async moderateContent(content: string): Promise<ModerationResult> {\n try {\n const moderation = await this.openai.moderations.create({ input: content, model: this.moderationModel });\n const result = moderation.results[0];\n return {\n flagged: result.flagged,\n categories: result.categories as unknown as Record<string, boolean>,\n categoryScores: result.category_scores as unknown as Record<string, number>,\n };\n } catch {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Analyze content for policy violations. Respond with JSON: {\"flagged\": bool, \"categories\": {}, \"categoryScores\": {}}' },\n { role: \"user\", content: `Analyze: ${content}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"flagged\":false,\"categories\":{},\"categoryScores\":{}}');\n }\n }\n\n async simplifyText(text: string, readingLevel: ReadingLevel = \"middle\"): Promise<string> {\n const levelInstructions = {\n elementary: \"5th grade reading level\",\n middle: \"8th grade reading level\",\n high: \"high school reading level\"\n };\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Rewrite at ${levelInstructions[readingLevel]}.` },\n { role: \"user\", content: text }\n ],\n temperature: 0.3,\n });\n return response.choices[0].message.content || text;\n }\n\n async extractEntities(text: string): Promise<EntityResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Extract entities. Respond with JSON: {\"entities\": [{\"text\": \"\", \"type\": \"\", \"position\": 0}]}' },\n { role: \"user\", content: text }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"entities\":[]}');\n }\n\n // Business Tools\n\n async generateEmail(purpose: string, tone: EmailTone = \"formal\", keyPoints: string[]): Promise<EmailResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${tone} email. Respond with JSON: {\"subject\": \"\", \"body\": \"\"}` },\n { role: \"user\", content: `Purpose: ${purpose}\\nKey points:\\n${keyPoints.map(p => `- ${p}`).join('\\n')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"subject\":\"\",\"body\":\"\"}');\n }\n\n async generateProductDescription(productName: string, features: string[], targetAudience?: string): Promise<string> {\n const audienceText = targetAudience ? `\\nTarget audience: ${targetAudience}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Create compelling, SEO-optimized product descriptions.\" },\n { role: \"user\", content: `Product: ${productName}\\nFeatures:\\n${features.map(f => `- ${f}`).join('\\n')}${audienceText}` }\n ],\n temperature: 0.5,\n });\n return response.choices[0].message.content || \"\";\n }\n\n async optimizeSEO(content: string, keywords: string[]): Promise<SEOResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Optimize for SEO. Respond with JSON: {\"optimizedContent\": \"\", \"analysis\": \"\"}' },\n { role: \"user\", content: `Content:\\n${content}\\n\\nKeywords: ${keywords.join(', ')}` }\n ],\n temperature: 0.4,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"optimizedContent\":\"\",\"analysis\":\"\"}');\n }\n\n // Developer Tools\n\n async generateCode(description: string, language: string, framework?: string): Promise<CodeGenerateResult> {\n const frameworkText = framework ? ` using ${framework}` : '';\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${language} code. Respond with JSON: {\"code\": \"\", \"explanation\": \"\"}` },\n { role: \"user\", content: `Generate ${language} code${frameworkText}: ${description}` }\n ],\n temperature: 0.2,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"code\":\"\",\"explanation\":\"\"}');\n }\n\n async reviewCode(code: string, language: string): Promise<CodeReviewResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Review ${language} code. Respond with JSON: {\"issues\": [], \"suggestions\": [], \"securityConcerns\": []}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"issues\":[],\"suggestions\":[],\"securityConcerns\":[]}');\n }\n\n async generateSQLQuery(schema: string, query: string): Promise<SQLResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate SQL. Respond with JSON: {\"query\": \"\", \"explanation\": \"\"}' },\n { role: \"user\", content: `Schema:\\n${schema}\\n\\nGenerate SQL for: ${query}` }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"query\":\"\",\"explanation\":\"\"}');\n }\n\n async generateRegex(description: string): Promise<RegexResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: 'Generate regex. Respond with JSON: {\"pattern\": \"\", \"explanation\": \"\", \"examples\": []}' },\n { role: \"user\", content: description }\n ],\n temperature: 0.1,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"pattern\":\"\",\"explanation\":\"\",\"examples\":[]}');\n }\n\n async generateAPIDocs(code: string, framework: string): Promise<APIDocsResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate API docs for ${framework}. Respond with JSON: {\"documentation\": \"\", \"openapi\": \"\"}` },\n { role: \"user\", content: code }\n ],\n temperature: 0.3,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"documentation\":\"\"}');\n }\n\n async extractTextOCR(image: string): Promise<OCRResult> {\n const url = image.startsWith(\"data:image\") ? image : `data:image/jpeg;base64,${image}`;\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: \"Extract all text from the image accurately.\" },\n { role: \"user\", content: [{ type: \"text\", text: \"Extract all text:\" }, { type: \"image_url\", image_url: { url } }] }\n ],\n });\n return { text: response.choices[0].message.content || \"\", confidence: 0.95 };\n }\n\n async generateQuiz(topic: string, numQuestions: number = 5, difficulty: Difficulty = \"medium\"): Promise<QuizResult> {\n const response = await this.getChatClient().chat.completions.create({\n model: this.getChatModel(),\n messages: [\n { role: \"system\", content: `Generate ${difficulty} quiz. Respond with JSON: {\"questions\": [{\"question\": \"\", \"options\": [], \"correctIndex\": 0, \"explanation\": \"\"}]}` },\n { role: \"user\", content: `Topic: ${topic}\\nQuestions: ${numQuestions}` }\n ],\n temperature: 0.5,\n response_format: { type: \"json_object\" }\n });\n return JSON.parse(response.choices[0].message.content || '{\"questions\":[]}');\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED