@matthew.ngo/ai-toolkit
Version:
A comprehensive AI toolkit with multi-provider support
190 lines (157 loc) • 21.1 kB
JavaScript
import x from'@anthropic-ai/sdk';import {GoogleGenerativeAI}from'@google/generative-ai';import v from'openai';var c=class{name;config;defaultModel;constructor(t){this.name=t.name,this.config=t,this.defaultModel=t.model||this.getDefaultModel();}validateApiKey(){if(!this.config.apiKey)throw new Error(`API key required for ${this.name} provider`)}getHeaders(t){return {"Content-Type":"application/json",...this.config.headers,...t}}async makeRequest(t,e){let r=this.config.timeout||3e4,n=new AbortController,s=setTimeout(()=>n.abort(),r);try{let a=await fetch(t,{...e,signal:n.signal});if(!a.ok)throw await this.parseError(a);return await a.json()}catch(a){throw a.name==="AbortError"?new Error(`Request timeout after ${r}ms`):a}finally{clearTimeout(s);}}async parseError(t){let e=`${this.name} API error: ${t.status} ${t.statusText}`;try{let n=await t.json();n.error?.message?e=n.error.message:n.message&&(e=n.message);}catch{}let r=new Error(e);return r.status=t.status,r.provider=this.name,r}getModel(t){return t?.model||this.config.model||this.defaultModel}async generateText(t,e){throw new Error(`Text generation not implemented for ${this.name} provider`)}async*generateStream(t,e){throw new Error(`Stream generation not implemented for ${this.name} provider`)}async generateEmbedding(t){throw new Error(`Embedding generation not implemented for ${this.name} provider`)}async classifyText(t,e){throw new Error(`Text classification not implemented for ${this.name} provider`)}async summarize(t,e){throw new Error(`Text summarization not implemented for ${this.name} provider`)}async analyzeSentiment(t){throw new Error(`Sentiment analysis not implemented for ${this.name} provider`)}async generateImage(t,e){throw new Error(`Image generation not implemented for ${this.name} provider`)}async analyzeImage(t,e){throw new Error(`Image analysis not implemented for ${this.name} provider`)}async transcribeAudio(t,e){throw new Error(`Audio transcription not implemented for ${this.name} provider`)}async generateSpeech(t,e){throw new Error(`Speech generation not implemented for ${this.name} provider`)}async generateCode(t,e){throw new Error(`Code generation not implemented for ${this.name} provider`)}async explainCode(t,e){throw new Error(`Code explanation not implemented for ${this.name} provider`)}};var p=class extends c{client;constructor(t){super(t),this.validateApiKey(),this.client=new x({apiKey:this.config.apiKey,baseURL:this.config.baseUrl,timeout:this.config.timeout,maxRetries:this.config.maxRetries||2});}getDefaultModel(){return "claude-3-sonnet-20240229"}async generateText(t,e){let r=this.getModel(e);return (await this.client.messages.create({model:r,messages:[{role:"user",content:t}],system:e?.systemPrompt,max_tokens:e?.maxTokens||1e3,temperature:e?.temperature,top_p:e?.topP,top_k:e?.topK,stop_sequences:e?.stopSequences,stream:false})).content.filter(a=>a.type==="text").map(a=>a.text).join(`
`)}async*generateStream(t,e){let r=this.getModel(e),n=await this.client.messages.create({model:r,messages:[{role:"user",content:t}],system:e?.systemPrompt,max_tokens:e?.maxTokens||1e3,temperature:e?.temperature,top_p:e?.topP,top_k:e?.topK,stop_sequences:e?.stopSequences,stream:true});for await(let s of n)s.type==="content_block_delta"&&s.delta.type==="text_delta"&&(yield s.delta.text);}async classifyText(t,e){let r=`Classify this text into exactly one category from: ${e.join(", ")}.
Text: "${t}"
Respond with a JSON object:
{
"label": "chosen category",
"confidence": 0.0-1.0,
"scores": { "category1": 0.0-1.0, ... }
}`,n=await this.generateText(r,{temperature:0,maxTokens:200});try{let a=n.match(/\{[\s\S]*\}/);if(a)return JSON.parse(a[0])}catch{}let s=e[0]??"";return {label:s,confidence:.5,scores:e.reduce((a,i)=>({...a,[i]:i===s?.5:.5/(e.length-1)}),{})}}async summarize(t,e){let n=`${{bullet:"Create a bullet-point summary with key points",paragraph:"Write a concise paragraph summary",tldr:"Write a one-sentence TL;DR","key-points":"Extract the most important key points",executive:"Write an executive summary for business leaders"}[e?.style||"paragraph"]} of the following text.
${e?.maxLength?`Keep it under ${e.maxLength} characters.`:""}
Text:
"${t}"
Summary:`;return this.generateText(n,{maxTokens:e?.maxLength?Math.ceil(e.maxLength/4):200,temperature:.3})}async analyzeSentiment(t){let e=`Analyze the sentiment of the following text. Respond with JSON:
{
"sentiment": "positive" | "negative" | "neutral" | "mixed",
"score": 0.0-1.0,
"aspects": [
{ "aspect": "...", "sentiment": "...", "score": 0.0-1.0 }
]
}
Text: "${t}"`,r=await this.generateText(e,{temperature:0,maxTokens:300});try{let n=r.match(/\{[\s\S]*\}/);if(n)return JSON.parse(n[0])}catch{}return {sentiment:"neutral",score:.5,aspects:[]}}async generateEmbedding(t){throw new Error("Embeddings not supported by Anthropic. Use a different provider.")}async generateCode(t,e){let r=`You are Claude, an expert programmer. Generate clean, efficient code.
${e?.includeComments?"Include helpful comments.":""}
${e?.includeTests?"Include unit tests.":""}
Always respond with valid JSON containing: code, language, explanation, and dependencies array.`,n=`Language: ${e?.language||"auto-detect"}
Framework: ${e?.framework||"none"}
Task: ${t}
Respond with JSON:
{
"code": "the generated code",
"language": "detected or specified language",
"explanation": "brief explanation",
${e?.includeTests?'"tests": "unit test code",':""}
"dependencies": ["required", "packages"]
}`,s=await this.generateText(n,{systemPrompt:r,temperature:.2,maxTokens:2e3});try{let a=s.match(/\{[\s\S]*\}/);if(a)return JSON.parse(a[0])}catch{}return {code:s,language:e?.language||"unknown",explanation:"Generated code",dependencies:[]}}async explainCode(t,e){let r=`Explain this ${e||"code"} in detail:
\`\`\`${e||""}
${t}
\`\`\`
Explain:
1. What it does
2. How it works
3. Key concepts/patterns
4. Potential improvements`;return this.generateText(r,{temperature:.3,maxTokens:1e3})}};var g=class extends c{client;constructor(t){super(t),this.validateApiKey(),this.client=new GoogleGenerativeAI(this.config.apiKey);}getDefaultModel(){return "gemini-pro"}async generateText(t,e){let r=this.getModel(e),n=this.client.getGenerativeModel({model:r}),s={maxOutputTokens:e?.maxTokens||1e3,temperature:e?.temperature||.7,topP:e?.topP||.95,topK:e?.topK||40,stopSequences:e?.stopSequences},a=e?.systemPrompt?`${e.systemPrompt}
${t}`:t;return (await(await n.generateContent({contents:[{role:"user",parts:[{text:a}]}],generationConfig:s})).response).text()}async*generateStream(t,e){let r=this.getModel(e),n=this.client.getGenerativeModel({model:r}),s={maxOutputTokens:e?.maxTokens||1e3,temperature:e?.temperature||.7,topP:e?.topP||.95,topK:e?.topK||40,stopSequences:e?.stopSequences},a=e?.systemPrompt?`${e.systemPrompt}
${t}`:t,i=await n.generateContentStream({contents:[{role:"user",parts:[{text:a}]}],generationConfig:s});for await(let m of i.stream){let l=m.text();l&&(yield l);}}async generateEmbedding(t){return (await this.client.getGenerativeModel({model:"embedding-001"}).embedContent(t)).embedding.values}async classifyText(t,e){let r=`Classify the following text into exactly one of these categories: ${e.join(", ")}.
Text: "${t}"
Respond with only JSON in this format:
{
"label": "chosen category",
"confidence": 0.95,
"scores": {
"category1": 0.95,
"category2": 0.03,
"category3": 0.02
}
}`,n=await this.generateText(r,{temperature:0,maxTokens:200});try{let a=n.match(/\{[\s\S]*\}/);if(a)return JSON.parse(a[0])}catch{}let s=e[0]||"unknown";return {label:s,confidence:.5,scores:e.reduce((a,i)=>({...a,[i]:i===s?.5:.5/(e.length-1)}),{})}}async summarize(t,e){let n=`${{bullet:"Create a concise bullet-point summary",paragraph:"Write a well-structured paragraph summary",tldr:"Provide a single sentence TL;DR","key-points":"List only the most critical key points",executive:"Write a professional executive summary"}[e?.style||"paragraph"]} of this text:
"${t}"
${e?.maxLength?`Limit to ${e.maxLength} characters.`:""}`;return this.generateText(n,{maxTokens:e?.maxLength?Math.ceil(e.maxLength/4):200,temperature:.3})}async analyzeImage(t,e){let r=this.client.getGenerativeModel({model:"gemini-pro-vision"}),n;if(t instanceof Blob){let o=await t.arrayBuffer();n=btoa(String.fromCharCode(...new Uint8Array(o)));}else n=t.replace(/^data:image\/\w+;base64,/,"");let s=e?.features||["description","objects","text"],a=`Analyze this image and provide a detailed response in JSON format with these features: ${s.join(", ")}.
Expected format:
{
${s.includes("description")?'"description": "detailed description",':""}
${s.includes("objects")?'"objects": [{"label": "object", "confidence": 0.9}],':""}
${s.includes("text")?'"text": [{"text": "extracted text", "confidence": 0.9}],':""}
${s.includes("colors")?'"colors": [{"hex": "#000000", "name": "black", "percentage": 30}],':""}
${s.includes("tags")?'"tags": ["tag1", "tag2"]':""}
}`,l=(await(await r.generateContent({contents:[{role:"user",parts:[{text:a},{inlineData:{mimeType:"image/jpeg",data:n}}]}]})).response).text();try{let o=l.match(/\{[\s\S]*\}/);if(o)return JSON.parse(o[0])}catch{}return {description:l,objects:[],text:[],colors:[],tags:[]}}async generateCode(t,e){let n=`${`You are an expert programmer. Generate high-quality code.
${e?.includeComments?"Include clear comments.":""}
${e?.includeTests?"Include comprehensive tests.":""}
Style: ${e?.style||"clean and efficient"}`}
Language: ${e?.language||"auto-detect"}
Framework: ${e?.framework||"none"}
Task: ${t}
Provide response as JSON:
{
"code": "complete code",
"language": "programming language",
"explanation": "what the code does",
${e?.includeTests?'"tests": "test code",':""}
"dependencies": ["list", "of", "dependencies"]
}`,s=await this.generateText(n,{temperature:.2,maxTokens:2e3});try{let a=s.match(/\{[\s\S]*\}/);if(a)return JSON.parse(a[0])}catch{}return {code:s,language:e?.language||"unknown",explanation:"Generated code"}}async explainCode(t,e){let r=`Analyze and explain this ${e||"code"}:
\`\`\`${e||""}
${t}
\`\`\`
Provide a comprehensive explanation covering:
1. Purpose and functionality
2. How it works step by step
3. Key algorithms or patterns used
4. Complexity analysis
5. Potential optimizations or issues`;return this.generateText(r,{temperature:.3,maxTokens:1500})}};var h=class extends c{delay;shouldFail;failureRate;responses;requestCount=0;constructor(t){super(t),this.delay=t.delay||100,this.shouldFail=t.shouldFail||false,this.failureRate=t.failureRate||0,this.responses=t.responses||new Map;}getDefaultModel(){return "mock-model-v1"}async simulateDelay(t){let e=t||this.delay;e>0&&await new Promise(r=>setTimeout(r,e));}shouldFailRequest(){return this.requestCount++,this.shouldFail?true:this.failureRate>0?Math.random()<this.failureRate:false}async generateText(t,e){if(await this.simulateDelay(),this.shouldFailRequest())throw new Error("Mock provider error: Simulated failure");let r=this.responses.get(t);if(r)return r;let s=(e?.temperature||.7)>.5?" (creative mode)":" (precise mode)";return `Mock response to: "${t.substring(0,50)}..."${s}
Model: ${this.getModel(e)}
Max tokens: ${e?.maxTokens||"default"}
System: ${e?.systemPrompt||"none"}
Generated at: ${new Date().toISOString()}`}async*generateStream(t,e){let n=(await this.generateText(t,e)).split(" ");for(let s of n)await this.simulateDelay(20),yield s+" ";}async generateEmbedding(t){if(await this.simulateDelay(),this.shouldFailRequest())throw new Error("Mock provider error: Embedding generation failed");let e=t.split("").reduce((n,s)=>n+s.charCodeAt(0),0);return new Array(1536).fill(0).map((n,s)=>Math.sin(e+s)*.1+Math.cos(e-s)*.05)}async classifyText(t,e){if(await this.simulateDelay(),this.shouldFailRequest())throw new Error("Mock provider error: Classification failed");let r=t.length,n=/good|great|excellent|happy|love/i.test(t),s=/bad|terrible|hate|awful|poor/i.test(t),a=r%e.length;n&&e.includes("positive")?a=e.indexOf("positive"):s&&e.includes("negative")&&(a=e.indexOf("negative"));let i=e.reduce((o,u,y)=>(o[u]=y===a?.8+Math.random()*.15:Math.random()*.2,o),{}),m=Object.values(i).reduce((o,u)=>o+u,0);Object.keys(i).forEach(o=>{i[o]=(i[o]??0)/m;});let l=e[a]??"unknown";return {label:l,confidence:i[l]??0,scores:i}}async summarize(t,e){if(await this.simulateDelay(),this.shouldFailRequest())throw new Error("Mock provider error: Summarization failed");let r=t.split(" ");switch(e?.style||"paragraph"){case "bullet":return `\u2022 First point about "${r.slice(0,5).join(" ")}..."
\u2022 Key insight from the middle section
\u2022 Final conclusion regarding "${r.slice(-5).join(" ")}"`;case "tldr":return `TL;DR: ${r.slice(0,10).join(" ")}... (${r.length} words total)`;case "key-points":return `Key Points:
1. Main topic: ${r[0]}
2. Important detail: ${r[Math.floor(r.length/2)]}
3. Conclusion: ${r[r.length-1]}`;case "executive":return `Executive Summary: This document discusses ${r.slice(0,5).join(" ")}.
The analysis reveals important insights about the subject matter.
Strategic recommendations include further investigation of key areas.`;default:return `Summary: ${r.slice(0,20).join(" ")}...
The text contains ${r.length} words and covers various topics.`}}async analyzeSentiment(t){if(await this.simulateDelay(),this.shouldFailRequest())throw new Error("Mock provider error: Sentiment analysis failed");let e=(t.match(/good|great|excellent|happy|love|wonderful/gi)||[]).length,r=(t.match(/bad|terrible|hate|awful|poor|horrible/gi)||[]).length,n,s;return e>r*2?(n="positive",s=.7+Math.random()*.25):r>e*2?(n="negative",s=.2+Math.random()*.2):e>0&&r>0?(n="mixed",s=.4+Math.random()*.2):(n="neutral",s=.45+Math.random()*.1),{sentiment:n,score:s,aspects:[{aspect:"tone",sentiment:n,score:s}]}}async generateImage(t,e){if(await this.simulateDelay(500),this.shouldFailRequest())throw new Error("Mock provider error: Image generation failed");let r=e?.size||"1024x1024",n=e?.style||"realistic";return {url:`https://picsum.photos/${r.split("x")[0]}/${r.split("x")[1]}?random=${Date.now()}`,base64:void 0,revisedPrompt:`Enhanced prompt: ${t} in ${n} style`,metadata:{model:"mock-dalle",size:r,style:n,seed:e?.seed||Math.floor(Math.random()*1e6)}}}async generateCode(t,e){if(await this.simulateDelay(),this.shouldFailRequest())throw new Error("Mock provider error: Code generation failed");let r=e?.language||"javascript",n=e?.includeComments??true,s=`${n?`// Mock generated code
`:""}
function mockFunction() {
${n?"// Implementation for: "+t.substring(0,50)+`
`:""}
console.log("This is mock generated code");
return {
prompt: "${t.substring(0,30)}...",
language: "${r}",
timestamp: new Date().toISOString()
};
}`,a=e?.includeTests?`
describe('mockFunction', () => {
it('should return expected output', () => {
const result = mockFunction();
expect(result).toBeDefined();
expect(result.language).toBe('${r}');
});
});`:void 0;return {code:s,language:r,explanation:`This is a mock implementation for: ${t}`,tests:a,dependencies:r==="javascript"?[]:["mock-dependency"]}}async explainCode(t,e){if(await this.simulateDelay(),this.shouldFailRequest())throw new Error("Mock provider error: Code explanation failed");let r=t.split(`
`).length,n=/function|=>|def|fn/.test(t),s=/class|struct|interface/.test(t);return `Mock Code Explanation:
This ${e||"code"} snippet contains ${r} lines.
Key observations:
${n?`- Contains function definitions
`:""}${s?`- Defines class or structural types
`:""}- Uses ${e||"modern programming"} syntax
- Implements mock functionality for testing
The code structure suggests it's designed for demonstration purposes.
In a real implementation, this would ${n?"execute the defined functions":"define the specified behavior"}.
Mock analysis completed at: ${new Date().toISOString()}`}configure(t){t.delay!==void 0&&(this.delay=t.delay),t.shouldFail!==void 0&&(this.shouldFail=t.shouldFail),t.failureRate!==void 0&&(this.failureRate=t.failureRate),t.responses&&t.responses.forEach((e,r)=>{this.responses.set(r,e);});}getStats(){return {totalRequests:this.requestCount,failureRate:this.failureRate,shouldFail:this.shouldFail,averageDelay:this.delay,predefinedResponses:this.responses.size}}reset(){this.requestCount=0,this.responses.clear(),this.shouldFail=false,this.failureRate=0;}};var f=class extends c{client;constructor(t){super(t),this.validateApiKey(),this.client=new v({apiKey:this.config.apiKey,baseURL:this.config.baseUrl,timeout:this.config.timeout,maxRetries:this.config.maxRetries||2});}getDefaultModel(){return "gpt-3.5-turbo"}async generateText(t,e){let r=this.getModel(e);return (await this.client.chat.completions.create({model:r,messages:[{role:"system",content:e?.systemPrompt||"You are a helpful assistant."},{role:"user",content:t}],max_tokens:e?.maxTokens,temperature:e?.temperature,top_p:e?.topP,frequency_penalty:e?.frequencyPenalty,presence_penalty:e?.presencePenalty,stop:e?.stopSequences,seed:e?.seed,response_format:e?.responseFormat,functions:e?.functions,stream:false})).choices[0]?.message?.content||""}async*generateStream(t,e){let r=this.getModel(e),n=await this.client.chat.completions.create({model:r,messages:[{role:"system",content:e?.systemPrompt||"You are a helpful assistant."},{role:"user",content:t}],max_tokens:e?.maxTokens,temperature:e?.temperature,top_p:e?.topP,frequency_penalty:e?.frequencyPenalty,presence_penalty:e?.presencePenalty,stop:e?.stopSequences,seed:e?.seed,stream:true});for await(let s of n){let a=s.choices[0]?.delta?.content;a&&(yield a);}}async generateEmbedding(t){return (await this.client.embeddings.create({model:"text-embedding-ada-002",input:t})).data[0]?.embedding||[]}async classifyText(t,e){let r=`Classify the following text into one of these categories: ${e.join(", ")}.
Text: "${t}"
Respond with a JSON object containing:
- label: the chosen category
- confidence: a number between 0 and 1
- scores: an object with confidence scores for each category
Response:`,n=await this.generateText(r,{temperature:0,maxTokens:200,responseFormat:{type:"json_object"}});try{return JSON.parse(n)}catch{let s=e[0]||"unknown";return {label:s,confidence:.5,scores:e.reduce((a,i)=>({...a,[i]:i===s?.5:.5/(e.length-1)}),{})}}}async summarize(t,e){let n=`${{bullet:"Create a bullet-point summary with key points.",paragraph:"Write a concise paragraph summary.",tldr:"Write a one-sentence TL;DR summary.","key-points":"Extract and list the most important key points.",executive:"Write an executive summary suitable for business leaders."}[e?.style||"paragraph"]}
Text to summarize:
"${t}"
Summary:`;return this.generateText(n,{maxTokens:e?.maxLength||200,temperature:.3})}async generateImage(t,e){let r=await this.client.images.generate({model:"dall-e-3",prompt:t,n:e?.n||1,size:e?.size||"1024x1024",quality:e?.quality||"standard",style:e?.style==="realistic"?"natural":"vivid",response_format:"url"});if(!r.data)throw new Error("No image data returned.");let n=r.data[0];return {url:n?.url||"",revisedPrompt:n?.revised_prompt||"",metadata:{model:"dall-e-3",size:e?.size||"1024x1024",quality:e?.quality||"standard"}}}async transcribeAudio(t,e){let r=new File([t],"audio.webm",{type:t.type}),n=await this.client.audio.transcriptions.create({file:r,model:"whisper-1",language:e?.language,response_format:e?.format==="json"?"verbose_json":"text",timestamp_granularities:e?.timestamps?["word"]:void 0});return typeof n=="string"?{text:n,language:e?.language}:{text:n.text,language:n.language,duration:n.duration,words:n.words?.map(s=>({word:s.word,start:s.start,end:s.end}))}}async generateSpeech(t,e){let n=await(await this.client.audio.speech.create({model:"tts-1",input:t,voice:e?.voice||"alloy",speed:e?.speed||1,response_format:e?.format||"mp3"})).arrayBuffer();return new Blob([n],{type:`audio/${e?.format||"mp3"}`})}async generateCode(t,e){let r=`You are an expert programmer. Generate clean, efficient, and well-documented code.
${e?.includeComments?"Include helpful comments.":"Minimize comments."}
${e?.includeTests?"Include unit tests.":""}
Style: ${e?.style||"concise"}`,n=`Language: ${e?.language||"auto-detect"}
Framework: ${e?.framework||"none"}
Task: ${t}
Respond with a JSON object containing:
- code: the generated code
- language: the programming language used
- explanation: brief explanation of the code
${e?.includeTests?"- tests: unit test code":""}
- dependencies: array of required dependencies`,s=await this.generateText(n,{systemPrompt:r,temperature:.2,maxTokens:2e3,responseFormat:{type:"json_object"}});try{return JSON.parse(s)}catch{return {code:s,language:e?.language||"unknown",explanation:"Generated code"}}}async explainCode(t,e){let r=`Explain the following ${e||"code"} in detail:
\`\`\`${e||""}
${t}
\`\`\`
Provide a clear explanation of:
1. What the code does
2. How it works
3. Any important concepts or patterns used
4. Potential improvements or issues`;return this.generateText(r,{temperature:.3,maxTokens:1e3})}};export{c as a,p as b,g as c,h as d,f as e};//# sourceMappingURL=chunk-SDHVI673.js.map
//# sourceMappingURL=chunk-SDHVI673.js.map