@measureoneinc/savant 1.0.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/README-SDK.md +148 -0
- package/dist/ai/agents/domain-identifier.agent.d.ts +34 -0
- package/dist/ai/agents/domain-identifier.agent.d.ts.map +1 -0
- package/dist/ai/agents/domain-identifier.agent.js +176 -0
- package/dist/ai/agents/domain-identifier.agent.js.map +1 -0
- package/dist/ai/agents/dynamic-agent.d.ts +105 -0
- package/dist/ai/agents/dynamic-agent.d.ts.map +1 -0
- package/dist/ai/agents/dynamic-agent.js +505 -0
- package/dist/ai/agents/dynamic-agent.js.map +1 -0
- package/dist/ai/agents/executor.agent.d.ts +25 -0
- package/dist/ai/agents/executor.agent.d.ts.map +1 -0
- package/dist/ai/agents/executor.agent.js +44 -0
- package/dist/ai/agents/executor.agent.js.map +1 -0
- package/dist/ai/agents/index.d.ts +17 -0
- package/dist/ai/agents/index.d.ts.map +1 -0
- package/dist/ai/agents/index.js +29 -0
- package/dist/ai/agents/index.js.map +1 -0
- package/dist/ai/agents/knowledge.agent.d.ts +25 -0
- package/dist/ai/agents/knowledge.agent.d.ts.map +1 -0
- package/dist/ai/agents/knowledge.agent.js +42 -0
- package/dist/ai/agents/knowledge.agent.js.map +1 -0
- package/dist/ai/agents/learning.agent.d.ts +63 -0
- package/dist/ai/agents/learning.agent.d.ts.map +1 -0
- package/dist/ai/agents/learning.agent.js +288 -0
- package/dist/ai/agents/learning.agent.js.map +1 -0
- package/dist/ai/agents/orchestrator.agent.d.ts +26 -0
- package/dist/ai/agents/orchestrator.agent.d.ts.map +1 -0
- package/dist/ai/agents/orchestrator.agent.js +42 -0
- package/dist/ai/agents/orchestrator.agent.js.map +1 -0
- package/dist/ai/agents/planner.agent.d.ts +25 -0
- package/dist/ai/agents/planner.agent.d.ts.map +1 -0
- package/dist/ai/agents/planner.agent.js +36 -0
- package/dist/ai/agents/planner.agent.js.map +1 -0
- package/dist/ai/agents/response-parser.d.ts +23 -0
- package/dist/ai/agents/response-parser.d.ts.map +1 -0
- package/dist/ai/agents/response-parser.js +313 -0
- package/dist/ai/agents/response-parser.js.map +1 -0
- package/dist/ai/agents/summarizer.agent.d.ts +38 -0
- package/dist/ai/agents/summarizer.agent.d.ts.map +1 -0
- package/dist/ai/agents/summarizer.agent.js +245 -0
- package/dist/ai/agents/summarizer.agent.js.map +1 -0
- package/dist/ai/instructions/domain-identifier.instructions.d.ts +10 -0
- package/dist/ai/instructions/domain-identifier.instructions.d.ts.map +1 -0
- package/dist/ai/instructions/domain-identifier.instructions.js +63 -0
- package/dist/ai/instructions/domain-identifier.instructions.js.map +1 -0
- package/dist/ai/instructions/executor.instructions.d.ts +11 -0
- package/dist/ai/instructions/executor.instructions.d.ts.map +1 -0
- package/dist/ai/instructions/executor.instructions.js +218 -0
- package/dist/ai/instructions/executor.instructions.js.map +1 -0
- package/dist/ai/instructions/knowledge.instructions.d.ts +11 -0
- package/dist/ai/instructions/knowledge.instructions.d.ts.map +1 -0
- package/dist/ai/instructions/knowledge.instructions.js +145 -0
- package/dist/ai/instructions/knowledge.instructions.js.map +1 -0
- package/dist/ai/instructions/learning.instructions.d.ts +11 -0
- package/dist/ai/instructions/learning.instructions.d.ts.map +1 -0
- package/dist/ai/instructions/learning.instructions.js +226 -0
- package/dist/ai/instructions/learning.instructions.js.map +1 -0
- package/dist/ai/instructions/orchestrator.instructions.d.ts +11 -0
- package/dist/ai/instructions/orchestrator.instructions.d.ts.map +1 -0
- package/dist/ai/instructions/orchestrator.instructions.js +148 -0
- package/dist/ai/instructions/orchestrator.instructions.js.map +1 -0
- package/dist/ai/instructions/planner.instructions.d.ts +12 -0
- package/dist/ai/instructions/planner.instructions.d.ts.map +1 -0
- package/dist/ai/instructions/planner.instructions.js +129 -0
- package/dist/ai/instructions/planner.instructions.js.map +1 -0
- package/dist/ai/instructions/summarizer.instructions.d.ts +11 -0
- package/dist/ai/instructions/summarizer.instructions.d.ts.map +1 -0
- package/dist/ai/instructions/summarizer.instructions.js +84 -0
- package/dist/ai/instructions/summarizer.instructions.js.map +1 -0
- package/dist/ai/learning/execution-learner.d.ts +79 -0
- package/dist/ai/learning/execution-learner.d.ts.map +1 -0
- package/dist/ai/learning/execution-learner.js +536 -0
- package/dist/ai/learning/execution-learner.js.map +1 -0
- package/dist/ai/response_handlers/base-handler.d.ts +73 -0
- package/dist/ai/response_handlers/base-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/base-handler.js +153 -0
- package/dist/ai/response_handlers/base-handler.js.map +1 -0
- package/dist/ai/response_handlers/direct-response-handler.d.ts +18 -0
- package/dist/ai/response_handlers/direct-response-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/direct-response-handler.js +86 -0
- package/dist/ai/response_handlers/direct-response-handler.js.map +1 -0
- package/dist/ai/response_handlers/error-handler.d.ts +13 -0
- package/dist/ai/response_handlers/error-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/error-handler.js +72 -0
- package/dist/ai/response_handlers/error-handler.js.map +1 -0
- package/dist/ai/response_handlers/handler-registry.d.ts +51 -0
- package/dist/ai/response_handlers/handler-registry.d.ts.map +1 -0
- package/dist/ai/response_handlers/handler-registry.js +268 -0
- package/dist/ai/response_handlers/handler-registry.js.map +1 -0
- package/dist/ai/response_handlers/index.d.ts +16 -0
- package/dist/ai/response_handlers/index.d.ts.map +1 -0
- package/dist/ai/response_handlers/index.js +29 -0
- package/dist/ai/response_handlers/index.js.map +1 -0
- package/dist/ai/response_handlers/message-handler.d.ts +23 -0
- package/dist/ai/response_handlers/message-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/message-handler.js +193 -0
- package/dist/ai/response_handlers/message-handler.js.map +1 -0
- package/dist/ai/response_handlers/plan-ready-handler.d.ts +26 -0
- package/dist/ai/response_handlers/plan-ready-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/plan-ready-handler.js +394 -0
- package/dist/ai/response_handlers/plan-ready-handler.js.map +1 -0
- package/dist/ai/response_handlers/request-input-handler.d.ts +14 -0
- package/dist/ai/response_handlers/request-input-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/request-input-handler.js +87 -0
- package/dist/ai/response_handlers/request-input-handler.js.map +1 -0
- package/dist/ai/response_handlers/request-plan-handler.d.ts +18 -0
- package/dist/ai/response_handlers/request-plan-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/request-plan-handler.js +143 -0
- package/dist/ai/response_handlers/request-plan-handler.js.map +1 -0
- package/dist/ai/response_handlers/step-complete-handler.d.ts +22 -0
- package/dist/ai/response_handlers/step-complete-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/step-complete-handler.js +307 -0
- package/dist/ai/response_handlers/step-complete-handler.js.map +1 -0
- package/dist/ai/response_handlers/unknown-handler.d.ts +12 -0
- package/dist/ai/response_handlers/unknown-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/unknown-handler.js +27 -0
- package/dist/ai/response_handlers/unknown-handler.js.map +1 -0
- package/dist/ai/response_handlers/user-input-handler.d.ts +20 -0
- package/dist/ai/response_handlers/user-input-handler.d.ts.map +1 -0
- package/dist/ai/response_handlers/user-input-handler.js +69 -0
- package/dist/ai/response_handlers/user-input-handler.js.map +1 -0
- package/dist/ai/tools/log-step.d.ts +29 -0
- package/dist/ai/tools/log-step.d.ts.map +1 -0
- package/dist/ai/tools/log-step.js +47 -0
- package/dist/ai/tools/log-step.js.map +1 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +223 -0
- package/dist/app.js.map +1 -0
- package/dist/config/environment/local.d.ts +12 -0
- package/dist/config/environment/local.d.ts.map +1 -0
- package/dist/config/environment/local.js +124 -0
- package/dist/config/environment/local.js.map +1 -0
- package/dist/config/environment/production.d.ts +7 -0
- package/dist/config/environment/production.d.ts.map +1 -0
- package/dist/config/environment/production.js +105 -0
- package/dist/config/environment/production.js.map +1 -0
- package/dist/config/environment/test.d.ts +7 -0
- package/dist/config/environment/test.d.ts.map +1 -0
- package/dist/config/environment/test.js +97 -0
- package/dist/config/environment/test.js.map +1 -0
- package/dist/config/index.d.ts +219 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +360 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controllers/agent_request.controller.d.ts +43 -0
- package/dist/controllers/agent_request.controller.d.ts.map +1 -0
- package/dist/controllers/agent_request.controller.js +141 -0
- package/dist/controllers/agent_request.controller.js.map +1 -0
- package/dist/controllers/base.controller.d.ts +208 -0
- package/dist/controllers/base.controller.d.ts.map +1 -0
- package/dist/controllers/base.controller.js +378 -0
- package/dist/controllers/base.controller.js.map +1 -0
- package/dist/controllers/conversations.controller.d.ts +31 -0
- package/dist/controllers/conversations.controller.d.ts.map +1 -0
- package/dist/controllers/conversations.controller.js +138 -0
- package/dist/controllers/conversations.controller.js.map +1 -0
- package/dist/controllers/knowledge.controller.d.ts +63 -0
- package/dist/controllers/knowledge.controller.d.ts.map +1 -0
- package/dist/controllers/knowledge.controller.js +311 -0
- package/dist/controllers/knowledge.controller.js.map +1 -0
- package/dist/controllers/mcp.controller.d.ts +25 -0
- package/dist/controllers/mcp.controller.d.ts.map +1 -0
- package/dist/controllers/mcp.controller.js +93 -0
- package/dist/controllers/mcp.controller.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/app-constants.d.ts +231 -0
- package/dist/lib/app-constants.d.ts.map +1 -0
- package/dist/lib/app-constants.js +240 -0
- package/dist/lib/app-constants.js.map +1 -0
- package/dist/lib/controller-utils.d.ts +48 -0
- package/dist/lib/controller-utils.d.ts.map +1 -0
- package/dist/lib/controller-utils.js +70 -0
- package/dist/lib/controller-utils.js.map +1 -0
- package/dist/lib/exceptions/app-exceptions.d.ts +158 -0
- package/dist/lib/exceptions/app-exceptions.d.ts.map +1 -0
- package/dist/lib/exceptions/app-exceptions.js +287 -0
- package/dist/lib/exceptions/app-exceptions.js.map +1 -0
- package/dist/lib/middleware/upload.middleware.d.ts +13 -0
- package/dist/lib/middleware/upload.middleware.d.ts.map +1 -0
- package/dist/lib/middleware/upload.middleware.js +35 -0
- package/dist/lib/middleware/upload.middleware.js.map +1 -0
- package/dist/lib/middleware/validation.middleware.d.ts +29 -0
- package/dist/lib/middleware/validation.middleware.d.ts.map +1 -0
- package/dist/lib/middleware/validation.middleware.js +219 -0
- package/dist/lib/middleware/validation.middleware.js.map +1 -0
- package/dist/lib/model/validation-schema/submit-message.schema.d.ts +3 -0
- package/dist/lib/model/validation-schema/submit-message.schema.d.ts.map +1 -0
- package/dist/lib/model/validation-schema/submit-message.schema.js +40 -0
- package/dist/lib/model/validation-schema/submit-message.schema.js.map +1 -0
- package/dist/lib/model/validation-schema/update-knowledge.schema.d.ts +3 -0
- package/dist/lib/model/validation-schema/update-knowledge.schema.d.ts.map +1 -0
- package/dist/lib/model/validation-schema/update-knowledge.schema.js +35 -0
- package/dist/lib/model/validation-schema/update-knowledge.schema.js.map +1 -0
- package/dist/lib/open-ai-event-processor.d.ts +101 -0
- package/dist/lib/open-ai-event-processor.d.ts.map +1 -0
- package/dist/lib/open-ai-event-processor.js +426 -0
- package/dist/lib/open-ai-event-processor.js.map +1 -0
- package/dist/lib/schemas/ai-responses.schema.d.ts +617 -0
- package/dist/lib/schemas/ai-responses.schema.d.ts.map +1 -0
- package/dist/lib/schemas/ai-responses.schema.js +377 -0
- package/dist/lib/schemas/ai-responses.schema.js.map +1 -0
- package/dist/lib/schemas/common.schemas.d.ts +84 -0
- package/dist/lib/schemas/common.schemas.d.ts.map +1 -0
- package/dist/lib/schemas/common.schemas.js +87 -0
- package/dist/lib/schemas/common.schemas.js.map +1 -0
- package/dist/lib/schemas/conversation.schema.d.ts +28 -0
- package/dist/lib/schemas/conversation.schema.d.ts.map +1 -0
- package/dist/lib/schemas/conversation.schema.js +31 -0
- package/dist/lib/schemas/conversation.schema.js.map +1 -0
- package/dist/lib/schemas/http-client.schema.d.ts +39 -0
- package/dist/lib/schemas/http-client.schema.d.ts.map +1 -0
- package/dist/lib/schemas/http-client.schema.js +36 -0
- package/dist/lib/schemas/http-client.schema.js.map +1 -0
- package/dist/lib/schemas/index.d.ts +95 -0
- package/dist/lib/schemas/index.d.ts.map +1 -0
- package/dist/lib/schemas/index.js +32 -0
- package/dist/lib/schemas/index.js.map +1 -0
- package/dist/lib/schemas/knowledge.schema.d.ts +145 -0
- package/dist/lib/schemas/knowledge.schema.d.ts.map +1 -0
- package/dist/lib/schemas/knowledge.schema.js +81 -0
- package/dist/lib/schemas/knowledge.schema.js.map +1 -0
- package/dist/lib/schemas/orchestration.schema.d.ts +168 -0
- package/dist/lib/schemas/orchestration.schema.d.ts.map +1 -0
- package/dist/lib/schemas/orchestration.schema.js +133 -0
- package/dist/lib/schemas/orchestration.schema.js.map +1 -0
- package/dist/lib/schemas/plan.schema.d.ts +103 -0
- package/dist/lib/schemas/plan.schema.d.ts.map +1 -0
- package/dist/lib/schemas/plan.schema.js +58 -0
- package/dist/lib/schemas/plan.schema.js.map +1 -0
- package/dist/lib/sequelize-service.d.ts +23 -0
- package/dist/lib/sequelize-service.d.ts.map +1 -0
- package/dist/lib/sequelize-service.js +446 -0
- package/dist/lib/sequelize-service.js.map +1 -0
- package/dist/lib/source-hash.d.ts +39 -0
- package/dist/lib/source-hash.d.ts.map +1 -0
- package/dist/lib/source-hash.js +56 -0
- package/dist/lib/source-hash.js.map +1 -0
- package/dist/lib/stable-stringify.d.ts +32 -0
- package/dist/lib/stable-stringify.d.ts.map +1 -0
- package/dist/lib/stable-stringify.js +72 -0
- package/dist/lib/stable-stringify.js.map +1 -0
- package/dist/lib/streaming-utils.d.ts +60 -0
- package/dist/lib/streaming-utils.d.ts.map +1 -0
- package/dist/lib/streaming-utils.js +190 -0
- package/dist/lib/streaming-utils.js.map +1 -0
- package/dist/lib/utils/conversation-builder.d.ts +36 -0
- package/dist/lib/utils/conversation-builder.d.ts.map +1 -0
- package/dist/lib/utils/conversation-builder.js +132 -0
- package/dist/lib/utils/conversation-builder.js.map +1 -0
- package/dist/lib/utils/domain-matcher.d.ts +25 -0
- package/dist/lib/utils/domain-matcher.d.ts.map +1 -0
- package/dist/lib/utils/domain-matcher.js +42 -0
- package/dist/lib/utils/domain-matcher.js.map +1 -0
- package/dist/lib/utils/file-util.d.ts +157 -0
- package/dist/lib/utils/file-util.d.ts.map +1 -0
- package/dist/lib/utils/file-util.js +373 -0
- package/dist/lib/utils/file-util.js.map +1 -0
- package/dist/lib/utils/html-summarizer.d.ts +27 -0
- package/dist/lib/utils/html-summarizer.d.ts.map +1 -0
- package/dist/lib/utils/html-summarizer.js +189 -0
- package/dist/lib/utils/html-summarizer.js.map +1 -0
- package/dist/lib/utils/http-client.d.ts +108 -0
- package/dist/lib/utils/http-client.d.ts.map +1 -0
- package/dist/lib/utils/http-client.js +298 -0
- package/dist/lib/utils/http-client.js.map +1 -0
- package/dist/lib/utils/index.d.ts +12 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +28 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/utils/logger.d.ts +30 -0
- package/dist/lib/utils/logger.d.ts.map +1 -0
- package/dist/lib/utils/logger.js +88 -0
- package/dist/lib/utils/logger.js.map +1 -0
- package/dist/lib/utils/mcp-utils.d.ts +208 -0
- package/dist/lib/utils/mcp-utils.d.ts.map +1 -0
- package/dist/lib/utils/mcp-utils.js +451 -0
- package/dist/lib/utils/mcp-utils.js.map +1 -0
- package/dist/lib/utils/sequelize-service.d.ts +153 -0
- package/dist/lib/utils/sequelize-service.d.ts.map +1 -0
- package/dist/lib/utils/sequelize-service.js +339 -0
- package/dist/lib/utils/sequelize-service.js.map +1 -0
- package/dist/lib/utils/tool-call-extractor.d.ts +36 -0
- package/dist/lib/utils/tool-call-extractor.d.ts.map +1 -0
- package/dist/lib/utils/tool-call-extractor.js +121 -0
- package/dist/lib/utils/tool-call-extractor.js.map +1 -0
- package/dist/lib/utils/zod-to-json-schema.d.ts +17 -0
- package/dist/lib/utils/zod-to-json-schema.d.ts.map +1 -0
- package/dist/lib/utils/zod-to-json-schema.js +53 -0
- package/dist/lib/utils/zod-to-json-schema.js.map +1 -0
- package/dist/models/AgentRequest.d.ts +33 -0
- package/dist/models/AgentRequest.d.ts.map +1 -0
- package/dist/models/AgentRequest.js +49 -0
- package/dist/models/AgentRequest.js.map +1 -0
- package/dist/models/AgentRun.d.ts +44 -0
- package/dist/models/AgentRun.d.ts.map +1 -0
- package/dist/models/AgentRun.js +53 -0
- package/dist/models/AgentRun.js.map +1 -0
- package/dist/models/AuditLog.d.ts +37 -0
- package/dist/models/AuditLog.d.ts.map +1 -0
- package/dist/models/AuditLog.js +46 -0
- package/dist/models/AuditLog.js.map +1 -0
- package/dist/models/Conversation.d.ts +39 -0
- package/dist/models/Conversation.d.ts.map +1 -0
- package/dist/models/Conversation.js +49 -0
- package/dist/models/Conversation.js.map +1 -0
- package/dist/models/Embedding.d.ts +56 -0
- package/dist/models/Embedding.d.ts.map +1 -0
- package/dist/models/Embedding.js +36 -0
- package/dist/models/Embedding.js.map +1 -0
- package/dist/models/ExecutionPattern.d.ts +57 -0
- package/dist/models/ExecutionPattern.d.ts.map +1 -0
- package/dist/models/ExecutionPattern.js +61 -0
- package/dist/models/ExecutionPattern.js.map +1 -0
- package/dist/models/Knowledge.d.ts +49 -0
- package/dist/models/Knowledge.d.ts.map +1 -0
- package/dist/models/Knowledge.js +67 -0
- package/dist/models/Knowledge.js.map +1 -0
- package/dist/models/KnowledgeRevision.d.ts +35 -0
- package/dist/models/KnowledgeRevision.d.ts.map +1 -0
- package/dist/models/KnowledgeRevision.js +51 -0
- package/dist/models/KnowledgeRevision.js.map +1 -0
- package/dist/models/Plan.d.ts +34 -0
- package/dist/models/Plan.d.ts.map +1 -0
- package/dist/models/Plan.js +43 -0
- package/dist/models/Plan.js.map +1 -0
- package/dist/models/PlanStep.d.ts +56 -0
- package/dist/models/PlanStep.d.ts.map +1 -0
- package/dist/models/PlanStep.js +65 -0
- package/dist/models/PlanStep.js.map +1 -0
- package/dist/models/SourceData.d.ts +39 -0
- package/dist/models/SourceData.d.ts.map +1 -0
- package/dist/models/SourceData.js +18 -0
- package/dist/models/SourceData.js.map +1 -0
- package/dist/models/index.d.ts +36 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +179 -0
- package/dist/models/index.js.map +1 -0
- package/dist/routes/agent.routes.d.ts +13 -0
- package/dist/routes/agent.routes.d.ts.map +1 -0
- package/dist/routes/agent.routes.js +27 -0
- package/dist/routes/agent.routes.js.map +1 -0
- package/dist/routes/agent_request.routes.d.ts +13 -0
- package/dist/routes/agent_request.routes.d.ts.map +1 -0
- package/dist/routes/agent_request.routes.js +65 -0
- package/dist/routes/agent_request.routes.js.map +1 -0
- package/dist/routes/knowledge.routes.d.ts +13 -0
- package/dist/routes/knowledge.routes.d.ts.map +1 -0
- package/dist/routes/knowledge.routes.js +91 -0
- package/dist/routes/knowledge.routes.js.map +1 -0
- package/dist/routes/mcp.routes.d.ts +14 -0
- package/dist/routes/mcp.routes.d.ts.map +1 -0
- package/dist/routes/mcp.routes.js +27 -0
- package/dist/routes/mcp.routes.js.map +1 -0
- package/dist/sdk/index.d.ts +13 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +35 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/savant.sdk.d.ts +53 -0
- package/dist/sdk/savant.sdk.d.ts.map +1 -0
- package/dist/sdk/savant.sdk.js +120 -0
- package/dist/sdk/savant.sdk.js.map +1 -0
- package/dist/services/agent-request-service.d.ts +104 -0
- package/dist/services/agent-request-service.d.ts.map +1 -0
- package/dist/services/agent-request-service.js +319 -0
- package/dist/services/agent-request-service.js.map +1 -0
- package/dist/services/audit_log.service.d.ts +104 -0
- package/dist/services/audit_log.service.d.ts.map +1 -0
- package/dist/services/audit_log.service.js +339 -0
- package/dist/services/audit_log.service.js.map +1 -0
- package/dist/services/conversation.service.d.ts +90 -0
- package/dist/services/conversation.service.d.ts.map +1 -0
- package/dist/services/conversation.service.js +552 -0
- package/dist/services/conversation.service.js.map +1 -0
- package/dist/services/domain.service.d.ts +58 -0
- package/dist/services/domain.service.d.ts.map +1 -0
- package/dist/services/domain.service.js +244 -0
- package/dist/services/domain.service.js.map +1 -0
- package/dist/services/embedding.service.d.ts +132 -0
- package/dist/services/embedding.service.d.ts.map +1 -0
- package/dist/services/embedding.service.js +587 -0
- package/dist/services/embedding.service.js.map +1 -0
- package/dist/services/file_upload.service.d.ts +50 -0
- package/dist/services/file_upload.service.d.ts.map +1 -0
- package/dist/services/file_upload.service.js +172 -0
- package/dist/services/file_upload.service.js.map +1 -0
- package/dist/services/knowledge.service.d.ts +200 -0
- package/dist/services/knowledge.service.d.ts.map +1 -0
- package/dist/services/knowledge.service.js +784 -0
- package/dist/services/knowledge.service.js.map +1 -0
- package/dist/types/responses-api.types.d.ts +181 -0
- package/dist/types/responses-api.types.d.ts.map +1 -0
- package/dist/types/responses-api.types.js +12 -0
- package/dist/types/responses-api.types.js.map +1 -0
- package/package.json +145 -0
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Embedding Service
|
|
4
|
+
*
|
|
5
|
+
* Service for generating embeddings using Gemini and storing them in the database.
|
|
6
|
+
*
|
|
7
|
+
* @author MeasureOne, Inc.
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.EmbeddingService = void 0;
|
|
12
|
+
const genai_1 = require("@google/genai");
|
|
13
|
+
const logger_1 = require("../lib/utils/logger");
|
|
14
|
+
const models_1 = require("../models");
|
|
15
|
+
const uuid_1 = require("uuid");
|
|
16
|
+
const config_1 = require("../config");
|
|
17
|
+
const sequelize_service_1 = require("../lib/sequelize-service");
|
|
18
|
+
const sequelize_1 = require("sequelize");
|
|
19
|
+
const faiss_node_1 = require("faiss-node");
|
|
20
|
+
const logger = (0, logger_1.create_default_logger)("embedding-service");
|
|
21
|
+
/**
|
|
22
|
+
* Chunk text into smaller pieces with overlap
|
|
23
|
+
*/
|
|
24
|
+
function create_chunks(text, chunk_size = 1200, overlap = 150) {
|
|
25
|
+
const chunks = [];
|
|
26
|
+
let start = 0;
|
|
27
|
+
while (start < text.length) {
|
|
28
|
+
const end = Math.min(start + chunk_size, text.length);
|
|
29
|
+
chunks.push(text.slice(start, end));
|
|
30
|
+
if (end >= text.length)
|
|
31
|
+
break;
|
|
32
|
+
start = Math.max(start + 1, end - overlap);
|
|
33
|
+
}
|
|
34
|
+
return chunks;
|
|
35
|
+
}
|
|
36
|
+
class EmbeddingService {
|
|
37
|
+
constructor() {
|
|
38
|
+
this.default_model = "text-embedding-004"; // Gemini embedding model
|
|
39
|
+
// Query embedding cache (Phase 1 optimization)
|
|
40
|
+
// Primary strategy: Semantic similarity (embeddings indexed by hash)
|
|
41
|
+
// Secondary strategy: Exact text match (fast path, but rare for user queries)
|
|
42
|
+
this.query_embedding_cache = new Map();
|
|
43
|
+
this.EMBEDDING_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
44
|
+
this.MAX_EMBEDDING_CACHE_SIZE = 1000;
|
|
45
|
+
this.SEMANTIC_SIMILARITY_THRESHOLD = 0.92; // Lower threshold for better cache hits (was 0.95)
|
|
46
|
+
this.MAX_SEMANTIC_CHECKS = 50; // Limit similarity checks to prevent O(n) on large cache
|
|
47
|
+
// In-memory Faiss index for fast vector search
|
|
48
|
+
this.faiss_index_cache = new Map();
|
|
49
|
+
this.is_index_building = false;
|
|
50
|
+
const api_key = config_1.config_utils.get("GEMINI_API_KEY");
|
|
51
|
+
if (!api_key) {
|
|
52
|
+
throw new Error("GEMINI_API_KEY not configured");
|
|
53
|
+
}
|
|
54
|
+
this.gemini = new genai_1.GoogleGenAI({ apiKey: api_key });
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Builds or retrieves a cached Faiss index for a given model.
|
|
58
|
+
* This is the core of the search optimization.
|
|
59
|
+
* @param model - The embedding model name (e.g., "text-embedding-004")
|
|
60
|
+
*/
|
|
61
|
+
async get_or_build_faiss_index(model) {
|
|
62
|
+
if (this.faiss_index_cache.has(model)) {
|
|
63
|
+
return this.faiss_index_cache.get(model);
|
|
64
|
+
}
|
|
65
|
+
if (this.is_index_building) {
|
|
66
|
+
logger.info("Faiss index is already being built, waiting...");
|
|
67
|
+
// Simple wait loop, can be improved with event emitters for production
|
|
68
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
69
|
+
return this.get_or_build_faiss_index(model);
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
this.is_index_building = true;
|
|
73
|
+
logger.info(`Building Faiss index for model: ${model}...`);
|
|
74
|
+
const embeddings = await models_1.EmbeddingModel.findAll({
|
|
75
|
+
where: { model },
|
|
76
|
+
attributes: ['id', 'embedding', 'text', 'knowledge_id', 'knowledge_revision_id', 'source_data_id', 'chunk_index', 'type', 'domain'],
|
|
77
|
+
});
|
|
78
|
+
if (embeddings.length === 0) {
|
|
79
|
+
logger.warn(`No embeddings found for model ${model} to build index.`);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const dimension = JSON.parse(embeddings[0].embedding).length;
|
|
83
|
+
const index = new faiss_node_1.Index(dimension);
|
|
84
|
+
const vectors = [];
|
|
85
|
+
const metadata = [];
|
|
86
|
+
for (const emb of embeddings) {
|
|
87
|
+
try {
|
|
88
|
+
const vector = JSON.parse(emb.embedding);
|
|
89
|
+
// Validate vector dimension
|
|
90
|
+
if (!Array.isArray(vector) || vector.length !== dimension) {
|
|
91
|
+
logger.warn(`Skipping embedding with invalid dimension: ${emb.id} (expected ${dimension}, got ${Array.isArray(vector) ? vector.length : 'not an array'})`);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
vectors.push(vector);
|
|
95
|
+
metadata.push({
|
|
96
|
+
id: emb.id,
|
|
97
|
+
text: emb.text,
|
|
98
|
+
knowledge_id: emb.knowledge_id,
|
|
99
|
+
knowledge_revision_id: emb.knowledge_revision_id,
|
|
100
|
+
source_data_id: emb.source_data_id,
|
|
101
|
+
chunk_index: emb.chunk_index,
|
|
102
|
+
type: emb.type,
|
|
103
|
+
domain: emb.domain,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
logger.warn(`Skipping invalid embedding record: ${emb.id}`, { error: e instanceof Error ? e.message : String(e) });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (vectors.length > 0) {
|
|
111
|
+
// Add vectors one at a time (faiss-node add method expects single vector)
|
|
112
|
+
for (const vector of vectors) {
|
|
113
|
+
index.add(vector);
|
|
114
|
+
}
|
|
115
|
+
const index_data = { index, metadata };
|
|
116
|
+
this.faiss_index_cache.set(model, index_data);
|
|
117
|
+
logger.info(`✅ Faiss index built for model ${model} with ${index.ntotal()} vectors.`);
|
|
118
|
+
return index_data;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logger.error(`❌ Failed to build Faiss index for model ${model}`, { error });
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
this.is_index_building = false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Generate embedding with caching (Phase 1 optimization)
|
|
132
|
+
* Caches query embeddings to avoid redundant API calls
|
|
133
|
+
*
|
|
134
|
+
* Cache strategy (optimized for user-generated queries):
|
|
135
|
+
* 1. Quick exact text check (O(1) - fast path, but rare for user queries)
|
|
136
|
+
* 2. Generate embedding and check semantic similarity (primary strategy)
|
|
137
|
+
* 3. Cache by semantic similarity, not exact text (since exact matches are rare)
|
|
138
|
+
*
|
|
139
|
+
* Rationale: User queries are semantically similar but textually different.
|
|
140
|
+
* Exact text caching has low hit rate, so we prioritize semantic similarity.
|
|
141
|
+
*/
|
|
142
|
+
async generate_embedding_cached(text, model) {
|
|
143
|
+
const normalized_text = text.toLowerCase().trim();
|
|
144
|
+
const exact_cache_key = `${model}:${normalized_text}`;
|
|
145
|
+
// Step 1: Quick exact text check (O(1) - worth checking but expect low hit rate)
|
|
146
|
+
const exact_cached = this.query_embedding_cache.get(exact_cache_key);
|
|
147
|
+
if (exact_cached && Date.now() - exact_cached.timestamp < this.EMBEDDING_CACHE_TTL_MS) {
|
|
148
|
+
logger.debug('Query embedding cache hit (exact match)', {
|
|
149
|
+
cache_key: exact_cache_key.substring(0, 50) + '...',
|
|
150
|
+
cache_size: this.query_embedding_cache.size
|
|
151
|
+
});
|
|
152
|
+
return exact_cached.embedding;
|
|
153
|
+
}
|
|
154
|
+
// Step 2: Generate embedding (we need it anyway for semantic comparison)
|
|
155
|
+
const query_embedding = await this.generate_embedding(text, model);
|
|
156
|
+
const query_norm = Math.sqrt(query_embedding.reduce((sum, val) => sum + val * val, 0));
|
|
157
|
+
// Step 3: Check for semantically similar cached embeddings (primary strategy)
|
|
158
|
+
// Only check if cache has entries
|
|
159
|
+
if (this.query_embedding_cache.size > 0) {
|
|
160
|
+
const similar_match = this.find_similar_cached_embedding_sync(query_embedding, query_norm, model, this.SEMANTIC_SIMILARITY_THRESHOLD);
|
|
161
|
+
if (similar_match) {
|
|
162
|
+
logger.debug('Query embedding cache hit (semantic match)', {
|
|
163
|
+
query_text: text.substring(0, 50) + '...',
|
|
164
|
+
cache_size: this.query_embedding_cache.size,
|
|
165
|
+
threshold: this.SEMANTIC_SIMILARITY_THRESHOLD
|
|
166
|
+
});
|
|
167
|
+
// Cache exact text too (in case same user retries exact query)
|
|
168
|
+
// But don't duplicate the embedding - just reference it
|
|
169
|
+
this.set_cache_entry(exact_cache_key, query_embedding, query_norm, text);
|
|
170
|
+
return similar_match;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Step 4: No match found - cache the new embedding
|
|
174
|
+
logger.debug('Query embedding cache miss, caching new embedding', {
|
|
175
|
+
cache_key: exact_cache_key.substring(0, 50) + '...',
|
|
176
|
+
cache_size: this.query_embedding_cache.size
|
|
177
|
+
});
|
|
178
|
+
this.set_cache_entry(exact_cache_key, query_embedding, query_norm, text);
|
|
179
|
+
return query_embedding;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Set cache entry with LRU eviction
|
|
183
|
+
* Stores embedding with pre-computed norm for faster similarity calculations
|
|
184
|
+
*/
|
|
185
|
+
set_cache_entry(cache_key, embedding, embedding_norm, original_text) {
|
|
186
|
+
// Pre-compute norm if not provided
|
|
187
|
+
const norm = embedding_norm || Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
|
|
188
|
+
// LRU eviction: Remove oldest entry if cache is full
|
|
189
|
+
if (this.query_embedding_cache.size >= this.MAX_EMBEDDING_CACHE_SIZE) {
|
|
190
|
+
const oldest_key = Array.from(this.query_embedding_cache.entries())
|
|
191
|
+
.sort((a, b) => a[1].timestamp - b[1].timestamp)[0][0];
|
|
192
|
+
this.query_embedding_cache.delete(oldest_key);
|
|
193
|
+
logger.debug('Evicted oldest cache entry', {
|
|
194
|
+
evicted_key: oldest_key.substring(0, 50) + '...',
|
|
195
|
+
remaining_size: this.query_embedding_cache.size
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
this.query_embedding_cache.set(cache_key, {
|
|
199
|
+
embedding,
|
|
200
|
+
embedding_norm: norm,
|
|
201
|
+
timestamp: Date.now(),
|
|
202
|
+
original_text: original_text || cache_key
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Find semantically similar cached embedding (synchronous version)
|
|
207
|
+
* Checks cached embeddings for high similarity (>= threshold)
|
|
208
|
+
*
|
|
209
|
+
* Optimization: Limits checks to prevent O(n) performance on large cache
|
|
210
|
+
* Uses pre-computed norms for faster similarity calculation
|
|
211
|
+
*
|
|
212
|
+
* @param query_embedding - Pre-computed query embedding vector
|
|
213
|
+
* @param query_norm - Pre-computed query embedding norm
|
|
214
|
+
* @param model - Embedding model
|
|
215
|
+
* @param similarity_threshold - Minimum similarity threshold
|
|
216
|
+
* @returns Matching embedding or null
|
|
217
|
+
*/
|
|
218
|
+
find_similar_cached_embedding_sync(query_embedding, query_norm, model, similarity_threshold) {
|
|
219
|
+
const now = Date.now();
|
|
220
|
+
let checked_count = 0;
|
|
221
|
+
let best_match = null;
|
|
222
|
+
// Check cached embeddings (limit checks for performance)
|
|
223
|
+
for (const [cache_key, cached] of this.query_embedding_cache.entries()) {
|
|
224
|
+
// Only check embeddings from the same model
|
|
225
|
+
if (!cache_key.startsWith(`${model}:`)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Skip if cache entry is expired
|
|
229
|
+
if (now - cached.timestamp >= this.EMBEDDING_CACHE_TTL_MS) {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
// Limit number of similarity checks to prevent O(n) on large cache
|
|
233
|
+
if (checked_count >= this.MAX_SEMANTIC_CHECKS) {
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
// Calculate similarity using pre-computed norms
|
|
237
|
+
const similarity = this.cosine_similarity_optimized(query_embedding, cached.embedding, query_norm, cached.embedding_norm);
|
|
238
|
+
checked_count++;
|
|
239
|
+
// Track best match (even if below threshold, in case we want to lower threshold later)
|
|
240
|
+
if (!best_match || similarity > best_match.similarity) {
|
|
241
|
+
best_match = { embedding: cached.embedding, similarity };
|
|
242
|
+
}
|
|
243
|
+
// Return immediately if we find a match above threshold
|
|
244
|
+
if (similarity >= similarity_threshold) {
|
|
245
|
+
logger.debug('Found semantically similar cached embedding', {
|
|
246
|
+
cache_key: cache_key.substring(0, 50) + '...',
|
|
247
|
+
similarity: similarity.toFixed(4),
|
|
248
|
+
checked_count
|
|
249
|
+
});
|
|
250
|
+
return cached.embedding;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Log if we checked but didn't find a match
|
|
254
|
+
if (checked_count > 0 && best_match) {
|
|
255
|
+
logger.debug('No semantic match found above threshold', {
|
|
256
|
+
best_similarity: best_match.similarity.toFixed(4),
|
|
257
|
+
threshold: similarity_threshold,
|
|
258
|
+
checked_count,
|
|
259
|
+
cache_size: this.query_embedding_cache.size
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Generate embedding for a single text using Gemini
|
|
266
|
+
*
|
|
267
|
+
* @param text - Text to embed
|
|
268
|
+
* @param model - Embedding model (default: text-embedding-004)
|
|
269
|
+
* @returns Promise resolving to embedding vector
|
|
270
|
+
*/
|
|
271
|
+
async generate_embedding(text, model) {
|
|
272
|
+
try {
|
|
273
|
+
const embedding_model = model || this.default_model;
|
|
274
|
+
logger.debug("Generating embedding using Gemini", {
|
|
275
|
+
model: embedding_model,
|
|
276
|
+
text_length: text.length,
|
|
277
|
+
});
|
|
278
|
+
// Use Gemini's embedding API
|
|
279
|
+
// The @google/genai package uses models.embedContent method
|
|
280
|
+
const result = await this.gemini.models.embedContent({
|
|
281
|
+
model: embedding_model,
|
|
282
|
+
contents: [{
|
|
283
|
+
parts: [{ text }]
|
|
284
|
+
}]
|
|
285
|
+
});
|
|
286
|
+
// Extract embedding values from the response
|
|
287
|
+
// Gemini returns embeddings array, get the first one
|
|
288
|
+
const embedding_values = result.embeddings?.[0]?.values;
|
|
289
|
+
if (!embedding_values || embedding_values.length === 0) {
|
|
290
|
+
throw new Error("No embedding returned from Gemini");
|
|
291
|
+
}
|
|
292
|
+
logger.debug("Embedding generated successfully", {
|
|
293
|
+
model: embedding_model,
|
|
294
|
+
embedding_dimension: embedding_values.length,
|
|
295
|
+
});
|
|
296
|
+
return embedding_values;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
logger.error("Failed to generate embedding", { error });
|
|
300
|
+
throw new Error(`Failed to generate embedding: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Create embeddings for a document (works for both SEED and LEARNING types)
|
|
305
|
+
* This method chunks text, generates embeddings, and stores them in the database.
|
|
306
|
+
*
|
|
307
|
+
* @param knowledge_id - Required knowledge ID (must exist)
|
|
308
|
+
* @param knowledge_revision_id - Required revision ID (must exist)
|
|
309
|
+
* @param text - Text content to create embeddings for
|
|
310
|
+
* @param source_data_id - Optional source data ID
|
|
311
|
+
* @param model - Optional embedding model (defaults to default_model)
|
|
312
|
+
* @param type - Embedding type (SEED or LEARNING)
|
|
313
|
+
* @param domain - Required domain (normalized to lowercase)
|
|
314
|
+
*
|
|
315
|
+
* Note: This does NOT search for similar documents or create knowledge/revision.
|
|
316
|
+
* The caller must ensure knowledge_id and knowledge_revision_id already exist.
|
|
317
|
+
*/
|
|
318
|
+
async create_embeddings_for_document(knowledge_id, knowledge_revision_id, text, source_data_id, model, type, domain) {
|
|
319
|
+
// Validate required parameters
|
|
320
|
+
if (!knowledge_id || !knowledge_revision_id) {
|
|
321
|
+
throw new Error("knowledge_id and knowledge_revision_id are required for all embedding types");
|
|
322
|
+
}
|
|
323
|
+
// Validate domain
|
|
324
|
+
if (!domain || domain.trim().length === 0) {
|
|
325
|
+
throw new Error("Domain is required for all embedding types (SEED and LEARNING)");
|
|
326
|
+
}
|
|
327
|
+
// Normalize domain to lowercase for consistency
|
|
328
|
+
const normalized_domain = domain.trim().toLowerCase();
|
|
329
|
+
const embedding_model = model || this.default_model;
|
|
330
|
+
logger.info("Processing document for embeddings", {
|
|
331
|
+
knowledge_id,
|
|
332
|
+
knowledge_revision_id,
|
|
333
|
+
chunks_count: 0, // Will be set after chunking
|
|
334
|
+
model: embedding_model,
|
|
335
|
+
domain: normalized_domain
|
|
336
|
+
});
|
|
337
|
+
// Chunk the text
|
|
338
|
+
const chunks = create_chunks(text, 1200, 150);
|
|
339
|
+
logger.info("Document chunked", {
|
|
340
|
+
knowledge_id,
|
|
341
|
+
chunks_count: chunks.length,
|
|
342
|
+
domain: normalized_domain
|
|
343
|
+
});
|
|
344
|
+
// STEP 1: Generate all embeddings FIRST (outside transaction)
|
|
345
|
+
// This is the slow part (API calls) and should NOT hold a database lock
|
|
346
|
+
const all_embedding_records = [];
|
|
347
|
+
const batch_size = 10;
|
|
348
|
+
for (let i = 0; i < chunks.length; i += batch_size) {
|
|
349
|
+
const batch = chunks.slice(i, i + batch_size);
|
|
350
|
+
// Generate embeddings for batch (API calls - can take seconds/minutes)
|
|
351
|
+
const embedding_promises = batch.map((chunk, index) => this.generate_embedding(chunk, embedding_model).then((embedding) => ({
|
|
352
|
+
chunk_index: i + index,
|
|
353
|
+
text: chunk,
|
|
354
|
+
embedding,
|
|
355
|
+
})));
|
|
356
|
+
const results = await Promise.all(embedding_promises);
|
|
357
|
+
// Prepare embedding records for batch insert
|
|
358
|
+
for (const result of results) {
|
|
359
|
+
const embedding_record = {
|
|
360
|
+
id: (0, uuid_1.v4)(),
|
|
361
|
+
knowledge_id,
|
|
362
|
+
knowledge_revision_id,
|
|
363
|
+
source_data_id,
|
|
364
|
+
text: result.text,
|
|
365
|
+
embedding: JSON.stringify(result.embedding),
|
|
366
|
+
model: embedding_model,
|
|
367
|
+
chunk_index: result.chunk_index,
|
|
368
|
+
type: type, // Use the type parameter (SEED or LEARNING)
|
|
369
|
+
};
|
|
370
|
+
// Domain is required and guaranteed to be valid at this point
|
|
371
|
+
// Use normalized_domain to ensure lowercase storage
|
|
372
|
+
embedding_record.domain = normalized_domain;
|
|
373
|
+
all_embedding_records.push(embedding_record);
|
|
374
|
+
}
|
|
375
|
+
logger.debug('Prepared embedding records', {
|
|
376
|
+
total_records: all_embedding_records.length,
|
|
377
|
+
domain
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
// STEP 2: Only NOW start transaction for database writes
|
|
381
|
+
// Transaction is held open only for the brief database write operation
|
|
382
|
+
const sequelize = (0, sequelize_service_1.get_sequelize_service)();
|
|
383
|
+
const transaction = await sequelize.transaction();
|
|
384
|
+
try {
|
|
385
|
+
let embeddings_created = 0;
|
|
386
|
+
// Batch insert all embeddings in a single transaction (fast operation)
|
|
387
|
+
if (all_embedding_records.length > 0) {
|
|
388
|
+
await models_1.EmbeddingModel.bulkCreate(all_embedding_records, { transaction });
|
|
389
|
+
embeddings_created = all_embedding_records.length;
|
|
390
|
+
}
|
|
391
|
+
await transaction.commit();
|
|
392
|
+
logger.info("Document processed successfully", {
|
|
393
|
+
knowledge_id,
|
|
394
|
+
knowledge_revision_id,
|
|
395
|
+
embeddings_created,
|
|
396
|
+
});
|
|
397
|
+
return { embeddings_created, knowledge_id, knowledge_revision_id };
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
await transaction.rollback();
|
|
401
|
+
logger.error("Failed to process document", { knowledge_id, knowledge_revision_id, error });
|
|
402
|
+
throw error;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Find knowledge ID for learned patterns
|
|
407
|
+
*/
|
|
408
|
+
async find_learned_patterns_knowledge_id() {
|
|
409
|
+
try {
|
|
410
|
+
const app_id = config_1.config_utils.get("APPLICATION_ID") || "savant-orchestration";
|
|
411
|
+
const requester_id = config_1.config_utils.get("REQUESTER_ID") || "execution-learner";
|
|
412
|
+
const knowledge_records = await models_1.KnowledgeModel.findAll({
|
|
413
|
+
where: {
|
|
414
|
+
application_id: app_id,
|
|
415
|
+
requester_id: requester_id,
|
|
416
|
+
metadata: {
|
|
417
|
+
[sequelize_1.Op.like]: '%"purpose"%learned-patterns%'
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
limit: 1,
|
|
421
|
+
order: [["created_at", "DESC"]]
|
|
422
|
+
});
|
|
423
|
+
return knowledge_records.length > 0 ? knowledge_records[0].id : null;
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
logger.debug("Could not find learned patterns KB", { error });
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Search embeddings by similarity using a two-pass top-k approach
|
|
432
|
+
*
|
|
433
|
+
* @param query_text - Query text to search for
|
|
434
|
+
* @param knowledge_id - Optional knowledge ID to filter by (learned knowledge from LEARNING embeddings is ALWAYS included)
|
|
435
|
+
* @param limit - Maximum number of results (default: 10)
|
|
436
|
+
* @param model - Embedding model (default: text-embedding-004)
|
|
437
|
+
* @returns Promise resolving to array of similar embeddings with scores
|
|
438
|
+
*
|
|
439
|
+
* This optimized version uses a pre-built in-memory Faiss index for fast vector search.
|
|
440
|
+
*/
|
|
441
|
+
async search_embeddings(query_text, knowledge_id, limit = 10, model, type, domain) {
|
|
442
|
+
try {
|
|
443
|
+
const embedding_model = model || this.default_model;
|
|
444
|
+
// If filters are provided, query database first to get matching embedding IDs
|
|
445
|
+
// This allows us to filter Faiss results more efficiently
|
|
446
|
+
let allowed_embedding_ids = null;
|
|
447
|
+
if (knowledge_id || type || domain) {
|
|
448
|
+
const where_clause = { model: embedding_model };
|
|
449
|
+
if (knowledge_id) {
|
|
450
|
+
where_clause.knowledge_id = knowledge_id;
|
|
451
|
+
}
|
|
452
|
+
if (type) {
|
|
453
|
+
where_clause.type = type;
|
|
454
|
+
}
|
|
455
|
+
if (domain) {
|
|
456
|
+
// Domains are stored in lowercase, so we can use simple equality
|
|
457
|
+
where_clause.domain = domain.trim().toLowerCase();
|
|
458
|
+
}
|
|
459
|
+
const matching_embeddings = await models_1.EmbeddingModel.findAll({
|
|
460
|
+
where: where_clause,
|
|
461
|
+
attributes: ['id'],
|
|
462
|
+
});
|
|
463
|
+
if (matching_embeddings.length === 0) {
|
|
464
|
+
logger.debug("No embeddings found matching filters", { knowledge_id, type, domain });
|
|
465
|
+
return [];
|
|
466
|
+
}
|
|
467
|
+
allowed_embedding_ids = new Set(matching_embeddings.map(e => e.id));
|
|
468
|
+
logger.debug("Filtered embeddings by criteria", {
|
|
469
|
+
matching_count: allowed_embedding_ids.size,
|
|
470
|
+
knowledge_id,
|
|
471
|
+
type,
|
|
472
|
+
domain
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
// Build or get the cached Faiss index for the model.
|
|
476
|
+
const index_data = await this.get_or_build_faiss_index(embedding_model);
|
|
477
|
+
if (!index_data) {
|
|
478
|
+
logger.warn(`Faiss index not available for model ${embedding_model}. Cannot perform search.`);
|
|
479
|
+
return [];
|
|
480
|
+
}
|
|
481
|
+
// Generate embedding for query (using cached version)
|
|
482
|
+
const query_embedding = await this.generate_embedding_cached(query_text, embedding_model);
|
|
483
|
+
// Find learned patterns KB
|
|
484
|
+
const learned_patterns_knowledge_id = await this.find_learned_patterns_knowledge_id();
|
|
485
|
+
// Perform the search against the Faiss index
|
|
486
|
+
// Search for more results if we have filters (to account for filtering)
|
|
487
|
+
// But ensure we don't exceed the total number of vectors in the index
|
|
488
|
+
const index_ntotal = index_data.index.ntotal();
|
|
489
|
+
const requested_limit = allowed_embedding_ids ? limit * 3 : limit * 2;
|
|
490
|
+
const search_limit = Math.min(requested_limit, index_ntotal);
|
|
491
|
+
if (search_limit === 0) {
|
|
492
|
+
logger.debug("Index is empty, returning empty results");
|
|
493
|
+
return [];
|
|
494
|
+
}
|
|
495
|
+
const { labels, distances } = index_data.index.search(query_embedding, search_limit);
|
|
496
|
+
// Map results back to our metadata and filter by allowed IDs if filters were provided
|
|
497
|
+
const all_results = labels
|
|
498
|
+
.map((label, i) => {
|
|
499
|
+
const metadata = index_data.metadata[label];
|
|
500
|
+
// Faiss returns distance, convert to similarity (1 - distance for cosine)
|
|
501
|
+
const score = 1 - distances[i];
|
|
502
|
+
return { ...metadata, score };
|
|
503
|
+
})
|
|
504
|
+
.filter((result) => {
|
|
505
|
+
// If we have a filter set, only include results whose embedding ID is in the allowed set
|
|
506
|
+
if (allowed_embedding_ids && !allowed_embedding_ids.has(result.id)) {
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
return true;
|
|
510
|
+
});
|
|
511
|
+
// Sort by score and return top-k
|
|
512
|
+
const final_results = all_results
|
|
513
|
+
.sort((a, b) => b.score - a.score)
|
|
514
|
+
.slice(0, limit);
|
|
515
|
+
if (final_results.length === 0) {
|
|
516
|
+
logger.warn("No similar embeddings found in Faiss index", { knowledge_id, type, domain });
|
|
517
|
+
return [];
|
|
518
|
+
}
|
|
519
|
+
logger.debug("Faiss index search completed", {
|
|
520
|
+
initial_found: labels.length,
|
|
521
|
+
filtered_count: all_results.length,
|
|
522
|
+
final_count: final_results.length,
|
|
523
|
+
limit,
|
|
524
|
+
had_filters: !!allowed_embedding_ids
|
|
525
|
+
});
|
|
526
|
+
return final_results;
|
|
527
|
+
}
|
|
528
|
+
catch (error) {
|
|
529
|
+
logger.error("Failed to search embeddings", { error });
|
|
530
|
+
throw error;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Calculate cosine similarity between two vectors
|
|
535
|
+
*
|
|
536
|
+
* @param vec_a - First vector
|
|
537
|
+
* @param vec_b - Second vector
|
|
538
|
+
* @returns Cosine similarity score (0-1)
|
|
539
|
+
*/
|
|
540
|
+
cosine_similarity(vec_a, vec_b) {
|
|
541
|
+
if (vec_a.length !== vec_b.length) {
|
|
542
|
+
throw new Error("Vectors must have the same length");
|
|
543
|
+
}
|
|
544
|
+
let dot_product = 0;
|
|
545
|
+
let norm_a = 0;
|
|
546
|
+
let norm_b = 0;
|
|
547
|
+
for (let i = 0; i < vec_a.length; i++) {
|
|
548
|
+
dot_product += vec_a[i] * vec_b[i];
|
|
549
|
+
norm_a += vec_a[i] * vec_a[i];
|
|
550
|
+
norm_b += vec_b[i] * vec_b[i];
|
|
551
|
+
}
|
|
552
|
+
const denominator = Math.sqrt(norm_a) * Math.sqrt(norm_b);
|
|
553
|
+
if (denominator === 0) {
|
|
554
|
+
return 0;
|
|
555
|
+
}
|
|
556
|
+
return dot_product / denominator;
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Optimized cosine similarity calculation that reuses pre-computed norms
|
|
560
|
+
* This avoids recalculating norms for every comparison
|
|
561
|
+
*
|
|
562
|
+
* @param vec_a - Query vector
|
|
563
|
+
* @param vec_b - Embedding vector to compare
|
|
564
|
+
* @param vec_a_norm - Pre-computed norm of vec_a (sqrt of sum of squares)
|
|
565
|
+
* @param vec_b_norm - Optional pre-computed norm of vec_b (if not provided, calculates it)
|
|
566
|
+
* @returns Cosine similarity score (0-1)
|
|
567
|
+
*/
|
|
568
|
+
cosine_similarity_optimized(vec_a, vec_b, vec_a_norm, vec_b_norm) {
|
|
569
|
+
if (vec_a.length !== vec_b.length) {
|
|
570
|
+
throw new Error("Vectors must have the same length");
|
|
571
|
+
}
|
|
572
|
+
let dot_product = 0;
|
|
573
|
+
// Calculate dot product
|
|
574
|
+
for (let i = 0; i < vec_a.length; i++) {
|
|
575
|
+
dot_product += vec_a[i] * vec_b[i];
|
|
576
|
+
}
|
|
577
|
+
// Use pre-computed norm if provided, otherwise calculate it
|
|
578
|
+
const norm_b = vec_b_norm || Math.sqrt(vec_b.reduce((sum, val) => sum + val * val, 0));
|
|
579
|
+
const denominator = vec_a_norm * norm_b;
|
|
580
|
+
if (denominator === 0) {
|
|
581
|
+
return 0;
|
|
582
|
+
}
|
|
583
|
+
return dot_product / denominator;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
exports.EmbeddingService = EmbeddingService;
|
|
587
|
+
//# sourceMappingURL=embedding.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.service.js","sourceRoot":"","sources":["../../src/services/embedding.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview File Upload Service
|
|
3
|
+
*
|
|
4
|
+
* Service for handling file uploads and storing metadata in source_data table.
|
|
5
|
+
*
|
|
6
|
+
* @author MeasureOne, Inc.
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
import { SourceDataModel } from "../models";
|
|
10
|
+
export declare class FileUploadService {
|
|
11
|
+
private uploads_dir;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Ensure uploads directory exists
|
|
15
|
+
*/
|
|
16
|
+
private ensure_uploads_directory;
|
|
17
|
+
/**
|
|
18
|
+
* Save uploaded file and create source_data record
|
|
19
|
+
*
|
|
20
|
+
* @param file - Multer file object
|
|
21
|
+
* @param application_id - Optional application ID
|
|
22
|
+
* @param requester_id - Optional requester ID
|
|
23
|
+
* @returns Promise resolving to file_id
|
|
24
|
+
*/
|
|
25
|
+
save_file(file: Express.Multer.File, application_id?: string, requester_id?: string): Promise<{
|
|
26
|
+
file_id: string;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Get file path by file_id
|
|
30
|
+
*
|
|
31
|
+
* @param file_id - Source data ID
|
|
32
|
+
* @returns Promise resolving to file path
|
|
33
|
+
*/
|
|
34
|
+
get_file_path(file_id: string): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Read file content by file_id
|
|
37
|
+
*
|
|
38
|
+
* @param file_id - Source data ID
|
|
39
|
+
* @returns Promise resolving to file content as string
|
|
40
|
+
*/
|
|
41
|
+
read_file_content(file_id: string): Promise<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Get source data by ID
|
|
44
|
+
*
|
|
45
|
+
* @param file_id - Source data ID
|
|
46
|
+
* @returns Promise resolving to source data
|
|
47
|
+
*/
|
|
48
|
+
get_source_data(file_id: string): Promise<SourceDataModel>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=file_upload.service.d.ts.map
|