@framers/agentos 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +98 -0
- package/README.md +576 -0
- package/dist/api/AgentOS.d.ts +451 -0
- package/dist/api/AgentOS.d.ts.map +1 -0
- package/dist/api/AgentOS.js +1157 -0
- package/dist/api/AgentOS.js.map +1 -0
- package/dist/api/AgentOSOrchestrator.d.ts +157 -0
- package/dist/api/AgentOSOrchestrator.d.ts.map +1 -0
- package/dist/api/AgentOSOrchestrator.js +679 -0
- package/dist/api/AgentOSOrchestrator.js.map +1 -0
- package/dist/api/interfaces/IAgentOS.d.ts +138 -0
- package/dist/api/interfaces/IAgentOS.d.ts.map +1 -0
- package/dist/api/interfaces/IAgentOS.js +11 -0
- package/dist/api/interfaces/IAgentOS.js.map +1 -0
- package/dist/api/interfaces/IUnifiedAgent.d.ts +126 -0
- package/dist/api/interfaces/IUnifiedAgent.d.ts.map +1 -0
- package/dist/api/interfaces/IUnifiedAgent.js +3 -0
- package/dist/api/interfaces/IUnifiedAgent.js.map +1 -0
- package/dist/api/types/AgentOSInput.d.ts +114 -0
- package/dist/api/types/AgentOSInput.d.ts.map +1 -0
- package/dist/api/types/AgentOSInput.js +13 -0
- package/dist/api/types/AgentOSInput.js.map +1 -0
- package/dist/api/types/AgentOSResponse.d.ts +170 -0
- package/dist/api/types/AgentOSResponse.d.ts.map +1 -0
- package/dist/api/types/AgentOSResponse.js +25 -0
- package/dist/api/types/AgentOSResponse.js.map +1 -0
- package/dist/cognitive_substrate/GMI.d.ts +148 -0
- package/dist/cognitive_substrate/GMI.d.ts.map +1 -0
- package/dist/cognitive_substrate/GMI.js +1003 -0
- package/dist/cognitive_substrate/GMI.js.map +1 -0
- package/dist/cognitive_substrate/GMIManager.d.ts +98 -0
- package/dist/cognitive_substrate/GMIManager.d.ts.map +1 -0
- package/dist/cognitive_substrate/GMIManager.js +517 -0
- package/dist/cognitive_substrate/GMIManager.js.map +1 -0
- package/dist/cognitive_substrate/IGMI.d.ts +469 -0
- package/dist/cognitive_substrate/IGMI.d.ts.map +1 -0
- package/dist/cognitive_substrate/IGMI.js +111 -0
- package/dist/cognitive_substrate/IGMI.js.map +1 -0
- package/dist/cognitive_substrate/memory/IWorkingMemory.d.ts +139 -0
- package/dist/cognitive_substrate/memory/IWorkingMemory.d.ts.map +1 -0
- package/dist/cognitive_substrate/memory/IWorkingMemory.js +14 -0
- package/dist/cognitive_substrate/memory/IWorkingMemory.js.map +1 -0
- package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.d.ts +143 -0
- package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.d.ts.map +1 -0
- package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.js +186 -0
- package/dist/cognitive_substrate/memory/InMemoryWorkingMemory.js.map +1 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.d.ts +33 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.d.ts.map +1 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.js +138 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayManager.js.map +1 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.d.ts +32 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.d.ts.map +1 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.js +2 -0
- package/dist/cognitive_substrate/persona_overlays/PersonaOverlayTypes.js.map +1 -0
- package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts +336 -0
- package/dist/cognitive_substrate/personas/IPersonaDefinition.d.ts.map +1 -0
- package/dist/cognitive_substrate/personas/IPersonaDefinition.js +8 -0
- package/dist/cognitive_substrate/personas/IPersonaDefinition.js.map +1 -0
- package/dist/cognitive_substrate/personas/IPersonaLoader.d.ts +78 -0
- package/dist/cognitive_substrate/personas/IPersonaLoader.d.ts.map +1 -0
- package/dist/cognitive_substrate/personas/IPersonaLoader.js +9 -0
- package/dist/cognitive_substrate/personas/IPersonaLoader.js.map +1 -0
- package/dist/cognitive_substrate/personas/PersonaLoader.d.ts +60 -0
- package/dist/cognitive_substrate/personas/PersonaLoader.d.ts.map +1 -0
- package/dist/cognitive_substrate/personas/PersonaLoader.js +138 -0
- package/dist/cognitive_substrate/personas/PersonaLoader.js.map +1 -0
- package/dist/cognitive_substrate/personas/PersonaValidation.d.ts +139 -0
- package/dist/cognitive_substrate/personas/PersonaValidation.d.ts.map +1 -0
- package/dist/cognitive_substrate/personas/PersonaValidation.js +277 -0
- package/dist/cognitive_substrate/personas/PersonaValidation.js.map +1 -0
- package/dist/cognitive_substrate/personas/definitions/atlas_systems_architect.json +29 -0
- package/dist/cognitive_substrate/personas/definitions/default_assistant_persona.json +346 -0
- package/dist/cognitive_substrate/personas/definitions/default_free_assistant.json +13 -0
- package/dist/cognitive_substrate/personas/definitions/index.d.ts +14 -0
- package/dist/cognitive_substrate/personas/definitions/index.d.ts.map +1 -0
- package/dist/cognitive_substrate/personas/definitions/index.js +35 -0
- package/dist/cognitive_substrate/personas/definitions/index.js.map +1 -0
- package/dist/cognitive_substrate/personas/definitions/nerf_generalist.json +11 -0
- package/dist/cognitive_substrate/personas/definitions/v_researcher.json +11 -0
- package/dist/config/AgentOSConfig.d.ts +74 -0
- package/dist/config/AgentOSConfig.d.ts.map +1 -0
- package/dist/config/AgentOSConfig.js +399 -0
- package/dist/config/AgentOSConfig.js.map +1 -0
- package/dist/config/EmbeddingManagerConfiguration.d.ts +190 -0
- package/dist/config/EmbeddingManagerConfiguration.d.ts.map +1 -0
- package/dist/config/EmbeddingManagerConfiguration.js +16 -0
- package/dist/config/EmbeddingManagerConfiguration.js.map +1 -0
- package/dist/config/MemoryLifecycleManagerConfiguration.d.ts +165 -0
- package/dist/config/MemoryLifecycleManagerConfiguration.d.ts.map +1 -0
- package/dist/config/MemoryLifecycleManagerConfiguration.js +69 -0
- package/dist/config/MemoryLifecycleManagerConfiguration.js.map +1 -0
- package/dist/config/RetrievalAugmentorConfiguration.d.ts +98 -0
- package/dist/config/RetrievalAugmentorConfiguration.d.ts.map +1 -0
- package/dist/config/RetrievalAugmentorConfiguration.js +47 -0
- package/dist/config/RetrievalAugmentorConfiguration.js.map +1 -0
- package/dist/config/ToolOrchestratorConfig.d.ts +69 -0
- package/dist/config/ToolOrchestratorConfig.d.ts.map +1 -0
- package/dist/config/ToolOrchestratorConfig.js +11 -0
- package/dist/config/ToolOrchestratorConfig.js.map +1 -0
- package/dist/config/VectorStoreConfiguration.d.ts +223 -0
- package/dist/config/VectorStoreConfiguration.d.ts.map +1 -0
- package/dist/config/VectorStoreConfiguration.js +59 -0
- package/dist/config/VectorStoreConfiguration.js.map +1 -0
- package/dist/config/extension-secrets.json +38 -0
- package/dist/config/extensionSecrets.d.ts +13 -0
- package/dist/config/extensionSecrets.d.ts.map +1 -0
- package/dist/config/extensionSecrets.js +24 -0
- package/dist/config/extensionSecrets.js.map +1 -0
- package/dist/core/agency/AgencyMemoryManager.d.ts +300 -0
- package/dist/core/agency/AgencyMemoryManager.d.ts.map +1 -0
- package/dist/core/agency/AgencyMemoryManager.js +657 -0
- package/dist/core/agency/AgencyMemoryManager.js.map +1 -0
- package/dist/core/agency/AgencyRegistry.d.ts +100 -0
- package/dist/core/agency/AgencyRegistry.d.ts.map +1 -0
- package/dist/core/agency/AgencyRegistry.js +209 -0
- package/dist/core/agency/AgencyRegistry.js.map +1 -0
- package/dist/core/agency/AgencyTypes.d.ts +200 -0
- package/dist/core/agency/AgencyTypes.d.ts.map +1 -0
- package/dist/core/agency/AgencyTypes.js +7 -0
- package/dist/core/agency/AgencyTypes.js.map +1 -0
- package/dist/core/agency/AgentCommunicationBus.d.ts +150 -0
- package/dist/core/agency/AgentCommunicationBus.d.ts.map +1 -0
- package/dist/core/agency/AgentCommunicationBus.js +568 -0
- package/dist/core/agency/AgentCommunicationBus.js.map +1 -0
- package/dist/core/agency/IAgentCommunicationBus.d.ts +469 -0
- package/dist/core/agency/IAgentCommunicationBus.d.ts.map +1 -0
- package/dist/core/agency/IAgentCommunicationBus.js +40 -0
- package/dist/core/agency/IAgentCommunicationBus.js.map +1 -0
- package/dist/core/agency/index.d.ts +18 -0
- package/dist/core/agency/index.d.ts.map +1 -0
- package/dist/core/agency/index.js +18 -0
- package/dist/core/agency/index.js.map +1 -0
- package/dist/core/agents/AgentCore.d.ts +385 -0
- package/dist/core/agents/AgentCore.d.ts.map +1 -0
- package/dist/core/agents/AgentCore.js +527 -0
- package/dist/core/agents/AgentCore.js.map +1 -0
- package/dist/core/agents/AgentFactory.d.ts +123 -0
- package/dist/core/agents/AgentFactory.d.ts.map +1 -0
- package/dist/core/agents/AgentFactory.js +232 -0
- package/dist/core/agents/AgentFactory.js.map +1 -0
- package/dist/core/agents/AgentPoolAgent.d.ts +244 -0
- package/dist/core/agents/AgentPoolAgent.d.ts.map +1 -0
- package/dist/core/agents/AgentPoolAgent.js +697 -0
- package/dist/core/agents/AgentPoolAgent.js.map +1 -0
- package/dist/core/agents/AgentPoolConfig.d.ts +191 -0
- package/dist/core/agents/AgentPoolConfig.d.ts.map +1 -0
- package/dist/core/agents/AgentPoolConfig.js +58 -0
- package/dist/core/agents/AgentPoolConfig.js.map +1 -0
- package/dist/core/agents/IAgent.d.ts +226 -0
- package/dist/core/agents/IAgent.d.ts.map +1 -0
- package/dist/core/agents/IAgent.js +14 -0
- package/dist/core/agents/IAgent.js.map +1 -0
- package/dist/core/agents/IAgentFactory.d.ts +137 -0
- package/dist/core/agents/IAgentFactory.d.ts.map +1 -0
- package/dist/core/agents/IAgentFactory.js +13 -0
- package/dist/core/agents/IAgentFactory.js.map +1 -0
- package/dist/core/agents/tools/Tool.d.ts +17 -0
- package/dist/core/agents/tools/Tool.d.ts.map +1 -0
- package/dist/core/agents/tools/Tool.js +8 -0
- package/dist/core/agents/tools/Tool.js.map +1 -0
- package/dist/core/ai_utilities/HybridUtilityAI.d.ts +1 -0
- package/dist/core/ai_utilities/HybridUtilityAI.d.ts.map +1 -0
- package/dist/core/ai_utilities/HybridUtilityAI.js +2 -0
- package/dist/core/ai_utilities/HybridUtilityAI.js.map +1 -0
- package/dist/core/ai_utilities/IUtilityAI.d.ts +212 -0
- package/dist/core/ai_utilities/IUtilityAI.d.ts.map +1 -0
- package/dist/core/ai_utilities/IUtilityAI.js +11 -0
- package/dist/core/ai_utilities/IUtilityAI.js.map +1 -0
- package/dist/core/ai_utilities/LLMUtilityAI.d.ts +94 -0
- package/dist/core/ai_utilities/LLMUtilityAI.d.ts.map +1 -0
- package/dist/core/ai_utilities/LLMUtilityAI.js +434 -0
- package/dist/core/ai_utilities/LLMUtilityAI.js.map +1 -0
- package/dist/core/ai_utilities/StatisticalUtilityAI.d.ts +102 -0
- package/dist/core/ai_utilities/StatisticalUtilityAI.d.ts.map +1 -0
- package/dist/core/ai_utilities/StatisticalUtilityAI.js +617 -0
- package/dist/core/ai_utilities/StatisticalUtilityAI.js.map +1 -0
- package/dist/core/conversation/ConversationContext.d.ts +259 -0
- package/dist/core/conversation/ConversationContext.d.ts.map +1 -0
- package/dist/core/conversation/ConversationContext.js +450 -0
- package/dist/core/conversation/ConversationContext.js.map +1 -0
- package/dist/core/conversation/ConversationManager.d.ts +223 -0
- package/dist/core/conversation/ConversationManager.d.ts.map +1 -0
- package/dist/core/conversation/ConversationManager.js +558 -0
- package/dist/core/conversation/ConversationManager.js.map +1 -0
- package/dist/core/conversation/ConversationMessage.d.ts +184 -0
- package/dist/core/conversation/ConversationMessage.d.ts.map +1 -0
- package/dist/core/conversation/ConversationMessage.js +66 -0
- package/dist/core/conversation/ConversationMessage.js.map +1 -0
- package/dist/core/evaluation/Evaluator.d.ts +28 -0
- package/dist/core/evaluation/Evaluator.d.ts.map +1 -0
- package/dist/core/evaluation/Evaluator.js +490 -0
- package/dist/core/evaluation/Evaluator.js.map +1 -0
- package/dist/core/evaluation/IEvaluator.d.ts +309 -0
- package/dist/core/evaluation/IEvaluator.d.ts.map +1 -0
- package/dist/core/evaluation/IEvaluator.js +12 -0
- package/dist/core/evaluation/IEvaluator.js.map +1 -0
- package/dist/core/evaluation/LLMJudge.d.ts +105 -0
- package/dist/core/evaluation/LLMJudge.d.ts.map +1 -0
- package/dist/core/evaluation/LLMJudge.js +229 -0
- package/dist/core/evaluation/LLMJudge.js.map +1 -0
- package/dist/core/evaluation/index.d.ts +9 -0
- package/dist/core/evaluation/index.d.ts.map +1 -0
- package/dist/core/evaluation/index.js +9 -0
- package/dist/core/evaluation/index.js.map +1 -0
- package/dist/core/guardrails/IGuardrailService.d.ts +142 -0
- package/dist/core/guardrails/IGuardrailService.d.ts.map +1 -0
- package/dist/core/guardrails/IGuardrailService.js +24 -0
- package/dist/core/guardrails/IGuardrailService.js.map +1 -0
- package/dist/core/guardrails/guardrailDispatcher.d.ts +36 -0
- package/dist/core/guardrails/guardrailDispatcher.d.ts.map +1 -0
- package/dist/core/guardrails/guardrailDispatcher.js +240 -0
- package/dist/core/guardrails/guardrailDispatcher.js.map +1 -0
- package/dist/core/hitl/HumanInteractionManager.d.ts +146 -0
- package/dist/core/hitl/HumanInteractionManager.d.ts.map +1 -0
- package/dist/core/hitl/HumanInteractionManager.js +491 -0
- package/dist/core/hitl/HumanInteractionManager.js.map +1 -0
- package/dist/core/hitl/IHumanInteractionManager.d.ts +521 -0
- package/dist/core/hitl/IHumanInteractionManager.d.ts.map +1 -0
- package/dist/core/hitl/IHumanInteractionManager.js +33 -0
- package/dist/core/hitl/IHumanInteractionManager.js.map +1 -0
- package/dist/core/hitl/index.d.ts +17 -0
- package/dist/core/hitl/index.d.ts.map +1 -0
- package/dist/core/hitl/index.js +17 -0
- package/dist/core/hitl/index.js.map +1 -0
- package/dist/core/knowledge/IKnowledgeGraph.d.ts +351 -0
- package/dist/core/knowledge/IKnowledgeGraph.d.ts.map +1 -0
- package/dist/core/knowledge/IKnowledgeGraph.js +10 -0
- package/dist/core/knowledge/IKnowledgeGraph.js.map +1 -0
- package/dist/core/knowledge/KnowledgeGraph.d.ts +93 -0
- package/dist/core/knowledge/KnowledgeGraph.d.ts.map +1 -0
- package/dist/core/knowledge/KnowledgeGraph.js +601 -0
- package/dist/core/knowledge/KnowledgeGraph.js.map +1 -0
- package/dist/core/knowledge/index.d.ts +8 -0
- package/dist/core/knowledge/index.d.ts.map +1 -0
- package/dist/core/knowledge/index.js +8 -0
- package/dist/core/knowledge/index.js.map +1 -0
- package/dist/core/language/LanguageService.d.ts +77 -0
- package/dist/core/language/LanguageService.d.ts.map +1 -0
- package/dist/core/language/LanguageService.js +305 -0
- package/dist/core/language/LanguageService.js.map +1 -0
- package/dist/core/language/index.d.ts +6 -0
- package/dist/core/language/index.d.ts.map +1 -0
- package/dist/core/language/index.js +6 -0
- package/dist/core/language/index.js.map +1 -0
- package/dist/core/language/interfaces.d.ts +168 -0
- package/dist/core/language/interfaces.d.ts.map +1 -0
- package/dist/core/language/interfaces.js +37 -0
- package/dist/core/language/interfaces.js.map +1 -0
- package/dist/core/language/providers/DeepLTranslationProvider.d.ts +16 -0
- package/dist/core/language/providers/DeepLTranslationProvider.d.ts.map +1 -0
- package/dist/core/language/providers/DeepLTranslationProvider.js +28 -0
- package/dist/core/language/providers/DeepLTranslationProvider.js.map +1 -0
- package/dist/core/language/providers/OpenAITranslationProvider.d.ts +17 -0
- package/dist/core/language/providers/OpenAITranslationProvider.d.ts.map +1 -0
- package/dist/core/language/providers/OpenAITranslationProvider.js +34 -0
- package/dist/core/language/providers/OpenAITranslationProvider.js.map +1 -0
- package/dist/core/language/providers/WhisperDetectionProvider.d.ts +16 -0
- package/dist/core/language/providers/WhisperDetectionProvider.d.ts.map +1 -0
- package/dist/core/language/providers/WhisperDetectionProvider.js +15 -0
- package/dist/core/language/providers/WhisperDetectionProvider.js.map +1 -0
- package/dist/core/llm/IPromptEngine.d.ts +627 -0
- package/dist/core/llm/IPromptEngine.d.ts.map +1 -0
- package/dist/core/llm/IPromptEngine.js +81 -0
- package/dist/core/llm/IPromptEngine.js.map +1 -0
- package/dist/core/llm/PromptEngine.d.ts +108 -0
- package/dist/core/llm/PromptEngine.d.ts.map +1 -0
- package/dist/core/llm/PromptEngine.js +872 -0
- package/dist/core/llm/PromptEngine.js.map +1 -0
- package/dist/core/llm/providers/AIModelProviderManager.d.ts +74 -0
- package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -0
- package/dist/core/llm/providers/AIModelProviderManager.js +263 -0
- package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -0
- package/dist/core/llm/providers/IProvider.d.ts +327 -0
- package/dist/core/llm/providers/IProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/IProvider.js +39 -0
- package/dist/core/llm/providers/IProvider.js.map +1 -0
- package/dist/core/llm/providers/errors/OllamaProviderError.d.ts +36 -0
- package/dist/core/llm/providers/errors/OllamaProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/OllamaProviderError.js +40 -0
- package/dist/core/llm/providers/errors/OllamaProviderError.js.map +1 -0
- package/dist/core/llm/providers/errors/OpenAIProviderError.d.ts +42 -0
- package/dist/core/llm/providers/errors/OpenAIProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/OpenAIProviderError.js +44 -0
- package/dist/core/llm/providers/errors/OpenAIProviderError.js.map +1 -0
- package/dist/core/llm/providers/errors/OpenRouterProviderError.d.ts +39 -0
- package/dist/core/llm/providers/errors/OpenRouterProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/OpenRouterProviderError.js +42 -0
- package/dist/core/llm/providers/errors/OpenRouterProviderError.js.map +1 -0
- package/dist/core/llm/providers/errors/ProviderError.d.ts +37 -0
- package/dist/core/llm/providers/errors/ProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/ProviderError.js +36 -0
- package/dist/core/llm/providers/errors/ProviderError.js.map +1 -0
- package/dist/core/llm/providers/implementations/OllamaProvider.d.ts +80 -0
- package/dist/core/llm/providers/implementations/OllamaProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/OllamaProvider.js +473 -0
- package/dist/core/llm/providers/implementations/OllamaProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts +160 -0
- package/dist/core/llm/providers/implementations/OpenAIProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/OpenAIProvider.js +672 -0
- package/dist/core/llm/providers/implementations/OpenAIProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/OpenRouterProvider.d.ts +51 -0
- package/dist/core/llm/providers/implementations/OpenRouterProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/OpenRouterProvider.js +499 -0
- package/dist/core/llm/providers/implementations/OpenRouterProvider.js.map +1 -0
- package/dist/core/llm/routing/IModelRouter.d.ts +129 -0
- package/dist/core/llm/routing/IModelRouter.d.ts.map +1 -0
- package/dist/core/llm/routing/IModelRouter.js +14 -0
- package/dist/core/llm/routing/IModelRouter.js.map +1 -0
- package/dist/core/llm/routing/ModelRouter.d.ts +157 -0
- package/dist/core/llm/routing/ModelRouter.d.ts.map +1 -0
- package/dist/core/llm/routing/ModelRouter.js +190 -0
- package/dist/core/llm/routing/ModelRouter.js.map +1 -0
- package/dist/core/llm/streaming/StreamingBatcher.d.ts +54 -0
- package/dist/core/llm/streaming/StreamingBatcher.d.ts.map +1 -0
- package/dist/core/llm/streaming/StreamingBatcher.js +173 -0
- package/dist/core/llm/streaming/StreamingBatcher.js.map +1 -0
- package/dist/core/llm/streaming/StreamingReconstructor.d.ts +69 -0
- package/dist/core/llm/streaming/StreamingReconstructor.d.ts.map +1 -0
- package/dist/core/llm/streaming/StreamingReconstructor.js +102 -0
- package/dist/core/llm/streaming/StreamingReconstructor.js.map +1 -0
- package/dist/core/marketplace/IMarketplace.d.ts +500 -0
- package/dist/core/marketplace/IMarketplace.d.ts.map +1 -0
- package/dist/core/marketplace/IMarketplace.js +10 -0
- package/dist/core/marketplace/IMarketplace.js.map +1 -0
- package/dist/core/marketplace/Marketplace.d.ts +122 -0
- package/dist/core/marketplace/Marketplace.d.ts.map +1 -0
- package/dist/core/marketplace/Marketplace.js +591 -0
- package/dist/core/marketplace/Marketplace.js.map +1 -0
- package/dist/core/marketplace/index.d.ts +8 -0
- package/dist/core/marketplace/index.d.ts.map +1 -0
- package/dist/core/marketplace/index.js +8 -0
- package/dist/core/marketplace/index.js.map +1 -0
- package/dist/core/observability/ITracer.d.ts +317 -0
- package/dist/core/observability/ITracer.d.ts.map +1 -0
- package/dist/core/observability/ITracer.js +55 -0
- package/dist/core/observability/ITracer.js.map +1 -0
- package/dist/core/observability/Tracer.d.ts +76 -0
- package/dist/core/observability/Tracer.d.ts.map +1 -0
- package/dist/core/observability/Tracer.js +360 -0
- package/dist/core/observability/Tracer.js.map +1 -0
- package/dist/core/observability/index.d.ts +9 -0
- package/dist/core/observability/index.d.ts.map +1 -0
- package/dist/core/observability/index.js +8 -0
- package/dist/core/observability/index.js.map +1 -0
- package/dist/core/orchestration/AgentOrchestrator.d.ts +243 -0
- package/dist/core/orchestration/AgentOrchestrator.d.ts.map +1 -0
- package/dist/core/orchestration/AgentOrchestrator.js +648 -0
- package/dist/core/orchestration/AgentOrchestrator.js.map +1 -0
- package/dist/core/orchestration/IAgentOrchestrator.d.ts +44 -0
- package/dist/core/orchestration/IAgentOrchestrator.d.ts.map +1 -0
- package/dist/core/orchestration/IAgentOrchestrator.js +4 -0
- package/dist/core/orchestration/IAgentOrchestrator.js.map +1 -0
- package/dist/core/orchestration/helpers.d.ts +12 -0
- package/dist/core/orchestration/helpers.d.ts.map +1 -0
- package/dist/core/orchestration/helpers.js +36 -0
- package/dist/core/orchestration/helpers.js.map +1 -0
- package/dist/core/planning/IPlanningEngine.d.ts +524 -0
- package/dist/core/planning/IPlanningEngine.d.ts.map +1 -0
- package/dist/core/planning/IPlanningEngine.js +32 -0
- package/dist/core/planning/IPlanningEngine.js.map +1 -0
- package/dist/core/planning/PlanningEngine.d.ts +161 -0
- package/dist/core/planning/PlanningEngine.d.ts.map +1 -0
- package/dist/core/planning/PlanningEngine.js +783 -0
- package/dist/core/planning/PlanningEngine.js.map +1 -0
- package/dist/core/planning/index.d.ts +25 -0
- package/dist/core/planning/index.d.ts.map +1 -0
- package/dist/core/planning/index.js +25 -0
- package/dist/core/planning/index.js.map +1 -0
- package/dist/core/sandbox/CodeSandbox.d.ts +86 -0
- package/dist/core/sandbox/CodeSandbox.d.ts.map +1 -0
- package/dist/core/sandbox/CodeSandbox.js +475 -0
- package/dist/core/sandbox/CodeSandbox.js.map +1 -0
- package/dist/core/sandbox/ICodeSandbox.d.ts +249 -0
- package/dist/core/sandbox/ICodeSandbox.d.ts.map +1 -0
- package/dist/core/sandbox/ICodeSandbox.js +24 -0
- package/dist/core/sandbox/ICodeSandbox.js.map +1 -0
- package/dist/core/sandbox/index.d.ts +9 -0
- package/dist/core/sandbox/index.d.ts.map +1 -0
- package/dist/core/sandbox/index.js +8 -0
- package/dist/core/sandbox/index.js.map +1 -0
- package/dist/core/storage/IStorageAdapter.d.ts +483 -0
- package/dist/core/storage/IStorageAdapter.d.ts.map +1 -0
- package/dist/core/storage/IStorageAdapter.js +19 -0
- package/dist/core/storage/IStorageAdapter.js.map +1 -0
- package/dist/core/storage/InMemoryStorageAdapter.d.ts +192 -0
- package/dist/core/storage/InMemoryStorageAdapter.d.ts.map +1 -0
- package/dist/core/storage/InMemoryStorageAdapter.js +343 -0
- package/dist/core/storage/InMemoryStorageAdapter.js.map +1 -0
- package/dist/core/storage/SqlStorageAdapter.d.ts +262 -0
- package/dist/core/storage/SqlStorageAdapter.d.ts.map +1 -0
- package/dist/core/storage/SqlStorageAdapter.js +485 -0
- package/dist/core/storage/SqlStorageAdapter.js.map +1 -0
- package/dist/core/storage/index.d.ts +14 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +14 -0
- package/dist/core/storage/index.js.map +1 -0
- package/dist/core/streaming/IStreamClient.d.ts +72 -0
- package/dist/core/streaming/IStreamClient.d.ts.map +1 -0
- package/dist/core/streaming/IStreamClient.js +12 -0
- package/dist/core/streaming/IStreamClient.js.map +1 -0
- package/dist/core/streaming/StreamingManager.d.ts +242 -0
- package/dist/core/streaming/StreamingManager.d.ts.map +1 -0
- package/dist/core/streaming/StreamingManager.js +282 -0
- package/dist/core/streaming/StreamingManager.js.map +1 -0
- package/dist/core/structured/IStructuredOutputManager.d.ts +701 -0
- package/dist/core/structured/IStructuredOutputManager.d.ts.map +1 -0
- package/dist/core/structured/IStructuredOutputManager.js +74 -0
- package/dist/core/structured/IStructuredOutputManager.js.map +1 -0
- package/dist/core/structured/StructuredOutputManager.d.ts +140 -0
- package/dist/core/structured/StructuredOutputManager.d.ts.map +1 -0
- package/dist/core/structured/StructuredOutputManager.js +1015 -0
- package/dist/core/structured/StructuredOutputManager.js.map +1 -0
- package/dist/core/structured/index.d.ts +34 -0
- package/dist/core/structured/index.d.ts.map +1 -0
- package/dist/core/structured/index.js +34 -0
- package/dist/core/structured/index.js.map +1 -0
- package/dist/core/tools/ITool.d.ts +228 -0
- package/dist/core/tools/ITool.d.ts.map +1 -0
- package/dist/core/tools/ITool.js +11 -0
- package/dist/core/tools/ITool.js.map +1 -0
- package/dist/core/tools/IToolOrchestrator.d.ts +131 -0
- package/dist/core/tools/IToolOrchestrator.d.ts.map +1 -0
- package/dist/core/tools/IToolOrchestrator.js +14 -0
- package/dist/core/tools/IToolOrchestrator.js.map +1 -0
- package/dist/core/tools/ToolExecutor.d.ts +143 -0
- package/dist/core/tools/ToolExecutor.d.ts.map +1 -0
- package/dist/core/tools/ToolExecutor.js +364 -0
- package/dist/core/tools/ToolExecutor.js.map +1 -0
- package/dist/core/tools/ToolOrchestrator.d.ts +142 -0
- package/dist/core/tools/ToolOrchestrator.d.ts.map +1 -0
- package/dist/core/tools/ToolOrchestrator.js +373 -0
- package/dist/core/tools/ToolOrchestrator.js.map +1 -0
- package/dist/core/tools/permissions/IToolPermissionManager.d.ts +195 -0
- package/dist/core/tools/permissions/IToolPermissionManager.d.ts.map +1 -0
- package/dist/core/tools/permissions/IToolPermissionManager.js +14 -0
- package/dist/core/tools/permissions/IToolPermissionManager.js.map +1 -0
- package/dist/core/tools/permissions/ToolPermissionManager.d.ts +203 -0
- package/dist/core/tools/permissions/ToolPermissionManager.d.ts.map +1 -0
- package/dist/core/tools/permissions/ToolPermissionManager.js +298 -0
- package/dist/core/tools/permissions/ToolPermissionManager.js.map +1 -0
- package/dist/core/ui/IUIComponent.d.ts +11 -0
- package/dist/core/ui/IUIComponent.d.ts.map +1 -0
- package/dist/core/ui/IUIComponent.js +2 -0
- package/dist/core/ui/IUIComponent.js.map +1 -0
- package/dist/core/usage/UsageLedger.d.ts +81 -0
- package/dist/core/usage/UsageLedger.d.ts.map +1 -0
- package/dist/core/usage/UsageLedger.js +135 -0
- package/dist/core/usage/UsageLedger.js.map +1 -0
- package/dist/core/workflows/IWorkflowEngine.d.ts +42 -0
- package/dist/core/workflows/IWorkflowEngine.d.ts.map +1 -0
- package/dist/core/workflows/IWorkflowEngine.js +2 -0
- package/dist/core/workflows/IWorkflowEngine.js.map +1 -0
- package/dist/core/workflows/WorkflowEngine.d.ts +28 -0
- package/dist/core/workflows/WorkflowEngine.d.ts.map +1 -0
- package/dist/core/workflows/WorkflowEngine.js +309 -0
- package/dist/core/workflows/WorkflowEngine.js.map +1 -0
- package/dist/core/workflows/WorkflowTypes.d.ts +180 -0
- package/dist/core/workflows/WorkflowTypes.d.ts.map +1 -0
- package/dist/core/workflows/WorkflowTypes.js +26 -0
- package/dist/core/workflows/WorkflowTypes.js.map +1 -0
- package/dist/core/workflows/runtime/WorkflowRuntime.d.ts +70 -0
- package/dist/core/workflows/runtime/WorkflowRuntime.d.ts.map +1 -0
- package/dist/core/workflows/runtime/WorkflowRuntime.js +566 -0
- package/dist/core/workflows/runtime/WorkflowRuntime.js.map +1 -0
- package/dist/core/workflows/storage/IWorkflowStore.d.ts +75 -0
- package/dist/core/workflows/storage/IWorkflowStore.d.ts.map +1 -0
- package/dist/core/workflows/storage/IWorkflowStore.js +2 -0
- package/dist/core/workflows/storage/IWorkflowStore.js.map +1 -0
- package/dist/core/workflows/storage/InMemoryWorkflowStore.d.ts +14 -0
- package/dist/core/workflows/storage/InMemoryWorkflowStore.d.ts.map +1 -0
- package/dist/core/workflows/storage/InMemoryWorkflowStore.js +130 -0
- package/dist/core/workflows/storage/InMemoryWorkflowStore.js.map +1 -0
- package/dist/extensions/ExtensionLoader.d.ts +119 -0
- package/dist/extensions/ExtensionLoader.d.ts.map +1 -0
- package/dist/extensions/ExtensionLoader.js +297 -0
- package/dist/extensions/ExtensionLoader.js.map +1 -0
- package/dist/extensions/ExtensionManager.d.ts +49 -0
- package/dist/extensions/ExtensionManager.d.ts.map +1 -0
- package/dist/extensions/ExtensionManager.js +197 -0
- package/dist/extensions/ExtensionManager.js.map +1 -0
- package/dist/extensions/ExtensionRegistry.d.ts +39 -0
- package/dist/extensions/ExtensionRegistry.d.ts.map +1 -0
- package/dist/extensions/ExtensionRegistry.js +103 -0
- package/dist/extensions/ExtensionRegistry.js.map +1 -0
- package/dist/extensions/MultiRegistryLoader.d.ts +61 -0
- package/dist/extensions/MultiRegistryLoader.d.ts.map +1 -0
- package/dist/extensions/MultiRegistryLoader.js +169 -0
- package/dist/extensions/MultiRegistryLoader.js.map +1 -0
- package/dist/extensions/RegistryConfig.d.ts +86 -0
- package/dist/extensions/RegistryConfig.d.ts.map +1 -0
- package/dist/extensions/RegistryConfig.js +99 -0
- package/dist/extensions/RegistryConfig.js.map +1 -0
- package/dist/extensions/events.d.ts +19 -0
- package/dist/extensions/events.d.ts.map +1 -0
- package/dist/extensions/events.js +2 -0
- package/dist/extensions/events.js.map +1 -0
- package/dist/extensions/index.d.ts +9 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +9 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/manifest.d.ts +52 -0
- package/dist/extensions/manifest.d.ts.map +1 -0
- package/dist/extensions/manifest.js +2 -0
- package/dist/extensions/manifest.js.map +1 -0
- package/dist/extensions/types.d.ts +294 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +12 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/ILogger.d.ts +8 -0
- package/dist/logging/ILogger.d.ts.map +1 -0
- package/dist/logging/ILogger.js +2 -0
- package/dist/logging/ILogger.js.map +1 -0
- package/dist/logging/PinoLogger.d.ts +12 -0
- package/dist/logging/PinoLogger.d.ts.map +1 -0
- package/dist/logging/PinoLogger.js +22 -0
- package/dist/logging/PinoLogger.js.map +1 -0
- package/dist/logging/loggerFactory.d.ts +6 -0
- package/dist/logging/loggerFactory.d.ts.map +1 -0
- package/dist/logging/loggerFactory.js +14 -0
- package/dist/logging/loggerFactory.js.map +1 -0
- package/dist/rag/EmbeddingManager.d.ts +81 -0
- package/dist/rag/EmbeddingManager.d.ts.map +1 -0
- package/dist/rag/EmbeddingManager.js +412 -0
- package/dist/rag/EmbeddingManager.js.map +1 -0
- package/dist/rag/IEmbeddingManager.d.ts +277 -0
- package/dist/rag/IEmbeddingManager.d.ts.map +1 -0
- package/dist/rag/IEmbeddingManager.js +19 -0
- package/dist/rag/IEmbeddingManager.js.map +1 -0
- package/dist/rag/IRetrievalAugmentor.d.ts +208 -0
- package/dist/rag/IRetrievalAugmentor.d.ts.map +1 -0
- package/dist/rag/IRetrievalAugmentor.js +21 -0
- package/dist/rag/IRetrievalAugmentor.js.map +1 -0
- package/dist/rag/IVectorStore.d.ts +351 -0
- package/dist/rag/IVectorStore.d.ts.map +1 -0
- package/dist/rag/IVectorStore.js +15 -0
- package/dist/rag/IVectorStore.js.map +1 -0
- package/dist/rag/IVectorStoreManager.d.ts +121 -0
- package/dist/rag/IVectorStoreManager.d.ts.map +1 -0
- package/dist/rag/IVectorStoreManager.js +13 -0
- package/dist/rag/IVectorStoreManager.js.map +1 -0
- package/dist/rag/RetrievalAugmentor.d.ts +99 -0
- package/dist/rag/RetrievalAugmentor.d.ts.map +1 -0
- package/dist/rag/RetrievalAugmentor.js +674 -0
- package/dist/rag/RetrievalAugmentor.js.map +1 -0
- package/dist/rag/VectorStoreManager.d.ts +90 -0
- package/dist/rag/VectorStoreManager.d.ts.map +1 -0
- package/dist/rag/VectorStoreManager.js +283 -0
- package/dist/rag/VectorStoreManager.js.map +1 -0
- package/dist/rag/implementations/index.d.ts +9 -0
- package/dist/rag/implementations/index.d.ts.map +1 -0
- package/dist/rag/implementations/index.js +9 -0
- package/dist/rag/implementations/index.js.map +1 -0
- package/dist/rag/implementations/vector_stores/InMemoryVectorStore.d.ts +132 -0
- package/dist/rag/implementations/vector_stores/InMemoryVectorStore.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/InMemoryVectorStore.js +539 -0
- package/dist/rag/implementations/vector_stores/InMemoryVectorStore.js.map +1 -0
- package/dist/rag/implementations/vector_stores/SqlVectorStore.d.ts +265 -0
- package/dist/rag/implementations/vector_stores/SqlVectorStore.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/SqlVectorStore.js +755 -0
- package/dist/rag/implementations/vector_stores/SqlVectorStore.js.map +1 -0
- package/dist/rag/implementations/vector_stores/index.d.ts +10 -0
- package/dist/rag/implementations/vector_stores/index.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/index.js +12 -0
- package/dist/rag/implementations/vector_stores/index.js.map +1 -0
- package/dist/rag/index.d.ts +95 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/index.js +97 -0
- package/dist/rag/index.js.map +1 -0
- package/dist/services/user_auth/AuthService.d.ts +13 -0
- package/dist/services/user_auth/AuthService.d.ts.map +1 -0
- package/dist/services/user_auth/AuthService.js +24 -0
- package/dist/services/user_auth/AuthService.js.map +1 -0
- package/dist/services/user_auth/SubscriptionService.d.ts +14 -0
- package/dist/services/user_auth/SubscriptionService.d.ts.map +1 -0
- package/dist/services/user_auth/SubscriptionService.js +34 -0
- package/dist/services/user_auth/SubscriptionService.js.map +1 -0
- package/dist/services/user_auth/types.d.ts +30 -0
- package/dist/services/user_auth/types.d.ts.map +1 -0
- package/dist/services/user_auth/types.js +2 -0
- package/dist/services/user_auth/types.js.map +1 -0
- package/dist/stubs/prismaClient.d.ts +35 -0
- package/dist/stubs/prismaClient.d.ts.map +1 -0
- package/dist/stubs/prismaClient.js +47 -0
- package/dist/stubs/prismaClient.js.map +1 -0
- package/dist/types/rateLimitTypes.d.ts +70 -0
- package/dist/types/rateLimitTypes.d.ts.map +1 -0
- package/dist/types/rateLimitTypes.js +55 -0
- package/dist/types/rateLimitTypes.js.map +1 -0
- package/dist/utils/errors.d.ts +80 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +201 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/uuid.d.ts +11 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +64 -0
- package/dist/utils/uuid.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,672 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// File: backend/agentos/core/llm/providers/implementations/OpenAIProvider.ts
|
|
3
|
+
import { OpenAIProviderError } from '../errors/OpenAIProviderError.js';
|
|
4
|
+
/**
|
|
5
|
+
* @class OpenAIProvider
|
|
6
|
+
* @implements {IProvider}
|
|
7
|
+
* Provides an interface to OpenAI's suite of models (GPT, Embeddings).
|
|
8
|
+
* It handles API requests, streaming, error management, and model information.
|
|
9
|
+
*/
|
|
10
|
+
export class OpenAIProvider {
|
|
11
|
+
/**
|
|
12
|
+
* Creates an instance of OpenAIProvider.
|
|
13
|
+
* Note: The provider is not ready to use until `initialize()` is called and resolves.
|
|
14
|
+
*/
|
|
15
|
+
constructor() {
|
|
16
|
+
/** @inheritdoc */
|
|
17
|
+
this.providerId = 'openai';
|
|
18
|
+
/** @inheritdoc */
|
|
19
|
+
this.isInitialized = false;
|
|
20
|
+
this.availableModelsCache = new Map();
|
|
21
|
+
// Known pricing for common OpenAI models (USD per 1K tokens).
|
|
22
|
+
// This should be updated periodically based on OpenAI's official pricing.
|
|
23
|
+
// Input: cost for prompt tokens, Output: cost for completion tokens.
|
|
24
|
+
// For embedding models, 'input' is typically used for total tokens.
|
|
25
|
+
this.modelPricing = {
|
|
26
|
+
// Chat models (per 1K tokens)
|
|
27
|
+
'gpt-4o': { input: 0.005, output: 0.015 },
|
|
28
|
+
'gpt-4o-mini': { input: 0.00015, output: 0.0006 },
|
|
29
|
+
'gpt-4-turbo': { input: 0.01, output: 0.03 }, // Example, check current pricing
|
|
30
|
+
'gpt-4-turbo-preview': { input: 0.01, output: 0.03 }, // Example
|
|
31
|
+
'gpt-4-vision-preview': { input: 0.01, output: 0.03 }, // Example
|
|
32
|
+
'gpt-4': { input: 0.03, output: 0.06 },
|
|
33
|
+
'gpt-4-32k': { input: 0.06, output: 0.12 },
|
|
34
|
+
'gpt-3.5-turbo': { input: 0.0005, output: 0.0015 }, // Example for gpt-3.5-turbo-0125
|
|
35
|
+
'gpt-3.5-turbo-16k': { input: 0.001, output: 0.002 }, // Example for gpt-3.5-turbo-16k-0613
|
|
36
|
+
// Embedding models (per 1K tokens, typically only input cost matters)
|
|
37
|
+
'text-embedding-3-large': { input: 0.00013, output: 0 },
|
|
38
|
+
'text-embedding-3-small': { input: 0.00002, output: 0 },
|
|
39
|
+
'text-embedding-ada-002': { input: 0.0001, output: 0 },
|
|
40
|
+
};
|
|
41
|
+
// Configuration is set during initialize()
|
|
42
|
+
}
|
|
43
|
+
/** @inheritdoc */
|
|
44
|
+
async initialize(config) {
|
|
45
|
+
if (!config.apiKey) {
|
|
46
|
+
throw new OpenAIProviderError('API key is required for OpenAIProvider initialization.', 'INIT_FAILED_MISSING_API_KEY');
|
|
47
|
+
}
|
|
48
|
+
this.config = {
|
|
49
|
+
baseURL: 'https://api.openai.com/v1',
|
|
50
|
+
maxRetries: 3,
|
|
51
|
+
requestTimeout: 60000, // 60 seconds
|
|
52
|
+
...config, // User-provided config overrides defaults
|
|
53
|
+
};
|
|
54
|
+
this.defaultModelId = config.defaultModelId;
|
|
55
|
+
try {
|
|
56
|
+
// Attempt to list models to verify API key and connectivity.
|
|
57
|
+
await this.refreshAvailableModels();
|
|
58
|
+
this.isInitialized = true;
|
|
59
|
+
console.log(`OpenAIProvider initialized successfully. Default model: ${this.defaultModelId || 'Not set'}. Found ${this.availableModelsCache.size} models.`);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.isInitialized = false;
|
|
63
|
+
if (error instanceof OpenAIProviderError) {
|
|
64
|
+
throw error; // Re-throw if already an OpenAIProviderError
|
|
65
|
+
}
|
|
66
|
+
const message = error instanceof Error ? error.message : 'Unknown error during initialization.';
|
|
67
|
+
throw new OpenAIProviderError(`OpenAIProvider initialization failed: ${message}`, 'INITIALIZATION_FAILED', undefined, undefined, undefined, error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fetches the list of available models from OpenAI and updates the internal cache.
|
|
72
|
+
* @private
|
|
73
|
+
* @throws {OpenAIProviderError} If fetching or parsing models fails.
|
|
74
|
+
*/
|
|
75
|
+
async refreshAvailableModels() {
|
|
76
|
+
const response = await this.makeApiRequest('/models', 'GET', this.config.apiKey);
|
|
77
|
+
this.availableModelsCache.clear();
|
|
78
|
+
response.data.forEach((apiModel) => {
|
|
79
|
+
// Basic filtering for generally usable models, can be expanded.
|
|
80
|
+
if (apiModel.id.startsWith('gpt-') || apiModel.id.includes('embedding')) {
|
|
81
|
+
const modelInfo = this.mapApiToModelInfo(apiModel);
|
|
82
|
+
this.availableModelsCache.set(modelInfo.modelId, modelInfo);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Maps an OpenAI API model object to the standard ModelInfo interface.
|
|
88
|
+
* @private
|
|
89
|
+
* @param {OpenAIAPITypes.ModelAPIObject} apiModel - The model object from OpenAI API.
|
|
90
|
+
* @returns {ModelInfo} The standardized ModelInfo object.
|
|
91
|
+
*/
|
|
92
|
+
mapApiToModelInfo(apiModel) {
|
|
93
|
+
const capabilities = [];
|
|
94
|
+
let contextWindowSize;
|
|
95
|
+
let _supportsTools = false;
|
|
96
|
+
let _supportsVision = false;
|
|
97
|
+
let isEmbeddingModel = false;
|
|
98
|
+
// Infer capabilities and context window from model ID (common OpenAI patterns)
|
|
99
|
+
if (apiModel.id.startsWith('gpt-4o')) {
|
|
100
|
+
capabilities.push('chat', 'vision_input', 'tool_use', 'json_mode');
|
|
101
|
+
contextWindowSize = 128000;
|
|
102
|
+
_supportsTools = true;
|
|
103
|
+
_supportsVision = true;
|
|
104
|
+
}
|
|
105
|
+
else if (apiModel.id.startsWith('gpt-4-turbo')) {
|
|
106
|
+
capabilities.push('chat', 'tool_use', 'json_mode');
|
|
107
|
+
contextWindowSize = 128000;
|
|
108
|
+
_supportsTools = true;
|
|
109
|
+
if (apiModel.id.includes('-vision')) {
|
|
110
|
+
capabilities.push('vision_input');
|
|
111
|
+
_supportsVision = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (apiModel.id.startsWith('gpt-4-32k')) {
|
|
115
|
+
capabilities.push('chat', 'tool_use', 'json_mode');
|
|
116
|
+
contextWindowSize = 32768;
|
|
117
|
+
_supportsTools = true;
|
|
118
|
+
}
|
|
119
|
+
else if (apiModel.id.startsWith('gpt-4')) {
|
|
120
|
+
capabilities.push('chat', 'tool_use', 'json_mode');
|
|
121
|
+
contextWindowSize = 8192;
|
|
122
|
+
_supportsTools = true;
|
|
123
|
+
}
|
|
124
|
+
else if (apiModel.id.startsWith('gpt-3.5-turbo-16k')) {
|
|
125
|
+
capabilities.push('chat', 'tool_use', 'json_mode');
|
|
126
|
+
contextWindowSize = 16385;
|
|
127
|
+
_supportsTools = true;
|
|
128
|
+
}
|
|
129
|
+
else if (apiModel.id.startsWith('gpt-3.5-turbo')) {
|
|
130
|
+
capabilities.push('chat', 'tool_use', 'json_mode');
|
|
131
|
+
// context window for gpt-3.5-turbo can vary (e.g. 4096, 16385 for -0125)
|
|
132
|
+
// Defaulting to a common value, but specific variants might differ.
|
|
133
|
+
contextWindowSize = apiModel.id.includes('0125') || apiModel.id.includes('1106') ? 16385 : 4096;
|
|
134
|
+
_supportsTools = true;
|
|
135
|
+
}
|
|
136
|
+
else if (apiModel.id.includes('embedding')) {
|
|
137
|
+
capabilities.push('embeddings');
|
|
138
|
+
isEmbeddingModel = true;
|
|
139
|
+
// Common context/input token limit for OpenAI embedding models
|
|
140
|
+
contextWindowSize = 8191; // Max input tokens
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Fallback for other gpt models if any (less common now)
|
|
144
|
+
capabilities.push('chat'); // Assume chat at least
|
|
145
|
+
}
|
|
146
|
+
const pricing = this.modelPricing[apiModel.id] || { input: 0, output: 0 };
|
|
147
|
+
return {
|
|
148
|
+
modelId: apiModel.id,
|
|
149
|
+
providerId: this.providerId,
|
|
150
|
+
displayName: apiModel.id, // Can be enhanced if more metadata is available
|
|
151
|
+
description: `OpenAI model: ${apiModel.id}`,
|
|
152
|
+
capabilities,
|
|
153
|
+
contextWindowSize,
|
|
154
|
+
pricePer1MTokensInput: pricing.input,
|
|
155
|
+
pricePer1MTokensOutput: pricing.output,
|
|
156
|
+
pricePer1MTokensTotal: isEmbeddingModel ? pricing.input : undefined,
|
|
157
|
+
supportsStreaming: capabilities.includes('chat'), // Generally, chat models support streaming
|
|
158
|
+
// OpenAI specific details can be added to metadata
|
|
159
|
+
embeddingDimension: apiModel.id.includes('embedding-3-large') ? 3072 :
|
|
160
|
+
apiModel.id.includes('embedding-3-small') ? 1536 :
|
|
161
|
+
apiModel.id.includes('ada-002') ? 1536 : undefined,
|
|
162
|
+
lastUpdated: new Date(apiModel.created * 1000).toISOString(),
|
|
163
|
+
status: 'active', // OpenAI doesn't directly provide status in this list, assume active.
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Ensures the provider is initialized before use.
|
|
168
|
+
* @private
|
|
169
|
+
* @throws {OpenAIProviderError} If not initialized.
|
|
170
|
+
*/
|
|
171
|
+
ensureInitialized() {
|
|
172
|
+
if (!this.isInitialized) {
|
|
173
|
+
throw new OpenAIProviderError('OpenAIProvider is not initialized. Call initialize() first.', 'PROVIDER_NOT_INITIALIZED');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Resolves the API key to use for a request, prioritizing per-request override, then user-specific, then system default.
|
|
178
|
+
* @private
|
|
179
|
+
* @param {string | undefined} apiKeyOverride - API key provided directly in request options.
|
|
180
|
+
* @returns {string} The API key to use.
|
|
181
|
+
* @throws {OpenAIProviderError} If no API key is available.
|
|
182
|
+
*/
|
|
183
|
+
getApiKey(apiKeyOverride) {
|
|
184
|
+
const keyToUse = apiKeyOverride || this.config.apiKey;
|
|
185
|
+
if (!keyToUse) {
|
|
186
|
+
throw new OpenAIProviderError('No OpenAI API key available for the request.', 'API_KEY_MISSING');
|
|
187
|
+
}
|
|
188
|
+
return keyToUse;
|
|
189
|
+
}
|
|
190
|
+
/** @inheritdoc */
|
|
191
|
+
async generateCompletion(modelId, messages, options) {
|
|
192
|
+
this.ensureInitialized();
|
|
193
|
+
const apiKey = this.getApiKey(options.apiKeyOverride);
|
|
194
|
+
const requestBody = this.buildChatCompletionPayload(modelId, messages, options, false);
|
|
195
|
+
const apiResponse = await this.makeApiRequest('/chat/completions', 'POST', apiKey, requestBody);
|
|
196
|
+
return this.mapApiToCompletionResponse(apiResponse);
|
|
197
|
+
}
|
|
198
|
+
/** @inheritdoc */
|
|
199
|
+
async *generateCompletionStream(modelId, messages, options) {
|
|
200
|
+
this.ensureInitialized();
|
|
201
|
+
const apiKey = this.getApiKey(options.apiKeyOverride);
|
|
202
|
+
const requestBody = this.buildChatCompletionPayload(modelId, messages, options, true);
|
|
203
|
+
const stream = (await this.makeApiRequest('/chat/completions', 'POST', apiKey, requestBody, true // Indicate streaming response is expected
|
|
204
|
+
));
|
|
205
|
+
// Accumulators for streaming tool calls
|
|
206
|
+
const accumulatedToolCalls = new Map();
|
|
207
|
+
const abortSignal = options.abortSignal;
|
|
208
|
+
if (abortSignal?.aborted) {
|
|
209
|
+
yield {
|
|
210
|
+
id: `openai-abort-${Date.now()}`,
|
|
211
|
+
object: 'chat.completion.chunk',
|
|
212
|
+
created: Math.floor(Date.now() / 1000),
|
|
213
|
+
modelId,
|
|
214
|
+
choices: [],
|
|
215
|
+
error: { message: 'Stream aborted prior to first chunk', type: 'abort' },
|
|
216
|
+
isFinal: true,
|
|
217
|
+
};
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const abortHandler = () => {
|
|
221
|
+
// Emit final abort chunk and ensure generator completes.
|
|
222
|
+
// We cannot directly cancel the underlying ReadableStream cleanly cross-platform here; consumer side will stop.
|
|
223
|
+
// Provide a terminal chunk for consistent teardown.
|
|
224
|
+
// Note: We don't attempt to read further chunks after abort.
|
|
225
|
+
};
|
|
226
|
+
abortSignal?.addEventListener('abort', abortHandler, { once: true });
|
|
227
|
+
for await (const chunk of this.parseSseStream(stream)) {
|
|
228
|
+
if (abortSignal?.aborted) {
|
|
229
|
+
yield {
|
|
230
|
+
id: `openai-abort-${Date.now()}`,
|
|
231
|
+
object: 'chat.completion.chunk',
|
|
232
|
+
created: Math.floor(Date.now() / 1000),
|
|
233
|
+
modelId,
|
|
234
|
+
choices: [],
|
|
235
|
+
error: { message: 'Stream aborted by caller', type: 'abort' },
|
|
236
|
+
isFinal: true,
|
|
237
|
+
};
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
if (chunk === '[DONE]') {
|
|
241
|
+
// The [DONE] message is a signal for the end of the stream from OpenAI.
|
|
242
|
+
// A final response chunk with isFinal=true and potential usage should be yielded by the parser if data exists.
|
|
243
|
+
// If OpenAI includes usage in the last data chunk before [DONE], parseSseStream handles it.
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
const apiChunk = JSON.parse(chunk);
|
|
248
|
+
yield this.mapApiToStreamChunkResponse(apiChunk, accumulatedToolCalls);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
console.warn('OpenAIProvider: Failed to parse stream chunk JSON:', chunk, error);
|
|
252
|
+
// Decide if to yield an error chunk or continue if minor parsing issue
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
abortSignal?.removeEventListener('abort', abortHandler);
|
|
256
|
+
}
|
|
257
|
+
/** @inheritdoc */
|
|
258
|
+
async generateEmbeddings(modelId, texts, options) {
|
|
259
|
+
this.ensureInitialized();
|
|
260
|
+
if (!texts || texts.length === 0) {
|
|
261
|
+
throw new OpenAIProviderError('Input texts array cannot be empty for embeddings.', 'EMBEDDING_NO_INPUT');
|
|
262
|
+
}
|
|
263
|
+
const apiKey = this.getApiKey(options?.apiKeyOverride);
|
|
264
|
+
const payload = {
|
|
265
|
+
model: modelId,
|
|
266
|
+
input: texts,
|
|
267
|
+
};
|
|
268
|
+
if (options?.encodingFormat)
|
|
269
|
+
payload.encoding_format = options.encodingFormat;
|
|
270
|
+
if (options?.dimensions)
|
|
271
|
+
payload.dimensions = options.dimensions;
|
|
272
|
+
if (options?.userId)
|
|
273
|
+
payload.user = options.userId;
|
|
274
|
+
// OpenAI specific: input_type for their newer models
|
|
275
|
+
if (options?.inputType && (modelId.includes('text-embedding-3') || modelId.includes('ada-002'))) {
|
|
276
|
+
// Not a standard OpenAI param, this is an example if they add it.
|
|
277
|
+
// For now, customModelParams is the way for non-standard things.
|
|
278
|
+
}
|
|
279
|
+
if (options?.customModelParams) {
|
|
280
|
+
Object.assign(payload, options.customModelParams);
|
|
281
|
+
}
|
|
282
|
+
const apiResponse = await this.makeApiRequest('/embeddings', 'POST', apiKey, payload);
|
|
283
|
+
return this.mapApiToEmbeddingResponse(apiResponse);
|
|
284
|
+
}
|
|
285
|
+
/** @inheritdoc */
|
|
286
|
+
async listAvailableModels(filter) {
|
|
287
|
+
this.ensureInitialized();
|
|
288
|
+
// Optionally refresh cache, or rely on initialization. For simplicity, using cached.
|
|
289
|
+
// await this.refreshAvailableModels();
|
|
290
|
+
const models = Array.from(this.availableModelsCache.values());
|
|
291
|
+
if (filter?.capability) {
|
|
292
|
+
return models.filter(m => m.capabilities.includes(filter.capability));
|
|
293
|
+
}
|
|
294
|
+
return models;
|
|
295
|
+
}
|
|
296
|
+
/** @inheritdoc */
|
|
297
|
+
async getModelInfo(modelId) {
|
|
298
|
+
this.ensureInitialized();
|
|
299
|
+
// Could implement a direct fetch if model not in cache, or rely on cached version.
|
|
300
|
+
// For now, uses cached version.
|
|
301
|
+
if (!this.availableModelsCache.has(modelId)) {
|
|
302
|
+
// Attempt to refresh and check again, in case it's a new model
|
|
303
|
+
try {
|
|
304
|
+
await this.refreshAvailableModels();
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
console.warn(`OpenAIProvider: Failed to refresh models while fetching info for ${modelId}`, error);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return this.availableModelsCache.get(modelId);
|
|
311
|
+
}
|
|
312
|
+
/** @inheritdoc */
|
|
313
|
+
async checkHealth() {
|
|
314
|
+
try {
|
|
315
|
+
// A lightweight call, e.g., fetching a small model's info or /models with limit=1
|
|
316
|
+
await this.makeApiRequest(`/models/${this.defaultModelId || 'gpt-3.5-turbo'}`, // Use a known cheap/fast model
|
|
317
|
+
'GET', this.config.apiKey);
|
|
318
|
+
return { isHealthy: true };
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
const message = error instanceof Error ? error.message : 'Health check failed';
|
|
322
|
+
return { isHealthy: false, details: { message, error } };
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/** @inheritdoc */
|
|
326
|
+
async shutdown() {
|
|
327
|
+
// For OpenAIProvider, using stateless HTTP requests, there might not be
|
|
328
|
+
// persistent connections to close. If connection pooling or WebSockets
|
|
329
|
+
// were used, they would be closed here.
|
|
330
|
+
this.isInitialized = false; // Mark as not initialized
|
|
331
|
+
console.log('OpenAIProvider shutdown complete.');
|
|
332
|
+
// No explicit resources to release in this implementation.
|
|
333
|
+
}
|
|
334
|
+
// --- Helper Methods ---
|
|
335
|
+
/**
|
|
336
|
+
* Builds the payload for OpenAI's Chat Completions API.
|
|
337
|
+
* @private
|
|
338
|
+
*/
|
|
339
|
+
buildChatCompletionPayload(modelId, messages, options, stream) {
|
|
340
|
+
const payload = {
|
|
341
|
+
model: modelId,
|
|
342
|
+
messages: messages.map(m => ({
|
|
343
|
+
role: m.role,
|
|
344
|
+
content: m.content, // OpenAI allows null content for assistant tool_calls message
|
|
345
|
+
name: m.name,
|
|
346
|
+
tool_calls: m.tool_calls,
|
|
347
|
+
tool_call_id: m.tool_call_id,
|
|
348
|
+
})),
|
|
349
|
+
stream: stream,
|
|
350
|
+
};
|
|
351
|
+
if (options.temperature !== undefined)
|
|
352
|
+
payload.temperature = options.temperature;
|
|
353
|
+
if (options.topP !== undefined)
|
|
354
|
+
payload.top_p = options.topP;
|
|
355
|
+
if (options.maxTokens !== undefined)
|
|
356
|
+
payload.max_tokens = options.maxTokens;
|
|
357
|
+
if (options.presencePenalty !== undefined)
|
|
358
|
+
payload.presence_penalty = options.presencePenalty;
|
|
359
|
+
if (options.frequencyPenalty !== undefined)
|
|
360
|
+
payload.frequency_penalty = options.frequencyPenalty;
|
|
361
|
+
if (options.stopSequences !== undefined)
|
|
362
|
+
payload.stop = options.stopSequences;
|
|
363
|
+
if (options.userId !== undefined)
|
|
364
|
+
payload.user = options.userId;
|
|
365
|
+
if (options.tools !== undefined)
|
|
366
|
+
payload.tools = options.tools;
|
|
367
|
+
if (options.toolChoice !== undefined)
|
|
368
|
+
payload.tool_choice = options.toolChoice;
|
|
369
|
+
if (options.responseFormat !== undefined)
|
|
370
|
+
payload.response_format = options.responseFormat;
|
|
371
|
+
if (options.customModelParams) {
|
|
372
|
+
Object.assign(payload, options.customModelParams);
|
|
373
|
+
}
|
|
374
|
+
return payload;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Maps the raw OpenAI API Chat Completion response to the standard ModelCompletionResponse.
|
|
378
|
+
* @private
|
|
379
|
+
*/
|
|
380
|
+
mapApiToCompletionResponse(apiResponse) {
|
|
381
|
+
const _choice = apiResponse.choices[0]; // Assuming N=1; kept for reference
|
|
382
|
+
return {
|
|
383
|
+
id: apiResponse.id,
|
|
384
|
+
object: apiResponse.object,
|
|
385
|
+
created: apiResponse.created,
|
|
386
|
+
modelId: apiResponse.model,
|
|
387
|
+
choices: apiResponse.choices.map(c => ({
|
|
388
|
+
index: c.index,
|
|
389
|
+
message: {
|
|
390
|
+
role: c.message.role,
|
|
391
|
+
content: c.message.content,
|
|
392
|
+
tool_calls: c.message.tool_calls,
|
|
393
|
+
},
|
|
394
|
+
finishReason: c.finish_reason,
|
|
395
|
+
logprobs: c.logprobs,
|
|
396
|
+
})),
|
|
397
|
+
usage: apiResponse.usage ? this.calculateUsage(apiResponse.usage, apiResponse.model) : undefined,
|
|
398
|
+
// No deltas for non-streaming response
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Maps an OpenAI API stream chunk to a ModelCompletionResponse chunk.
|
|
403
|
+
* Handles accumulation of tool calls.
|
|
404
|
+
* @private
|
|
405
|
+
*/
|
|
406
|
+
mapApiToStreamChunkResponse(apiChunk, accumulatedToolCalls) {
|
|
407
|
+
const choice = apiChunk.choices[0];
|
|
408
|
+
let responseTextDelta;
|
|
409
|
+
let toolCallsDeltas;
|
|
410
|
+
let finalUsage;
|
|
411
|
+
if (choice?.delta?.content) {
|
|
412
|
+
responseTextDelta = choice.delta.content;
|
|
413
|
+
}
|
|
414
|
+
if (choice?.delta?.tool_calls) {
|
|
415
|
+
toolCallsDeltas = [];
|
|
416
|
+
choice.delta.tool_calls.forEach(tcDelta => {
|
|
417
|
+
let currentToolCall = accumulatedToolCalls.get(tcDelta.index);
|
|
418
|
+
if (!currentToolCall) {
|
|
419
|
+
currentToolCall = { function: {} }; // Initialize if new
|
|
420
|
+
if (tcDelta.id)
|
|
421
|
+
currentToolCall.id = tcDelta.id;
|
|
422
|
+
if (tcDelta.type)
|
|
423
|
+
currentToolCall.type = tcDelta.type;
|
|
424
|
+
}
|
|
425
|
+
if (tcDelta.id && !currentToolCall.id)
|
|
426
|
+
currentToolCall.id = tcDelta.id; // Ensure ID is set if provided in delta
|
|
427
|
+
if (tcDelta.function?.name)
|
|
428
|
+
currentToolCall.function.name = (currentToolCall.function.name || '') + tcDelta.function.name;
|
|
429
|
+
if (tcDelta.function?.arguments)
|
|
430
|
+
currentToolCall.function.arguments = (currentToolCall.function.arguments || '') + tcDelta.function.arguments;
|
|
431
|
+
accumulatedToolCalls.set(tcDelta.index, currentToolCall);
|
|
432
|
+
toolCallsDeltas.push({
|
|
433
|
+
index: tcDelta.index,
|
|
434
|
+
id: tcDelta.id,
|
|
435
|
+
type: tcDelta.type,
|
|
436
|
+
function: tcDelta.function ? {
|
|
437
|
+
name: tcDelta.function.name,
|
|
438
|
+
arguments_delta: tcDelta.function.arguments
|
|
439
|
+
} : undefined,
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
const isFinal = !!choice?.finish_reason;
|
|
444
|
+
if (isFinal) {
|
|
445
|
+
// OpenAI might send usage in the last chunk or not at all for streams.
|
|
446
|
+
// If `apiChunk.usage` exists (it's optional in stream chunks per some docs), use it.
|
|
447
|
+
if (apiChunk.usage) {
|
|
448
|
+
finalUsage = this.calculateUsage(apiChunk.usage, apiChunk.model);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Construct the primary choice message for the response
|
|
452
|
+
const responseChoice = {
|
|
453
|
+
index: choice.index,
|
|
454
|
+
message: {
|
|
455
|
+
role: choice.delta.role || 'assistant', // Role usually comes once or is 'assistant'
|
|
456
|
+
content: responseTextDelta || null, // Content is delta
|
|
457
|
+
// For final chunk, assemble complete tool_calls
|
|
458
|
+
tool_calls: isFinal ? Array.from(accumulatedToolCalls.values()).map(accTc => ({
|
|
459
|
+
id: accTc.id, // ID should be present by now
|
|
460
|
+
type: accTc.type, // Type should be present
|
|
461
|
+
function: {
|
|
462
|
+
name: accTc.function.name,
|
|
463
|
+
arguments: accTc.function.arguments
|
|
464
|
+
}
|
|
465
|
+
})).filter(tc => tc.id && tc.function.name) : undefined, // Only include if valid
|
|
466
|
+
},
|
|
467
|
+
finishReason: choice.finish_reason || null,
|
|
468
|
+
logprobs: choice.logprobs,
|
|
469
|
+
};
|
|
470
|
+
return {
|
|
471
|
+
id: apiChunk.id,
|
|
472
|
+
object: apiChunk.object,
|
|
473
|
+
created: apiChunk.created,
|
|
474
|
+
modelId: apiChunk.model,
|
|
475
|
+
choices: [responseChoice],
|
|
476
|
+
responseTextDelta,
|
|
477
|
+
toolCallsDeltas,
|
|
478
|
+
isFinal,
|
|
479
|
+
usage: finalUsage, // Only on the very final message from the stream
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Maps the raw OpenAI API Embedding response to the standard ProviderEmbeddingResponse.
|
|
484
|
+
* @private
|
|
485
|
+
*/
|
|
486
|
+
mapApiToEmbeddingResponse(apiResponse) {
|
|
487
|
+
return {
|
|
488
|
+
object: 'list',
|
|
489
|
+
data: apiResponse.data.map(d => ({
|
|
490
|
+
object: 'embedding',
|
|
491
|
+
embedding: d.embedding,
|
|
492
|
+
index: d.index,
|
|
493
|
+
})),
|
|
494
|
+
model: apiResponse.model,
|
|
495
|
+
usage: {
|
|
496
|
+
prompt_tokens: apiResponse.usage.prompt_tokens,
|
|
497
|
+
total_tokens: apiResponse.usage.total_tokens,
|
|
498
|
+
costUSD: this.calculateCost(apiResponse.usage.prompt_tokens, 0, // No completion tokens for embeddings
|
|
499
|
+
apiResponse.model, true // isEmbedding
|
|
500
|
+
),
|
|
501
|
+
},
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Calculates token usage and cost.
|
|
506
|
+
* @private
|
|
507
|
+
*/
|
|
508
|
+
calculateUsage(usage, modelId) {
|
|
509
|
+
return {
|
|
510
|
+
promptTokens: usage.prompt_tokens,
|
|
511
|
+
completionTokens: usage.completion_tokens,
|
|
512
|
+
totalTokens: usage.total_tokens,
|
|
513
|
+
costUSD: this.calculateCost(usage.prompt_tokens, usage.completion_tokens, modelId),
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Calculates the estimated cost of an API call.
|
|
518
|
+
* @private
|
|
519
|
+
*/
|
|
520
|
+
calculateCost(promptTokens, completionTokens, modelId, isEmbedding = false) {
|
|
521
|
+
const pricing = this.modelPricing[modelId];
|
|
522
|
+
if (!pricing)
|
|
523
|
+
return undefined; // Pricing info not available
|
|
524
|
+
if (isEmbedding) {
|
|
525
|
+
return (promptTokens / 1000) * pricing.input;
|
|
526
|
+
}
|
|
527
|
+
const inputCost = (promptTokens / 1000) * pricing.input;
|
|
528
|
+
const outputCost = (completionTokens / 1000) * pricing.output;
|
|
529
|
+
return inputCost + outputCost;
|
|
530
|
+
}
|
|
531
|
+
async makeApiRequest(endpoint, method, apiKey, body, expectStream = false) {
|
|
532
|
+
const url = `${this.config.baseURL}${endpoint}`;
|
|
533
|
+
const headers = {
|
|
534
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
535
|
+
'User-Agent': 'AgentOS/1.0 (OpenAIProvider)',
|
|
536
|
+
...(this.config.customHeaders || {}),
|
|
537
|
+
};
|
|
538
|
+
if (method === 'POST') {
|
|
539
|
+
headers['Content-Type'] = 'application/json';
|
|
540
|
+
}
|
|
541
|
+
if (this.config.organizationId) {
|
|
542
|
+
headers['OpenAI-Organization'] = this.config.organizationId;
|
|
543
|
+
}
|
|
544
|
+
let lastError = new OpenAIProviderError('Request failed after all retries.', 'MAX_RETRIES_REACHED');
|
|
545
|
+
for (let attempt = 0; attempt < this.config.maxRetries; attempt++) {
|
|
546
|
+
const controller = new AbortController();
|
|
547
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.requestTimeout);
|
|
548
|
+
try {
|
|
549
|
+
const requestOptions = {
|
|
550
|
+
method,
|
|
551
|
+
headers,
|
|
552
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
553
|
+
signal: controller.signal,
|
|
554
|
+
};
|
|
555
|
+
const response = await fetch(url, requestOptions);
|
|
556
|
+
clearTimeout(timeoutId);
|
|
557
|
+
if (!response.ok) {
|
|
558
|
+
const errorData = await response.json().catch(() => ({}));
|
|
559
|
+
const errorMessage = errorData.error?.message || `HTTP error ${response.status}: ${response.statusText}`;
|
|
560
|
+
const errorType = errorData.error?.type;
|
|
561
|
+
const errorCode = errorData.error?.code;
|
|
562
|
+
// Non-retryable errors
|
|
563
|
+
if (response.status === 401 || response.status === 403 || response.status === 400 || response.status === 404) {
|
|
564
|
+
throw new OpenAIProviderError(errorMessage, 'API_CLIENT_ERROR', errorCode || undefined, errorType, response.status, errorData);
|
|
565
|
+
}
|
|
566
|
+
// For other server errors or rate limits, prepare for retry
|
|
567
|
+
lastError = new OpenAIProviderError(errorMessage, 'API_SERVER_ERROR', errorCode || undefined, errorType, response.status, errorData);
|
|
568
|
+
if (response.status === 429) { // Rate limit
|
|
569
|
+
lastError = new OpenAIProviderError(errorMessage, 'RATE_LIMIT_EXCEEDED', errorCode || undefined, errorType, response.status, errorData);
|
|
570
|
+
const retryAfter = response.headers.get('retry-after'); // seconds
|
|
571
|
+
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : (2 ** attempt) * 1000;
|
|
572
|
+
await new Promise(resolve => setTimeout(resolve, retryAfterMs));
|
|
573
|
+
continue; // Retry
|
|
574
|
+
}
|
|
575
|
+
// Other retryable server errors
|
|
576
|
+
if (response.status >= 500) {
|
|
577
|
+
await new Promise(resolve => setTimeout(resolve, (2 ** attempt) * 1000)); // Exponential backoff
|
|
578
|
+
continue; // Retry
|
|
579
|
+
}
|
|
580
|
+
throw lastError; // If not explicitly handled for retry, throw
|
|
581
|
+
}
|
|
582
|
+
if (expectStream) {
|
|
583
|
+
if (!response.body) {
|
|
584
|
+
throw new OpenAIProviderError('Expected a stream response but body was null.', 'STREAM_BODY_NULL');
|
|
585
|
+
}
|
|
586
|
+
return response.body;
|
|
587
|
+
}
|
|
588
|
+
return (await response.json());
|
|
589
|
+
}
|
|
590
|
+
catch (error) {
|
|
591
|
+
clearTimeout(timeoutId);
|
|
592
|
+
if (error instanceof OpenAIProviderError) { // If already our custom error, re-throw if not retryable
|
|
593
|
+
if (error.code === 'API_CLIENT_ERROR')
|
|
594
|
+
throw error;
|
|
595
|
+
lastError = error;
|
|
596
|
+
}
|
|
597
|
+
else if (error instanceof Error && error.name === 'AbortError') {
|
|
598
|
+
lastError = new OpenAIProviderError(`Request timed out after ${this.config.requestTimeout}ms.`, 'REQUEST_TIMEOUT', undefined, undefined, undefined, error);
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
lastError = new OpenAIProviderError(error instanceof Error ? error.message : 'Network or unknown error', 'NETWORK_ERROR', undefined, undefined, undefined, error);
|
|
602
|
+
}
|
|
603
|
+
if (attempt === this.config.maxRetries - 1) {
|
|
604
|
+
break; // Last attempt failed, break to throw lastError
|
|
605
|
+
}
|
|
606
|
+
// Exponential backoff for retries not handled by 429
|
|
607
|
+
const delay = Math.min(30000, (1000 * (2 ** attempt)) + Math.random() * 1000); // Add jitter
|
|
608
|
+
console.warn(`OpenAIProvider: Request attempt ${attempt + 1} failed. Retrying in ${delay.toFixed(0)}ms. Error: ${lastError.message}`);
|
|
609
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
throw lastError; // Throw the last encountered error after all retries
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Parses an SSE (Server-Sent Events) stream.
|
|
616
|
+
* @private
|
|
617
|
+
*/
|
|
618
|
+
async *parseSseStream(stream) {
|
|
619
|
+
const reader = stream.getReader();
|
|
620
|
+
const decoder = new TextDecoder();
|
|
621
|
+
let buffer = '';
|
|
622
|
+
try {
|
|
623
|
+
while (true) {
|
|
624
|
+
const { done, value } = await reader.read();
|
|
625
|
+
if (done)
|
|
626
|
+
break;
|
|
627
|
+
buffer += decoder.decode(value, { stream: true });
|
|
628
|
+
let eolIndex;
|
|
629
|
+
// An SSE event is typically defined by "data: ...\n\n"
|
|
630
|
+
// Or multiple "data: ..." lines followed by \n\n
|
|
631
|
+
while ((eolIndex = buffer.indexOf('\n\n')) >= 0) {
|
|
632
|
+
const messageBlock = buffer.substring(0, eolIndex);
|
|
633
|
+
buffer = buffer.substring(eolIndex + 2); // +2 for \n\n
|
|
634
|
+
const lines = messageBlock.split('\n');
|
|
635
|
+
for (const line of lines) {
|
|
636
|
+
if (line.startsWith('data: ')) {
|
|
637
|
+
const dataContent = line.substring('data: '.length).trim();
|
|
638
|
+
if (dataContent) { // Ensure not empty data string
|
|
639
|
+
yield dataContent;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
// Process any remaining data in the buffer (e.g. if stream ends without \n\n)
|
|
646
|
+
if (buffer.startsWith('data: ')) {
|
|
647
|
+
const dataContent = buffer.substring('data: '.length).trim();
|
|
648
|
+
if (dataContent)
|
|
649
|
+
yield dataContent;
|
|
650
|
+
}
|
|
651
|
+
else if (buffer.trim()) { // Sometimes final [DONE] might not be prefixed by "data: "
|
|
652
|
+
if (buffer.trim() === "[DONE]")
|
|
653
|
+
yield "[DONE]";
|
|
654
|
+
else
|
|
655
|
+
console.warn("OpenAIProvider: Trailing stream data not processed:", buffer);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
catch (error) {
|
|
659
|
+
const message = error instanceof Error ? error.message : 'Stream parsing error';
|
|
660
|
+
console.error('OpenAIProvider: Error reading or parsing SSE stream:', message, error);
|
|
661
|
+
throw new OpenAIProviderError(message, 'STREAM_PARSING_ERROR', undefined, undefined, undefined, error);
|
|
662
|
+
}
|
|
663
|
+
finally {
|
|
664
|
+
// Ensure stream is closed if `break` or `return` is called within the generator
|
|
665
|
+
if (!reader.closed) {
|
|
666
|
+
await reader.cancel().catch(err => console.error("OpenAIProvider: Error cancelling stream reader:", err));
|
|
667
|
+
}
|
|
668
|
+
// console.log("OpenAIProvider: SSE Stream parsing finished.");
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
//# sourceMappingURL=OpenAIProvider.js.map
|