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
JavaScript
;
/**
* 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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