@botonic/plugin-ai-agents 0.40.1-alpha.0 → 0.41.0-alpha.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/lib/cjs/agent-builder.d.ts +4 -3
- package/lib/cjs/agent-builder.js +0 -2
- package/lib/cjs/agent-builder.js.map +1 -1
- package/lib/cjs/constants.js +2 -2
- package/lib/cjs/hubtype-api-client.d.ts +2 -2
- package/lib/cjs/hubtype-api-client.js +7 -3
- package/lib/cjs/hubtype-api-client.js.map +1 -1
- package/lib/cjs/index.d.ts +5 -5
- package/lib/cjs/index.js +7 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/runner.d.ts +7 -4
- package/lib/cjs/runner.js +34 -8
- package/lib/cjs/runner.js.map +1 -1
- package/lib/cjs/tools/retrieve-knowledge.js +10 -3
- package/lib/cjs/tools/retrieve-knowledge.js.map +1 -1
- package/lib/cjs/types.d.ts +17 -7
- package/lib/esm/agent-builder.d.ts +4 -3
- package/lib/esm/agent-builder.js +0 -2
- package/lib/esm/agent-builder.js.map +1 -1
- package/lib/esm/constants.js +2 -2
- package/lib/esm/hubtype-api-client.d.ts +2 -2
- package/lib/esm/hubtype-api-client.js +7 -3
- package/lib/esm/hubtype-api-client.js.map +1 -1
- package/lib/esm/index.d.ts +5 -5
- package/lib/esm/index.js +7 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/runner.d.ts +7 -4
- package/lib/esm/runner.js +34 -8
- package/lib/esm/runner.js.map +1 -1
- package/lib/esm/tools/retrieve-knowledge.js +10 -3
- package/lib/esm/tools/retrieve-knowledge.js.map +1 -1
- package/lib/esm/types.d.ts +17 -7
- package/package.json +5 -5
- package/src/agent-builder.ts +12 -12
- package/src/constants.ts +2 -2
- package/src/hubtype-api-client.ts +9 -5
- package/src/index.ts +21 -11
- package/src/runner.ts +57 -14
- package/src/tools/retrieve-knowledge.ts +11 -3
- package/src/types.ts +30 -7
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { ResolvedPlugins } from '@botonic/core';
|
|
1
2
|
import { AIAgent, ContactInfo, GuardrailRule, Tool } from './types';
|
|
2
|
-
export declare class AIAgentBuilder {
|
|
3
|
+
export declare class AIAgentBuilder<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
3
4
|
private name;
|
|
4
5
|
private instructions;
|
|
5
6
|
private tools;
|
|
6
7
|
private inputGuardrails;
|
|
7
|
-
constructor(name: string, instructions: string, tools: Tool[], contactInfo: ContactInfo, inputGuardrailRules: GuardrailRule[], sourceIds: string[]);
|
|
8
|
-
build(): AIAgent
|
|
8
|
+
constructor(name: string, instructions: string, tools: Tool<TPlugins, TExtraData>[], contactInfo: ContactInfo, inputGuardrailRules: GuardrailRule[], sourceIds: string[]);
|
|
9
|
+
build(): AIAgent<TPlugins, TExtraData>;
|
|
9
10
|
private addExtraInstructions;
|
|
10
11
|
private getContactInfoInstructions;
|
|
11
12
|
private getMetadataInstructions;
|
package/lib/cjs/agent-builder.js
CHANGED
|
@@ -19,7 +19,6 @@ class AIAgentBuilder {
|
|
|
19
19
|
build() {
|
|
20
20
|
const modelSettings = {};
|
|
21
21
|
if (this.tools.includes(tools_1.retrieveKnowledge)) {
|
|
22
|
-
// With this line, we force the agent to use the retrieve_knowledge tool
|
|
23
22
|
modelSettings.toolChoice = tools_1.retrieveKnowledge.name;
|
|
24
23
|
}
|
|
25
24
|
return new agents_1.Agent({
|
|
@@ -49,7 +48,6 @@ class AIAgentBuilder {
|
|
|
49
48
|
const metadata = `Current Date: ${new Date().toISOString()}`;
|
|
50
49
|
return `<metadata>\n${metadata}\n</metadata>`;
|
|
51
50
|
}
|
|
52
|
-
// TODO: Review in the future if the model works better without this instruction
|
|
53
51
|
getOutputInstructions() {
|
|
54
52
|
const example = {
|
|
55
53
|
messages: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-builder.js","sourceRoot":"","sources":["../../src/agent-builder.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"agent-builder.js","sourceRoot":"","sources":["../../src/agent-builder.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/constants.js
CHANGED
|
@@ -4,8 +4,8 @@ exports.MAX_MEMORY_LENGTH = exports.isProd = exports.AZURE_OPENAI_API_VERSION =
|
|
|
4
4
|
exports.HUBTYPE_API_URL = process.env.HUBTYPE_API_URL || 'https://api.hubtype.com';
|
|
5
5
|
exports.AZURE_OPENAI_API_KEY = process.env.AZURE_OPENAI_API_KEY; // pragma: allowlist secret
|
|
6
6
|
exports.AZURE_OPENAI_API_BASE = process.env.AZURE_OPENAI_API_BASE;
|
|
7
|
-
exports.AZURE_OPENAI_API_DEPLOYMENT_NAME = process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME || 'gpt-
|
|
8
|
-
exports.AZURE_OPENAI_API_VERSION = process.env.AZURE_OPENAI_API_VERSION || '
|
|
7
|
+
exports.AZURE_OPENAI_API_DEPLOYMENT_NAME = process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME || 'gpt-41-mini_p1';
|
|
8
|
+
exports.AZURE_OPENAI_API_VERSION = process.env.AZURE_OPENAI_API_VERSION || '2025-01-01-preview';
|
|
9
9
|
exports.isProd = process.env.NODE_ENV === 'production';
|
|
10
10
|
exports.MAX_MEMORY_LENGTH = 25;
|
|
11
11
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BotContext } from '@botonic/core';
|
|
2
|
-
import { AgenticInputMessage } from './types';
|
|
2
|
+
import { AgenticInputMessage, Chunk } from './types';
|
|
3
3
|
export declare class HubtypeApiClient {
|
|
4
4
|
private readonly authToken;
|
|
5
5
|
constructor(authToken: string);
|
|
6
|
-
retrieveSimilarChunks(query: string,
|
|
6
|
+
retrieveSimilarChunks(query: string, sourceIds: string[]): Promise<Chunk[]>;
|
|
7
7
|
getLocalMessages(maxMemoryLength: number): Promise<AgenticInputMessage[]>;
|
|
8
8
|
getMessages(request: BotContext, maxMemoryLength: number): Promise<AgenticInputMessage[]>;
|
|
9
9
|
private formatMessage;
|
|
@@ -8,7 +8,7 @@ class HubtypeApiClient {
|
|
|
8
8
|
constructor(authToken) {
|
|
9
9
|
this.authToken = authToken;
|
|
10
10
|
}
|
|
11
|
-
retrieveSimilarChunks(query,
|
|
11
|
+
retrieveSimilarChunks(query, sourceIds) {
|
|
12
12
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
13
13
|
const url = `${constants_1.HUBTYPE_API_URL}/external/v1/ai/knowledge_base/similar_chunks/`;
|
|
14
14
|
const headers = {
|
|
@@ -17,11 +17,15 @@ class HubtypeApiClient {
|
|
|
17
17
|
};
|
|
18
18
|
const params = {
|
|
19
19
|
query,
|
|
20
|
-
source_ids:
|
|
20
|
+
source_ids: sourceIds,
|
|
21
21
|
num_chunks: 5,
|
|
22
22
|
};
|
|
23
23
|
const response = yield axios_1.default.post(url, params, { headers });
|
|
24
|
-
|
|
24
|
+
const chunks = response.data.chunks.map((chunk) => ({
|
|
25
|
+
id: chunk.id,
|
|
26
|
+
text: chunk.text,
|
|
27
|
+
}));
|
|
28
|
+
return chunks;
|
|
25
29
|
});
|
|
26
30
|
}
|
|
27
31
|
getLocalMessages(maxMemoryLength) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hubtype-api-client.js","sourceRoot":"","sources":["../../src/hubtype-api-client.ts"],"names":[],"mappings":";;;;AAEA,0DAAyB;AAEzB,2CAA6C;AAe7C,MAAa,gBAAgB;IAG3B,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEK,qBAAqB,CACzB,KAAa,EACb,
|
|
1
|
+
{"version":3,"file":"hubtype-api-client.js","sourceRoot":"","sources":["../../src/hubtype-api-client.ts"],"names":[],"mappings":";;;;AAEA,0DAAyB;AAEzB,2CAA6C;AAe7C,MAAa,gBAAgB;IAG3B,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEK,qBAAqB,CACzB,KAAa,EACb,SAAmB;;YAEnB,MAAM,GAAG,GAAG,GAAG,2BAAe,gDAAgD,CAAA;YAC9E,MAAM,OAAO,GAAG;gBACd,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;aAC1C,CAAA;YACD,MAAM,MAAM,GAAG;gBACb,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,CAAC;aACd,CAAA;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;gBACzD,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC,CAAA;YACH,OAAO,MAAM,CAAA;QACf,CAAC;KAAA;IAEK,gBAAgB,CACpB,eAAuB;;YAEvB,MAAM,iBAAiB,GACrB,OAAO,UAAU,KAAK,WAAW,IAAI,UAAU,CAAC,YAAY;gBAC1D,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC;gBACjD,CAAC,CAAC,IAAI,CAAA;YACV,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAA;YAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAA;YACtC,MAAM,gBAAgB,GAAG,QAAQ;iBAC9B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;iBACpC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACf,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;gBACtD,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;aAC3B,CAAC,CAAC;iBACF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;YAC9C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAA;QACjD,CAAC;KAAA;IAEK,WAAW,CACf,OAAmB,EACnB,eAAuB;;YAEvB,MAAM,GAAG,GAAG,GAAG,2BAAe,wCAAwC,CAAA;YACtE,MAAM,OAAO,GAAG;gBACd,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;aAC1C,CAAA;YACD,MAAM,MAAM,GAAG;gBACb,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBACzC,YAAY,EAAE,eAAe;aAC9B,CAAA;YAED,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAiC,GAAG,EAAE;oBACpE,OAAO;oBACP,MAAM;iBACP,CAAC,CAAA;gBACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAA;gBACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;aAC5D;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;aACvD;QACH,CAAC;KAAA;IAEO,aAAa,CAAC,OAAuB;QAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;YAC3B,OAAO;gBACL,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,MAAM;aACb,CAAA;SACF;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE;YACvC,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,aAAa;wBACnB,IAAI,EAAE,OAAO,CAAC,OAAO;qBACtB;iBACF;gBACD,MAAM,EAAE,WAAW;aACpB,CAAA;SACF;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;SACxC;IACH,CAAC;CACF;AAhGD,4CAgGC"}
|
package/lib/cjs/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { AiAgentArgs, BotContext, Plugin } from '@botonic/core';
|
|
1
|
+
import { AiAgentArgs, BotContext, Plugin, ResolvedPlugins } from '@botonic/core';
|
|
2
2
|
import { CustomTool, InferenceResponse, PluginAiAgentOptions } from './types';
|
|
3
|
-
export default class BotonicPluginAiAgents implements Plugin {
|
|
3
|
+
export default class BotonicPluginAiAgents<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> implements Plugin {
|
|
4
4
|
private readonly authToken?;
|
|
5
|
-
toolDefinitions: CustomTool[];
|
|
6
|
-
constructor(options?: PluginAiAgentOptions);
|
|
5
|
+
toolDefinitions: CustomTool<TPlugins, TExtraData>[];
|
|
6
|
+
constructor(options?: PluginAiAgentOptions<TPlugins, TExtraData>);
|
|
7
7
|
pre(): void;
|
|
8
|
-
getInference(request: BotContext, aiAgentArgs: AiAgentArgs): Promise<InferenceResponse>;
|
|
8
|
+
getInference(request: BotContext<TPlugins, TExtraData>, aiAgentArgs: AiAgentArgs): Promise<InferenceResponse>;
|
|
9
9
|
private getMessages;
|
|
10
10
|
private buildTools;
|
|
11
11
|
}
|
package/lib/cjs/index.js
CHANGED
|
@@ -30,8 +30,14 @@ class BotonicPluginAiAgents {
|
|
|
30
30
|
const messages = yield this.getMessages(request, authToken, constants_1.MAX_MEMORY_LENGTH);
|
|
31
31
|
const context = {
|
|
32
32
|
authToken,
|
|
33
|
+
sourceIds: aiAgentArgs.sourceIds || [],
|
|
34
|
+
knowledgeUsed: {
|
|
35
|
+
query: '',
|
|
36
|
+
sourceIds: [],
|
|
37
|
+
chunksIds: [],
|
|
38
|
+
chunkTexts: [],
|
|
39
|
+
},
|
|
33
40
|
request,
|
|
34
|
-
sources: aiAgentArgs.sourceIds || [],
|
|
35
41
|
};
|
|
36
42
|
const runner = new runner_1.AIAgentRunner(agent);
|
|
37
43
|
return yield runner.run(messages, context);
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AACA,2CAAqC;AAErC,mDAAgD;AAChD,2CAAuD;AACvD,6DAAuD;AACvD,qCAAsC;AACtC,qCAAwC;AAUxC,MAAqB,qBAAqB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/runner.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { ResolvedPlugins } from '@botonic/core';
|
|
1
2
|
import { AgenticInputMessage, AIAgent, Context, RunResult } from './types';
|
|
2
|
-
export declare class AIAgentRunner {
|
|
3
|
+
export declare class AIAgentRunner<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
3
4
|
private agent;
|
|
4
|
-
constructor(agent: AIAgent);
|
|
5
|
-
run(messages: AgenticInputMessage[], context: Context, maxRetries?: number): Promise<RunResult>;
|
|
5
|
+
constructor(agent: AIAgent<TPlugins, TExtraData>);
|
|
6
|
+
run(messages: AgenticInputMessage[], context: Context<TPlugins, TExtraData>, maxRetries?: number): Promise<RunResult>;
|
|
6
7
|
private runWithRetry;
|
|
7
|
-
private
|
|
8
|
+
private getToolsExecuted;
|
|
9
|
+
private getToolExecutionInfo;
|
|
10
|
+
private getSafeToolArguments;
|
|
8
11
|
}
|
package/lib/cjs/runner.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AIAgentRunner = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const agents_1 = require("@openai/agents");
|
|
6
|
+
const tools_1 = require("./tools");
|
|
6
7
|
class AIAgentRunner {
|
|
7
8
|
constructor(agent) {
|
|
8
9
|
this.agent = agent;
|
|
@@ -23,7 +24,7 @@ class AIAgentRunner {
|
|
|
23
24
|
const outputMessages = ((_a = result.finalOutput) === null || _a === void 0 ? void 0 : _a.messages) || [];
|
|
24
25
|
const hasExit = outputMessages.length === 0 ||
|
|
25
26
|
outputMessages.some(message => message.type === 'exit');
|
|
26
|
-
const toolsExecuted = this.
|
|
27
|
+
const toolsExecuted = this.getToolsExecuted(result, context);
|
|
27
28
|
return {
|
|
28
29
|
messages: hasExit
|
|
29
30
|
? []
|
|
@@ -55,14 +56,39 @@ class AIAgentRunner {
|
|
|
55
56
|
}
|
|
56
57
|
});
|
|
57
58
|
}
|
|
58
|
-
|
|
59
|
+
getToolsExecuted(result, context) {
|
|
59
60
|
var _a;
|
|
60
|
-
return (((_a = result.newItems) === null || _a === void 0 ? void 0 : _a.filter(item => item instanceof agents_1.RunToolCallItem).map((item) =>
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return
|
|
65
|
-
|
|
61
|
+
return (((_a = result.newItems) === null || _a === void 0 ? void 0 : _a.filter(item => item instanceof agents_1.RunToolCallItem).map((item) => this.getToolExecutionInfo(item, context)).filter((toolExecution) => toolExecution.toolName !== '')) || []);
|
|
62
|
+
}
|
|
63
|
+
getToolExecutionInfo(item, context) {
|
|
64
|
+
if (item.rawItem.type !== 'function_call') {
|
|
65
|
+
return {
|
|
66
|
+
toolName: '',
|
|
67
|
+
toolArguments: {},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const toolName = item.rawItem.name;
|
|
71
|
+
const toolArguments = this.getSafeToolArguments(item.rawItem.arguments);
|
|
72
|
+
if (toolName === tools_1.retrieveKnowledge.name) {
|
|
73
|
+
return {
|
|
74
|
+
toolName,
|
|
75
|
+
toolArguments,
|
|
76
|
+
knowledgebaseSourcesIds: context.knowledgeUsed.sourceIds,
|
|
77
|
+
knowledgebaseChunksIds: context.knowledgeUsed.chunksIds,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
toolName,
|
|
82
|
+
toolArguments,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
getSafeToolArguments(rawToolArguments) {
|
|
86
|
+
try {
|
|
87
|
+
return JSON.parse(rawToolArguments);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
66
92
|
}
|
|
67
93
|
}
|
|
68
94
|
exports.AIAgentRunner = AIAgentRunner;
|
package/lib/cjs/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,17 @@ exports.retrieveKnowledge = (0, agents_1.tool)({
|
|
|
16
16
|
if (!context) {
|
|
17
17
|
throw new Error('Context is required');
|
|
18
18
|
}
|
|
19
|
-
const
|
|
19
|
+
const sourceIds = context.sourceIds;
|
|
20
20
|
const client = new hubtype_api_client_1.HubtypeApiClient(context.authToken);
|
|
21
|
-
const chunks = yield client.retrieveSimilarChunks(query,
|
|
22
|
-
|
|
21
|
+
const chunks = yield client.retrieveSimilarChunks(query, sourceIds);
|
|
22
|
+
const chunkTexts = chunks.map(chunk => chunk.text);
|
|
23
|
+
context.knowledgeUsed = {
|
|
24
|
+
query,
|
|
25
|
+
sourceIds,
|
|
26
|
+
chunksIds: chunks.map(chunk => chunk.id),
|
|
27
|
+
chunkTexts,
|
|
28
|
+
};
|
|
29
|
+
return chunkTexts;
|
|
23
30
|
}),
|
|
24
31
|
});
|
|
25
32
|
//# sourceMappingURL=retrieve-knowledge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieve-knowledge.js","sourceRoot":"","sources":["../../../src/tools/retrieve-knowledge.ts"],"names":[],"mappings":";;;;AAAA,2CAAiD;AACjD,6BAAuB;AAEvB,8DAAwD;AAG3C,QAAA,iBAAiB,GAAG,IAAA,aAAI,EAAoB;IACvD,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,kIAAkI;IACpI,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KACzE,CAAC;IACF,OAAO,EAAE,CACP,EAAE,KAAK,EAAqB,EAC5B,UAAgC,EACb,EAAE;QACrB,MAAM,OAAO,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,CAAA;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;SACvC;QACD,MAAM,
|
|
1
|
+
{"version":3,"file":"retrieve-knowledge.js","sourceRoot":"","sources":["../../../src/tools/retrieve-knowledge.ts"],"names":[],"mappings":";;;;AAAA,2CAAiD;AACjD,6BAAuB;AAEvB,8DAAwD;AAG3C,QAAA,iBAAiB,GAAG,IAAA,aAAI,EAAoB;IACvD,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,kIAAkI;IACpI,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KACzE,CAAC;IACF,OAAO,EAAE,CACP,EAAE,KAAK,EAAqB,EAC5B,UAAgC,EACb,EAAE;QACrB,MAAM,OAAO,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,CAAA;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;SACvC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,MAAM,MAAM,GAAG,IAAI,qCAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QACnE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAElD,OAAO,CAAC,aAAa,GAAG;YACtB,KAAK;YACL,SAAS;YACT,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,UAAU;SACX,CAAA;QAED,OAAO,UAAU,CAAA;IACnB,CAAC,CAAA;CACF,CAAC,CAAA"}
|
package/lib/cjs/types.d.ts
CHANGED
|
@@ -4,22 +4,32 @@ import { ZodSchema } from 'zod';
|
|
|
4
4
|
import { OutputSchema } from './structured-output';
|
|
5
5
|
export interface Context<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
6
6
|
authToken: string;
|
|
7
|
+
sourceIds: string[];
|
|
8
|
+
knowledgeUsed: {
|
|
9
|
+
query: string;
|
|
10
|
+
sourceIds: string[];
|
|
11
|
+
chunksIds: string[];
|
|
12
|
+
chunkTexts: string[];
|
|
13
|
+
};
|
|
7
14
|
request: BotContext<TPlugins, TExtraData>;
|
|
8
|
-
sources: string[];
|
|
9
15
|
}
|
|
10
16
|
export type RunContext<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> = OpenAIRunContext<Context<TPlugins, TExtraData>>;
|
|
11
|
-
export interface CustomTool {
|
|
17
|
+
export interface CustomTool<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
12
18
|
name: string;
|
|
13
19
|
description: string;
|
|
14
20
|
schema: ZodSchema;
|
|
15
|
-
func:
|
|
21
|
+
func: (input?: any, runContext?: RunContext<TPlugins, TExtraData>) => Promise<any>;
|
|
22
|
+
}
|
|
23
|
+
export interface Chunk {
|
|
24
|
+
id: string;
|
|
25
|
+
text: string;
|
|
16
26
|
}
|
|
17
27
|
export type ContactInfo = Record<string, string>;
|
|
18
|
-
export type Tool = OpenAITool<Context
|
|
19
|
-
export type AIAgent = Agent<Context, typeof OutputSchema>;
|
|
20
|
-
export interface PluginAiAgentOptions {
|
|
28
|
+
export type Tool<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> = OpenAITool<Context<TPlugins, TExtraData>>;
|
|
29
|
+
export type AIAgent<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> = Agent<Context<TPlugins, TExtraData>, typeof OutputSchema>;
|
|
30
|
+
export interface PluginAiAgentOptions<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
21
31
|
authToken?: string;
|
|
22
|
-
customTools?: CustomTool[];
|
|
32
|
+
customTools?: CustomTool<TPlugins, TExtraData>[];
|
|
23
33
|
}
|
|
24
34
|
export type AgenticInputMessage = AgentInputItem;
|
|
25
35
|
export { AgenticOutputMessage, AiAgentArgs, GuardrailRule, InferenceResponse, RunResult, };
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { ResolvedPlugins } from '@botonic/core';
|
|
1
2
|
import { AIAgent, ContactInfo, GuardrailRule, Tool } from './types';
|
|
2
|
-
export declare class AIAgentBuilder {
|
|
3
|
+
export declare class AIAgentBuilder<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
3
4
|
private name;
|
|
4
5
|
private instructions;
|
|
5
6
|
private tools;
|
|
6
7
|
private inputGuardrails;
|
|
7
|
-
constructor(name: string, instructions: string, tools: Tool[], contactInfo: ContactInfo, inputGuardrailRules: GuardrailRule[], sourceIds: string[]);
|
|
8
|
-
build(): AIAgent
|
|
8
|
+
constructor(name: string, instructions: string, tools: Tool<TPlugins, TExtraData>[], contactInfo: ContactInfo, inputGuardrailRules: GuardrailRule[], sourceIds: string[]);
|
|
9
|
+
build(): AIAgent<TPlugins, TExtraData>;
|
|
9
10
|
private addExtraInstructions;
|
|
10
11
|
private getContactInfoInstructions;
|
|
11
12
|
private getMetadataInstructions;
|
package/lib/esm/agent-builder.js
CHANGED
|
@@ -16,7 +16,6 @@ export class AIAgentBuilder {
|
|
|
16
16
|
build() {
|
|
17
17
|
const modelSettings = {};
|
|
18
18
|
if (this.tools.includes(retrieveKnowledge)) {
|
|
19
|
-
// With this line, we force the agent to use the retrieve_knowledge tool
|
|
20
19
|
modelSettings.toolChoice = retrieveKnowledge.name;
|
|
21
20
|
}
|
|
22
21
|
return new Agent({
|
|
@@ -46,7 +45,6 @@ export class AIAgentBuilder {
|
|
|
46
45
|
const metadata = `Current Date: ${new Date().toISOString()}`;
|
|
47
46
|
return `<metadata>\n${metadata}\n</metadata>`;
|
|
48
47
|
}
|
|
49
|
-
// TODO: Review in the future if the model works better without this instruction
|
|
50
48
|
getOutputInstructions() {
|
|
51
49
|
const example = {
|
|
52
50
|
messages: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-builder.js","sourceRoot":"","sources":["../../src/agent-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-builder.js","sourceRoot":"","sources":["../../src/agent-builder.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/constants.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export const HUBTYPE_API_URL = process.env.HUBTYPE_API_URL || 'https://api.hubtype.com';
|
|
2
2
|
export const AZURE_OPENAI_API_KEY = process.env.AZURE_OPENAI_API_KEY; // pragma: allowlist secret
|
|
3
3
|
export const AZURE_OPENAI_API_BASE = process.env.AZURE_OPENAI_API_BASE;
|
|
4
|
-
export const AZURE_OPENAI_API_DEPLOYMENT_NAME = process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME || 'gpt-
|
|
5
|
-
export const AZURE_OPENAI_API_VERSION = process.env.AZURE_OPENAI_API_VERSION || '
|
|
4
|
+
export const AZURE_OPENAI_API_DEPLOYMENT_NAME = process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME || 'gpt-41-mini_p1';
|
|
5
|
+
export const AZURE_OPENAI_API_VERSION = process.env.AZURE_OPENAI_API_VERSION || '2025-01-01-preview';
|
|
6
6
|
export const isProd = process.env.NODE_ENV === 'production';
|
|
7
7
|
export const MAX_MEMORY_LENGTH = 25;
|
|
8
8
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BotContext } from '@botonic/core';
|
|
2
|
-
import { AgenticInputMessage } from './types';
|
|
2
|
+
import { AgenticInputMessage, Chunk } from './types';
|
|
3
3
|
export declare class HubtypeApiClient {
|
|
4
4
|
private readonly authToken;
|
|
5
5
|
constructor(authToken: string);
|
|
6
|
-
retrieveSimilarChunks(query: string,
|
|
6
|
+
retrieveSimilarChunks(query: string, sourceIds: string[]): Promise<Chunk[]>;
|
|
7
7
|
getLocalMessages(maxMemoryLength: number): Promise<AgenticInputMessage[]>;
|
|
8
8
|
getMessages(request: BotContext, maxMemoryLength: number): Promise<AgenticInputMessage[]>;
|
|
9
9
|
private formatMessage;
|
|
@@ -5,7 +5,7 @@ export class HubtypeApiClient {
|
|
|
5
5
|
constructor(authToken) {
|
|
6
6
|
this.authToken = authToken;
|
|
7
7
|
}
|
|
8
|
-
retrieveSimilarChunks(query,
|
|
8
|
+
retrieveSimilarChunks(query, sourceIds) {
|
|
9
9
|
return __awaiter(this, void 0, void 0, function* () {
|
|
10
10
|
const url = `${HUBTYPE_API_URL}/external/v1/ai/knowledge_base/similar_chunks/`;
|
|
11
11
|
const headers = {
|
|
@@ -14,11 +14,15 @@ export class HubtypeApiClient {
|
|
|
14
14
|
};
|
|
15
15
|
const params = {
|
|
16
16
|
query,
|
|
17
|
-
source_ids:
|
|
17
|
+
source_ids: sourceIds,
|
|
18
18
|
num_chunks: 5,
|
|
19
19
|
};
|
|
20
20
|
const response = yield axios.post(url, params, { headers });
|
|
21
|
-
|
|
21
|
+
const chunks = response.data.chunks.map((chunk) => ({
|
|
22
|
+
id: chunk.id,
|
|
23
|
+
text: chunk.text,
|
|
24
|
+
}));
|
|
25
|
+
return chunks;
|
|
22
26
|
});
|
|
23
27
|
}
|
|
24
28
|
getLocalMessages(maxMemoryLength) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hubtype-api-client.js","sourceRoot":"","sources":["../../src/hubtype-api-client.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAe7C,MAAM,OAAO,gBAAgB;IAG3B,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEK,qBAAqB,CACzB,KAAa,EACb,
|
|
1
|
+
{"version":3,"file":"hubtype-api-client.js","sourceRoot":"","sources":["../../src/hubtype-api-client.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAe7C,MAAM,OAAO,gBAAgB;IAG3B,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEK,qBAAqB,CACzB,KAAa,EACb,SAAmB;;YAEnB,MAAM,GAAG,GAAG,GAAG,eAAe,gDAAgD,CAAA;YAC9E,MAAM,OAAO,GAAG;gBACd,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;aAC1C,CAAA;YACD,MAAM,MAAM,GAAG;gBACb,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,CAAC;aACd,CAAA;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;gBACzD,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC,CAAA;YACH,OAAO,MAAM,CAAA;QACf,CAAC;KAAA;IAEK,gBAAgB,CACpB,eAAuB;;YAEvB,MAAM,iBAAiB,GACrB,OAAO,UAAU,KAAK,WAAW,IAAI,UAAU,CAAC,YAAY;gBAC1D,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC;gBACjD,CAAC,CAAC,IAAI,CAAA;YACV,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAA;YAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAA;YACtC,MAAM,gBAAgB,GAAG,QAAQ;iBAC9B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;iBACpC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACf,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;gBACtD,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;aAC3B,CAAC,CAAC;iBACF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;YAC9C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAA;QACjD,CAAC;KAAA;IAEK,WAAW,CACf,OAAmB,EACnB,eAAuB;;YAEvB,MAAM,GAAG,GAAG,GAAG,eAAe,wCAAwC,CAAA;YACtE,MAAM,OAAO,GAAG;gBACd,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE;aAC1C,CAAA;YACD,MAAM,MAAM,GAAG;gBACb,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBACzC,YAAY,EAAE,eAAe;aAC9B,CAAA;YAED,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAiC,GAAG,EAAE;oBACpE,OAAO;oBACP,MAAM;iBACP,CAAC,CAAA;gBACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAA;gBACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;aAC5D;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;aACvD;QACH,CAAC;KAAA;IAEO,aAAa,CAAC,OAAuB;QAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;YAC3B,OAAO;gBACL,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,MAAM;aACb,CAAA;SACF;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE;YACvC,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,aAAa;wBACnB,IAAI,EAAE,OAAO,CAAC,OAAO;qBACtB;iBACF;gBACD,MAAM,EAAE,WAAW;aACpB,CAAA;SACF;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;SACxC;IACH,CAAC;CACF"}
|
package/lib/esm/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { AiAgentArgs, BotContext, Plugin } from '@botonic/core';
|
|
1
|
+
import { AiAgentArgs, BotContext, Plugin, ResolvedPlugins } from '@botonic/core';
|
|
2
2
|
import { CustomTool, InferenceResponse, PluginAiAgentOptions } from './types';
|
|
3
|
-
export default class BotonicPluginAiAgents implements Plugin {
|
|
3
|
+
export default class BotonicPluginAiAgents<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> implements Plugin {
|
|
4
4
|
private readonly authToken?;
|
|
5
|
-
toolDefinitions: CustomTool[];
|
|
6
|
-
constructor(options?: PluginAiAgentOptions);
|
|
5
|
+
toolDefinitions: CustomTool<TPlugins, TExtraData>[];
|
|
6
|
+
constructor(options?: PluginAiAgentOptions<TPlugins, TExtraData>);
|
|
7
7
|
pre(): void;
|
|
8
|
-
getInference(request: BotContext, aiAgentArgs: AiAgentArgs): Promise<InferenceResponse>;
|
|
8
|
+
getInference(request: BotContext<TPlugins, TExtraData>, aiAgentArgs: AiAgentArgs): Promise<InferenceResponse>;
|
|
9
9
|
private getMessages;
|
|
10
10
|
private buildTools;
|
|
11
11
|
}
|
package/lib/esm/index.js
CHANGED
|
@@ -28,8 +28,14 @@ export default class BotonicPluginAiAgents {
|
|
|
28
28
|
const messages = yield this.getMessages(request, authToken, MAX_MEMORY_LENGTH);
|
|
29
29
|
const context = {
|
|
30
30
|
authToken,
|
|
31
|
+
sourceIds: aiAgentArgs.sourceIds || [],
|
|
32
|
+
knowledgeUsed: {
|
|
33
|
+
query: '',
|
|
34
|
+
sourceIds: [],
|
|
35
|
+
chunksIds: [],
|
|
36
|
+
chunkTexts: [],
|
|
37
|
+
},
|
|
31
38
|
request,
|
|
32
|
-
sources: aiAgentArgs.sourceIds || [],
|
|
33
39
|
};
|
|
34
40
|
const runner = new AIAgentRunner(agent);
|
|
35
41
|
return yield runner.run(messages, context);
|
package/lib/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAErC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAUxC,MAAM,CAAC,OAAO,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/runner.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { ResolvedPlugins } from '@botonic/core';
|
|
1
2
|
import { AgenticInputMessage, AIAgent, Context, RunResult } from './types';
|
|
2
|
-
export declare class AIAgentRunner {
|
|
3
|
+
export declare class AIAgentRunner<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
3
4
|
private agent;
|
|
4
|
-
constructor(agent: AIAgent);
|
|
5
|
-
run(messages: AgenticInputMessage[], context: Context, maxRetries?: number): Promise<RunResult>;
|
|
5
|
+
constructor(agent: AIAgent<TPlugins, TExtraData>);
|
|
6
|
+
run(messages: AgenticInputMessage[], context: Context<TPlugins, TExtraData>, maxRetries?: number): Promise<RunResult>;
|
|
6
7
|
private runWithRetry;
|
|
7
|
-
private
|
|
8
|
+
private getToolsExecuted;
|
|
9
|
+
private getToolExecutionInfo;
|
|
10
|
+
private getSafeToolArguments;
|
|
8
11
|
}
|
package/lib/esm/runner.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
2
|
import { InputGuardrailTripwireTriggered, Runner, RunToolCallItem, } from '@openai/agents';
|
|
3
|
+
import { retrieveKnowledge } from './tools';
|
|
3
4
|
export class AIAgentRunner {
|
|
4
5
|
constructor(agent) {
|
|
5
6
|
this.agent = agent;
|
|
@@ -20,7 +21,7 @@ export class AIAgentRunner {
|
|
|
20
21
|
const outputMessages = ((_a = result.finalOutput) === null || _a === void 0 ? void 0 : _a.messages) || [];
|
|
21
22
|
const hasExit = outputMessages.length === 0 ||
|
|
22
23
|
outputMessages.some(message => message.type === 'exit');
|
|
23
|
-
const toolsExecuted = this.
|
|
24
|
+
const toolsExecuted = this.getToolsExecuted(result, context);
|
|
24
25
|
return {
|
|
25
26
|
messages: hasExit
|
|
26
27
|
? []
|
|
@@ -52,14 +53,39 @@ export class AIAgentRunner {
|
|
|
52
53
|
}
|
|
53
54
|
});
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
+
getToolsExecuted(result, context) {
|
|
56
57
|
var _a;
|
|
57
|
-
return (((_a = result.newItems) === null || _a === void 0 ? void 0 : _a.filter(item => item instanceof RunToolCallItem).map((item) =>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
return
|
|
62
|
-
|
|
58
|
+
return (((_a = result.newItems) === null || _a === void 0 ? void 0 : _a.filter(item => item instanceof RunToolCallItem).map((item) => this.getToolExecutionInfo(item, context)).filter((toolExecution) => toolExecution.toolName !== '')) || []);
|
|
59
|
+
}
|
|
60
|
+
getToolExecutionInfo(item, context) {
|
|
61
|
+
if (item.rawItem.type !== 'function_call') {
|
|
62
|
+
return {
|
|
63
|
+
toolName: '',
|
|
64
|
+
toolArguments: {},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const toolName = item.rawItem.name;
|
|
68
|
+
const toolArguments = this.getSafeToolArguments(item.rawItem.arguments);
|
|
69
|
+
if (toolName === retrieveKnowledge.name) {
|
|
70
|
+
return {
|
|
71
|
+
toolName,
|
|
72
|
+
toolArguments,
|
|
73
|
+
knowledgebaseSourcesIds: context.knowledgeUsed.sourceIds,
|
|
74
|
+
knowledgebaseChunksIds: context.knowledgeUsed.chunksIds,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
toolName,
|
|
79
|
+
toolArguments,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
getSafeToolArguments(rawToolArguments) {
|
|
83
|
+
try {
|
|
84
|
+
return JSON.parse(rawToolArguments);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
63
89
|
}
|
|
64
90
|
}
|
|
65
91
|
//# sourceMappingURL=runner.js.map
|
package/lib/esm/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":";AACA,OAAO,EACL,+BAA+B,EAC/B,MAAM,EACN,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAS3C,MAAM,OAAO,aAAa;IAMxB,YAAY,KAAoC;QAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAEK,GAAG,CACP,QAA+B,EAC/B,OAAsC,EACtC,aAAqB,CAAC;;YAEtB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QAC5D,CAAC;KAAA;IAEa,YAAY,CACxB,aAAoC,EACpC,OAAsC,EACtC,UAAkB,EAClB,OAAe;;;YAEf,IAAI;gBACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;oBACxB,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;iBAClC,CAAC,CAAA;gBACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;gBAEvE,MAAM,cAAc,GAAG,CAAA,MAAA,MAAM,CAAC,WAAW,0CAAE,QAAQ,KAAI,EAAE,CAAA;gBACzD,MAAM,OAAO,GACX,cAAc,CAAC,MAAM,KAAK,CAAC;oBAC3B,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;gBACzD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAE5D,OAAO;oBACL,QAAQ,EAAE,OAAO;wBACf,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAE,cAAc,CAAC,MAAM,CACpB,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CACR;oBAChC,aAAa;oBACb,IAAI,EAAE,OAAO;oBACb,YAAY,EAAE,aAAa,CAAC,MAAM;oBAClC,KAAK,EAAE,KAAK;oBACZ,wBAAwB,EAAE,EAAE;oBAC5B,yBAAyB,EAAE,EAAE;iBAC9B,CAAA;aACF;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,KAAK,YAAY,+BAA+B,EAAE;oBACpD,OAAO;wBACL,QAAQ,EAAE,EAAE;wBACZ,YAAY,EAAE,CAAC;wBACf,aAAa,EAAE,EAAE;wBACjB,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,KAAK;wBACZ,wBAAwB,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;wBACxD,yBAAyB,EAAE,EAAE;qBAC9B,CAAA;iBACF;gBACD,IAAI,OAAO,GAAG,UAAU,EAAE;oBACxB,MAAM,KAAK,CAAA;iBACZ;gBACD,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC,CAAA;aAC1E;;KACF;IAEO,gBAAgB,CACtB,MAAM,EACN,OAAsC;;QAEtC,OAAO,CACL,CAAA,MAAA,MAAM,CAAC,QAAQ,0CACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,YAAY,eAAe,EAC/C,GAAG,CAAC,CAAC,IAAqB,EAAE,EAAE,CAC7B,IAAI,CAAC,oBAAoB,CAAC,IAAuB,EAAE,OAAO,CAAC,EAE5D,MAAM,CACL,CAAC,aAA4B,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,KAAK,EAAE,CAChE,KAAI,EAAE,CACV,CAAA;IACH,CAAC;IAEO,oBAAoB,CAC1B,IAAqB,EACrB,OAAsC;QAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE;YACzC,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,aAAa,EAAE,EAAE;aAClB,CAAA;SACF;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAEvE,IAAI,QAAQ,KAAK,iBAAiB,CAAC,IAAI,EAAE;YACvC,OAAO;gBACL,QAAQ;gBACR,aAAa;gBACb,uBAAuB,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS;gBACxD,sBAAsB,EAAE,OAAO,CAAC,aAAa,CAAC,SAAS;aACxD,CAAA;SACF;QAED,OAAO;YACL,QAAQ;YACR,aAAa;SACd,CAAA;IACH,CAAC;IAEO,oBAAoB,CAAC,gBAAwB;QACnD,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;SACpC;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,EAAE,CAAA;SACV;IACH,CAAC;CACF"}
|
|
@@ -13,10 +13,17 @@ export const retrieveKnowledge = tool({
|
|
|
13
13
|
if (!context) {
|
|
14
14
|
throw new Error('Context is required');
|
|
15
15
|
}
|
|
16
|
-
const
|
|
16
|
+
const sourceIds = context.sourceIds;
|
|
17
17
|
const client = new HubtypeApiClient(context.authToken);
|
|
18
|
-
const chunks = yield client.retrieveSimilarChunks(query,
|
|
19
|
-
|
|
18
|
+
const chunks = yield client.retrieveSimilarChunks(query, sourceIds);
|
|
19
|
+
const chunkTexts = chunks.map(chunk => chunk.text);
|
|
20
|
+
context.knowledgeUsed = {
|
|
21
|
+
query,
|
|
22
|
+
sourceIds,
|
|
23
|
+
chunksIds: chunks.map(chunk => chunk.id),
|
|
24
|
+
chunkTexts,
|
|
25
|
+
};
|
|
26
|
+
return chunkTexts;
|
|
20
27
|
}),
|
|
21
28
|
});
|
|
22
29
|
//# sourceMappingURL=retrieve-knowledge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieve-knowledge.js","sourceRoot":"","sources":["../../../src/tools/retrieve-knowledge.ts"],"names":[],"mappings":";AAAA,OAAO,EAAc,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAGxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAoB;IACvD,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,kIAAkI;IACpI,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KACzE,CAAC;IACF,OAAO,EAAE,CACP,EAAE,KAAK,EAAqB,EAC5B,UAAgC,EACb,EAAE;QACrB,MAAM,OAAO,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,CAAA;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;SACvC;QACD,MAAM,
|
|
1
|
+
{"version":3,"file":"retrieve-knowledge.js","sourceRoot":"","sources":["../../../src/tools/retrieve-knowledge.ts"],"names":[],"mappings":";AAAA,OAAO,EAAc,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAGxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAoB;IACvD,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,kIAAkI;IACpI,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KACzE,CAAC;IACF,OAAO,EAAE,CACP,EAAE,KAAK,EAAqB,EAC5B,UAAgC,EACb,EAAE;QACrB,MAAM,OAAO,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,CAAA;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;SACvC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QACnE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAElD,OAAO,CAAC,aAAa,GAAG;YACtB,KAAK;YACL,SAAS;YACT,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,UAAU;SACX,CAAA;QAED,OAAO,UAAU,CAAA;IACnB,CAAC,CAAA;CACF,CAAC,CAAA"}
|
package/lib/esm/types.d.ts
CHANGED
|
@@ -4,22 +4,32 @@ import { ZodSchema } from 'zod';
|
|
|
4
4
|
import { OutputSchema } from './structured-output';
|
|
5
5
|
export interface Context<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
6
6
|
authToken: string;
|
|
7
|
+
sourceIds: string[];
|
|
8
|
+
knowledgeUsed: {
|
|
9
|
+
query: string;
|
|
10
|
+
sourceIds: string[];
|
|
11
|
+
chunksIds: string[];
|
|
12
|
+
chunkTexts: string[];
|
|
13
|
+
};
|
|
7
14
|
request: BotContext<TPlugins, TExtraData>;
|
|
8
|
-
sources: string[];
|
|
9
15
|
}
|
|
10
16
|
export type RunContext<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> = OpenAIRunContext<Context<TPlugins, TExtraData>>;
|
|
11
|
-
export interface CustomTool {
|
|
17
|
+
export interface CustomTool<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
12
18
|
name: string;
|
|
13
19
|
description: string;
|
|
14
20
|
schema: ZodSchema;
|
|
15
|
-
func:
|
|
21
|
+
func: (input?: any, runContext?: RunContext<TPlugins, TExtraData>) => Promise<any>;
|
|
22
|
+
}
|
|
23
|
+
export interface Chunk {
|
|
24
|
+
id: string;
|
|
25
|
+
text: string;
|
|
16
26
|
}
|
|
17
27
|
export type ContactInfo = Record<string, string>;
|
|
18
|
-
export type Tool = OpenAITool<Context
|
|
19
|
-
export type AIAgent = Agent<Context, typeof OutputSchema>;
|
|
20
|
-
export interface PluginAiAgentOptions {
|
|
28
|
+
export type Tool<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> = OpenAITool<Context<TPlugins, TExtraData>>;
|
|
29
|
+
export type AIAgent<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> = Agent<Context<TPlugins, TExtraData>, typeof OutputSchema>;
|
|
30
|
+
export interface PluginAiAgentOptions<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> {
|
|
21
31
|
authToken?: string;
|
|
22
|
-
customTools?: CustomTool[];
|
|
32
|
+
customTools?: CustomTool<TPlugins, TExtraData>[];
|
|
23
33
|
}
|
|
24
34
|
export type AgenticInputMessage = AgentInputItem;
|
|
25
35
|
export { AgenticOutputMessage, AiAgentArgs, GuardrailRule, InferenceResponse, RunResult, };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botonic/plugin-ai-agents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.41.0-alpha.0",
|
|
4
4
|
"main": "./lib/cjs/index.js",
|
|
5
5
|
"module": "./lib/esm/index.js",
|
|
6
6
|
"description": "Use AI Agents to generate your contents",
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"lint_core": "../../node_modules/.bin/eslint_d --cache --quiet 'src/**/*.ts*'"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@botonic/core": "
|
|
17
|
-
"@openai/agents": "^0.
|
|
16
|
+
"@botonic/core": "0.41.0-alpha.0",
|
|
17
|
+
"@openai/agents": "^0.1.11",
|
|
18
18
|
"axios": "^1.12.2",
|
|
19
|
-
"openai": "^5.
|
|
19
|
+
"openai": "^5.23.2",
|
|
20
20
|
"uuid": "^10.0.0",
|
|
21
|
-
"zod": "3.25.
|
|
21
|
+
"zod": "3.25.76"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/uuid": "^10.0.0"
|
package/src/agent-builder.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ResolvedPlugins } from '@botonic/core'
|
|
1
2
|
import { Agent, InputGuardrail, ModelSettings } from '@openai/agents'
|
|
2
3
|
|
|
3
4
|
import { createInputGuardrail } from './guardrails'
|
|
@@ -5,16 +6,19 @@ import { OutputSchema } from './structured-output'
|
|
|
5
6
|
import { mandatoryTools, retrieveKnowledge } from './tools'
|
|
6
7
|
import { AIAgent, ContactInfo, GuardrailRule, Tool } from './types'
|
|
7
8
|
|
|
8
|
-
export class AIAgentBuilder
|
|
9
|
+
export class AIAgentBuilder<
|
|
10
|
+
TPlugins extends ResolvedPlugins = ResolvedPlugins,
|
|
11
|
+
TExtraData = any,
|
|
12
|
+
> {
|
|
9
13
|
private name: string
|
|
10
14
|
private instructions: string
|
|
11
|
-
private tools: Tool[]
|
|
15
|
+
private tools: Tool<TPlugins, TExtraData>[]
|
|
12
16
|
private inputGuardrails: InputGuardrail[]
|
|
13
17
|
|
|
14
18
|
constructor(
|
|
15
19
|
name: string,
|
|
16
20
|
instructions: string,
|
|
17
|
-
tools: Tool[],
|
|
21
|
+
tools: Tool<TPlugins, TExtraData>[],
|
|
18
22
|
contactInfo: ContactInfo,
|
|
19
23
|
inputGuardrailRules: GuardrailRule[],
|
|
20
24
|
sourceIds: string[]
|
|
@@ -29,11 +33,10 @@ export class AIAgentBuilder {
|
|
|
29
33
|
}
|
|
30
34
|
}
|
|
31
35
|
|
|
32
|
-
build(): AIAgent {
|
|
36
|
+
build(): AIAgent<TPlugins, TExtraData> {
|
|
33
37
|
const modelSettings: ModelSettings = {}
|
|
34
38
|
|
|
35
39
|
if (this.tools.includes(retrieveKnowledge)) {
|
|
36
|
-
// With this line, we force the agent to use the retrieve_knowledge tool
|
|
37
40
|
modelSettings.toolChoice = retrieveKnowledge.name
|
|
38
41
|
}
|
|
39
42
|
|
|
@@ -56,7 +59,6 @@ export class AIAgentBuilder {
|
|
|
56
59
|
const metadataInstructions = this.getMetadataInstructions()
|
|
57
60
|
const contactInfoInstructions = this.getContactInfoInstructions(contactInfo)
|
|
58
61
|
const outputInstructions = this.getOutputInstructions()
|
|
59
|
-
|
|
60
62
|
return `${instructions}\n\n${metadataInstructions}\n\n${contactInfoInstructions}\n\n${outputInstructions}`
|
|
61
63
|
}
|
|
62
64
|
|
|
@@ -64,17 +66,14 @@ export class AIAgentBuilder {
|
|
|
64
66
|
const structuredContactInfo = Object.entries(contactInfo)
|
|
65
67
|
.map(([key, value]) => `${key}: ${value}`)
|
|
66
68
|
.join('\n')
|
|
67
|
-
|
|
68
69
|
return `<contact_info>\n${structuredContactInfo}\n</contact_info>`
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
private getMetadataInstructions(): string {
|
|
72
73
|
const metadata = `Current Date: ${new Date().toISOString()}`
|
|
73
|
-
|
|
74
74
|
return `<metadata>\n${metadata}\n</metadata>`
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
// TODO: Review in the future if the model works better without this instruction
|
|
78
77
|
private getOutputInstructions(): string {
|
|
79
78
|
const example = {
|
|
80
79
|
messages: [
|
|
@@ -87,16 +86,17 @@ export class AIAgentBuilder {
|
|
|
87
86
|
],
|
|
88
87
|
}
|
|
89
88
|
const output = `Return a JSON that follows the output schema provided. Never return multiple output schemas concatenated by a line break.\n<example>\n${JSON.stringify(example)}\n</example>`
|
|
90
|
-
|
|
91
89
|
return `<output>\n${output}\n</output>`
|
|
92
90
|
}
|
|
93
91
|
|
|
94
|
-
private addHubtypeTools(
|
|
92
|
+
private addHubtypeTools(
|
|
93
|
+
tools: Tool<TPlugins, TExtraData>[],
|
|
94
|
+
sourceIds: string[]
|
|
95
|
+
): Tool<TPlugins, TExtraData>[] {
|
|
95
96
|
const hubtypeTools: Tool[] = [...mandatoryTools]
|
|
96
97
|
if (sourceIds.length > 0) {
|
|
97
98
|
hubtypeTools.push(retrieveKnowledge)
|
|
98
99
|
}
|
|
99
|
-
|
|
100
100
|
return [...hubtypeTools, ...tools]
|
|
101
101
|
}
|
|
102
102
|
}
|
package/src/constants.ts
CHANGED
|
@@ -4,9 +4,9 @@ export const HUBTYPE_API_URL =
|
|
|
4
4
|
export const AZURE_OPENAI_API_KEY = process.env.AZURE_OPENAI_API_KEY // pragma: allowlist secret
|
|
5
5
|
export const AZURE_OPENAI_API_BASE = process.env.AZURE_OPENAI_API_BASE
|
|
6
6
|
export const AZURE_OPENAI_API_DEPLOYMENT_NAME =
|
|
7
|
-
process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME || 'gpt-
|
|
7
|
+
process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME || 'gpt-41-mini_p1'
|
|
8
8
|
export const AZURE_OPENAI_API_VERSION =
|
|
9
|
-
process.env.AZURE_OPENAI_API_VERSION || '
|
|
9
|
+
process.env.AZURE_OPENAI_API_VERSION || '2025-01-01-preview'
|
|
10
10
|
|
|
11
11
|
export const isProd = process.env.NODE_ENV === 'production'
|
|
12
12
|
|
|
@@ -3,7 +3,7 @@ import { BotContext } from '@botonic/core'
|
|
|
3
3
|
import axios from 'axios'
|
|
4
4
|
|
|
5
5
|
import { HUBTYPE_API_URL } from './constants'
|
|
6
|
-
import { AgenticInputMessage } from './types'
|
|
6
|
+
import { AgenticInputMessage, Chunk } from './types'
|
|
7
7
|
|
|
8
8
|
interface HubtypeAssistantMessage {
|
|
9
9
|
role: 'assistant'
|
|
@@ -26,8 +26,8 @@ export class HubtypeApiClient {
|
|
|
26
26
|
|
|
27
27
|
async retrieveSimilarChunks(
|
|
28
28
|
query: string,
|
|
29
|
-
|
|
30
|
-
): Promise<
|
|
29
|
+
sourceIds: string[]
|
|
30
|
+
): Promise<Chunk[]> {
|
|
31
31
|
const url = `${HUBTYPE_API_URL}/external/v1/ai/knowledge_base/similar_chunks/`
|
|
32
32
|
const headers = {
|
|
33
33
|
'Content-Type': 'application/json',
|
|
@@ -35,11 +35,15 @@ export class HubtypeApiClient {
|
|
|
35
35
|
}
|
|
36
36
|
const params = {
|
|
37
37
|
query,
|
|
38
|
-
source_ids:
|
|
38
|
+
source_ids: sourceIds,
|
|
39
39
|
num_chunks: 5,
|
|
40
40
|
}
|
|
41
41
|
const response = await axios.post(url, params, { headers })
|
|
42
|
-
|
|
42
|
+
const chunks = response.data.chunks.map((chunk: Chunk) => ({
|
|
43
|
+
id: chunk.id,
|
|
44
|
+
text: chunk.text,
|
|
45
|
+
}))
|
|
46
|
+
return chunks
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
async getLocalMessages(
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AiAgentArgs, BotContext, Plugin } from '@botonic/core'
|
|
1
|
+
import { AiAgentArgs, BotContext, Plugin, ResolvedPlugins } from '@botonic/core'
|
|
2
2
|
import { tool } from '@openai/agents'
|
|
3
3
|
|
|
4
4
|
import { AIAgentBuilder } from './agent-builder'
|
|
@@ -15,11 +15,15 @@ import {
|
|
|
15
15
|
Tool,
|
|
16
16
|
} from './types'
|
|
17
17
|
|
|
18
|
-
export default class BotonicPluginAiAgents
|
|
18
|
+
export default class BotonicPluginAiAgents<
|
|
19
|
+
TPlugins extends ResolvedPlugins = ResolvedPlugins,
|
|
20
|
+
TExtraData = any,
|
|
21
|
+
> implements Plugin
|
|
22
|
+
{
|
|
19
23
|
private readonly authToken?: string
|
|
20
|
-
public toolDefinitions: CustomTool[] = []
|
|
24
|
+
public toolDefinitions: CustomTool<TPlugins, TExtraData>[] = []
|
|
21
25
|
|
|
22
|
-
constructor(options?: PluginAiAgentOptions) {
|
|
26
|
+
constructor(options?: PluginAiAgentOptions<TPlugins, TExtraData>) {
|
|
23
27
|
setUpOpenAI()
|
|
24
28
|
this.authToken = options?.authToken
|
|
25
29
|
this.toolDefinitions = options?.customTools || []
|
|
@@ -30,7 +34,7 @@ export default class BotonicPluginAiAgents implements Plugin {
|
|
|
30
34
|
}
|
|
31
35
|
|
|
32
36
|
async getInference(
|
|
33
|
-
request: BotContext,
|
|
37
|
+
request: BotContext<TPlugins, TExtraData>,
|
|
34
38
|
aiAgentArgs: AiAgentArgs
|
|
35
39
|
): Promise<InferenceResponse> {
|
|
36
40
|
try {
|
|
@@ -42,7 +46,7 @@ export default class BotonicPluginAiAgents implements Plugin {
|
|
|
42
46
|
const tools = this.buildTools(
|
|
43
47
|
aiAgentArgs.activeTools?.map(tool => tool.name) || []
|
|
44
48
|
)
|
|
45
|
-
const agent = new AIAgentBuilder(
|
|
49
|
+
const agent = new AIAgentBuilder<TPlugins, TExtraData>(
|
|
46
50
|
aiAgentArgs.name,
|
|
47
51
|
aiAgentArgs.instructions,
|
|
48
52
|
tools,
|
|
@@ -56,13 +60,19 @@ export default class BotonicPluginAiAgents implements Plugin {
|
|
|
56
60
|
authToken,
|
|
57
61
|
MAX_MEMORY_LENGTH
|
|
58
62
|
)
|
|
59
|
-
const context: Context = {
|
|
63
|
+
const context: Context<TPlugins, TExtraData> = {
|
|
60
64
|
authToken,
|
|
65
|
+
sourceIds: aiAgentArgs.sourceIds || [],
|
|
66
|
+
knowledgeUsed: {
|
|
67
|
+
query: '',
|
|
68
|
+
sourceIds: [],
|
|
69
|
+
chunksIds: [],
|
|
70
|
+
chunkTexts: [],
|
|
71
|
+
},
|
|
61
72
|
request,
|
|
62
|
-
sources: aiAgentArgs.sourceIds || [],
|
|
63
73
|
}
|
|
64
74
|
|
|
65
|
-
const runner = new AIAgentRunner(agent)
|
|
75
|
+
const runner = new AIAgentRunner<TPlugins, TExtraData>(agent)
|
|
66
76
|
return await runner.run(messages, context)
|
|
67
77
|
} catch (error) {
|
|
68
78
|
console.error('error plugin returns undefined', error)
|
|
@@ -91,12 +101,12 @@ export default class BotonicPluginAiAgents implements Plugin {
|
|
|
91
101
|
return await hubtypeClient.getLocalMessages(memoryLength)
|
|
92
102
|
}
|
|
93
103
|
|
|
94
|
-
private buildTools(activeToolNames: string[]): Tool[] {
|
|
104
|
+
private buildTools(activeToolNames: string[]): Tool<TPlugins, TExtraData>[] {
|
|
95
105
|
const availableTools = this.toolDefinitions.filter(tool =>
|
|
96
106
|
activeToolNames.includes(tool.name)
|
|
97
107
|
)
|
|
98
108
|
return availableTools.map(toolDefinition => {
|
|
99
|
-
return tool<any, Context, any>({
|
|
109
|
+
return tool<any, Context<TPlugins, TExtraData>, any>({
|
|
100
110
|
name: toolDefinition.name,
|
|
101
111
|
description: toolDefinition.description,
|
|
102
112
|
parameters: toolDefinition.schema,
|
package/src/runner.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { ResolvedPlugins, ToolExecution } from '@botonic/core'
|
|
1
2
|
import {
|
|
2
3
|
InputGuardrailTripwireTriggered,
|
|
3
4
|
Runner,
|
|
4
5
|
RunToolCallItem,
|
|
5
6
|
} from '@openai/agents'
|
|
6
7
|
|
|
8
|
+
import { retrieveKnowledge } from './tools'
|
|
7
9
|
import {
|
|
8
10
|
AgenticInputMessage,
|
|
9
11
|
AgenticOutputMessage,
|
|
@@ -12,16 +14,19 @@ import {
|
|
|
12
14
|
RunResult,
|
|
13
15
|
} from './types'
|
|
14
16
|
|
|
15
|
-
export class AIAgentRunner
|
|
16
|
-
|
|
17
|
+
export class AIAgentRunner<
|
|
18
|
+
TPlugins extends ResolvedPlugins = ResolvedPlugins,
|
|
19
|
+
TExtraData = any,
|
|
20
|
+
> {
|
|
21
|
+
private agent: AIAgent<TPlugins, TExtraData>
|
|
17
22
|
|
|
18
|
-
constructor(agent: AIAgent) {
|
|
23
|
+
constructor(agent: AIAgent<TPlugins, TExtraData>) {
|
|
19
24
|
this.agent = agent
|
|
20
25
|
}
|
|
21
26
|
|
|
22
27
|
async run(
|
|
23
28
|
messages: AgenticInputMessage[],
|
|
24
|
-
context: Context,
|
|
29
|
+
context: Context<TPlugins, TExtraData>,
|
|
25
30
|
maxRetries: number = 1
|
|
26
31
|
): Promise<RunResult> {
|
|
27
32
|
return this.runWithRetry(messages, context, maxRetries, 1)
|
|
@@ -29,7 +34,7 @@ export class AIAgentRunner {
|
|
|
29
34
|
|
|
30
35
|
private async runWithRetry(
|
|
31
36
|
inputMessages: AgenticInputMessage[],
|
|
32
|
-
context: Context,
|
|
37
|
+
context: Context<TPlugins, TExtraData>,
|
|
33
38
|
maxRetries: number,
|
|
34
39
|
attempt: number
|
|
35
40
|
): Promise<RunResult> {
|
|
@@ -43,7 +48,7 @@ export class AIAgentRunner {
|
|
|
43
48
|
const hasExit =
|
|
44
49
|
outputMessages.length === 0 ||
|
|
45
50
|
outputMessages.some(message => message.type === 'exit')
|
|
46
|
-
const toolsExecuted = this.
|
|
51
|
+
const toolsExecuted = this.getToolsExecuted(result, context)
|
|
47
52
|
|
|
48
53
|
return {
|
|
49
54
|
messages: hasExit
|
|
@@ -77,17 +82,55 @@ export class AIAgentRunner {
|
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
|
|
80
|
-
private
|
|
85
|
+
private getToolsExecuted(
|
|
86
|
+
result,
|
|
87
|
+
context: Context<TPlugins, TExtraData>
|
|
88
|
+
): ToolExecution[] {
|
|
81
89
|
return (
|
|
82
90
|
result.newItems
|
|
83
91
|
?.filter(item => item instanceof RunToolCallItem)
|
|
84
|
-
.map((item: RunToolCallItem) =>
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
.filter((toolName: string) => toolName !== '') || []
|
|
92
|
+
.map((item: RunToolCallItem) =>
|
|
93
|
+
this.getToolExecutionInfo(item as RunToolCallItem, context)
|
|
94
|
+
)
|
|
95
|
+
.filter(
|
|
96
|
+
(toolExecution: ToolExecution) => toolExecution.toolName !== ''
|
|
97
|
+
) || []
|
|
91
98
|
)
|
|
92
99
|
}
|
|
100
|
+
|
|
101
|
+
private getToolExecutionInfo(
|
|
102
|
+
item: RunToolCallItem,
|
|
103
|
+
context: Context<TPlugins, TExtraData>
|
|
104
|
+
): ToolExecution {
|
|
105
|
+
if (item.rawItem.type !== 'function_call') {
|
|
106
|
+
return {
|
|
107
|
+
toolName: '',
|
|
108
|
+
toolArguments: {},
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const toolName = item.rawItem.name
|
|
112
|
+
const toolArguments = this.getSafeToolArguments(item.rawItem.arguments)
|
|
113
|
+
|
|
114
|
+
if (toolName === retrieveKnowledge.name) {
|
|
115
|
+
return {
|
|
116
|
+
toolName,
|
|
117
|
+
toolArguments,
|
|
118
|
+
knowledgebaseSourcesIds: context.knowledgeUsed.sourceIds,
|
|
119
|
+
knowledgebaseChunksIds: context.knowledgeUsed.chunksIds,
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
toolName,
|
|
125
|
+
toolArguments,
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private getSafeToolArguments(rawToolArguments: string): Record<string, any> {
|
|
130
|
+
try {
|
|
131
|
+
return JSON.parse(rawToolArguments)
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return {}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
93
136
|
}
|
|
@@ -19,10 +19,18 @@ export const retrieveKnowledge = tool<any, Context, any>({
|
|
|
19
19
|
if (!context) {
|
|
20
20
|
throw new Error('Context is required')
|
|
21
21
|
}
|
|
22
|
-
const
|
|
22
|
+
const sourceIds = context.sourceIds
|
|
23
23
|
const client = new HubtypeApiClient(context.authToken)
|
|
24
|
-
const chunks = await client.retrieveSimilarChunks(query,
|
|
24
|
+
const chunks = await client.retrieveSimilarChunks(query, sourceIds)
|
|
25
|
+
const chunkTexts = chunks.map(chunk => chunk.text)
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
context.knowledgeUsed = {
|
|
28
|
+
query,
|
|
29
|
+
sourceIds,
|
|
30
|
+
chunksIds: chunks.map(chunk => chunk.id),
|
|
31
|
+
chunkTexts,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return chunkTexts
|
|
27
35
|
},
|
|
28
36
|
})
|
package/src/types.ts
CHANGED
|
@@ -22,8 +22,14 @@ export interface Context<
|
|
|
22
22
|
TExtraData = any,
|
|
23
23
|
> {
|
|
24
24
|
authToken: string
|
|
25
|
+
sourceIds: string[]
|
|
26
|
+
knowledgeUsed: {
|
|
27
|
+
query: string
|
|
28
|
+
sourceIds: string[]
|
|
29
|
+
chunksIds: string[]
|
|
30
|
+
chunkTexts: string[]
|
|
31
|
+
}
|
|
25
32
|
request: BotContext<TPlugins, TExtraData>
|
|
26
|
-
sources: string[]
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
export type RunContext<
|
|
@@ -31,23 +37,40 @@ export type RunContext<
|
|
|
31
37
|
TExtraData = any,
|
|
32
38
|
> = OpenAIRunContext<Context<TPlugins, TExtraData>>
|
|
33
39
|
|
|
34
|
-
export interface CustomTool
|
|
40
|
+
export interface CustomTool<
|
|
41
|
+
TPlugins extends ResolvedPlugins = ResolvedPlugins,
|
|
42
|
+
TExtraData = any,
|
|
43
|
+
> {
|
|
35
44
|
name: string
|
|
36
45
|
description: string
|
|
37
46
|
schema: ZodSchema
|
|
38
|
-
func:
|
|
47
|
+
func: (
|
|
39
48
|
input?: any,
|
|
40
49
|
runContext?: RunContext<TPlugins, TExtraData>
|
|
41
50
|
) => Promise<any>
|
|
42
51
|
}
|
|
43
52
|
|
|
53
|
+
export interface Chunk {
|
|
54
|
+
id: string
|
|
55
|
+
text: string
|
|
56
|
+
}
|
|
57
|
+
|
|
44
58
|
export type ContactInfo = Record<string, string>
|
|
45
59
|
|
|
46
|
-
export type Tool
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
export type Tool<
|
|
61
|
+
TPlugins extends ResolvedPlugins = ResolvedPlugins,
|
|
62
|
+
TExtraData = any,
|
|
63
|
+
> = OpenAITool<Context<TPlugins, TExtraData>>
|
|
64
|
+
export type AIAgent<
|
|
65
|
+
TPlugins extends ResolvedPlugins = ResolvedPlugins,
|
|
66
|
+
TExtraData = any,
|
|
67
|
+
> = Agent<Context<TPlugins, TExtraData>, typeof OutputSchema>
|
|
68
|
+
export interface PluginAiAgentOptions<
|
|
69
|
+
TPlugins extends ResolvedPlugins = ResolvedPlugins,
|
|
70
|
+
TExtraData = any,
|
|
71
|
+
> {
|
|
49
72
|
authToken?: string
|
|
50
|
-
customTools?: CustomTool[]
|
|
73
|
+
customTools?: CustomTool<TPlugins, TExtraData>[]
|
|
51
74
|
}
|
|
52
75
|
|
|
53
76
|
export type AgenticInputMessage = AgentInputItem
|