@mohamedtebo/convai-platform 1.0.0 → 1.0.4
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 +80 -72
- package/dist/providers/openai/builders/conversation-or-create.builder.d.ts +7 -6
- package/dist/providers/openai/builders/conversation-or-create.builder.d.ts.map +1 -1
- package/dist/providers/openai/builders/conversation-or-create.builder.js +11 -11
- package/dist/providers/openai/builders/conversation-or-create.builder.js.map +1 -1
- package/dist/providers/openai/loops/responses-tool.loop.d.ts +7 -2
- package/dist/providers/openai/loops/responses-tool.loop.d.ts.map +1 -1
- package/dist/providers/openai/loops/responses-tool.loop.js +164 -48
- package/dist/providers/openai/loops/responses-tool.loop.js.map +1 -1
- package/dist/providers/openai/openai-responses.provider.d.ts.map +1 -1
- package/dist/providers/openai/openai-responses.provider.js +1 -2
- package/dist/providers/openai/openai-responses.provider.js.map +1 -1
- package/dist/providers/openai/operations/create-response.operation.d.ts +2 -1
- package/dist/providers/openai/operations/create-response.operation.d.ts.map +1 -1
- package/dist/providers/openai/operations/create-response.operation.js +13 -4
- package/dist/providers/openai/operations/create-response.operation.js.map +1 -1
- package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts +4 -3
- package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +1 -1
- package/dist/providers/openai/operations/submit-tool-outputs.operation.js +13 -7
- package/dist/providers/openai/operations/submit-tool-outputs.operation.js.map +1 -1
- package/docs/API_INTEGRATION.md +385 -0
- package/package.json +3 -3
- package/dist/src/adapters/index.d.ts +0 -2
- package/dist/src/adapters/index.d.ts.map +0 -1
- package/dist/src/adapters/index.js +0 -6
- package/dist/src/adapters/index.js.map +0 -1
- package/dist/src/adapters/memory-conversation.store.d.ts +0 -12
- package/dist/src/adapters/memory-conversation.store.d.ts.map +0 -1
- package/dist/src/adapters/memory-conversation.store.js +0 -25
- package/dist/src/adapters/memory-conversation.store.js.map +0 -1
- package/dist/src/composed/platform-client.d.ts +0 -29
- package/dist/src/composed/platform-client.d.ts.map +0 -1
- package/dist/src/composed/platform-client.js +0 -16
- package/dist/src/composed/platform-client.js.map +0 -1
- package/dist/src/errors/index.d.ts +0 -4
- package/dist/src/errors/index.d.ts.map +0 -1
- package/dist/src/errors/index.js +0 -11
- package/dist/src/errors/index.js.map +0 -1
- package/dist/src/errors/provider.error.d.ts +0 -16
- package/dist/src/errors/provider.error.d.ts.map +0 -1
- package/dist/src/errors/provider.error.js +0 -15
- package/dist/src/errors/provider.error.js.map +0 -1
- package/dist/src/errors/sdk.error.d.ts +0 -15
- package/dist/src/errors/sdk.error.d.ts.map +0 -1
- package/dist/src/errors/sdk.error.js +0 -16
- package/dist/src/errors/sdk.error.js.map +0 -1
- package/dist/src/errors/tool-loop.error.d.ts +0 -11
- package/dist/src/errors/tool-loop.error.d.ts.map +0 -1
- package/dist/src/errors/tool-loop.error.js +0 -30
- package/dist/src/errors/tool-loop.error.js.map +0 -1
- package/dist/src/factory/index.d.ts +0 -2
- package/dist/src/factory/index.d.ts.map +0 -1
- package/dist/src/factory/index.js +0 -6
- package/dist/src/factory/index.js.map +0 -1
- package/dist/src/factory/provider.factory.d.ts +0 -8
- package/dist/src/factory/provider.factory.d.ts.map +0 -1
- package/dist/src/factory/provider.factory.js +0 -49
- package/dist/src/factory/provider.factory.js.map +0 -1
- package/dist/src/index.d.ts +0 -13
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -34
- package/dist/src/index.js.map +0 -1
- package/dist/src/providers/anthropic/anthropic.provider.d.ts +0 -22
- package/dist/src/providers/anthropic/anthropic.provider.d.ts.map +0 -1
- package/dist/src/providers/anthropic/anthropic.provider.js +0 -34
- package/dist/src/providers/anthropic/anthropic.provider.js.map +0 -1
- package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts +0 -11
- package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts.map +0 -1
- package/dist/src/providers/anthropic/loops/claude-tool.loop.js +0 -58
- package/dist/src/providers/anthropic/loops/claude-tool.loop.js.map +0 -1
- package/dist/src/providers/anthropic/utils/error-mapper.d.ts +0 -4
- package/dist/src/providers/anthropic/utils/error-mapper.d.ts.map +0 -1
- package/dist/src/providers/anthropic/utils/error-mapper.js +0 -35
- package/dist/src/providers/anthropic/utils/error-mapper.js.map +0 -1
- package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts +0 -15
- package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts.map +0 -1
- package/dist/src/providers/openai/builders/conversation-or-create.builder.js +0 -18
- package/dist/src/providers/openai/builders/conversation-or-create.builder.js.map +0 -1
- package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts +0 -19
- package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts.map +0 -1
- package/dist/src/providers/openai/loops/assistants-tool.loop.js +0 -58
- package/dist/src/providers/openai/loops/assistants-tool.loop.js.map +0 -1
- package/dist/src/providers/openai/loops/responses-tool.loop.d.ts +0 -14
- package/dist/src/providers/openai/loops/responses-tool.loop.d.ts.map +0 -1
- package/dist/src/providers/openai/loops/responses-tool.loop.js +0 -87
- package/dist/src/providers/openai/loops/responses-tool.loop.js.map +0 -1
- package/dist/src/providers/openai/openai-assistants.provider.d.ts +0 -27
- package/dist/src/providers/openai/openai-assistants.provider.d.ts.map +0 -1
- package/dist/src/providers/openai/openai-assistants.provider.js +0 -40
- package/dist/src/providers/openai/openai-assistants.provider.js.map +0 -1
- package/dist/src/providers/openai/openai-responses.provider.d.ts +0 -25
- package/dist/src/providers/openai/openai-responses.provider.d.ts.map +0 -1
- package/dist/src/providers/openai/openai-responses.provider.js +0 -35
- package/dist/src/providers/openai/openai-responses.provider.js.map +0 -1
- package/dist/src/providers/openai/operations/create-conversation.operation.d.ts +0 -7
- package/dist/src/providers/openai/operations/create-conversation.operation.d.ts.map +0 -1
- package/dist/src/providers/openai/operations/create-conversation.operation.js +0 -22
- package/dist/src/providers/openai/operations/create-conversation.operation.js.map +0 -1
- package/dist/src/providers/openai/operations/create-response.operation.d.ts +0 -13
- package/dist/src/providers/openai/operations/create-response.operation.d.ts.map +0 -1
- package/dist/src/providers/openai/operations/create-response.operation.js +0 -27
- package/dist/src/providers/openai/operations/create-response.operation.js.map +0 -1
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts +0 -17
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +0 -1
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js +0 -33
- package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js.map +0 -1
- package/dist/src/providers/openai/utils/error-mapper.d.ts +0 -4
- package/dist/src/providers/openai/utils/error-mapper.d.ts.map +0 -1
- package/dist/src/providers/openai/utils/error-mapper.js +0 -45
- package/dist/src/providers/openai/utils/error-mapper.js.map +0 -1
- package/dist/src/providers/openai/utils/usage-mapper.d.ts +0 -10
- package/dist/src/providers/openai/utils/usage-mapper.d.ts.map +0 -1
- package/dist/src/providers/openai/utils/usage-mapper.js +0 -16
- package/dist/src/providers/openai/utils/usage-mapper.js.map +0 -1
- package/dist/src/safe/index.d.ts +0 -2
- package/dist/src/safe/index.d.ts.map +0 -1
- package/dist/src/safe/index.js +0 -6
- package/dist/src/safe/index.js.map +0 -1
- package/dist/src/safe/safe-platform.client.d.ts +0 -14
- package/dist/src/safe/safe-platform.client.d.ts.map +0 -1
- package/dist/src/safe/safe-platform.client.js +0 -56
- package/dist/src/safe/safe-platform.client.js.map +0 -1
- package/dist/src/types/ask-with-tools.types.d.ts +0 -48
- package/dist/src/types/ask-with-tools.types.d.ts.map +0 -1
- package/dist/src/types/ask-with-tools.types.js +0 -3
- package/dist/src/types/ask-with-tools.types.js.map +0 -1
- package/dist/src/types/client-config.interface.d.ts +0 -33
- package/dist/src/types/client-config.interface.d.ts.map +0 -1
- package/dist/src/types/client-config.interface.js +0 -3
- package/dist/src/types/client-config.interface.js.map +0 -1
- package/dist/src/types/conversation-store.interface.d.ts +0 -24
- package/dist/src/types/conversation-store.interface.d.ts.map +0 -1
- package/dist/src/types/conversation-store.interface.js +0 -3
- package/dist/src/types/conversation-store.interface.js.map +0 -1
- package/dist/src/types/index.d.ts +0 -8
- package/dist/src/types/index.d.ts.map +0 -1
- package/dist/src/types/index.js +0 -7
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/provider.interface.d.ts +0 -13
- package/dist/src/types/provider.interface.d.ts.map +0 -1
- package/dist/src/types/provider.interface.js +0 -3
- package/dist/src/types/provider.interface.js.map +0 -1
- package/dist/src/types/sdk-result.interface.d.ts +0 -30
- package/dist/src/types/sdk-result.interface.d.ts.map +0 -1
- package/dist/src/types/sdk-result.interface.js +0 -11
- package/dist/src/types/sdk-result.interface.js.map +0 -1
- package/dist/src/types/tool-handler.interface.d.ts +0 -45
- package/dist/src/types/tool-handler.interface.d.ts.map +0 -1
- package/dist/src/types/tool-handler.interface.js +0 -3
- package/dist/src/types/tool-handler.interface.js.map +0 -1
- package/dist/tests/safe-client.test.d.ts +0 -2
- package/dist/tests/safe-client.test.d.ts.map +0 -1
- package/dist/tests/safe-client.test.js +0 -66
- package/dist/tests/safe-client.test.js.map +0 -1
|
@@ -7,12 +7,21 @@ async function createResponse(openai, params) {
|
|
|
7
7
|
const { conversationId, previousResponseId, model, instructions, userQuestion, tools, vectorStoreIds, } = params;
|
|
8
8
|
const body = {
|
|
9
9
|
model,
|
|
10
|
-
conversation_id: conversationId,
|
|
11
10
|
instructions,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
// Responses API requires an array of message objects, not a plain string
|
|
12
|
+
input: [{ role: 'user', content: userQuestion }],
|
|
13
|
+
store: true,
|
|
15
14
|
};
|
|
15
|
+
// Pass existing conversation or chain via previous_response_id — never both
|
|
16
|
+
if (conversationId) {
|
|
17
|
+
body['conversation'] = conversationId;
|
|
18
|
+
}
|
|
19
|
+
else if (previousResponseId) {
|
|
20
|
+
body['previous_response_id'] = previousResponseId;
|
|
21
|
+
}
|
|
22
|
+
if (tools?.length) {
|
|
23
|
+
body['tools'] = tools;
|
|
24
|
+
}
|
|
16
25
|
if (vectorStoreIds?.length) {
|
|
17
26
|
body['tool_resources'] = { file_search: { vector_store_ids: vectorStoreIds } };
|
|
18
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-response.operation.js","sourceRoot":"","sources":["../../../../src/providers/openai/operations/create-response.operation.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"create-response.operation.js","sourceRoot":"","sources":["../../../../src/providers/openai/operations/create-response.operation.ts"],"names":[],"mappings":";;AAeA,wCA2CC;AAzDD,wDAAuD;AAavD,mFAAmF;AAC5E,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,MAA4B;IAE5B,MAAM,EACJ,cAAc,EACd,kBAAkB,EAClB,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,cAAc,GACf,GAAG,MAAM,CAAC;IAEX,MAAM,IAAI,GAA4B;QACpC,KAAK;QACL,YAAY;QACZ,yEAAyE;QACzE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAChD,KAAK,EAAE,IAAI;KACZ,CAAC;IAEF,4EAA4E;IAC5E,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;IACxC,CAAC;SAAM,IAAI,kBAAkB,EAAE,CAAC;QAC9B,IAAI,CAAC,sBAAsB,CAAC,GAAG,kBAAkB,CAAC;IACpD,CAAC;IAED,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,cAAc,EAAE,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE,EAAE,CAAC;IACjF,CAAC;IAED,IAAI,CAAC;QACH,8DAA8D;QAC9D,OAAO,MAAO,MAAc,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAA,6BAAc,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -2,7 +2,8 @@ import type OpenAI from 'openai';
|
|
|
2
2
|
import type { ToolOutput } from '../../../types/tool-handler.interface';
|
|
3
3
|
export interface SubmitToolOutputsParams {
|
|
4
4
|
previousResponseId: string;
|
|
5
|
-
|
|
5
|
+
/** Used only when previous_response_id is not set — never send both. */
|
|
6
|
+
conversationId?: string;
|
|
6
7
|
model: string;
|
|
7
8
|
instructions: string;
|
|
8
9
|
toolOutputs: ToolOutput[];
|
|
@@ -10,8 +11,8 @@ export interface SubmitToolOutputsParams {
|
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* Resumes the AI response by submitting tool call outputs.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* OpenAI accepts either `conversation` OR `previous_response_id`, never both.
|
|
15
|
+
* Tool continuations chain via previous_response_id (matches telbany legacy when no conversation).
|
|
15
16
|
*/
|
|
16
17
|
export declare function submitToolOutputs(openai: OpenAI, params: SubmitToolOutputsParams): Promise<unknown>;
|
|
17
18
|
//# sourceMappingURL=submit-tool-outputs.operation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-tool-outputs.operation.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/operations/submit-tool-outputs.operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAGxE,MAAM,WAAW,uBAAuB;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"submit-tool-outputs.operation.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/operations/submit-tool-outputs.operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAGxE,MAAM,WAAW,uBAAuB;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CA8BlB"}
|
|
@@ -4,24 +4,30 @@ exports.submitToolOutputs = submitToolOutputs;
|
|
|
4
4
|
const error_mapper_1 = require("../utils/error-mapper");
|
|
5
5
|
/**
|
|
6
6
|
* Resumes the AI response by submitting tool call outputs.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* OpenAI accepts either `conversation` OR `previous_response_id`, never both.
|
|
8
|
+
* Tool continuations chain via previous_response_id (matches telbany legacy when no conversation).
|
|
9
9
|
*/
|
|
10
10
|
async function submitToolOutputs(openai, params) {
|
|
11
11
|
const { previousResponseId, conversationId, model, instructions, toolOutputs, tools } = params;
|
|
12
12
|
const toolResultMessages = toolOutputs.map((o) => ({
|
|
13
|
-
type: '
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
type: 'function_call_output',
|
|
14
|
+
call_id: o.call_id,
|
|
15
|
+
output: o.output,
|
|
16
16
|
}));
|
|
17
17
|
const body = {
|
|
18
18
|
model,
|
|
19
|
-
conversation_id: conversationId,
|
|
20
19
|
instructions,
|
|
21
|
-
previous_response_id: previousResponseId,
|
|
22
20
|
input: toolResultMessages,
|
|
21
|
+
store: true,
|
|
23
22
|
...(tools?.length ? { tools } : {}),
|
|
24
23
|
};
|
|
24
|
+
// Mutually exclusive — prefer chaining from the function-call response
|
|
25
|
+
if (previousResponseId) {
|
|
26
|
+
body['previous_response_id'] = previousResponseId;
|
|
27
|
+
}
|
|
28
|
+
else if (conversationId) {
|
|
29
|
+
body['conversation'] = conversationId;
|
|
30
|
+
}
|
|
25
31
|
try {
|
|
26
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
33
|
return await openai.responses.create(body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-tool-outputs.operation.js","sourceRoot":"","sources":["../../../../src/providers/openai/operations/submit-tool-outputs.operation.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"submit-tool-outputs.operation.js","sourceRoot":"","sources":["../../../../src/providers/openai/operations/submit-tool-outputs.operation.ts"],"names":[],"mappings":";;AAmBA,8CAiCC;AAlDD,wDAAuD;AAYvD;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,MAA+B;IAE/B,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAE/F,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC,CAAC,CAAC;IAEJ,MAAM,IAAI,GAA4B;QACpC,KAAK;QACL,YAAY;QACZ,KAAK,EAAE,kBAAkB;QACzB,KAAK,EAAE,IAAI;QACX,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;IAEF,uEAAuE;IACvE,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC,sBAAsB,CAAC,GAAG,kBAAkB,CAAC;IACpD,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;IACxC,CAAC;IAED,IAAI,CAAC;QACH,8DAA8D;QAC9D,OAAO,MAAO,MAAc,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAA,6BAAc,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
# @mohamedtebo/convai-platform — API Integration Guide
|
|
2
|
+
|
|
3
|
+
Integration of this SDK into the **api** service for OpenAI **Responses + Conversations**, with MongoDB persistence and custom function tools.
|
|
4
|
+
|
|
5
|
+
> **Package:** `@mohamedtebo/convai-platform`
|
|
6
|
+
> **Consumer adapters:** `api/src/core/convai-adapters/` (in the api monorepo)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Table of contents
|
|
11
|
+
|
|
12
|
+
1. [Architecture](#architecture)
|
|
13
|
+
2. [Environment variables](#environment-variables)
|
|
14
|
+
3. [Setup examples](#setup-examples)
|
|
15
|
+
4. [Production rollout & migration scripts](#production-rollout--migration-scripts)
|
|
16
|
+
5. [User message → AI reply lifecycle](#user-message--ai-reply-lifecycle)
|
|
17
|
+
6. [WhatsApp integration cycle](#whatsapp-integration-cycle)
|
|
18
|
+
7. [Facebook Messenger integration cycle](#facebook-messenger-integration-cycle)
|
|
19
|
+
8. [Tool loop lifecycle](#tool-loop-lifecycle)
|
|
20
|
+
9. [Vision (images)](#vision-images)
|
|
21
|
+
10. [Troubleshooting](#troubleshooting)
|
|
22
|
+
11. [Publish this package](#publish-this-package)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Architecture
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Widget / Channel
|
|
30
|
+
│
|
|
31
|
+
▼
|
|
32
|
+
api (Socket: ask-question)
|
|
33
|
+
│
|
|
34
|
+
▼
|
|
35
|
+
ThreadRunQueue ──► getBotMessageForResponses()
|
|
36
|
+
│
|
|
37
|
+
├── AI_USE_CONVAI_SDK=false → legacy response-tool-loop (deprecated)
|
|
38
|
+
│
|
|
39
|
+
└── AI_USE_CONVAI_SDK=true → getBotMessageForResponsesViaSdk()
|
|
40
|
+
│
|
|
41
|
+
├── buildResponseConfig() ← instructions, tools, model
|
|
42
|
+
├── enrichResponsesUserQuestion() ← vision when enabled
|
|
43
|
+
├── getAIPlatformClient() ← cached SDK client
|
|
44
|
+
└── sdkClient.safe.askWithTools()
|
|
45
|
+
│
|
|
46
|
+
├── MongoConversationStore
|
|
47
|
+
├── ApiToolHandler ← tickets, calendar, custom functions
|
|
48
|
+
└── OpenAI Responses API tool loop (this SDK)
|
|
49
|
+
│
|
|
50
|
+
▼
|
|
51
|
+
AssistantResponseService / handleFinalResponseForResponses
|
|
52
|
+
│
|
|
53
|
+
▼
|
|
54
|
+
Socket BOT_REPLIED → widget
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### api adapter files
|
|
58
|
+
|
|
59
|
+
| File | Role |
|
|
60
|
+
|------|------|
|
|
61
|
+
| `api/src/core/convai-adapters/ai-platform.factory.ts` | Cached `PlatformClient` |
|
|
62
|
+
| `api/src/core/convai-adapters/mongo-conversation.store.ts` | `Thread.openai_conversation_id` / `last_response_id` |
|
|
63
|
+
| `api/src/core/convai-adapters/telbany-tool.handler.ts` | **ApiToolHandler** → `run-completion.service` |
|
|
64
|
+
| `api/src/core/convai-adapters/tool-loop-context.loader.ts` | Chatbot functions + org context |
|
|
65
|
+
| `api/src/core/services/ai/providers/openai/response-config.builder.ts` | Instructions, tools, model |
|
|
66
|
+
| `api/src/api/v1/routes/openai/helpers.ts` | `getBotMessageForResponses()` |
|
|
67
|
+
|
|
68
|
+
### SDK files (this package)
|
|
69
|
+
|
|
70
|
+
| File | Role |
|
|
71
|
+
|------|------|
|
|
72
|
+
| `src/composed/platform-client.ts` | `createPlatformClient()` |
|
|
73
|
+
| `src/providers/openai/openai-responses.provider.ts` | Responses provider |
|
|
74
|
+
| `src/providers/openai/loops/responses-tool.loop.ts` | Tool loop (max 10 turns) |
|
|
75
|
+
| `src/providers/openai/operations/create-response.operation.ts` | `responses.create` |
|
|
76
|
+
| `src/providers/openai/operations/submit-tool-outputs.operation.ts` | Tool output submit |
|
|
77
|
+
| `src/types/conversation-store.interface.ts` | `ConversationStore` contract |
|
|
78
|
+
| `src/types/tool-handler.interface.ts` | `ToolHandler` contract |
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Environment variables
|
|
83
|
+
|
|
84
|
+
In **api** `.env`:
|
|
85
|
+
|
|
86
|
+
```env
|
|
87
|
+
AI_BACKEND_DEFAULT=assistants
|
|
88
|
+
AI_RESPONSES_MODEL_DEFAULT=gpt-4o-mini
|
|
89
|
+
AI_USE_CONVAI_SDK=false
|
|
90
|
+
OPENAI_API_KEY=sk-...
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
| Variable | Values | When to change |
|
|
94
|
+
|----------|--------|----------------|
|
|
95
|
+
| `AI_BACKEND_DEFAULT` | `assistants` \| `responses` | After migration steps 01–04 |
|
|
96
|
+
| `AI_USE_CONVAI_SDK` | `true` \| `false` | After parity test (step 06) on staging |
|
|
97
|
+
| `AI_RESPONSES_MODEL_DEFAULT` | e.g. `gpt-4o-mini` | Optional default model |
|
|
98
|
+
|
|
99
|
+
MongoDB per chatbot:
|
|
100
|
+
|
|
101
|
+
| Field | Purpose |
|
|
102
|
+
|-------|---------|
|
|
103
|
+
| `chatbots.ai_backend` | `assistants` or `responses` |
|
|
104
|
+
| `generalsettings.openai_vision_enabled` | Image analysis before model call |
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Setup examples
|
|
109
|
+
|
|
110
|
+
### Install
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npm install @mohamedtebo/convai-platform openai
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Standalone SDK
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import { createPlatformClient, MemoryConversationStore } from '@mohamedtebo/convai-platform';
|
|
120
|
+
|
|
121
|
+
const client = createPlatformClient({
|
|
122
|
+
provider: 'openai-responses',
|
|
123
|
+
apiKey: process.env.OPENAI_API_KEY!,
|
|
124
|
+
model: 'gpt-4o-mini',
|
|
125
|
+
conversationStore: new MemoryConversationStore(),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const result = await client.safe.askWithTools({
|
|
129
|
+
threadKey: 'resp_conv_abc123',
|
|
130
|
+
chatbotId: '507f1f77bcf86cd799439011',
|
|
131
|
+
organizationId: 'org_001',
|
|
132
|
+
userQuestion: 'I want to book a ticket for tomorrow',
|
|
133
|
+
instructions: 'You are a helpful assistant.',
|
|
134
|
+
tools: [],
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
if (result.success && result.data.kind === 'text') {
|
|
138
|
+
console.log(result.data.outputText);
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### With api adapters (production)
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { getAIPlatformClient } from './core/convai-adapters';
|
|
146
|
+
|
|
147
|
+
const client = getAIPlatformClient({ backend: 'openai-responses', model: 'gpt-4o-mini' });
|
|
148
|
+
|
|
149
|
+
const result = await client.safe.askWithTools({
|
|
150
|
+
threadKey: threadId,
|
|
151
|
+
chatbotId,
|
|
152
|
+
organizationId,
|
|
153
|
+
userQuestion: enrichedQuestion,
|
|
154
|
+
instructions: params.instructions,
|
|
155
|
+
tools: params.tools,
|
|
156
|
+
vectorStoreIds: vectorStoreId ? [vectorStoreId] : undefined,
|
|
157
|
+
model: params.model,
|
|
158
|
+
mediaUrl,
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Custom ConversationStore + ToolHandler
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { createPlatformClient } from '@mohamedtebo/convai-platform';
|
|
166
|
+
import type { ConversationStore, ToolHandler } from '@mohamedtebo/convai-platform';
|
|
167
|
+
|
|
168
|
+
const client = createPlatformClient({
|
|
169
|
+
provider: 'openai-responses',
|
|
170
|
+
apiKey: process.env.OPENAI_API_KEY!,
|
|
171
|
+
model: 'gpt-4o',
|
|
172
|
+
conversationStore: myStore as ConversationStore,
|
|
173
|
+
toolHandler: myHandler as ToolHandler,
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Production rollout & migration scripts
|
|
180
|
+
|
|
181
|
+
Run from the **api** service root (`MONGO_URI`, `OPENAI_API_KEY` required).
|
|
182
|
+
|
|
183
|
+
### Steps (must run before production Responses + SDK)
|
|
184
|
+
|
|
185
|
+
| Step | Purpose | Changes DB? |
|
|
186
|
+
|------|---------|-------------|
|
|
187
|
+
| **01** | Audit chatbots, assistant IDs, vector stores | No |
|
|
188
|
+
| **02** | Verify `General.system_prompt` for all chatbots | Conditionally |
|
|
189
|
+
| **03** | Backfill `openai_conversation_id` from Assistants threads | Yes |
|
|
190
|
+
| **04** | Verify threads missing conversation ID | No |
|
|
191
|
+
| **05** | Set `ai_backend=responses` on pilot chatbots | Yes |
|
|
192
|
+
| **06** | Golden-path parity Q&A test | API calls only |
|
|
193
|
+
|
|
194
|
+
### Commands
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
cd api
|
|
198
|
+
|
|
199
|
+
# Audit
|
|
200
|
+
AI_MIGRATION_DRY_RUN=true MIGRATION_STEPS=01,02 \
|
|
201
|
+
ts-node -r tsconfig-paths/register migrations/openai-responses/run-openai-responses-migration.ts
|
|
202
|
+
|
|
203
|
+
# Backfill (active threads, 90 days)
|
|
204
|
+
AI_MIGRATION_DRY_RUN=false MIGRATION_STEPS=03 \
|
|
205
|
+
ts-node -r tsconfig-paths/register migrations/openai-responses/run-openai-responses-migration.ts
|
|
206
|
+
|
|
207
|
+
# Verify
|
|
208
|
+
AI_MIGRATION_DRY_RUN=false MIGRATION_STEPS=04 \
|
|
209
|
+
ts-node -r tsconfig-paths/register migrations/openai-responses/run-openai-responses-migration.ts
|
|
210
|
+
|
|
211
|
+
# Enable Responses on pilot chatbots
|
|
212
|
+
AI_MIGRATION_DRY_RUN=false MIGRATION_STEPS=05 \
|
|
213
|
+
MIGRATION_CHATBOT_IDS=CHATBOT_ID_1,CHATBOT_ID_2 \
|
|
214
|
+
ts-node -r tsconfig-paths/register migrations/openai-responses/run-openai-responses-migration.ts
|
|
215
|
+
|
|
216
|
+
# Parity test
|
|
217
|
+
AI_MIGRATION_DRY_RUN=false MIGRATION_STEPS=06 \
|
|
218
|
+
PARITY_CHATBOT_ID=CHATBOT_ID_1 \
|
|
219
|
+
ts-node -r tsconfig-paths/register migrations/openai-responses/run-openai-responses-migration.ts
|
|
220
|
+
|
|
221
|
+
# Deploy api: AI_USE_CONVAI_SDK=true
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Production checklist
|
|
225
|
+
|
|
226
|
+
| Order | Action |
|
|
227
|
+
|-------|--------|
|
|
228
|
+
| 1 | Deploy api code (SDK adapters + fixes) with `AI_USE_CONVAI_SDK=false` |
|
|
229
|
+
| 2 | Run migration steps **01–04** on production Mongo |
|
|
230
|
+
| 3 | Run step **05** on 2–3 internal chatbots |
|
|
231
|
+
| 4 | Run step **06** parity on staging, then prod sample |
|
|
232
|
+
| 5 | Set `AI_USE_CONVAI_SDK=true` on staging → soak → production |
|
|
233
|
+
| 6 | Expand step **05** (5% → 25% → 100% chatbots) |
|
|
234
|
+
|
|
235
|
+
### Rollback
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
AI_MIGRATION_DRY_RUN=false ROLLBACK_CHATBOT_IDS=CHATBOT_ID \
|
|
239
|
+
ts-node -r tsconfig-paths/register migrations/openai-responses/repair/reset-ai-backend.step.ts
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Set `AI_USE_CONVAI_SDK=false` and redeploy.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## User message → AI reply lifecycle
|
|
247
|
+
|
|
248
|
+
When `ai_backend=responses` and `AI_USE_CONVAI_SDK=true`:
|
|
249
|
+
|
|
250
|
+
| # | Step | Location | What happens |
|
|
251
|
+
|---|------|----------|--------------|
|
|
252
|
+
| 1 | User sends message | Widget → Socket `ask-question` | `userQuestion`, optional `mediaUrl` |
|
|
253
|
+
| 2 | Save message | `api/.../bot-thread-active.handler.ts` | `userQuestionMessage()` → Mongo `Message` |
|
|
254
|
+
| 3 | Enqueue job | `thread-run-queue.service.ts` | One run per `threadId` (batch or sequential) |
|
|
255
|
+
| 4 | Resolve backend | `resolve-job-backend.helper.ts` | `resp_*` or `ai_backend=responses` |
|
|
256
|
+
| 5 | Batch path | `batch-run-processor.ts` | `getBotMessageForResponses()` (not Assistants API) |
|
|
257
|
+
| 6 | Vision | `helpers.ts` → `enrichResponsesUserQuestion()` | `buildVisionMessageContent()` if enabled |
|
|
258
|
+
| 7 | Config | `response-config.builder.ts` | `system_prompt`, context, function tools |
|
|
259
|
+
| 8 | SDK | `getBotMessageForResponsesViaSdk()` | `askWithTools()` |
|
|
260
|
+
| 9 | Load state | `mongo-conversation.store.ts` | `Thread.openai_conversation_id` |
|
|
261
|
+
| 10 | OpenAI | SDK `create-response.operation.ts` | `responses.create` |
|
|
262
|
+
| 11 | Tools? | SDK `responses-tool.loop.ts` | See tool loop section |
|
|
263
|
+
| 12 | Post-process | `handleFinalResponseForResponses()` | Tickets, markers, widget shape |
|
|
264
|
+
| 13 | Reply | Socket `onResult` | `BOT_REPLIED` event |
|
|
265
|
+
|
|
266
|
+
**Thread IDs**
|
|
267
|
+
|
|
268
|
+
| Backend | Format | Created in |
|
|
269
|
+
|---------|--------|------------|
|
|
270
|
+
| Assistants | `thread_…` | OpenAI Threads API |
|
|
271
|
+
| Responses | `resp_conv_…` | OpenAI Conversations API |
|
|
272
|
+
|
|
273
|
+
> **Full guide (Widget + WhatsApp + Facebook + migration):**
|
|
274
|
+
> api monorepo: `api/docs/COMPLETE_CONVAI_SDK_INTEGRATION_GUIDE.md`
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## WhatsApp integration cycle
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
WhatsApp user → Meta webhook → handle-event.ts → handle-incoming-message.ts
|
|
282
|
+
→ BullMQ queue_worker (addTextJob / addMediaJob)
|
|
283
|
+
→ handleChannelAskQuestion('whatsapp')
|
|
284
|
+
→ userQuestionMessage() + ThreadRunQueue.enqueueJob()
|
|
285
|
+
→ getBotMessageForResponses() [SDK when AI_USE_CONVAI_SDK=true]
|
|
286
|
+
→ dispatchBotReply() → WhatsAppAdapter.sendMessage() → user
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
| # | Step | File |
|
|
290
|
+
|---|------|------|
|
|
291
|
+
| 1 | Meta webhook POST | `whatsapp/webhook/handle-event.ts` |
|
|
292
|
+
| 2 | Parse text/media/button | `handle-incoming-message.ts` |
|
|
293
|
+
| 3 | Redis queue | `queue_worker.ts` |
|
|
294
|
+
| 4 | Channel routing | `channel-ask-question.handler.ts` |
|
|
295
|
+
| 5 | Save + enqueue AI | `existing-lead-bot-text.handler.ts` |
|
|
296
|
+
| 6 | AI pipeline | Shared (see above) |
|
|
297
|
+
| 7 | Outbound | `channel-bot-reply.handler.ts` → `WhatsAppAdapter` |
|
|
298
|
+
|
|
299
|
+
WhatsApp-specific: typing indicator, interactive calendar lists, media upload to Wasabi.
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Facebook Messenger integration cycle
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
Facebook user → Meta webhook → FacebookAdapter.handleEvent()
|
|
307
|
+
→ fetchMessengerMedia() (attachments) → BullMQ queue_worker
|
|
308
|
+
→ handleChannelAskQuestion('facebook')
|
|
309
|
+
→ userQuestionMessage() + ThreadRunQueue.enqueueJob()
|
|
310
|
+
→ getBotMessageForResponses() [SDK when AI_USE_CONVAI_SDK=true]
|
|
311
|
+
→ dispatchBotReply() → FacebookAdapter.sendMessage() → user
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
| # | Step | File |
|
|
315
|
+
|---|------|------|
|
|
316
|
+
| 1 | Meta webhook POST | `FacebookAdapter.ts` |
|
|
317
|
+
| 2 | Skip echo, resolve page | `handleEvent()` |
|
|
318
|
+
| 3 | Media / audio transcript | `fetchMessengerMedia()`, `transcribeAudioToText()` |
|
|
319
|
+
| 4 | Redis queue | `queue_worker.ts` |
|
|
320
|
+
| 5 | Channel routing | `channel-ask-question.handler.ts` |
|
|
321
|
+
| 6 | Save + enqueue AI | `existing-lead-bot-text.handler.ts` |
|
|
322
|
+
| 7 | Outbound | `channel-bot-reply.handler.ts` → `FacebookAdapter` |
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Tool loop lifecycle
|
|
327
|
+
|
|
328
|
+
Triggered when `response.output[]` contains `type: function_call`.
|
|
329
|
+
|
|
330
|
+
| # | Step | Location | Description |
|
|
331
|
+
|---|------|----------|-------------|
|
|
332
|
+
| 1 | Detect calls | SDK `responses-tool.loop.ts` | Scan output for `function_call` |
|
|
333
|
+
| 2 | Build output | api `run-completion.service.ts` | Route by function name |
|
|
334
|
+
| 3 | Missing params | api `query-function.context.ts` | JSON + `MANDATORY_RESPONSE_FORMAT` |
|
|
335
|
+
| 4 | Submit | SDK `submit-tool-outputs.operation.ts` | Chain via `conversation` or `previous_response_id` |
|
|
336
|
+
| 5 | Cap | `MAX_TURNS = 10` | Prevent infinite loops |
|
|
337
|
+
| 6 | Extract | api `ApiToolHandler.extractResult()` | Ticket / API when complete |
|
|
338
|
+
| 7 | Short-circuit | SDK `kind: 'toolResult'` | `AssistantResponseService.run()` |
|
|
339
|
+
| 8 | Continue | `extractResult` returns `null` | Model asks user for missing fields |
|
|
340
|
+
|
|
341
|
+
**Tool sources**
|
|
342
|
+
|
|
343
|
+
| Source | Examples |
|
|
344
|
+
|--------|----------|
|
|
345
|
+
| Platform tools | `notifyAgent`, calendar, `get_current_date` |
|
|
346
|
+
| Custom (Mongo) | `create_ticket_for_booking`, `job_application` |
|
|
347
|
+
| File search | When chatbot has vector store |
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## Vision (images)
|
|
352
|
+
|
|
353
|
+
When `openai_vision_enabled=true`:
|
|
354
|
+
|
|
355
|
+
1. api `enrichResponsesUserQuestion()` → `buildVisionMessageContent()`
|
|
356
|
+
2. `VisionFactory.analyzeImages()` → `Image analysis: …` in text
|
|
357
|
+
3. Enriched text sent as `userQuestion` to SDK
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Troubleshooting
|
|
362
|
+
|
|
363
|
+
| Symptom | Cause | Fix area |
|
|
364
|
+
|---------|-------|----------|
|
|
365
|
+
| `Invalid thread_id resp_conv_…` | Assistants API on Responses thread | api batch processor |
|
|
366
|
+
| `Invalid schema … image` | Raw param type to OpenAI | api `function-param-schema.helper.ts` |
|
|
367
|
+
| Ignores images | Vision not enriched | api `enrichResponsesUserQuestion` |
|
|
368
|
+
| Empty reply | SDK error | Check `[getBotMessageForResponses] SDK error` logs |
|
|
369
|
+
| Stale SDK in Docker | Old dist | Rebuild package + restart api |
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## Publish this package
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
cd convai-platform
|
|
377
|
+
npm run build
|
|
378
|
+
npm publish --access public
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
If publish returns **404 / no permission**, run `npm login` with the account that owns the `@mohamedtebo` scope on npmjs.com. Until then, mount `./convai-platform/dist` in Docker.
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
MIT © mohamedtebo
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mohamedtebo/convai-platform",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Multi-provider AI platform SDK — OpenAI Responses/Conversations + Anthropic Claude with explicit tool loops, pluggable persistence, and SRP architecture",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
-
"files": ["dist", "README.md"],
|
|
7
|
+
"files": ["dist", "README.md", "docs"],
|
|
8
8
|
"scripts": {
|
|
9
|
-
"build": "tsc",
|
|
9
|
+
"build": "rm -rf dist && tsc",
|
|
10
10
|
"dev": "tsc --watch",
|
|
11
11
|
"test": "npm run build && node --test dist/tests/safe-client.test.js",
|
|
12
12
|
"prepublishOnly": "npm run build"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MemoryConversationStore = void 0;
|
|
4
|
-
var memory_conversation_store_1 = require("./memory-conversation.store");
|
|
5
|
-
Object.defineProperty(exports, "MemoryConversationStore", { enumerable: true, get: function () { return memory_conversation_store_1.MemoryConversationStore; } });
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/index.ts"],"names":[],"mappings":";;;AAAA,yEAAsE;AAA7D,oIAAA,uBAAuB,OAAA"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { ConversationState, ConversationStore } from '../types/conversation-store.interface';
|
|
2
|
-
/**
|
|
3
|
-
* In-memory ConversationStore — useful for tests and lightweight apps.
|
|
4
|
-
* State is lost when the process restarts. Use MongoConversationStore in production.
|
|
5
|
-
*/
|
|
6
|
-
export declare class MemoryConversationStore implements ConversationStore {
|
|
7
|
-
private readonly map;
|
|
8
|
-
load(threadKey: string): Promise<ConversationState | null>;
|
|
9
|
-
save(threadKey: string, state: ConversationState): Promise<void>;
|
|
10
|
-
create(threadKey: string, conversationId: string): Promise<ConversationState>;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=memory-conversation.store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory-conversation.store.d.ts","sourceRoot":"","sources":["../../../src/adapters/memory-conversation.store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAElG;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwC;IAEtD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAI1D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAKpF"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MemoryConversationStore = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* In-memory ConversationStore — useful for tests and lightweight apps.
|
|
6
|
-
* State is lost when the process restarts. Use MongoConversationStore in production.
|
|
7
|
-
*/
|
|
8
|
-
class MemoryConversationStore {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.map = new Map();
|
|
11
|
-
}
|
|
12
|
-
async load(threadKey) {
|
|
13
|
-
return this.map.get(threadKey) ?? null;
|
|
14
|
-
}
|
|
15
|
-
async save(threadKey, state) {
|
|
16
|
-
this.map.set(threadKey, state);
|
|
17
|
-
}
|
|
18
|
-
async create(threadKey, conversationId) {
|
|
19
|
-
const state = { conversationId };
|
|
20
|
-
this.map.set(threadKey, state);
|
|
21
|
-
return state;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
exports.MemoryConversationStore = MemoryConversationStore;
|
|
25
|
-
//# sourceMappingURL=memory-conversation.store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory-conversation.store.js","sourceRoot":"","sources":["../../../src/adapters/memory-conversation.store.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,uBAAuB;IAApC;QACmB,QAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IAe9D,CAAC;IAbC,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,KAAwB;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,cAAsB;QACpD,MAAM,KAAK,GAAsB,EAAE,cAAc,EAAE,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAhBD,0DAgBC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { ClientConfig } from '../types/client-config.interface';
|
|
2
|
-
import type { AskWithToolsParams, AskWithToolsResult } from '../types/ask-with-tools.types';
|
|
3
|
-
import type { SdkResult } from '../types/sdk-result.interface';
|
|
4
|
-
/**
|
|
5
|
-
* Fully composed SDK client.
|
|
6
|
-
* Exposes both a raw API (throws on error) and a safe API (returns SdkResult).
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* const client = createPlatformClient({
|
|
10
|
-
* provider: 'openai-responses',
|
|
11
|
-
* apiKey: process.env.OPENAI_API_KEY!,
|
|
12
|
-
* model: 'gpt-4o',
|
|
13
|
-
* conversationStore: new MongoConversationStore(),
|
|
14
|
-
* toolHandler: new TelbanyToolHandler(),
|
|
15
|
-
* });
|
|
16
|
-
*
|
|
17
|
-
* const result = await client.safe.askWithTools({ ... });
|
|
18
|
-
* if (result.success) console.log(result.data.outputText);
|
|
19
|
-
*/
|
|
20
|
-
export interface PlatformClient {
|
|
21
|
-
/** Call askWithTools directly — throws SdkError on failure. */
|
|
22
|
-
askWithTools(params: AskWithToolsParams): Promise<AskWithToolsResult>;
|
|
23
|
-
/** Safe version — never throws, returns SdkResult<T>. */
|
|
24
|
-
safe: {
|
|
25
|
-
askWithTools(params: AskWithToolsParams): Promise<SdkResult<AskWithToolsResult>>;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
export declare function createPlatformClient(config: ClientConfig): PlatformClient;
|
|
29
|
-
//# sourceMappingURL=platform-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"platform-client.d.ts","sourceRoot":"","sources":["../../../src/composed/platform-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAI/D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtE,yDAAyD;IACzD,IAAI,EAAE;QACJ,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC;KAClF,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAUzE"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createPlatformClient = createPlatformClient;
|
|
4
|
-
const provider_factory_1 = require("../factory/provider.factory");
|
|
5
|
-
const safe_platform_client_1 = require("../safe/safe-platform.client");
|
|
6
|
-
function createPlatformClient(config) {
|
|
7
|
-
const provider = (0, provider_factory_1.buildProvider)(config);
|
|
8
|
-
const safeClient = new safe_platform_client_1.SafePlatformClient(provider);
|
|
9
|
-
return {
|
|
10
|
-
askWithTools: (params) => provider.askWithTools(params),
|
|
11
|
-
safe: {
|
|
12
|
-
askWithTools: (params) => safeClient.askWithTools(params),
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=platform-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"platform-client.js","sourceRoot":"","sources":["../../../src/composed/platform-client.ts"],"names":[],"mappings":";;AA+BA,oDAUC;AAtCD,kEAA4D;AAC5D,uEAAkE;AA2BlE,SAAgB,oBAAoB,CAAC,MAAoB;IACvD,MAAM,QAAQ,GAAG,IAAA,gCAAa,EAAC,MAAM,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,yCAAkB,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO;QACL,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;QACvD,IAAI,EAAE;YACJ,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;SAC1D;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/src/errors/index.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NoToolHandlerError = exports.ToolLoopError = exports.ProviderError = exports.SdkError = void 0;
|
|
4
|
-
var sdk_error_1 = require("./sdk.error");
|
|
5
|
-
Object.defineProperty(exports, "SdkError", { enumerable: true, get: function () { return sdk_error_1.SdkError; } });
|
|
6
|
-
var provider_error_1 = require("./provider.error");
|
|
7
|
-
Object.defineProperty(exports, "ProviderError", { enumerable: true, get: function () { return provider_error_1.ProviderError; } });
|
|
8
|
-
var tool_loop_error_1 = require("./tool-loop.error");
|
|
9
|
-
Object.defineProperty(exports, "ToolLoopError", { enumerable: true, get: function () { return tool_loop_error_1.ToolLoopError; } });
|
|
10
|
-
Object.defineProperty(exports, "NoToolHandlerError", { enumerable: true, get: function () { return tool_loop_error_1.NoToolHandlerError; } });
|
|
11
|
-
//# sourceMappingURL=index.js.map
|