UNPKG

@tehreet/conduit

Version:

LLM API gateway with intelligent routing, robust process management, and health monitoring

224 lines 7.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ContextExtractor = void 0; class ContextExtractor { /** * Extract Synapse context from environment variables */ static extractSynapseContext(env) { return { projectId: env.SYNAPSE_PROJECT_ID, agentId: env.SYNAPSE_AGENT_ID, agentType: env.SYNAPSE_AGENT_TYPE, projectModelConfig: env.SYNAPSE_PROJECT_MODEL_CONFIG, agentModelConfig: env.SYNAPSE_AGENT_MODEL_CONFIG, workspaceId: env.SYNAPSE_WORKSPACE_ID, userId: env.SYNAPSE_USER_ID, sessionId: env.SYNAPSE_SESSION_ID, requestId: env.SYNAPSE_REQUEST_ID, orgId: env.SYNAPSE_ORG_ID, metadata: this.extractMetadata(env) }; } /** * Extract Synapse context from environment variables (non-static) */ extractSynapseContext(env) { return ContextExtractor.extractSynapseContext(env); } /** * Parse project model configuration */ static parseProjectConfig(configString) { if (!configString) { return null; } try { const config = JSON.parse(configString); return { enabled: config.enabled ?? true, defaultModel: config.defaultModel, fallbackModel: config.fallbackModel, maxTokens: config.maxTokens, costLimit: config.costLimit, rateLimits: config.rateLimits }; } catch (error) { console.warn('Failed to parse project config:', error); return null; } } /** * Parse agent model configuration */ static parseAgentConfig(configString) { if (!configString) { return null; } try { const config = JSON.parse(configString); return { useProjectDefaults: config.useProjectDefaults ?? true, overrideModel: config.overrideModel, maxTokens: config.maxTokens, systemPrompt: config.systemPrompt, temperature: config.temperature, topP: config.topP, reasoning: config.reasoning }; } catch (error) { console.warn('Failed to parse agent config:', error); return null; } } /** * Get effective model configuration */ static getEffectiveModelConfig(synapseContext) { // Try agent config first const agentConfig = this.parseAgentConfig(synapseContext.agentModelConfig); if (agentConfig && !agentConfig.useProjectDefaults && agentConfig.overrideModel) { return { model: agentConfig.overrideModel, source: 'agent', config: agentConfig }; } // Fall back to project config const projectConfig = this.parseProjectConfig(synapseContext.projectModelConfig); if (projectConfig && projectConfig.enabled && projectConfig.defaultModel) { return { model: projectConfig.defaultModel, source: 'project', config: projectConfig }; } return { model: undefined, source: 'none', config: null }; } /** * Validate Synapse context */ static validateSynapseContext(context) { const errors = []; const warnings = []; // Check required fields if (!context.projectId && !context.agentId) { errors.push('Either projectId or agentId must be provided'); } // Validate project config if present if (context.projectModelConfig) { const projectConfig = this.parseProjectConfig(context.projectModelConfig); if (!projectConfig) { errors.push('Invalid project model configuration JSON'); } else if (!projectConfig.enabled) { warnings.push('Project model configuration is disabled'); } } // Validate agent config if present if (context.agentModelConfig) { const agentConfig = this.parseAgentConfig(context.agentModelConfig); if (!agentConfig) { errors.push('Invalid agent model configuration JSON'); } } return { valid: errors.length === 0, errors, warnings }; } /** * Extract additional metadata from environment */ static extractMetadata(env) { const metadata = {}; // Extract any SYNAPSE_* environment variables for (const [key, value] of Object.entries(env)) { if (key.startsWith('SYNAPSE_') && value) { const metadataKey = key.substring('SYNAPSE_'.length).toLowerCase(); // Skip known context fields if (!['project_id', 'agent_id', 'agent_type', 'project_model_config', 'agent_model_config', 'workspace_id', 'user_id', 'session_id', 'request_id', 'org_id'].includes(metadataKey)) { metadata[metadataKey] = value; } } } return metadata; } /** * Create test context for development */ static createTestContext(overrides = {}) { return { projectId: 'test-project-123', agentId: 'test-agent-456', agentType: 'code-assistant', projectModelConfig: JSON.stringify({ enabled: true, defaultModel: 'anthropic/claude-3-5-sonnet-20241022', fallbackModel: 'anthropic/claude-3-5-haiku-20241022', maxTokens: 100000, costLimit: 1.0 }), agentModelConfig: JSON.stringify({ useProjectDefaults: false, overrideModel: 'anthropic/claude-3-5-haiku-20241022', maxTokens: 50000, temperature: 0.7, reasoning: true }), workspaceId: 'test-workspace-789', userId: 'test-user-abc', sessionId: 'test-session-def', requestId: 'test-request-ghi', orgId: 'test-org-jkl', metadata: { environment: 'test', version: '1.0.0' }, ...overrides }; } /** * Convert Synapse model format to Claude format */ static mapSynapseModelToClaude(synapseModel) { // Remove 'anthropic/' prefix if present if (synapseModel.startsWith('anthropic/')) { return synapseModel.substring('anthropic/'.length); } // Handle other provider prefixes if (synapseModel.startsWith('openai/')) { return synapseModel.substring('openai/'.length); } if (synapseModel.startsWith('google/')) { return synapseModel.substring('google/'.length); } return synapseModel; } /** * Convert Claude model format to Synapse format */ static mapClaudeModelToSynapse(claudeModel) { // Add 'anthropic/' prefix for Claude models if (claudeModel.startsWith('claude-')) { return `anthropic/${claudeModel}`; } // Add appropriate prefix for other models if (claudeModel.startsWith('gpt-')) { return `openai/${claudeModel}`; } if (claudeModel.startsWith('gemini-')) { return `google/${claudeModel}`; } return claudeModel; } } exports.ContextExtractor = ContextExtractor; //# sourceMappingURL=context-extractor.js.map