UNPKG

@matthew.ngo/ai-toolkit

Version:

A comprehensive AI toolkit with multi-provider support

677 lines (669 loc) 22.4 kB
import { z } from 'zod'; type AIProviderType = 'openai' | 'anthropic' | 'google' | 'cohere' | 'huggingface' | 'replicate' | 'stability' | 'elevenlabs' | 'whisper' | 'custom' | 'local' | 'mock'; declare const RateLimitConfigSchema: z.ZodObject<{ requestsPerMinute: z.ZodOptional<z.ZodNumber>; tokensPerMinute: z.ZodOptional<z.ZodNumber>; requestsPerHour: z.ZodOptional<z.ZodNumber>; tokensPerHour: z.ZodOptional<z.ZodNumber>; concurrent: z.ZodDefault<z.ZodNumber>; strategy: z.ZodDefault<z.ZodEnum<["fixed-window", "sliding-window", "token-bucket"]>>; }, "strip", z.ZodTypeAny, { concurrent: number; strategy: "fixed-window" | "sliding-window" | "token-bucket"; requestsPerMinute?: number | undefined; tokensPerMinute?: number | undefined; requestsPerHour?: number | undefined; tokensPerHour?: number | undefined; }, { requestsPerMinute?: number | undefined; tokensPerMinute?: number | undefined; requestsPerHour?: number | undefined; tokensPerHour?: number | undefined; concurrent?: number | undefined; strategy?: "fixed-window" | "sliding-window" | "token-bucket" | undefined; }>; declare const CacheConfigSchema: z.ZodObject<{ enabled: z.ZodDefault<z.ZodBoolean>; ttl: z.ZodDefault<z.ZodNumber>; maxSize: z.ZodDefault<z.ZodNumber>; strategy: z.ZodDefault<z.ZodEnum<["lru", "fifo", "lfu"]>>; }, "strip", z.ZodTypeAny, { strategy: "lru" | "fifo" | "lfu"; enabled: boolean; ttl: number; maxSize: number; }, { strategy?: "lru" | "fifo" | "lfu" | undefined; enabled?: boolean | undefined; ttl?: number | undefined; maxSize?: number | undefined; }>; declare const RetryConfigSchema: z.ZodObject<{ maxAttempts: z.ZodDefault<z.ZodNumber>; baseDelay: z.ZodDefault<z.ZodNumber>; maxDelay: z.ZodDefault<z.ZodNumber>; backoff: z.ZodDefault<z.ZodEnum<["exponential", "linear", "fixed"]>>; }, "strip", z.ZodTypeAny, { maxAttempts: number; baseDelay: number; maxDelay: number; backoff: "exponential" | "linear" | "fixed"; }, { maxAttempts?: number | undefined; baseDelay?: number | undefined; maxDelay?: number | undefined; backoff?: "exponential" | "linear" | "fixed" | undefined; }>; declare const AIConfigSchema: z.ZodObject<{ provider: z.ZodType<AIProviderType, z.ZodTypeDef, AIProviderType>; apiKey: z.ZodOptional<z.ZodString>; apiKeys: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; model: z.ZodOptional<z.ZodString>; models: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; baseUrl: z.ZodOptional<z.ZodString>; headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; maxRetries: z.ZodOptional<z.ZodNumber>; timeout: z.ZodOptional<z.ZodNumber>; cache: z.ZodOptional<z.ZodObject<{ enabled: z.ZodDefault<z.ZodBoolean>; ttl: z.ZodDefault<z.ZodNumber>; maxSize: z.ZodDefault<z.ZodNumber>; strategy: z.ZodDefault<z.ZodEnum<["lru", "fifo", "lfu"]>>; }, "strip", z.ZodTypeAny, { strategy: "lru" | "fifo" | "lfu"; enabled: boolean; ttl: number; maxSize: number; }, { strategy?: "lru" | "fifo" | "lfu" | undefined; enabled?: boolean | undefined; ttl?: number | undefined; maxSize?: number | undefined; }>>; rateLimit: z.ZodOptional<z.ZodObject<{ requestsPerMinute: z.ZodOptional<z.ZodNumber>; tokensPerMinute: z.ZodOptional<z.ZodNumber>; requestsPerHour: z.ZodOptional<z.ZodNumber>; tokensPerHour: z.ZodOptional<z.ZodNumber>; concurrent: z.ZodDefault<z.ZodNumber>; strategy: z.ZodDefault<z.ZodEnum<["fixed-window", "sliding-window", "token-bucket"]>>; }, "strip", z.ZodTypeAny, { concurrent: number; strategy: "fixed-window" | "sliding-window" | "token-bucket"; requestsPerMinute?: number | undefined; tokensPerMinute?: number | undefined; requestsPerHour?: number | undefined; tokensPerHour?: number | undefined; }, { requestsPerMinute?: number | undefined; tokensPerMinute?: number | undefined; requestsPerHour?: number | undefined; tokensPerHour?: number | undefined; concurrent?: number | undefined; strategy?: "fixed-window" | "sliding-window" | "token-bucket" | undefined; }>>; retry: z.ZodOptional<z.ZodObject<{ maxAttempts: z.ZodDefault<z.ZodNumber>; baseDelay: z.ZodDefault<z.ZodNumber>; maxDelay: z.ZodDefault<z.ZodNumber>; backoff: z.ZodDefault<z.ZodEnum<["exponential", "linear", "fixed"]>>; }, "strip", z.ZodTypeAny, { maxAttempts: number; baseDelay: number; maxDelay: number; backoff: "exponential" | "linear" | "fixed"; }, { maxAttempts?: number | undefined; baseDelay?: number | undefined; maxDelay?: number | undefined; backoff?: "exponential" | "linear" | "fixed" | undefined; }>>; fallbackProviders: z.ZodOptional<z.ZodArray<z.ZodType<AIProviderType, z.ZodTypeDef, AIProviderType>, "many">>; }, "strip", z.ZodTypeAny, { provider: AIProviderType; apiKey?: string | undefined; apiKeys?: Record<string, string> | undefined; model?: string | undefined; models?: Record<string, string> | undefined; baseUrl?: string | undefined; headers?: Record<string, string> | undefined; maxRetries?: number | undefined; timeout?: number | undefined; cache?: { strategy: "lru" | "fifo" | "lfu"; enabled: boolean; ttl: number; maxSize: number; } | undefined; rateLimit?: { concurrent: number; strategy: "fixed-window" | "sliding-window" | "token-bucket"; requestsPerMinute?: number | undefined; tokensPerMinute?: number | undefined; requestsPerHour?: number | undefined; tokensPerHour?: number | undefined; } | undefined; retry?: { maxAttempts: number; baseDelay: number; maxDelay: number; backoff: "exponential" | "linear" | "fixed"; } | undefined; fallbackProviders?: AIProviderType[] | undefined; }, { provider: AIProviderType; apiKey?: string | undefined; apiKeys?: Record<string, string> | undefined; model?: string | undefined; models?: Record<string, string> | undefined; baseUrl?: string | undefined; headers?: Record<string, string> | undefined; maxRetries?: number | undefined; timeout?: number | undefined; cache?: { strategy?: "lru" | "fifo" | "lfu" | undefined; enabled?: boolean | undefined; ttl?: number | undefined; maxSize?: number | undefined; } | undefined; rateLimit?: { requestsPerMinute?: number | undefined; tokensPerMinute?: number | undefined; requestsPerHour?: number | undefined; tokensPerHour?: number | undefined; concurrent?: number | undefined; strategy?: "fixed-window" | "sliding-window" | "token-bucket" | undefined; } | undefined; retry?: { maxAttempts?: number | undefined; baseDelay?: number | undefined; maxDelay?: number | undefined; backoff?: "exponential" | "linear" | "fixed" | undefined; } | undefined; fallbackProviders?: AIProviderType[] | undefined; }>; type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>; type CacheConfig = z.infer<typeof CacheConfigSchema>; type RetryConfig = z.infer<typeof RetryConfigSchema>; type AIConfig = z.infer<typeof AIConfigSchema>; interface GenerateOptions { maxTokens?: number; temperature?: number; topP?: number; topK?: number; frequencyPenalty?: number; presencePenalty?: number; stopSequences?: string[]; systemPrompt?: string; stream?: boolean; format?: 'text' | 'json' | 'markdown'; seed?: number; logitBias?: Record<string, number>; functions?: FunctionDefinition[]; responseFormat?: ResponseFormat; } interface FunctionDefinition { name: string; description: string; parameters: Record<string, any>; } interface ResponseFormat { type: 'text' | 'json_object'; schema?: Record<string, any>; } interface TokenUsage { promptTokens: number; completionTokens: number; totalTokens: number; } interface AIResponse { content: string; usage: TokenUsage; model: string; provider: string; cached: boolean; latency: number; metadata?: Record<string, any>; } interface Classification { label: string; confidence: number; scores: Record<string, number>; } interface SentimentAnalysis { sentiment: 'positive' | 'negative' | 'neutral' | 'mixed'; score: number; aspects?: AspectSentiment[]; } interface AspectSentiment { aspect: string; sentiment: string; score: number; } interface SummarizeOptions { maxLength?: number; minLength?: number; style?: 'bullet' | 'paragraph' | 'tldr' | 'key-points' | 'executive'; language?: string; extractive?: boolean; } interface ImageGenerationOptions { size?: '256x256' | '512x512' | '1024x1024' | '1792x1024' | '1024x1792'; style?: 'realistic' | 'artistic' | 'cartoon' | 'photographic'; quality?: 'standard' | 'hd'; n?: number; negativePrompt?: string; seed?: number; steps?: number; guidanceScale?: number; } interface ImageResult { url?: string; base64?: string; revisedPrompt?: string; metadata?: Record<string, any>; } interface ImageAnalysisOptions { features?: ('objects' | 'faces' | 'text' | 'colors' | 'tags' | 'description')[]; language?: string; } interface ImageAnalysis { description?: string; objects?: DetectedObject[]; faces?: DetectedFace[]; text?: ExtractedText[]; colors?: ColorInfo[]; tags?: string[]; } interface DetectedObject { label: string; confidence: number; boundingBox?: BoundingBox; } interface DetectedFace { age?: number; gender?: string; emotion?: string; boundingBox?: BoundingBox; } interface ExtractedText { text: string; confidence: number; boundingBox?: BoundingBox; } interface ColorInfo { hex: string; name: string; percentage: number; } interface BoundingBox { x: number; y: number; width: number; height: number; } interface TranscriptionOptions { language?: string; translateTo?: string; format?: 'text' | 'srt' | 'vtt' | 'json'; timestamps?: boolean; speakerDiarization?: boolean; } interface TranscriptionResult { text: string; language?: string; duration?: number; words?: WordTimestamp[]; speakers?: SpeakerSegment[]; } interface WordTimestamp { word: string; start: number; end: number; confidence?: number; } interface SpeakerSegment { speaker: string; start: number; end: number; text: string; } interface SpeechOptions { voice?: string; speed?: number; pitch?: number; volume?: number; format?: 'mp3' | 'wav' | 'ogg'; language?: string; emotion?: string; } interface CodeGenerationOptions { language?: string; framework?: string; style?: 'concise' | 'verbose' | 'documented'; includeTests?: boolean; includeComments?: boolean; } interface CodeResult { code: string; language: string; explanation?: string; tests?: string; dependencies?: string[]; } interface ChatMessage { id: string; role: 'user' | 'assistant' | 'system' | 'function'; content: string; timestamp: Date; name?: string; functionCall?: FunctionCall; metadata?: Record<string, any>; } interface FunctionCall { name: string; arguments: string; } interface ChatOptions { systemPrompt?: string; model?: string; temperature?: number; maxTokens?: number; memorySize?: number; persistChat?: boolean; } interface AIUsageStats { tokensUsed: number; requestsCount: number; costEstimate: number; lastReset: Date; byProvider?: Record<string, ProviderStats>; byModel?: Record<string, ModelStats>; byCapability?: Record<string, number>; errors?: ErrorStats[]; } interface ProviderStats { requests: number; tokens: number; cost: number; averageLatency: number; errorRate: number; } interface ModelStats { requests: number; tokens: number; inputTokens: number; outputTokens: number; cost: number; } interface ErrorStats { timestamp: Date; provider: string; error: string; count: number; } interface AIProvider { name: string; generateText?(prompt: string, options?: GenerateOptions): Promise<string>; generateStream?(prompt: string, options?: GenerateOptions): AsyncGenerator<string>; generateEmbedding?(text: string): Promise<number[]>; classifyText?(text: string, labels: string[]): Promise<Classification>; summarize?(text: string, options?: SummarizeOptions): Promise<string>; analyzeSentiment?(text: string): Promise<SentimentAnalysis>; generateImage?(prompt: string, options?: ImageGenerationOptions): Promise<ImageResult>; analyzeImage?(image: string | Blob, options?: ImageAnalysisOptions): Promise<ImageAnalysis>; transcribeAudio?(audio: Blob, options?: TranscriptionOptions): Promise<TranscriptionResult>; generateSpeech?(text: string, options?: SpeechOptions): Promise<Blob>; generateCode?(prompt: string, options?: CodeGenerationOptions): Promise<CodeResult>; explainCode?(code: string, language?: string): Promise<string>; } interface ProviderConfig { name: string; apiKey?: string; baseUrl?: string; model?: string; headers?: Record<string, string>; maxRetries?: number; timeout?: number; } declare abstract class BaseProvider implements AIProvider { name: string; protected config: ProviderConfig; protected defaultModel: string; constructor(config: ProviderConfig); /** * Get default model for provider */ protected abstract getDefaultModel(): string; /** * Validate API key format */ protected validateApiKey(): void; /** * Get headers for API requests */ protected getHeaders(additionalHeaders?: Record<string, string>): Record<string, string>; /** * Make API request with error handling */ protected makeRequest<T>(url: string, options: RequestInit): Promise<T>; /** * Parse API error response */ protected parseError(response: Response): Promise<Error>; /** * Get model to use for request */ protected getModel(options?: { model?: string; }): string; generateText(_prompt: string, _options?: GenerateOptions): Promise<string>; generateStream(_prompt: string, _options?: GenerateOptions): AsyncGenerator<string>; generateEmbedding(_text: string): Promise<number[]>; classifyText(_text: string, _labels: string[]): Promise<Classification>; summarize(_text: string, _options?: SummarizeOptions): Promise<string>; analyzeSentiment(_text: string): Promise<SentimentAnalysis>; generateImage(_prompt: string, _options?: ImageGenerationOptions): Promise<ImageResult>; analyzeImage(_image: string | Blob, _options?: ImageAnalysisOptions): Promise<ImageAnalysis>; transcribeAudio(_audio: Blob, _options?: TranscriptionOptions): Promise<TranscriptionResult>; generateSpeech(_text: string, _options?: SpeechOptions): Promise<Blob>; generateCode(_prompt: string, _options?: CodeGenerationOptions): Promise<CodeResult>; explainCode(_code: string, _language?: string): Promise<string>; } declare class OpenAIProvider extends BaseProvider { private client; constructor(config: ProviderConfig); protected getDefaultModel(): string; /** * Generate text completion */ generateText(prompt: string, options?: GenerateOptions): Promise<string>; /** * Generate streaming text completion */ generateStream(prompt: string, options?: GenerateOptions): AsyncGenerator<string>; /** * Generate embeddings */ generateEmbedding(text: string): Promise<number[]>; /** * Classify text (using completion) */ classifyText(text: string, labels: string[]): Promise<Classification>; /** * Summarize text */ summarize(text: string, options?: SummarizeOptions): Promise<string>; /** * Generate images */ generateImage(prompt: string, options?: ImageGenerationOptions): Promise<ImageResult>; /** * Transcribe audio */ transcribeAudio(audio: Blob, options?: TranscriptionOptions): Promise<TranscriptionResult>; /** * Generate speech */ generateSpeech(text: string, options?: SpeechOptions): Promise<Blob>; /** * Generate code */ generateCode(prompt: string, options?: CodeGenerationOptions): Promise<CodeResult>; /** * Explain code */ explainCode(code: string, language?: string): Promise<string>; } declare class AnthropicProvider extends BaseProvider { private client; constructor(config: ProviderConfig); protected getDefaultModel(): string; /** * Generate text completion */ generateText(prompt: string, options?: GenerateOptions): Promise<string>; /** * Generate streaming text completion */ generateStream(prompt: string, options?: GenerateOptions): AsyncGenerator<string>; /** * Classify text */ classifyText(text: string, labels: string[]): Promise<Classification>; /** * Summarize text */ summarize(text: string, options?: SummarizeOptions): Promise<string>; /** * Analyze sentiment */ analyzeSentiment(text: string): Promise<any>; /** * Generate embeddings (not supported by Anthropic) */ generateEmbedding(_text: string): Promise<number[]>; /** * Generate code */ generateCode(prompt: string, options?: any): Promise<any>; /** * Explain code */ explainCode(code: string, language?: string): Promise<string>; } declare class GoogleProvider extends BaseProvider { private client; constructor(config: ProviderConfig); protected getDefaultModel(): string; /** * Generate text completion */ generateText(prompt: string, options?: GenerateOptions): Promise<string>; /** * Generate streaming text completion */ generateStream(prompt: string, options?: GenerateOptions): AsyncGenerator<string>; /** * Generate embeddings */ generateEmbedding(text: string): Promise<number[]>; /** * Classify text */ classifyText(text: string, labels: string[]): Promise<Classification>; /** * Summarize text */ summarize(text: string, options?: SummarizeOptions): Promise<string>; /** * Analyze image (Gemini Pro Vision) */ analyzeImage(image: string | Blob, options?: ImageAnalysisOptions): Promise<ImageAnalysis>; /** * Generate code */ generateCode(prompt: string, options?: any): Promise<any>; /** * Explain code */ explainCode(code: string, language?: string): Promise<string>; } interface MockProviderOptions extends ProviderConfig { delay?: number; shouldFail?: boolean; failureRate?: number; responses?: Map<string, string>; } declare class MockProvider extends BaseProvider { private delay; private shouldFail; private failureRate; private responses; private requestCount; constructor(config: MockProviderOptions); protected getDefaultModel(): string; /** * Simulate delay */ private simulateDelay; /** * Check if request should fail */ private shouldFailRequest; /** * Generate text completion */ generateText(prompt: string, options?: GenerateOptions): Promise<string>; /** * Generate streaming text completion */ generateStream(prompt: string, options?: GenerateOptions): AsyncGenerator<string>; /** * Generate embeddings */ generateEmbedding(text: string): Promise<number[]>; /** * Classify text */ classifyText(text: string, labels: string[]): Promise<Classification>; /** * Summarize text */ summarize(text: string, options?: SummarizeOptions): Promise<string>; /** * Analyze sentiment */ analyzeSentiment(text: string): Promise<SentimentAnalysis>; /** * Generate image */ generateImage(prompt: string, options?: ImageGenerationOptions): Promise<ImageResult>; /** * Generate code */ generateCode(prompt: string, options?: CodeGenerationOptions): Promise<CodeResult>; /** * Explain code */ explainCode(code: string, language?: string): Promise<string>; /** * Configure mock behavior */ configure(options: Partial<MockProviderOptions>): void; /** * Get request statistics */ getStats(): { totalRequests: number; failureRate: number; shouldFail: boolean; averageDelay: number; predefinedResponses: number; }; /** * Reset mock provider */ reset(): void; } export { type AIConfig as A, BaseProvider as B, type Classification as C, type DetectedObject as D, type ExtractedText as E, type FunctionDefinition as F, type GenerateOptions as G, type SpeakerSegment as H, type ImageGenerationOptions as I, type ChatMessage as J, type FunctionCall as K, type ChatOptions as L, MockProvider as M, type ModelStats as N, OpenAIProvider as O, type ProviderStats as P, type ErrorStats as Q, type RateLimitConfig as R, type SummarizeOptions as S, type TranscriptionOptions as T, type AIProvider as U, type WordTimestamp as W, type ImageResult as a, type TranscriptionResult as b, type SpeechOptions as c, type CodeGenerationOptions as d, type CodeResult as e, type AIProviderType as f, type CacheConfig as g, type RetryConfig as h, type AIUsageStats as i, type ProviderConfig as j, AnthropicProvider as k, GoogleProvider as l, RateLimitConfigSchema as m, CacheConfigSchema as n, RetryConfigSchema as o, AIConfigSchema as p, type ResponseFormat as q, type TokenUsage as r, type AIResponse as s, type SentimentAnalysis as t, type AspectSentiment as u, type ImageAnalysisOptions as v, type ImageAnalysis as w, type DetectedFace as x, type ColorInfo as y, type BoundingBox as z };