UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

288 lines 22.4 kB
"use strict"; /** * AI Transformer Interface * Streaming AI integration with confidence tracking and token management */ Object.defineProperty(exports, "__esModule", { value: true }); exports.createBatchAITransformer = exports.composeAITransformers = exports.createVisionModel = exports.createLLMTransformer = exports.MultiModalTransformer = exports.MockAITransformer = exports.OpenAITransformer = exports.BaseAITransformer = void 0; const signal_1 = require("../core/signal"); const coalgebra_1 = require("./coalgebra"); // Base AI transformer implementation class BaseAITransformer { constructor(config) { this.confidenceSignal = (0, signal_1.signal)(0); this.tokensSignal = (0, signal_1.signal)({ input: 0, output: 0, total: 0, }); this.processingSignal = (0, signal_1.signal)(false); this.config = { ...config }; this.rateLimitState = { requestCount: 0, windowStart: Date.now(), maxRequests: 60, // Default: 60 requests per minute windowSize: 60000, }; } transform(input) { const output = (0, coalgebra_1.createStreamingSignal)(null); input.subscribe(async (inputValue) => { if (inputValue === null || inputValue === undefined) return; try { this.processingSignal._set(true); // Check rate limiting await this.checkRateLimit(); // Process the request const response = await this.processRequest(inputValue); // Update signals this.confidenceSignal._set(response.confidence); this.tokensSignal._set(response.tokens); output._set(response.data); } catch (error) { console.error('AI transformer error:', error); this.confidenceSignal._set(0); } finally { this.processingSignal._set(false); } }); return output; } async checkRateLimit() { const now = Date.now(); // Reset window if needed if (now - this.rateLimitState.windowStart >= this.rateLimitState.windowSize) { this.rateLimitState.requestCount = 0; this.rateLimitState.windowStart = now; } // Check if we've exceeded the limit if (this.rateLimitState.requestCount >= this.rateLimitState.maxRequests) { const waitTime = this.rateLimitState.windowSize - (now - this.rateLimitState.windowStart); await new Promise((resolve) => setTimeout(resolve, waitTime)); return this.checkRateLimit(); } this.rateLimitState.requestCount++; } confidence() { return this.confidenceSignal; } tokens() { return this.tokensSignal; } isProcessing() { return this.processingSignal; } getModel() { return this.config.model; } setConfig(config) { this.config = { ...this.config, ...config }; } } exports.BaseAITransformer = BaseAITransformer; // OpenAI GPT transformer class OpenAITransformer extends BaseAITransformer { async processRequest(input) { const startTime = Date.now(); try { const response = await fetch(`${this.config.baseURL || 'https://api.openai.com/v1'}/chat/completions`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.config.apiKey}`, }, body: JSON.stringify({ model: this.config.model === 'gpt-4' ? 'gpt-4' : 'gpt-3.5-turbo', messages: [{ role: 'user', content: input }], max_tokens: this.config.maxTokens, temperature: this.config.temperature, stream: this.config.streaming, }), }); if (!response.ok) { throw new Error(`OpenAI API error: ${response.status}`); } const data = await response.json(); const choice = data.choices[0]; const usage = data.usage; return { data: choice.message.content, confidence: this.calculateConfidence(choice), tokens: { input: usage.prompt_tokens, output: usage.completion_tokens, total: usage.total_tokens, }, processingTime: Date.now() - startTime, model: data.model, timestamp: Date.now(), }; } catch (error) { throw new Error(`OpenAI processing failed: ${error}`); } } calculateConfidence(choice) { // Simple confidence calculation based on finish_reason and logprobs if (choice.finish_reason === 'stop') return 0.9; if (choice.finish_reason === 'length') return 0.7; return 0.5; } } exports.OpenAITransformer = OpenAITransformer; // Mock AI transformer for testing class MockAITransformer extends BaseAITransformer { async processRequest(input) { const startTime = Date.now(); // Simulate processing delay await new Promise((resolve) => setTimeout(resolve, 100 + Math.random() * 500)); const output = `AI response to: "${input}"`; const inputTokens = Math.ceil(input.length / 4); // Rough token estimation const outputTokens = Math.ceil(output.length / 4); return { data: output, confidence: 0.8 + Math.random() * 0.2, tokens: { input: inputTokens, output: outputTokens, total: inputTokens + outputTokens, }, processingTime: Date.now() - startTime, model: 'mock-ai', timestamp: Date.now(), }; } } exports.MockAITransformer = MockAITransformer; // Multi-modal AI transformer for vision + language class MultiModalTransformer extends BaseAITransformer { async processRequest(input) { const startTime = Date.now(); // Simulate multi-modal processing await new Promise((resolve) => setTimeout(resolve, 200 + Math.random() * 800)); let response = ''; if (input.text) response += `Text analysis: ${input.text}. `; if (input.image) response += `Image analysis: [Image content description]. `; const inputTokens = (input.text?.length || 0) / 4 + (input.image ? 100 : 0); // Images cost more tokens const outputTokens = response.length / 4; return { data: response.trim(), confidence: 0.75 + Math.random() * 0.25, tokens: { input: Math.ceil(inputTokens), output: Math.ceil(outputTokens), total: Math.ceil(inputTokens + outputTokens), }, processingTime: Date.now() - startTime, model: 'multimodal-ai', timestamp: Date.now(), }; } } exports.MultiModalTransformer = MultiModalTransformer; // Factory functions for creating AI transformers const createLLMTransformer = (model, config = {}) => { const fullConfig = { model, maxTokens: 4000, temperature: 0.7, streaming: false, timeout: 30000, retryAttempts: 3, rateLimitDelay: 1000, ...config, }; switch (model) { case 'gpt-4': return new OpenAITransformer(fullConfig); case 'custom': return new MockAITransformer(fullConfig); default: return new MockAITransformer(fullConfig); } }; exports.createLLMTransformer = createLLMTransformer; const createVisionModel = (_model, config = {}) => { const fullConfig = { model: 'custom', maxTokens: 2000, temperature: 0.5, streaming: false, timeout: 45000, retryAttempts: 2, rateLimitDelay: 2000, ...config, }; return new MultiModalTransformer(fullConfig); }; exports.createVisionModel = createVisionModel; // AI agent composition utilities const composeAITransformers = (first, second) => { return { transform: (input) => { const intermediate = first.transform(input); return second.transform(intermediate); }, confidence: () => { // Combined confidence is the minimum of both const conf1 = first.confidence().value(); const conf2 = second.confidence().value(); return (0, signal_1.signal)(Math.min(conf1, conf2)); }, tokens: () => { // Combined token usage const tokens1 = first.tokens().value(); const tokens2 = second.tokens().value(); return (0, signal_1.signal)({ input: tokens1.input, output: tokens2.output, total: tokens1.total + tokens2.total, }); }, isProcessing: () => { // Either transformer is processing const proc1 = first.isProcessing().value(); const proc2 = second.isProcessing().value(); return (0, signal_1.signal)(proc1 || proc2); }, getModel: () => 'composed', setConfig: (config) => { first.setConfig(config); second.setConfig(config); }, }; }; exports.composeAITransformers = composeAITransformers; // Batch processing for multiple inputs const createBatchAITransformer = (baseTransformer, batchSize = 10) => { return { transform: (input) => { const batched = input.buffer(batchSize); const batchOutput = baseTransformer.transform(batched); // Flatten batch output back to individual items const output = (0, coalgebra_1.createStreamingSignal)(null); batchOutput.subscribe((batch) => { if (batch && Array.isArray(batch)) { batch.forEach((item) => output._set(item)); } }); return output; }, confidence: baseTransformer.confidence, tokens: baseTransformer.tokens, isProcessing: baseTransformer.isProcessing, getModel: baseTransformer.getModel, setConfig: baseTransformer.setConfig, }; }; exports.createBatchAITransformer = createBatchAITransformer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktdHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RyZWFtaW5nL2FpLXRyYW5zZm9ybWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDJDQUFnRDtBQUVoRCwyQ0FBcUU7QUEyRHJFLHFDQUFxQztBQUNyQyxNQUFzQixpQkFBaUI7SUFXckMsWUFBWSxNQUFnQjtRQVRsQixxQkFBZ0IsR0FBRyxJQUFBLGVBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixpQkFBWSxHQUFHLElBQUEsZUFBTSxFQUFhO1lBQzFDLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsQ0FBQztTQUNULENBQUMsQ0FBQztRQUNPLHFCQUFnQixHQUFHLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBSXpDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEIsWUFBWSxFQUFFLENBQUM7WUFDZixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN2QixXQUFXLEVBQUUsRUFBRSxFQUFFLGtDQUFrQztZQUNuRCxVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDO0lBQ0osQ0FBQztJQUlELFNBQVMsQ0FBQyxLQUF5QjtRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFBLGlDQUFxQixFQUFJLElBQVcsQ0FBQyxDQUFDO1FBRXJELEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQ25DLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUztnQkFBRSxPQUFPO1lBRTVELElBQUksQ0FBQztnQkFDRixJQUFJLENBQUMsZ0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUxQyxzQkFBc0I7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