@matthew.ngo/ai-toolkit
Version:
A comprehensive AI toolkit with multi-provider support
283 lines (279 loc) • 9.65 kB
text/typescript
import { z } from 'zod';
type AIProviderType = 'openai' | 'anthropic' | 'google' | 'cohere' | 'huggingface' | 'replicate' | 'stability' | 'elevenlabs' | 'whisper' | 'custom' | 'local' | 'mock';
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 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 Classification {
label: string;
confidence: number;
scores: Record<string, 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 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 UseAIOptions {
config?: Partial<AIConfig>;
onError?: (error: Error) => void;
debug?: boolean;
}
interface UseAIReturn {
generateText: (prompt: string, options?: GenerateOptions) => Promise<string>;
generateStream: (prompt: string, options?: GenerateOptions) => AsyncGenerator<string>;
summarize: (text: string, options?: SummarizeOptions) => Promise<string>;
classifyText: (text: string, labels: string[]) => Promise<Classification>;
generateEmbedding: (text: string) => Promise<number[]>;
generateImage: (prompt: string, options?: ImageGenerationOptions) => Promise<ImageResult>;
transcribeAudio: (audio: Blob, options?: TranscriptionOptions) => Promise<TranscriptionResult>;
generateSpeech: (text: string, options?: SpeechOptions) => Promise<Blob>;
generateCode: (prompt: string, options?: CodeGenerationOptions) => Promise<CodeResult>;
loading: boolean;
error: Error | null;
stats: any;
updateConfig: (config: Partial<AIConfig>) => Promise<void>;
reset: () => Promise<void>;
}
declare function useAI(options?: UseAIOptions): UseAIReturn;
declare function useAIChat(systemPrompt?: string): {
messages: {
id: string;
role: "user" | "assistant" | "system";
content: string;
timestamp: Date;
}[];
sendMessage: (content: string) => Promise<string>;
clearMessages: () => void;
loading: boolean;
error: Error | null;
};
declare function useAIEmbeddings(): {
generateEmbedding: (text: string) => Promise<number[]>;
findSimilar: (query: string, items: Array<{
id: string;
text: string;
}>, topK?: number) => Promise<{
similarity: number;
id: string;
text: string;
}[]>;
};
export { useAI, useAIChat, useAIEmbeddings };