@mohamedtebo/convai-platform 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.md +155 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/memory-conversation.store.d.ts +12 -0
- package/dist/adapters/memory-conversation.store.d.ts.map +1 -0
- package/dist/adapters/memory-conversation.store.js +25 -0
- package/dist/adapters/memory-conversation.store.js.map +1 -0
- package/dist/composed/platform-client.d.ts +29 -0
- package/dist/composed/platform-client.d.ts.map +1 -0
- package/dist/composed/platform-client.js +16 -0
- package/dist/composed/platform-client.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +11 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/provider.error.d.ts +16 -0
- package/dist/errors/provider.error.d.ts.map +1 -0
- package/dist/errors/provider.error.js +15 -0
- package/dist/errors/provider.error.js.map +1 -0
- package/dist/errors/sdk.error.d.ts +15 -0
- package/dist/errors/sdk.error.d.ts.map +1 -0
- package/dist/errors/sdk.error.js +16 -0
- package/dist/errors/sdk.error.js.map +1 -0
- package/dist/errors/tool-loop.error.d.ts +11 -0
- package/dist/errors/tool-loop.error.d.ts.map +1 -0
- package/dist/errors/tool-loop.error.js +30 -0
- package/dist/errors/tool-loop.error.js.map +1 -0
- package/dist/factory/index.d.ts +2 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/factory/index.js +6 -0
- package/dist/factory/index.js.map +1 -0
- package/dist/factory/provider.factory.d.ts +8 -0
- package/dist/factory/provider.factory.d.ts.map +1 -0
- package/dist/factory/provider.factory.js +49 -0
- package/dist/factory/provider.factory.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic/anthropic.provider.d.ts +22 -0
- package/dist/providers/anthropic/anthropic.provider.d.ts.map +1 -0
- package/dist/providers/anthropic/anthropic.provider.js +34 -0
- package/dist/providers/anthropic/anthropic.provider.js.map +1 -0
- package/dist/providers/anthropic/loops/claude-tool.loop.d.ts +11 -0
- package/dist/providers/anthropic/loops/claude-tool.loop.d.ts.map +1 -0
- package/dist/providers/anthropic/loops/claude-tool.loop.js +58 -0
- package/dist/providers/anthropic/loops/claude-tool.loop.js.map +1 -0
- package/dist/providers/anthropic/utils/error-mapper.d.ts +4 -0
- package/dist/providers/anthropic/utils/error-mapper.d.ts.map +1 -0
- package/dist/providers/anthropic/utils/error-mapper.js +35 -0
- package/dist/providers/anthropic/utils/error-mapper.js.map +1 -0
- package/dist/providers/openai/builders/conversation-or-create.builder.d.ts +15 -0
- package/dist/providers/openai/builders/conversation-or-create.builder.d.ts.map +1 -0
- package/dist/providers/openai/builders/conversation-or-create.builder.js +18 -0
- package/dist/providers/openai/builders/conversation-or-create.builder.js.map +1 -0
- package/dist/providers/openai/loops/assistants-tool.loop.d.ts +19 -0
- package/dist/providers/openai/loops/assistants-tool.loop.d.ts.map +1 -0
- package/dist/providers/openai/loops/assistants-tool.loop.js +58 -0
- package/dist/providers/openai/loops/assistants-tool.loop.js.map +1 -0
- package/dist/providers/openai/loops/responses-tool.loop.d.ts +14 -0
- package/dist/providers/openai/loops/responses-tool.loop.d.ts.map +1 -0
- package/dist/providers/openai/loops/responses-tool.loop.js +87 -0
- package/dist/providers/openai/loops/responses-tool.loop.js.map +1 -0
- package/dist/providers/openai/openai-assistants.provider.d.ts +27 -0
- package/dist/providers/openai/openai-assistants.provider.d.ts.map +1 -0
- package/dist/providers/openai/openai-assistants.provider.js +40 -0
- package/dist/providers/openai/openai-assistants.provider.js.map +1 -0
- package/dist/providers/openai/openai-responses.provider.d.ts +25 -0
- package/dist/providers/openai/openai-responses.provider.d.ts.map +1 -0
- package/dist/providers/openai/openai-responses.provider.js +35 -0
- package/dist/providers/openai/openai-responses.provider.js.map +1 -0
- package/dist/providers/openai/operations/create-conversation.operation.d.ts +7 -0
- package/dist/providers/openai/operations/create-conversation.operation.d.ts.map +1 -0
- package/dist/providers/openai/operations/create-conversation.operation.js +22 -0
- package/dist/providers/openai/operations/create-conversation.operation.js.map +1 -0
- package/dist/providers/openai/operations/create-response.operation.d.ts +13 -0
- package/dist/providers/openai/operations/create-response.operation.d.ts.map +1 -0
- package/dist/providers/openai/operations/create-response.operation.js +27 -0
- package/dist/providers/openai/operations/create-response.operation.js.map +1 -0
- package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts +17 -0
- package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +1 -0
- package/dist/providers/openai/operations/submit-tool-outputs.operation.js +33 -0
- package/dist/providers/openai/operations/submit-tool-outputs.operation.js.map +1 -0
- package/dist/providers/openai/utils/error-mapper.d.ts +4 -0
- package/dist/providers/openai/utils/error-mapper.d.ts.map +1 -0
- package/dist/providers/openai/utils/error-mapper.js +45 -0
- package/dist/providers/openai/utils/error-mapper.js.map +1 -0
- package/dist/providers/openai/utils/usage-mapper.d.ts +10 -0
- package/dist/providers/openai/utils/usage-mapper.d.ts.map +1 -0
- package/dist/providers/openai/utils/usage-mapper.js +16 -0
- package/dist/providers/openai/utils/usage-mapper.js.map +1 -0
- package/dist/safe/index.d.ts +2 -0
- package/dist/safe/index.d.ts.map +1 -0
- package/dist/safe/index.js +6 -0
- package/dist/safe/index.js.map +1 -0
- package/dist/safe/safe-platform.client.d.ts +14 -0
- package/dist/safe/safe-platform.client.d.ts.map +1 -0
- package/dist/safe/safe-platform.client.js +56 -0
- package/dist/safe/safe-platform.client.js.map +1 -0
- package/dist/src/adapters/index.d.ts +2 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +6 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/memory-conversation.store.d.ts +12 -0
- package/dist/src/adapters/memory-conversation.store.d.ts.map +1 -0
- package/dist/src/adapters/memory-conversation.store.js +25 -0
- package/dist/src/adapters/memory-conversation.store.js.map +1 -0
- package/dist/src/composed/platform-client.d.ts +29 -0
- package/dist/src/composed/platform-client.d.ts.map +1 -0
- package/dist/src/composed/platform-client.js +16 -0
- package/dist/src/composed/platform-client.js.map +1 -0
- package/dist/src/errors/index.d.ts +4 -0
- package/dist/src/errors/index.d.ts.map +1 -0
- package/dist/src/errors/index.js +11 -0
- package/dist/src/errors/index.js.map +1 -0
- package/dist/src/errors/provider.error.d.ts +16 -0
- package/dist/src/errors/provider.error.d.ts.map +1 -0
- package/dist/src/errors/provider.error.js +15 -0
- package/dist/src/errors/provider.error.js.map +1 -0
- package/dist/src/errors/sdk.error.d.ts +15 -0
- package/dist/src/errors/sdk.error.d.ts.map +1 -0
- package/dist/src/errors/sdk.error.js +16 -0
- package/dist/src/errors/sdk.error.js.map +1 -0
- package/dist/src/errors/tool-loop.error.d.ts +11 -0
- package/dist/src/errors/tool-loop.error.d.ts.map +1 -0
- package/dist/src/errors/tool-loop.error.js +30 -0
- package/dist/src/errors/tool-loop.error.js.map +1 -0
- package/dist/src/factory/index.d.ts +2 -0
- package/dist/src/factory/index.d.ts.map +1 -0
- package/dist/src/factory/index.js +6 -0
- package/dist/src/factory/index.js.map +1 -0
- package/dist/src/factory/provider.factory.d.ts +8 -0
- package/dist/src/factory/provider.factory.d.ts.map +1 -0
- package/dist/src/factory/provider.factory.js +49 -0
- package/dist/src/factory/provider.factory.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +34 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/providers/anthropic/anthropic.provider.d.ts +22 -0
- package/dist/src/providers/anthropic/anthropic.provider.d.ts.map +1 -0
- package/dist/src/providers/anthropic/anthropic.provider.js +34 -0
- package/dist/src/providers/anthropic/anthropic.provider.js.map +1 -0
- package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts +11 -0
- package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts.map +1 -0
- package/dist/src/providers/anthropic/loops/claude-tool.loop.js +58 -0
- package/dist/src/providers/anthropic/loops/claude-tool.loop.js.map +1 -0
- package/dist/src/providers/anthropic/utils/error-mapper.d.ts +4 -0
- package/dist/src/providers/anthropic/utils/error-mapper.d.ts.map +1 -0
- package/dist/src/providers/anthropic/utils/error-mapper.js +35 -0
- package/dist/src/providers/anthropic/utils/error-mapper.js.map +1 -0
- package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts +15 -0
- package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts.map +1 -0
- package/dist/src/providers/openai/builders/conversation-or-create.builder.js +18 -0
- package/dist/src/providers/openai/builders/conversation-or-create.builder.js.map +1 -0
- package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts +19 -0
- package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts.map +1 -0
- package/dist/src/providers/openai/loops/assistants-tool.loop.js +58 -0
- package/dist/src/providers/openai/loops/assistants-tool.loop.js.map +1 -0
- package/dist/src/providers/openai/loops/responses-tool.loop.d.ts +14 -0
- package/dist/src/providers/openai/loops/responses-tool.loop.d.ts.map +1 -0
- package/dist/src/providers/openai/loops/responses-tool.loop.js +87 -0
- package/dist/src/providers/openai/loops/responses-tool.loop.js.map +1 -0
- package/dist/src/providers/openai/openai-assistants.provider.d.ts +27 -0
- package/dist/src/providers/openai/openai-assistants.provider.d.ts.map +1 -0
- package/dist/src/providers/openai/openai-assistants.provider.js +40 -0
- package/dist/src/providers/openai/openai-assistants.provider.js.map +1 -0
- package/dist/src/providers/openai/openai-responses.provider.d.ts +25 -0
- package/dist/src/providers/openai/openai-responses.provider.d.ts.map +1 -0
- package/dist/src/providers/openai/openai-responses.provider.js +35 -0
- package/dist/src/providers/openai/openai-responses.provider.js.map +1 -0
- package/dist/src/providers/openai/operations/create-conversation.operation.d.ts +7 -0
- package/dist/src/providers/openai/operations/create-conversation.operation.d.ts.map +1 -0
- package/dist/src/providers/openai/operations/create-conversation.operation.js +22 -0
- package/dist/src/providers/openai/operations/create-conversation.operation.js.map +1 -0
- package/dist/src/providers/openai/operations/create-response.operation.d.ts +13 -0
- package/dist/src/providers/openai/operations/create-response.operation.d.ts.map +1 -0
- package/dist/src/providers/openai/operations/create-response.operation.js +27 -0
- package/dist/src/providers/openai/operations/create-response.operation.js.map +1 -0
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts +17 -0
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +1 -0
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js +33 -0
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js.map +1 -0
- package/dist/src/providers/openai/utils/error-mapper.d.ts +4 -0
- package/dist/src/providers/openai/utils/error-mapper.d.ts.map +1 -0
- package/dist/src/providers/openai/utils/error-mapper.js +45 -0
- package/dist/src/providers/openai/utils/error-mapper.js.map +1 -0
- package/dist/src/providers/openai/utils/usage-mapper.d.ts +10 -0
- package/dist/src/providers/openai/utils/usage-mapper.d.ts.map +1 -0
- package/dist/src/providers/openai/utils/usage-mapper.js +16 -0
- package/dist/src/providers/openai/utils/usage-mapper.js.map +1 -0
- package/dist/src/safe/index.d.ts +2 -0
- package/dist/src/safe/index.d.ts.map +1 -0
- package/dist/src/safe/index.js +6 -0
- package/dist/src/safe/index.js.map +1 -0
- package/dist/src/safe/safe-platform.client.d.ts +14 -0
- package/dist/src/safe/safe-platform.client.d.ts.map +1 -0
- package/dist/src/safe/safe-platform.client.js +56 -0
- package/dist/src/safe/safe-platform.client.js.map +1 -0
- package/dist/src/types/ask-with-tools.types.d.ts +48 -0
- package/dist/src/types/ask-with-tools.types.d.ts.map +1 -0
- package/dist/src/types/ask-with-tools.types.js +3 -0
- package/dist/src/types/ask-with-tools.types.js.map +1 -0
- package/dist/src/types/client-config.interface.d.ts +33 -0
- package/dist/src/types/client-config.interface.d.ts.map +1 -0
- package/dist/src/types/client-config.interface.js +3 -0
- package/dist/src/types/client-config.interface.js.map +1 -0
- package/dist/src/types/conversation-store.interface.d.ts +24 -0
- package/dist/src/types/conversation-store.interface.d.ts.map +1 -0
- package/dist/src/types/conversation-store.interface.js +3 -0
- package/dist/src/types/conversation-store.interface.js.map +1 -0
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +7 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/provider.interface.d.ts +13 -0
- package/dist/src/types/provider.interface.d.ts.map +1 -0
- package/dist/src/types/provider.interface.js +3 -0
- package/dist/src/types/provider.interface.js.map +1 -0
- package/dist/src/types/sdk-result.interface.d.ts +30 -0
- package/dist/src/types/sdk-result.interface.d.ts.map +1 -0
- package/dist/src/types/sdk-result.interface.js +11 -0
- package/dist/src/types/sdk-result.interface.js.map +1 -0
- package/dist/src/types/tool-handler.interface.d.ts +45 -0
- package/dist/src/types/tool-handler.interface.d.ts.map +1 -0
- package/dist/src/types/tool-handler.interface.js +3 -0
- package/dist/src/types/tool-handler.interface.js.map +1 -0
- package/dist/tests/safe-client.test.d.ts +2 -0
- package/dist/tests/safe-client.test.d.ts.map +1 -0
- package/dist/tests/safe-client.test.js +66 -0
- package/dist/tests/safe-client.test.js.map +1 -0
- package/dist/types/ask-with-tools.types.d.ts +48 -0
- package/dist/types/ask-with-tools.types.d.ts.map +1 -0
- package/dist/types/ask-with-tools.types.js +3 -0
- package/dist/types/ask-with-tools.types.js.map +1 -0
- package/dist/types/client-config.interface.d.ts +33 -0
- package/dist/types/client-config.interface.d.ts.map +1 -0
- package/dist/types/client-config.interface.js +3 -0
- package/dist/types/client-config.interface.js.map +1 -0
- package/dist/types/conversation-store.interface.d.ts +24 -0
- package/dist/types/conversation-store.interface.d.ts.map +1 -0
- package/dist/types/conversation-store.interface.js +3 -0
- package/dist/types/conversation-store.interface.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provider.interface.d.ts +13 -0
- package/dist/types/provider.interface.d.ts.map +1 -0
- package/dist/types/provider.interface.js +3 -0
- package/dist/types/provider.interface.js.map +1 -0
- package/dist/types/sdk-result.interface.d.ts +30 -0
- package/dist/types/sdk-result.interface.d.ts.map +1 -0
- package/dist/types/sdk-result.interface.js +11 -0
- package/dist/types/sdk-result.interface.js.map +1 -0
- package/dist/types/tool-handler.interface.d.ts +45 -0
- package/dist/types/tool-handler.interface.d.ts.map +1 -0
- package/dist/types/tool-handler.interface.js +3 -0
- package/dist/types/tool-handler.interface.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AnthropicProvider = void 0;
|
|
4
|
+
const claude_tool_loop_1 = require("./loops/claude-tool.loop");
|
|
5
|
+
const error_mapper_1 = require("./utils/error-mapper");
|
|
6
|
+
/**
|
|
7
|
+
* Anthropic Claude provider.
|
|
8
|
+
* Implements the same AIProvider interface as the OpenAI providers
|
|
9
|
+
* so telbany can swap providers by changing a single config field.
|
|
10
|
+
*/
|
|
11
|
+
class AnthropicProvider {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
try {
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
15
|
+
const Anthropic = require('@anthropic-ai/sdk');
|
|
16
|
+
this.anthropic = new Anthropic({ apiKey: config.apiKey, maxRetries: config.maxRetries ?? 2 });
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error('@anthropic-ai/sdk is required when using AnthropicProvider. Run: npm install @anthropic-ai/sdk');
|
|
20
|
+
}
|
|
21
|
+
this.model = config.model;
|
|
22
|
+
this.handler = config.toolHandler;
|
|
23
|
+
}
|
|
24
|
+
async askWithTools(params) {
|
|
25
|
+
try {
|
|
26
|
+
return await (0, claude_tool_loop_1.runClaudeToolLoop)({ anthropic: this.anthropic, model: this.model, handler: this.handler }, params);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
throw (0, error_mapper_1.mapAnthropicError)(err);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.AnthropicProvider = AnthropicProvider;
|
|
34
|
+
//# sourceMappingURL=anthropic.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.provider.js","sourceRoot":"","sources":["../../../src/providers/anthropic/anthropic.provider.ts"],"names":[],"mappings":";;;AAGA,+DAA6D;AAC7D,uDAAyD;AASzD;;;;GAIG;AACH,MAAa,iBAAiB;IAK5B,YAAY,MAA+B;QACzC,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;QACpH,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,oCAAiB,EAC5B,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACvE,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAA,gCAAiB,EAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;AA3BD,8CA2BC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AskWithToolsParams, AskWithToolsResult } from '../../../types/ask-with-tools.types';
|
|
2
|
+
import type { ToolHandler } from '../../../types/tool-handler.interface';
|
|
3
|
+
interface ClaudeLoopContext {
|
|
4
|
+
anthropic: unknown;
|
|
5
|
+
model: string;
|
|
6
|
+
handler?: ToolHandler;
|
|
7
|
+
}
|
|
8
|
+
/** Run the Anthropic tool loop for one user turn. */
|
|
9
|
+
export declare function runClaudeToolLoop(ctx: ClaudeLoopContext, params: AskWithToolsParams): Promise<AskWithToolsResult>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=claude-tool.loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-tool.loop.d.ts","sourceRoot":"","sources":["../../../../src/providers/anthropic/loops/claude-tool.loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,uCAAuC,CAAC;AAKlG,UAAU,iBAAiB;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAID,qDAAqD;AACrD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA+C7B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runClaudeToolLoop = runClaudeToolLoop;
|
|
4
|
+
const errors_1 = require("../../../errors");
|
|
5
|
+
const MAX_TURNS = 10;
|
|
6
|
+
/** Run the Anthropic tool loop for one user turn. */
|
|
7
|
+
async function runClaudeToolLoop(ctx, params) {
|
|
8
|
+
const { anthropic, model, handler } = ctx;
|
|
9
|
+
const messages = [{ role: 'user', content: params.userQuestion }];
|
|
10
|
+
for (let turn = 0; turn < MAX_TURNS; turn++) {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
const sdk = anthropic;
|
|
13
|
+
const response = await sdk.messages.create({
|
|
14
|
+
model: params.model ?? model,
|
|
15
|
+
max_tokens: 4096,
|
|
16
|
+
system: params.instructions,
|
|
17
|
+
tools: params.tools ?? [],
|
|
18
|
+
messages,
|
|
19
|
+
});
|
|
20
|
+
const responseId = response.id;
|
|
21
|
+
const stopReason = response.stop_reason;
|
|
22
|
+
if (stopReason === 'end_turn') {
|
|
23
|
+
const text = response.content
|
|
24
|
+
.filter((b) => b.type === 'text')
|
|
25
|
+
.map((b) => b.text ?? '')
|
|
26
|
+
.join('');
|
|
27
|
+
return { kind: 'text', outputText: text, responseId, usage: mapClaudeUsage(response.usage), model: params.model ?? model };
|
|
28
|
+
}
|
|
29
|
+
if (stopReason === 'tool_use') {
|
|
30
|
+
if (!handler)
|
|
31
|
+
throw new errors_1.NoToolHandlerError();
|
|
32
|
+
messages.push({ role: 'assistant', content: response.content });
|
|
33
|
+
const toolUseBlocks = response.content.filter((b) => b.type === 'tool_use');
|
|
34
|
+
const calls = toolUseBlocks.map((b) => ({ id: b.id, name: b.name, arguments: JSON.stringify(b.input) }));
|
|
35
|
+
const toolContext = { threadKey: params.threadKey, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion };
|
|
36
|
+
const outputs = [];
|
|
37
|
+
for (const call of calls) {
|
|
38
|
+
const out = await handler.buildOutput(call, toolContext);
|
|
39
|
+
if (out)
|
|
40
|
+
outputs.push(out);
|
|
41
|
+
}
|
|
42
|
+
const appResult = await handler.extractResult(calls, outputs, toolContext);
|
|
43
|
+
if (appResult !== null) {
|
|
44
|
+
return { kind: 'toolResult', toolCallResult: appResult, responseId, usage: null, model: params.model ?? model };
|
|
45
|
+
}
|
|
46
|
+
const toolResultContent = outputs.map((o) => ({ type: 'tool_result', tool_use_id: o.call_id, content: o.output }));
|
|
47
|
+
messages.push({ role: 'user', content: toolResultContent });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new errors_1.ToolLoopError(MAX_TURNS);
|
|
51
|
+
}
|
|
52
|
+
function mapClaudeUsage(usage) {
|
|
53
|
+
if (!usage || typeof usage !== 'object')
|
|
54
|
+
return null;
|
|
55
|
+
const u = usage;
|
|
56
|
+
return { inputTokens: u['input_tokens'] ?? 0, outputTokens: u['output_tokens'] ?? 0, totalTokens: (u['input_tokens'] ?? 0) + (u['output_tokens'] ?? 0) };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=claude-tool.loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-tool.loop.js","sourceRoot":"","sources":["../../../../src/providers/anthropic/loops/claude-tool.loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-mapper.d.ts","sourceRoot":"","sources":["../../../../src/providers/anthropic/utils/error-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAS/D,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAmB7D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapAnthropicError = mapAnthropicError;
|
|
4
|
+
const provider_error_1 = require("../../../errors/provider.error");
|
|
5
|
+
/** Map an Anthropic SDK error to a typed ProviderError. */
|
|
6
|
+
function mapAnthropicError(err) {
|
|
7
|
+
const apiErr = err;
|
|
8
|
+
if (apiErr?.status !== undefined) {
|
|
9
|
+
const retryable = apiErr.status === 429 || (apiErr.status >= 500 && apiErr.status < 600);
|
|
10
|
+
const retryAfterMs = retryable ? parseRetryAfter(apiErr.headers) : undefined;
|
|
11
|
+
return new provider_error_1.ProviderError({
|
|
12
|
+
provider: 'anthropic',
|
|
13
|
+
code: `ANTHROPIC_${apiErr.status}`,
|
|
14
|
+
message: apiErr.error?.message ?? apiErr.message ?? 'Anthropic API error',
|
|
15
|
+
statusCode: apiErr.status,
|
|
16
|
+
retryable,
|
|
17
|
+
retryAfterMs,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return new provider_error_1.ProviderError({
|
|
21
|
+
provider: 'anthropic',
|
|
22
|
+
code: 'ANTHROPIC_UNEXPECTED',
|
|
23
|
+
message: err instanceof Error ? err.message : 'Unexpected Anthropic error',
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function parseRetryAfter(headers) {
|
|
27
|
+
if (!headers)
|
|
28
|
+
return undefined;
|
|
29
|
+
const v = headers['retry-after'] ?? headers['Retry-After'];
|
|
30
|
+
if (!v)
|
|
31
|
+
return undefined;
|
|
32
|
+
const s = parseInt(v, 10);
|
|
33
|
+
return isNaN(s) ? undefined : s * 1000;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=error-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-mapper.js","sourceRoot":"","sources":["../../../../src/providers/anthropic/utils/error-mapper.ts"],"names":[],"mappings":";;AAUA,8CAmBC;AA7BD,mEAA+D;AAS/D,2DAA2D;AAC3D,SAAgB,iBAAiB,CAAC,GAAY;IAC5C,MAAM,MAAM,GAAG,GAAwB,CAAC;IACxC,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QACzF,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,OAAO,IAAI,8BAAa,CAAC;YACvB,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,aAAa,MAAM,CAAC,MAAM,EAAE;YAClC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,qBAAqB;YACzE,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,SAAS;YACT,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,8BAAa,CAAC;QACvB,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B;KAC3E,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,OAAgC;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type OpenAI from 'openai';
|
|
2
|
+
import type { ConversationStore } from '../../../types/conversation-store.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the conversationId for a thread.
|
|
5
|
+
* Creates a new OpenAI conversation when none exists yet (lazy creation).
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveConversationId({ openai, store, threadKey, }: {
|
|
8
|
+
openai: OpenAI;
|
|
9
|
+
store: ConversationStore;
|
|
10
|
+
threadKey: string;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
conversationId: string;
|
|
13
|
+
lastResponseId: string | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=conversation-or-create.builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-or-create.builder.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/builders/conversation-or-create.builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAGrF;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,EAC1C,MAAM,EACN,KAAK,EACL,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAU1E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveConversationId = resolveConversationId;
|
|
4
|
+
const create_conversation_operation_1 = require("../operations/create-conversation.operation");
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the conversationId for a thread.
|
|
7
|
+
* Creates a new OpenAI conversation when none exists yet (lazy creation).
|
|
8
|
+
*/
|
|
9
|
+
async function resolveConversationId({ openai, store, threadKey, }) {
|
|
10
|
+
const existing = await store.load(threadKey);
|
|
11
|
+
if (existing) {
|
|
12
|
+
return { conversationId: existing.conversationId, lastResponseId: existing.lastResponseId };
|
|
13
|
+
}
|
|
14
|
+
const conversationId = await (0, create_conversation_operation_1.createConversation)(openai);
|
|
15
|
+
await store.create(threadKey, conversationId);
|
|
16
|
+
return { conversationId, lastResponseId: undefined };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=conversation-or-create.builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-or-create.builder.js","sourceRoot":"","sources":["../../../../src/providers/openai/builders/conversation-or-create.builder.ts"],"names":[],"mappings":";;AAQA,sDAkBC;AAxBD,+FAAiF;AAEjF;;;GAGG;AACI,KAAK,UAAU,qBAAqB,CAAC,EAC1C,MAAM,EACN,KAAK,EACL,SAAS,GAKV;IACC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC9F,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,IAAA,kDAAkB,EAAC,MAAM,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type OpenAI from 'openai';
|
|
2
|
+
import type { AskWithToolsResult } from '../../../types/ask-with-tools.types';
|
|
3
|
+
import type { ToolHandler } from '../../../types/tool-handler.interface';
|
|
4
|
+
interface AssistantsLoopCtx {
|
|
5
|
+
openai: OpenAI;
|
|
6
|
+
handler?: ToolHandler;
|
|
7
|
+
}
|
|
8
|
+
export interface AssistantsLoopParams {
|
|
9
|
+
threadId: string;
|
|
10
|
+
runId: string;
|
|
11
|
+
chatbotId: string;
|
|
12
|
+
organizationId?: string;
|
|
13
|
+
userQuestion: string;
|
|
14
|
+
model: string;
|
|
15
|
+
}
|
|
16
|
+
/** Poll a beta.threads run until completion, executing tool calls via the ToolHandler. */
|
|
17
|
+
export declare function runAssistantsToolLoop(ctx: AssistantsLoopCtx, params: AssistantsLoopParams): Promise<AskWithToolsResult>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=assistants-tool.loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistants-tool.loop.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/loops/assistants-tool.loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,uCAAuC,CAAC;AAOtF,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0FAA0F;AAC1F,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA+C7B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runAssistantsToolLoop = runAssistantsToolLoop;
|
|
4
|
+
const errors_1 = require("../../../errors");
|
|
5
|
+
const usage_mapper_1 = require("../utils/usage-mapper");
|
|
6
|
+
const MAX_POLLS = 60;
|
|
7
|
+
const POLL_INTERVAL_MS = 1000;
|
|
8
|
+
/** Poll a beta.threads run until completion, executing tool calls via the ToolHandler. */
|
|
9
|
+
async function runAssistantsToolLoop(ctx, params) {
|
|
10
|
+
const { openai, handler } = ctx;
|
|
11
|
+
for (let poll = 0; poll < MAX_POLLS; poll++) {
|
|
12
|
+
await sleep(POLL_INTERVAL_MS);
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
const run = await openai.beta.threads.runs.retrieve(params.threadId, params.runId);
|
|
15
|
+
if (run.status === 'completed') {
|
|
16
|
+
const messages = await openai.beta.threads.messages.list(params.threadId, { limit: 1 });
|
|
17
|
+
const first = messages.data[0];
|
|
18
|
+
const text = first?.content
|
|
19
|
+
.filter((c) => c.type === 'text')
|
|
20
|
+
.map((c) => c.text.value)
|
|
21
|
+
.join('') ?? '';
|
|
22
|
+
return { kind: 'text', outputText: text, responseId: run.id, usage: (0, usage_mapper_1.mapUsage)(run.usage), model: params.model };
|
|
23
|
+
}
|
|
24
|
+
if (run.status === 'requires_action') {
|
|
25
|
+
if (!handler)
|
|
26
|
+
throw new errors_1.NoToolHandlerError();
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
const rawToolCalls = (run.required_action?.submit_tool_outputs?.tool_calls ?? []);
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
const toolCalls = rawToolCalls.map((tc) => ({
|
|
31
|
+
id: tc.id, name: tc.function.name, arguments: tc.function.arguments,
|
|
32
|
+
}));
|
|
33
|
+
const toolContext = { threadKey: params.threadId, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion };
|
|
34
|
+
const outputs = [];
|
|
35
|
+
for (const call of toolCalls) {
|
|
36
|
+
const out = await handler.buildOutput(call, toolContext);
|
|
37
|
+
if (out)
|
|
38
|
+
outputs.push(out);
|
|
39
|
+
}
|
|
40
|
+
const appResult = await handler.extractResult(toolCalls, outputs, toolContext);
|
|
41
|
+
if (appResult !== null) {
|
|
42
|
+
return { kind: 'toolResult', toolCallResult: appResult, responseId: run.id, usage: null, model: params.model };
|
|
43
|
+
}
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
+
await openai.beta.threads.runs.submitToolOutputs(params.threadId, params.runId, {
|
|
46
|
+
tool_outputs: outputs.map((o) => ({ tool_call_id: o.call_id, output: o.output })),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (['failed', 'cancelled', 'expired'].includes(run.status)) {
|
|
50
|
+
throw new Error(`Assistants run ended with status: ${run.status}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw new errors_1.ToolLoopError(MAX_POLLS);
|
|
54
|
+
}
|
|
55
|
+
function sleep(ms) {
|
|
56
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=assistants-tool.loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistants-tool.loop.js","sourceRoot":"","sources":["../../../../src/providers/openai/loops/assistants-tool.loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type OpenAI from 'openai';
|
|
2
|
+
import type { AskWithToolsParams, AskWithToolsResult } from '../../../types/ask-with-tools.types';
|
|
3
|
+
import type { ToolHandler } from '../../../types/tool-handler.interface';
|
|
4
|
+
import type { ConversationStore } from '../../../types/conversation-store.interface';
|
|
5
|
+
interface LoopContext {
|
|
6
|
+
openai: OpenAI;
|
|
7
|
+
store: ConversationStore;
|
|
8
|
+
handler?: ToolHandler;
|
|
9
|
+
model: string;
|
|
10
|
+
}
|
|
11
|
+
/** Run the full Responses API tool loop for one user turn. */
|
|
12
|
+
export declare function runResponsesToolLoop(ctx: LoopContext, params: AskWithToolsParams, conversationId: string, previousResponseId: string | undefined): Promise<AskWithToolsResult>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=responses-tool.loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses-tool.loop.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/loops/responses-tool.loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,uCAAuC,CAAC;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAQrF,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8DAA8D;AAC9D,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,kBAAkB,EAC1B,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,GAAG,SAAS,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAyD7B"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runResponsesToolLoop = runResponsesToolLoop;
|
|
4
|
+
const create_response_operation_1 = require("../operations/create-response.operation");
|
|
5
|
+
const submit_tool_outputs_operation_1 = require("../operations/submit-tool-outputs.operation");
|
|
6
|
+
const usage_mapper_1 = require("../utils/usage-mapper");
|
|
7
|
+
const errors_1 = require("../../../errors");
|
|
8
|
+
const MAX_TURNS = 10;
|
|
9
|
+
/** Run the full Responses API tool loop for one user turn. */
|
|
10
|
+
async function runResponsesToolLoop(ctx, params, conversationId, previousResponseId) {
|
|
11
|
+
const { openai, store, handler, model } = ctx;
|
|
12
|
+
let lastResponseId = previousResponseId;
|
|
13
|
+
for (let turn = 0; turn < MAX_TURNS; turn++) {
|
|
14
|
+
const response = (await (turn === 0
|
|
15
|
+
? (0, create_response_operation_1.createResponse)(openai, {
|
|
16
|
+
conversationId,
|
|
17
|
+
previousResponseId: lastResponseId,
|
|
18
|
+
model,
|
|
19
|
+
instructions: params.instructions,
|
|
20
|
+
userQuestion: params.userQuestion,
|
|
21
|
+
tools: params.tools,
|
|
22
|
+
vectorStoreIds: params.vectorStoreIds,
|
|
23
|
+
})
|
|
24
|
+
: Promise.resolve(null)));
|
|
25
|
+
// On re-entry submit tool outputs instead
|
|
26
|
+
if (turn > 0 || !response)
|
|
27
|
+
break;
|
|
28
|
+
const raw = response;
|
|
29
|
+
const responseId = raw['id'];
|
|
30
|
+
lastResponseId = responseId;
|
|
31
|
+
await store.save(params.threadKey, { conversationId, lastResponseId: responseId });
|
|
32
|
+
const status = raw['status'];
|
|
33
|
+
if (status === 'completed') {
|
|
34
|
+
const outputText = extractOutputText(raw);
|
|
35
|
+
return { kind: 'text', outputText, responseId, usage: (0, usage_mapper_1.mapUsage)(raw['usage']), model };
|
|
36
|
+
}
|
|
37
|
+
if (status === 'requires_action' || status === 'failed_with_tool_calls') {
|
|
38
|
+
if (!handler)
|
|
39
|
+
throw new errors_1.NoToolHandlerError();
|
|
40
|
+
const calls = extractToolCalls(raw);
|
|
41
|
+
const toolContext = { threadKey: params.threadKey, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion, mediaUrl: params.mediaUrl };
|
|
42
|
+
const outputs = [];
|
|
43
|
+
for (const call of calls) {
|
|
44
|
+
const out = await handler.buildOutput(call, toolContext);
|
|
45
|
+
if (out)
|
|
46
|
+
outputs.push(out);
|
|
47
|
+
}
|
|
48
|
+
const appResult = await handler.extractResult(calls, outputs, toolContext);
|
|
49
|
+
if (appResult !== null) {
|
|
50
|
+
return { kind: 'toolResult', toolCallResult: appResult, responseId, usage: (0, usage_mapper_1.mapUsage)(raw['usage']), model };
|
|
51
|
+
}
|
|
52
|
+
const nextResponse = await (0, submit_tool_outputs_operation_1.submitToolOutputs)(openai, { previousResponseId: responseId, conversationId, model, instructions: params.instructions, toolOutputs: outputs, tools: params.tools });
|
|
53
|
+
const nextId = nextResponse['id'];
|
|
54
|
+
await store.save(params.threadKey, { conversationId, lastResponseId: nextId });
|
|
55
|
+
lastResponseId = nextId;
|
|
56
|
+
const nextStatus = nextResponse['status'];
|
|
57
|
+
if (nextStatus === 'completed') {
|
|
58
|
+
return { kind: 'text', outputText: extractOutputText(nextResponse), responseId: nextId, usage: (0, usage_mapper_1.mapUsage)(nextResponse['usage']), model };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
throw new errors_1.ToolLoopError(MAX_TURNS);
|
|
63
|
+
}
|
|
64
|
+
function extractOutputText(response) {
|
|
65
|
+
const output = response['output'];
|
|
66
|
+
if (!Array.isArray(output))
|
|
67
|
+
return '';
|
|
68
|
+
const textBlock = output.find((b) => b['type'] === 'message');
|
|
69
|
+
if (!textBlock)
|
|
70
|
+
return '';
|
|
71
|
+
const content = textBlock['content'];
|
|
72
|
+
if (!Array.isArray(content))
|
|
73
|
+
return '';
|
|
74
|
+
return content.map((c) => c['text'] ?? '').join('');
|
|
75
|
+
}
|
|
76
|
+
function extractToolCalls(response) {
|
|
77
|
+
const output = response['output'];
|
|
78
|
+
if (!Array.isArray(output))
|
|
79
|
+
return [];
|
|
80
|
+
return output
|
|
81
|
+
.filter((b) => b['type'] === 'function_call')
|
|
82
|
+
.map((b) => {
|
|
83
|
+
const block = b;
|
|
84
|
+
return { id: block['call_id'], name: block['name'], arguments: block['arguments'] };
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=responses-tool.loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses-tool.loop.js","sourceRoot":"","sources":["../../../../src/providers/openai/loops/responses-tool.loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AIProvider } from '../../types/provider.interface';
|
|
2
|
+
import type { AskWithToolsParams, AskWithToolsResult } from '../../types/ask-with-tools.types';
|
|
3
|
+
import type { ToolHandler } from '../../types/tool-handler.interface';
|
|
4
|
+
export interface OpenAIAssistantsProviderConfig {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
assistantId: string;
|
|
7
|
+
model: string;
|
|
8
|
+
toolHandler?: ToolHandler;
|
|
9
|
+
maxRetries?: number;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Legacy OpenAI Assistants API provider.
|
|
14
|
+
* Use this during the dual-run migration period until all threads are moved
|
|
15
|
+
* to the Responses + Conversations API, then remove.
|
|
16
|
+
*
|
|
17
|
+
* @deprecated Prefer OpenAIResponsesProvider for new chatbots.
|
|
18
|
+
*/
|
|
19
|
+
export declare class OpenAIAssistantsProvider implements AIProvider {
|
|
20
|
+
private readonly openai;
|
|
21
|
+
private readonly assistantId;
|
|
22
|
+
private readonly model;
|
|
23
|
+
private readonly handler?;
|
|
24
|
+
constructor(config: OpenAIAssistantsProviderConfig);
|
|
25
|
+
askWithTools(params: AskWithToolsParams): Promise<AskWithToolsResult>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=openai-assistants.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-assistants.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/openai-assistants.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAGtE,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,YAAW,UAAU;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAc;gBAE3B,MAAM,EAAE,8BAA8B;IAW5C,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAgB5E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenAIAssistantsProvider = void 0;
|
|
7
|
+
const openai_1 = __importDefault(require("openai"));
|
|
8
|
+
const assistants_tool_loop_1 = require("./loops/assistants-tool.loop");
|
|
9
|
+
/**
|
|
10
|
+
* Legacy OpenAI Assistants API provider.
|
|
11
|
+
* Use this during the dual-run migration period until all threads are moved
|
|
12
|
+
* to the Responses + Conversations API, then remove.
|
|
13
|
+
*
|
|
14
|
+
* @deprecated Prefer OpenAIResponsesProvider for new chatbots.
|
|
15
|
+
*/
|
|
16
|
+
class OpenAIAssistantsProvider {
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.openai = new openai_1.default({
|
|
19
|
+
apiKey: config.apiKey,
|
|
20
|
+
maxRetries: config.maxRetries ?? 2,
|
|
21
|
+
timeout: config.timeoutMs ?? 60000,
|
|
22
|
+
});
|
|
23
|
+
this.assistantId = config.assistantId;
|
|
24
|
+
this.model = config.model;
|
|
25
|
+
this.handler = config.toolHandler;
|
|
26
|
+
}
|
|
27
|
+
async askWithTools(params) {
|
|
28
|
+
await this.openai.beta.threads.messages.create(params.threadKey, {
|
|
29
|
+
role: 'user',
|
|
30
|
+
content: params.userQuestion,
|
|
31
|
+
});
|
|
32
|
+
const run = await this.openai.beta.threads.runs.create(params.threadKey, {
|
|
33
|
+
assistant_id: this.assistantId,
|
|
34
|
+
model: params.model ?? this.model,
|
|
35
|
+
});
|
|
36
|
+
return (0, assistants_tool_loop_1.runAssistantsToolLoop)({ openai: this.openai, handler: this.handler }, { threadId: params.threadKey, runId: run.id, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion, model: params.model ?? this.model });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.OpenAIAssistantsProvider = OpenAIAssistantsProvider;
|
|
40
|
+
//# sourceMappingURL=openai-assistants.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-assistants.provider.js","sourceRoot":"","sources":["../../../src/providers/openai/openai-assistants.provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAI5B,uEAAqE;AAWrE;;;;;;GAMG;AACH,MAAa,wBAAwB;IAMnC,YAAY,MAAsC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,SAAS,IAAI,KAAM;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;YAC/D,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM,CAAC,YAAY;SAC7B,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;YACvE,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;SAClC,CAAC,CAAC;QAEH,OAAO,IAAA,4CAAqB,EAC1B,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAC9C,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CACxL,CAAC;IACJ,CAAC;CACF;AAjCD,4DAiCC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AIProvider } from '../../types/provider.interface';
|
|
2
|
+
import type { AskWithToolsParams, AskWithToolsResult } from '../../types/ask-with-tools.types';
|
|
3
|
+
import type { ConversationStore } from '../../types/conversation-store.interface';
|
|
4
|
+
import type { ToolHandler } from '../../types/tool-handler.interface';
|
|
5
|
+
export interface OpenAIResponsesProviderConfig {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
model: string;
|
|
8
|
+
conversationStore: ConversationStore;
|
|
9
|
+
toolHandler?: ToolHandler;
|
|
10
|
+
maxRetries?: number;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* OpenAI Responses + Conversations API provider.
|
|
15
|
+
* Manages conversation state via the injected ConversationStore.
|
|
16
|
+
*/
|
|
17
|
+
export declare class OpenAIResponsesProvider implements AIProvider {
|
|
18
|
+
private readonly openai;
|
|
19
|
+
private readonly model;
|
|
20
|
+
private readonly store;
|
|
21
|
+
private readonly handler?;
|
|
22
|
+
constructor(config: OpenAIResponsesProviderConfig);
|
|
23
|
+
askWithTools(params: AskWithToolsParams): Promise<AskWithToolsResult>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=openai-responses.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-responses.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/openai-responses.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAItE,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,UAAU;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAc;gBAE3B,MAAM,EAAE,6BAA6B;IAW3C,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAc5E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenAIResponsesProvider = void 0;
|
|
7
|
+
const openai_1 = __importDefault(require("openai"));
|
|
8
|
+
const conversation_or_create_builder_1 = require("./builders/conversation-or-create.builder");
|
|
9
|
+
const responses_tool_loop_1 = require("./loops/responses-tool.loop");
|
|
10
|
+
/**
|
|
11
|
+
* OpenAI Responses + Conversations API provider.
|
|
12
|
+
* Manages conversation state via the injected ConversationStore.
|
|
13
|
+
*/
|
|
14
|
+
class OpenAIResponsesProvider {
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.openai = new openai_1.default({
|
|
17
|
+
apiKey: config.apiKey,
|
|
18
|
+
maxRetries: config.maxRetries ?? 2,
|
|
19
|
+
timeout: config.timeoutMs ?? 60000,
|
|
20
|
+
});
|
|
21
|
+
this.model = config.model;
|
|
22
|
+
this.store = config.conversationStore;
|
|
23
|
+
this.handler = config.toolHandler;
|
|
24
|
+
}
|
|
25
|
+
async askWithTools(params) {
|
|
26
|
+
const { conversationId, lastResponseId } = await (0, conversation_or_create_builder_1.resolveConversationId)({
|
|
27
|
+
openai: this.openai,
|
|
28
|
+
store: this.store,
|
|
29
|
+
threadKey: params.threadKey,
|
|
30
|
+
});
|
|
31
|
+
return (0, responses_tool_loop_1.runResponsesToolLoop)({ openai: this.openai, store: this.store, handler: this.handler, model: params.model ?? this.model }, params, conversationId, lastResponseId);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.OpenAIResponsesProvider = OpenAIResponsesProvider;
|
|
35
|
+
//# sourceMappingURL=openai-responses.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-responses.provider.js","sourceRoot":"","sources":["../../../src/providers/openai/openai-responses.provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAK5B,8FAAkF;AAClF,qEAAmE;AAWnE;;;GAGG;AACH,MAAa,uBAAuB;IAMlC,YAAY,MAAqC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,SAAS,IAAI,KAAM;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,IAAA,sDAAqB,EAAC;YACrE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAC;QAEH,OAAO,IAAA,0CAAoB,EACzB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,EACpG,MAAM,EACN,cAAc,EACd,cAAc,CACf,CAAC;IACJ,CAAC;CACF;AA/BD,0DA+BC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type OpenAI from 'openai';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an OpenAI Conversation via the Responses + Conversations API.
|
|
4
|
+
* Wraps the raw SDK call in a typed error boundary.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createConversation(openai: OpenAI): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=create-conversation.operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-conversation.operation.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/operations/create-conversation.operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWxE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createConversation = createConversation;
|
|
4
|
+
const error_mapper_1 = require("../utils/error-mapper");
|
|
5
|
+
/**
|
|
6
|
+
* Creates an OpenAI Conversation via the Responses + Conversations API.
|
|
7
|
+
* Wraps the raw SDK call in a typed error boundary.
|
|
8
|
+
*/
|
|
9
|
+
async function createConversation(openai) {
|
|
10
|
+
try {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
const conversation = await openai.beta.conversations.create({});
|
|
13
|
+
if (!conversation?.id) {
|
|
14
|
+
throw new Error('createConversation returned no id');
|
|
15
|
+
}
|
|
16
|
+
return conversation.id;
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
throw (0, error_mapper_1.mapOpenAIError)(err);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=create-conversation.operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-conversation.operation.js","sourceRoot":"","sources":["../../../../src/providers/openai/operations/create-conversation.operation.ts"],"names":[],"mappings":";;AAOA,gDAWC;AAjBD,wDAAuD;AAEvD;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,YAAY,GAAG,MAAO,MAAc,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,YAAY,CAAC,EAAY,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAA,6BAAc,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
|