@botonic/plugin-ai-agents 0.56.0-alpha.0 → 0.57.0-rslib-esm.1
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/agents → agents}/base-agent.d.ts +4 -4
- package/lib/agents/base-agent.js +66 -0
- package/lib/agents/base-agent.js.map +1 -0
- package/lib/agents/index.d.ts +2 -0
- package/lib/agents/index.js +9 -0
- package/lib/agents/index.js.map +1 -0
- package/lib/{esm/agents → agents}/router-agent.d.ts +5 -5
- package/lib/agents/router-agent.js +50 -0
- package/lib/agents/router-agent.js.map +1 -0
- package/lib/{cjs/agents → agents}/specialist-agent.d.ts +5 -5
- package/lib/{cjs/agents → agents}/specialist-agent.js +65 -45
- package/lib/agents/specialist-agent.js.map +1 -0
- package/lib/{cjs/bot-config-tools.d.ts → bot-config-tools.d.ts} +1 -1
- package/lib/bot-config-tools.js +20 -0
- package/lib/bot-config-tools.js.map +1 -0
- package/lib/constants.js +26 -0
- package/lib/constants.js.map +1 -0
- package/lib/{esm/debug-logger.d.ts → debug-logger.d.ts} +1 -1
- package/lib/{cjs/debug-logger.js → debug-logger.js} +14 -9
- package/lib/debug-logger.js.map +1 -0
- package/lib/guardrails/index.d.ts +1 -0
- package/lib/guardrails/index.js +6 -0
- package/lib/guardrails/index.js.map +1 -0
- package/lib/{cjs/guardrails → guardrails}/input.d.ts +2 -2
- package/lib/guardrails/input.js +119 -0
- package/lib/guardrails/input.js.map +1 -0
- package/lib/{esm/index.d.ts → index.d.ts} +3 -3
- package/lib/{esm/index.js → index.js} +114 -74
- package/lib/index.js.map +1 -0
- package/lib/{cjs/llm-config.d.ts → llm-config.d.ts} +1 -1
- package/lib/llm-config.js +150 -0
- package/lib/llm-config.js.map +1 -0
- package/lib/{esm/runners → runners}/base-runner.d.ts +3 -3
- package/lib/{cjs/runners → runners}/base-runner.js +81 -69
- package/lib/runners/base-runner.js.map +1 -0
- package/lib/runners/index.d.ts +2 -0
- package/lib/runners/index.js +9 -0
- package/lib/runners/index.js.map +1 -0
- package/lib/{cjs/runners → runners}/router-runner.d.ts +2 -2
- package/lib/{cjs/runners → runners}/router-runner.js +19 -14
- package/lib/runners/router-runner.js.map +1 -0
- package/lib/{esm/runners → runners}/specialist-runner.d.ts +1 -1
- package/lib/runners/specialist-runner.js +10 -0
- package/lib/runners/specialist-runner.js.map +1 -0
- package/lib/{esm/services → services}/hubtype-api-client.d.ts +2 -2
- package/lib/services/hubtype-api-client.js +191 -0
- package/lib/services/hubtype-api-client.js.map +1 -0
- package/lib/{cjs/services → services}/types.d.ts +1 -1
- package/lib/services/types.js +13 -0
- package/lib/services/types.js.map +1 -0
- package/lib/structured-output/bot-executor.js +21 -0
- package/lib/structured-output/bot-executor.js.map +1 -0
- package/lib/structured-output/carousel.js +26 -0
- package/lib/structured-output/carousel.js.map +1 -0
- package/lib/structured-output/exit.js +14 -0
- package/lib/structured-output/exit.js.map +1 -0
- package/lib/{cjs/structured-output → structured-output}/index.d.ts +0 -10
- package/lib/structured-output/index.js +55 -0
- package/lib/structured-output/index.js.map +1 -0
- package/lib/structured-output/text-with-buttons.js +25 -0
- package/lib/structured-output/text-with-buttons.js.map +1 -0
- package/lib/structured-output/text.js +17 -0
- package/lib/structured-output/text.js.map +1 -0
- package/lib/{cjs/tools → tools}/index.d.ts +2 -2
- package/lib/tools/index.js +8 -0
- package/lib/tools/index.js.map +1 -0
- package/lib/{cjs/tools → tools}/retrieve-knowledge.d.ts +2 -2
- package/lib/tools/retrieve-knowledge.js +40 -0
- package/lib/tools/retrieve-knowledge.js.map +1 -0
- package/lib/{cjs/types.d.ts → types.d.ts} +3 -3
- package/lib/types.js +5 -0
- package/lib/types.js.map +1 -0
- package/package.json +10 -8
- package/src/structured-output/index.ts +0 -2
- package/src/types.ts +4 -4
- package/lib/cjs/agents/base-agent.js +0 -39
- package/lib/cjs/agents/base-agent.js.map +0 -1
- package/lib/cjs/agents/index.d.ts +0 -2
- package/lib/cjs/agents/index.js +0 -8
- package/lib/cjs/agents/index.js.map +0 -1
- package/lib/cjs/agents/router-agent.d.ts +0 -25
- package/lib/cjs/agents/router-agent.js +0 -33
- package/lib/cjs/agents/router-agent.js.map +0 -1
- package/lib/cjs/agents/specialist-agent.js.map +0 -1
- package/lib/cjs/bot-config-tools.js +0 -18
- package/lib/cjs/bot-config-tools.js.map +0 -1
- package/lib/cjs/constants.js +0 -25
- package/lib/cjs/constants.js.map +0 -1
- package/lib/cjs/debug-logger.d.ts +0 -33
- package/lib/cjs/debug-logger.js.map +0 -1
- package/lib/cjs/guardrails/index.d.ts +0 -1
- package/lib/cjs/guardrails/index.js +0 -5
- package/lib/cjs/guardrails/index.js.map +0 -1
- package/lib/cjs/guardrails/input.js +0 -96
- package/lib/cjs/guardrails/input.js.map +0 -1
- package/lib/cjs/index.d.ts +0 -22
- package/lib/cjs/index.js +0 -219
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/llm-config.js +0 -121
- package/lib/cjs/llm-config.js.map +0 -1
- package/lib/cjs/runners/base-runner.d.ts +0 -31
- package/lib/cjs/runners/base-runner.js.map +0 -1
- package/lib/cjs/runners/index.d.ts +0 -2
- package/lib/cjs/runners/index.js +0 -8
- package/lib/cjs/runners/index.js.map +0 -1
- package/lib/cjs/runners/router-runner.js.map +0 -1
- package/lib/cjs/runners/specialist-runner.d.ts +0 -4
- package/lib/cjs/runners/specialist-runner.js +0 -8
- package/lib/cjs/runners/specialist-runner.js.map +0 -1
- package/lib/cjs/services/hubtype-api-client.d.ts +0 -13
- package/lib/cjs/services/hubtype-api-client.js +0 -176
- package/lib/cjs/services/hubtype-api-client.js.map +0 -1
- package/lib/cjs/services/types.js +0 -13
- package/lib/cjs/services/types.js.map +0 -1
- package/lib/cjs/structured-output/bot-executor.js +0 -18
- package/lib/cjs/structured-output/bot-executor.js.map +0 -1
- package/lib/cjs/structured-output/carousel.js +0 -23
- package/lib/cjs/structured-output/carousel.js.map +0 -1
- package/lib/cjs/structured-output/exit.js +0 -11
- package/lib/cjs/structured-output/exit.js.map +0 -1
- package/lib/cjs/structured-output/index.js +0 -45
- package/lib/cjs/structured-output/index.js.map +0 -1
- package/lib/cjs/structured-output/request-contact-info.d.ts +0 -9
- package/lib/cjs/structured-output/request-contact-info.js +0 -14
- package/lib/cjs/structured-output/request-contact-info.js.map +0 -1
- package/lib/cjs/structured-output/text-with-buttons.js +0 -24
- package/lib/cjs/structured-output/text-with-buttons.js.map +0 -1
- package/lib/cjs/structured-output/text.js +0 -14
- package/lib/cjs/structured-output/text.js.map +0 -1
- package/lib/cjs/tools/index.js +0 -8
- package/lib/cjs/tools/index.js.map +0 -1
- package/lib/cjs/tools/retrieve-knowledge.js +0 -34
- package/lib/cjs/tools/retrieve-knowledge.js.map +0 -1
- package/lib/cjs/types.js +0 -3
- package/lib/cjs/types.js.map +0 -1
- package/lib/esm/agents/base-agent.d.ts +0 -28
- package/lib/esm/agents/base-agent.js +0 -39
- package/lib/esm/agents/base-agent.js.map +0 -1
- package/lib/esm/agents/index.d.ts +0 -2
- package/lib/esm/agents/index.js +0 -8
- package/lib/esm/agents/index.js.map +0 -1
- package/lib/esm/agents/router-agent.js +0 -33
- package/lib/esm/agents/router-agent.js.map +0 -1
- package/lib/esm/agents/specialist-agent.d.ts +0 -39
- package/lib/esm/agents/specialist-agent.js +0 -108
- package/lib/esm/agents/specialist-agent.js.map +0 -1
- package/lib/esm/bot-config-tools.d.ts +0 -7
- package/lib/esm/bot-config-tools.js +0 -18
- package/lib/esm/bot-config-tools.js.map +0 -1
- package/lib/esm/constants.d.ts +0 -21
- package/lib/esm/constants.js +0 -25
- package/lib/esm/constants.js.map +0 -1
- package/lib/esm/debug-logger.js +0 -116
- package/lib/esm/debug-logger.js.map +0 -1
- package/lib/esm/guardrails/index.d.ts +0 -1
- package/lib/esm/guardrails/index.js +0 -5
- package/lib/esm/guardrails/index.js.map +0 -1
- package/lib/esm/guardrails/input.d.ts +0 -10
- package/lib/esm/guardrails/input.js +0 -96
- package/lib/esm/guardrails/input.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/llm-config.d.ts +0 -30
- package/lib/esm/llm-config.js +0 -121
- package/lib/esm/llm-config.js.map +0 -1
- package/lib/esm/runners/base-runner.js +0 -189
- package/lib/esm/runners/base-runner.js.map +0 -1
- package/lib/esm/runners/index.d.ts +0 -2
- package/lib/esm/runners/index.js +0 -8
- package/lib/esm/runners/index.js.map +0 -1
- package/lib/esm/runners/router-runner.d.ts +0 -8
- package/lib/esm/runners/router-runner.js +0 -44
- package/lib/esm/runners/router-runner.js.map +0 -1
- package/lib/esm/runners/specialist-runner.js +0 -8
- package/lib/esm/runners/specialist-runner.js.map +0 -1
- package/lib/esm/services/hubtype-api-client.js +0 -176
- package/lib/esm/services/hubtype-api-client.js.map +0 -1
- package/lib/esm/services/types.d.ts +0 -72
- package/lib/esm/services/types.js +0 -13
- package/lib/esm/services/types.js.map +0 -1
- package/lib/esm/structured-output/bot-executor.d.ts +0 -13
- package/lib/esm/structured-output/bot-executor.js +0 -18
- package/lib/esm/structured-output/bot-executor.js.map +0 -1
- package/lib/esm/structured-output/carousel.d.ts +0 -18
- package/lib/esm/structured-output/carousel.js +0 -23
- package/lib/esm/structured-output/carousel.js.map +0 -1
- package/lib/esm/structured-output/exit.d.ts +0 -6
- package/lib/esm/structured-output/exit.js +0 -11
- package/lib/esm/structured-output/exit.js.map +0 -1
- package/lib/esm/structured-output/index.d.ts +0 -108
- package/lib/esm/structured-output/index.js +0 -45
- package/lib/esm/structured-output/index.js.map +0 -1
- package/lib/esm/structured-output/request-contact-info.d.ts +0 -9
- package/lib/esm/structured-output/request-contact-info.js +0 -14
- package/lib/esm/structured-output/request-contact-info.js.map +0 -1
- package/lib/esm/structured-output/text-with-buttons.d.ts +0 -17
- package/lib/esm/structured-output/text-with-buttons.js +0 -24
- package/lib/esm/structured-output/text-with-buttons.js.map +0 -1
- package/lib/esm/structured-output/text.d.ts +0 -9
- package/lib/esm/structured-output/text.js +0 -14
- package/lib/esm/structured-output/text.js.map +0 -1
- package/lib/esm/tools/index.d.ts +0 -3
- package/lib/esm/tools/index.js +0 -8
- package/lib/esm/tools/index.js.map +0 -1
- package/lib/esm/tools/retrieve-knowledge.d.ts +0 -6
- package/lib/esm/tools/retrieve-knowledge.js +0 -34
- package/lib/esm/tools/retrieve-knowledge.js.map +0 -1
- package/lib/esm/types.d.ts +0 -53
- package/lib/esm/types.js +0 -3
- package/lib/esm/types.js.map +0 -1
- package/src/structured-output/request-contact-info.ts +0 -18
- /package/lib/{cjs/constants.d.ts → constants.d.ts} +0 -0
- /package/lib/{cjs/structured-output → structured-output}/bot-executor.d.ts +0 -0
- /package/lib/{cjs/structured-output → structured-output}/carousel.d.ts +0 -0
- /package/lib/{cjs/structured-output → structured-output}/exit.d.ts +0 -0
- /package/lib/{cjs/structured-output → structured-output}/text-with-buttons.d.ts +0 -0
- /package/lib/{cjs/structured-output → structured-output}/text.d.ts +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Agent, Runner } from "@openai/agents";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { LLM_PROVIDERS, isProd } from "../constants.js";
|
|
4
|
+
import { HubtypeApiClient } from "../services/hubtype-api-client.js";
|
|
5
|
+
import { TrackFeature, TrackProductName } from "../services/types.js";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async function createInputGuardrails(rules, llmConfig, trackingContext) {
|
|
18
|
+
if (rules.length === 0) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
return [
|
|
22
|
+
await buildInputGuardrail(rules, llmConfig, trackingContext)
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
async function buildInputGuardrail(rules, llmConfig, trackingContext) {
|
|
26
|
+
const outputType = z.object(Object.fromEntries(rules.map((rule)=>[
|
|
27
|
+
rule.name,
|
|
28
|
+
z.boolean().describe(rule.description)
|
|
29
|
+
])));
|
|
30
|
+
const modelSettings = createInputGuardrailModelSettings(llmConfig);
|
|
31
|
+
const agent = new Agent({
|
|
32
|
+
name: 'InputGuardrail',
|
|
33
|
+
model: await llmConfig.getModel(),
|
|
34
|
+
modelSettings,
|
|
35
|
+
instructions: 'Check if the user triggers some of the following guardrails.',
|
|
36
|
+
outputType
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
name: 'InputGuardrail',
|
|
40
|
+
execute: async ({ input, context })=>{
|
|
41
|
+
const lastMessage = input[input.length - 1];
|
|
42
|
+
const runner = new Runner({
|
|
43
|
+
tracingDisabled: true
|
|
44
|
+
});
|
|
45
|
+
const startTime = Date.now();
|
|
46
|
+
const result = await runner.run(agent, [
|
|
47
|
+
lastMessage
|
|
48
|
+
], {
|
|
49
|
+
context
|
|
50
|
+
});
|
|
51
|
+
const endTime = Date.now();
|
|
52
|
+
await sendGuardrailLlmRunTracking(result, trackingContext, llmConfig, startTime, endTime);
|
|
53
|
+
const finalOutput = result.finalOutput;
|
|
54
|
+
if (finalOutput === undefined) {
|
|
55
|
+
throw new Error('Guardrail agent failed to produce output');
|
|
56
|
+
}
|
|
57
|
+
const triggered = Object.values(finalOutput).some((value)=>value === true);
|
|
58
|
+
const triggeredGuardrails = Object.keys(finalOutput).filter((key)=>finalOutput[key] === true);
|
|
59
|
+
return {
|
|
60
|
+
outputInfo: triggeredGuardrails,
|
|
61
|
+
tripwireTriggered: triggered
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function createInputGuardrailModelSettings(llmConfig) {
|
|
67
|
+
const modelSettings = {
|
|
68
|
+
...llmConfig.modelSettings,
|
|
69
|
+
toolChoice: undefined
|
|
70
|
+
};
|
|
71
|
+
if (llmConfig.modelSettings.reasoning) {
|
|
72
|
+
modelSettings.reasoning = {
|
|
73
|
+
...llmConfig.modelSettings.reasoning
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (llmConfig.modelSettings.text) {
|
|
77
|
+
modelSettings.text = {
|
|
78
|
+
...llmConfig.modelSettings.text
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return modelSettings;
|
|
82
|
+
}
|
|
83
|
+
async function sendGuardrailLlmRunTracking(result, trackingContext, llmConfig, startTime, endTime) {
|
|
84
|
+
if (!isProd) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (llmConfig.getProviderName() === LLM_PROVIDERS.LITELLM) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const rawResponses = result.rawResponses ?? [];
|
|
91
|
+
if (rawResponses.length === 0) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const totalDuration = endTime - startTime;
|
|
95
|
+
const durationPerCall = Math.round(totalDuration / rawResponses.length);
|
|
96
|
+
const temperature = llmConfig.modelSettings.temperature ?? 0;
|
|
97
|
+
const llmRuns = rawResponses.map((response)=>({
|
|
98
|
+
inference_id: trackingContext.inferenceId,
|
|
99
|
+
is_test: trackingContext.isTest,
|
|
100
|
+
product_name: TrackProductName.AI_AGENT,
|
|
101
|
+
deployment_name: llmConfig.modelName,
|
|
102
|
+
model_name: response.providerData?.model ?? llmConfig.modelName,
|
|
103
|
+
feature: TrackFeature.AI_AGENT_GUARDRAIL,
|
|
104
|
+
api_version: llmConfig.getApiVersion(),
|
|
105
|
+
num_prompt_tokens: response.usage.inputTokens,
|
|
106
|
+
num_completion_tokens: response.usage.outputTokens,
|
|
107
|
+
duration_in_milliseconds: durationPerCall,
|
|
108
|
+
temperature,
|
|
109
|
+
error: null
|
|
110
|
+
}));
|
|
111
|
+
const client = new HubtypeApiClient(trackingContext.authToken);
|
|
112
|
+
await client.trackLlmRuns(trackingContext.botId, {
|
|
113
|
+
llm_runs: llmRuns
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export { createInputGuardrails };
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails/input.js","sources":["../../src/guardrails/input.ts"],"sourcesContent":["import {\n Agent,\n type InputGuardrail,\n type ModelSettings,\n Runner,\n type UserMessageItem,\n} from '@openai/agents'\nimport { z } from 'zod'\nimport { isProd, LLM_PROVIDERS } from '../constants'\nimport type { LLMConfig } from '../llm-config'\nimport { HubtypeApiClient } from '../services/hubtype-api-client'\nimport { TrackFeature, TrackProductName } from '../services/types'\nimport type { GuardrailRule, ResultRawResponse } from '../types'\n\nexport interface GuardrailTrackingContext {\n botId: string\n isTest: boolean\n authToken: string\n inferenceId: string\n}\n\nexport async function createInputGuardrails(\n rules: GuardrailRule[],\n llmConfig: LLMConfig,\n trackingContext: GuardrailTrackingContext\n): Promise<InputGuardrail[]> {\n if (rules.length === 0) {\n return []\n }\n\n return [await buildInputGuardrail(rules, llmConfig, trackingContext)]\n}\n\nasync function buildInputGuardrail(\n rules: GuardrailRule[],\n llmConfig: LLMConfig,\n trackingContext: GuardrailTrackingContext\n): Promise<InputGuardrail> {\n const outputType = z.object(\n Object.fromEntries(\n rules.map(rule => [rule.name, z.boolean().describe(rule.description)])\n )\n )\n const modelSettings = createInputGuardrailModelSettings(llmConfig)\n\n const agent = new Agent({\n name: 'InputGuardrail',\n model: await llmConfig.getModel(),\n modelSettings,\n instructions:\n 'Check if the user triggers some of the following guardrails.',\n outputType,\n })\n\n return {\n name: 'InputGuardrail',\n execute: async ({ input, context }) => {\n const lastMessage = input[input.length - 1] as UserMessageItem\n const runner = new Runner({\n tracingDisabled: true,\n })\n const startTime = Date.now()\n const result = await runner.run(agent, [lastMessage], { context })\n const endTime = Date.now()\n\n await sendGuardrailLlmRunTracking(\n result,\n trackingContext,\n llmConfig,\n startTime,\n endTime\n )\n\n const finalOutput = result.finalOutput as Record<string, boolean>\n if (finalOutput === undefined) {\n throw new Error('Guardrail agent failed to produce output')\n }\n const triggered = Object.values(finalOutput).some(value => value === true)\n const triggeredGuardrails = Object.keys(finalOutput).filter(\n key => finalOutput[key] === true\n )\n return {\n outputInfo: triggeredGuardrails,\n tripwireTriggered: triggered,\n }\n },\n }\n}\n\nfunction createInputGuardrailModelSettings(\n llmConfig: LLMConfig\n): ModelSettings {\n const modelSettings: ModelSettings = {\n ...llmConfig.modelSettings,\n toolChoice: undefined,\n }\n if (llmConfig.modelSettings.reasoning) {\n modelSettings.reasoning = { ...llmConfig.modelSettings.reasoning }\n }\n if (llmConfig.modelSettings.text) {\n modelSettings.text = { ...llmConfig.modelSettings.text }\n }\n return modelSettings\n}\n\nasync function sendGuardrailLlmRunTracking(\n result: {\n rawResponses?: ResultRawResponse[]\n },\n trackingContext: GuardrailTrackingContext,\n llmConfig: LLMConfig,\n startTime: number,\n endTime: number\n): Promise<void> {\n if (!isProd) {\n return\n }\n if (llmConfig.getProviderName() === LLM_PROVIDERS.LITELLM) {\n return\n }\n const rawResponses = result.rawResponses ?? []\n if (rawResponses.length === 0) {\n return\n }\n const totalDuration = endTime - startTime\n const durationPerCall = Math.round(totalDuration / rawResponses.length)\n const temperature =\n (llmConfig.modelSettings.temperature as number | undefined) ?? 0\n const llmRuns = rawResponses.map(response => ({\n inference_id: trackingContext.inferenceId,\n is_test: trackingContext.isTest,\n product_name: TrackProductName.AI_AGENT,\n deployment_name: llmConfig.modelName,\n model_name:\n (response.providerData?.model as string | undefined) ??\n llmConfig.modelName,\n feature: TrackFeature.AI_AGENT_GUARDRAIL,\n api_version: llmConfig.getApiVersion(),\n num_prompt_tokens: response.usage.inputTokens,\n num_completion_tokens: response.usage.outputTokens,\n duration_in_milliseconds: durationPerCall,\n temperature,\n error: null,\n }))\n\n const client = new HubtypeApiClient(trackingContext.authToken)\n await client.trackLlmRuns(trackingContext.botId, {\n llm_runs: llmRuns,\n })\n}\n"],"names":["Agent","Runner","z","isProd","LLM_PROVIDERS","HubtypeApiClient","TrackFeature","TrackProductName","createInputGuardrails","rules","llmConfig","trackingContext","buildInputGuardrail","outputType","Object","rule","modelSettings","createInputGuardrailModelSettings","agent","input","context","lastMessage","runner","startTime","Date","result","endTime","sendGuardrailLlmRunTracking","finalOutput","undefined","Error","triggered","value","triggeredGuardrails","key","rawResponses","totalDuration","durationPerCall","Math","temperature","llmRuns","response","client"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type AiAgentArgs, type BotContext, type Plugin, type ResolvedPlugins } from '@botonic/core';
|
|
2
|
-
import type { CustomTool, InferenceResponse, PluginAiAgentOptions } from './types';
|
|
2
|
+
import type { CustomTool, InferenceResponse, PluginAiAgentOptions } from './types.js';
|
|
3
3
|
export default class BotonicPluginAiAgents<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = any> implements Plugin {
|
|
4
4
|
private readonly authToken?;
|
|
5
5
|
private readonly memory;
|
|
@@ -18,5 +18,5 @@ export default class BotonicPluginAiAgents<TPlugins extends ResolvedPlugins = Re
|
|
|
18
18
|
private getMessages;
|
|
19
19
|
private buildTools;
|
|
20
20
|
}
|
|
21
|
-
export * from './bot-config-tools';
|
|
22
|
-
export * from './types';
|
|
21
|
+
export * from './bot-config-tools.js';
|
|
22
|
+
export * from './types.js';
|
|
@@ -1,61 +1,71 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
memory: this.memory,
|
|
1
|
+
import { AiAgentType } from "@botonic/core";
|
|
2
|
+
import { handoff, setTracingDisabled, tool as agents_tool } from "@openai/agents";
|
|
3
|
+
import { v7 } from "uuid";
|
|
4
|
+
import { RouterAgent, SpecialistAgent } from "./agents/index.js";
|
|
5
|
+
import { DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT_16_SECONDS, MAX_MEMORY_LENGTH, isProd } from "./constants.js";
|
|
6
|
+
import { createDebugLogger } from "./debug-logger.js";
|
|
7
|
+
import { LLMConfig } from "./llm-config.js";
|
|
8
|
+
import { RouterRunner, SpecialistRunner } from "./runners/index.js";
|
|
9
|
+
import { HubtypeApiClient } from "./services/hubtype-api-client.js";
|
|
10
|
+
|
|
11
|
+
export * from "./bot-config-tools.js";
|
|
12
|
+
export * from "./types.js";
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
function _define_property(obj, key, value) {
|
|
23
|
+
if (key in obj) {
|
|
24
|
+
Object.defineProperty(obj, key, {
|
|
25
|
+
value: value,
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true
|
|
30
29
|
});
|
|
31
|
-
}
|
|
30
|
+
} else obj[key] = value;
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class BotonicPluginAiAgents {
|
|
32
43
|
getMemoryOptions(memory) {
|
|
33
44
|
return {
|
|
34
|
-
maxMessages: memory?.maxMessages ??
|
|
45
|
+
maxMessages: memory?.maxMessages ?? MAX_MEMORY_LENGTH,
|
|
35
46
|
includeToolCalls: memory?.includeToolCalls ?? true,
|
|
36
47
|
maxFullToolResults: memory?.maxFullToolResults ?? 1,
|
|
37
|
-
debugMode: memory?.debugMode ?? false
|
|
48
|
+
debugMode: memory?.debugMode ?? false
|
|
38
49
|
};
|
|
39
50
|
}
|
|
40
51
|
pre() {
|
|
41
52
|
return;
|
|
42
53
|
}
|
|
43
54
|
async getInference(botContext, aiAgentArgs) {
|
|
44
|
-
const authToken =
|
|
55
|
+
const authToken = isProd ? botContext.session._access_token : this.authToken;
|
|
45
56
|
if (!authToken) {
|
|
46
57
|
throw new Error('Auth token is required');
|
|
47
58
|
}
|
|
48
|
-
const inferenceId =
|
|
59
|
+
const inferenceId = v7();
|
|
49
60
|
try {
|
|
50
|
-
if (aiAgentArgs.type ===
|
|
61
|
+
if (aiAgentArgs.type === AiAgentType.Specialist) {
|
|
51
62
|
return await this.executeSpecialistAIAgent(botContext, aiAgentArgs, authToken, inferenceId);
|
|
52
63
|
}
|
|
53
|
-
if (aiAgentArgs.type ===
|
|
64
|
+
if (aiAgentArgs.type === AiAgentType.Router) {
|
|
54
65
|
return await this.executeRouterAIAgent(botContext, aiAgentArgs, authToken, inferenceId);
|
|
55
66
|
}
|
|
56
67
|
throw new Error('Invalid agent type');
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
68
|
+
} catch (error) {
|
|
59
69
|
console.error('error plugin returns undefined', error);
|
|
60
70
|
return {
|
|
61
71
|
messages: [],
|
|
@@ -68,18 +78,18 @@ class BotonicPluginAiAgents {
|
|
|
68
78
|
startingAgentName: '',
|
|
69
79
|
lastAgentName: '',
|
|
70
80
|
availableSpecialists: [],
|
|
71
|
-
isTransferredToSpecialist: false
|
|
81
|
+
isTransferredToSpecialist: false
|
|
72
82
|
};
|
|
73
83
|
}
|
|
74
84
|
}
|
|
75
85
|
async executeSpecialistAIAgent(botContext, aiAgentArgs, authToken, inferenceId) {
|
|
76
|
-
const llmConfig = new
|
|
86
|
+
const llmConfig = new LLMConfig({
|
|
77
87
|
maxRetries: this.maxRetries,
|
|
78
88
|
timeout: this.timeout,
|
|
79
89
|
modelName: aiAgentArgs.model,
|
|
80
90
|
verbosity: aiAgentArgs.verbosity,
|
|
81
91
|
botContext,
|
|
82
|
-
reasoningEffort: aiAgentArgs.reasoningEffort
|
|
92
|
+
reasoningEffort: aiAgentArgs.reasoningEffort
|
|
83
93
|
});
|
|
84
94
|
// Get LLM config, tools and agent
|
|
85
95
|
const { tools, agent } = await this.getSpecialistAgentAndTools(botContext, aiAgentArgs, aiAgentArgs.outputMessagesSchemas || [], authToken, inferenceId, llmConfig);
|
|
@@ -92,27 +102,27 @@ class BotonicPluginAiAgents {
|
|
|
92
102
|
query: '',
|
|
93
103
|
sourceIds: [],
|
|
94
104
|
chunksIds: [],
|
|
95
|
-
chunkTexts: []
|
|
105
|
+
chunkTexts: []
|
|
96
106
|
},
|
|
97
|
-
request: botContext
|
|
107
|
+
request: botContext
|
|
98
108
|
};
|
|
99
109
|
// Log agent debug info
|
|
100
|
-
this.logger.logAgentDebugInfo(aiAgentArgs, tools.map(t
|
|
110
|
+
this.logger.logAgentDebugInfo(aiAgentArgs, tools.map((t)=>t.name), messages);
|
|
101
111
|
// Run agent
|
|
102
|
-
const runner = new
|
|
112
|
+
const runner = new SpecialistRunner(agent, llmConfig, inferenceId, this.logger);
|
|
103
113
|
return await runner.run(messages, context);
|
|
104
114
|
}
|
|
105
115
|
async executeRouterAIAgent(botContext, aiAgentArgs, authToken, inferenceId) {
|
|
106
116
|
const { specialists, name, instructions } = aiAgentArgs;
|
|
107
|
-
const llmConfig = new
|
|
117
|
+
const llmConfig = new LLMConfig({
|
|
108
118
|
maxRetries: this.maxRetries,
|
|
109
119
|
timeout: this.timeout,
|
|
110
120
|
modelName: aiAgentArgs.model,
|
|
111
121
|
verbosity: aiAgentArgs.verbosity,
|
|
112
122
|
botContext,
|
|
113
|
-
reasoningEffort: aiAgentArgs.reasoningEffort
|
|
123
|
+
reasoningEffort: aiAgentArgs.reasoningEffort
|
|
114
124
|
});
|
|
115
|
-
const specialistsAgents = await Promise.all(specialists.map(async (specialistData)
|
|
125
|
+
const specialistsAgents = await Promise.all(specialists.map(async (specialistData)=>{
|
|
116
126
|
// If the forceToolNameOverride is set, we force this override for all specialists
|
|
117
127
|
const forceToolNameOverride = aiAgentArgs.forceToolNameOverride;
|
|
118
128
|
const reasoningEffort = aiAgentArgs.reasoningEffort;
|
|
@@ -122,15 +132,15 @@ class BotonicPluginAiAgents {
|
|
|
122
132
|
...specialistData,
|
|
123
133
|
forceToolNameOverride,
|
|
124
134
|
reasoningEffort,
|
|
125
|
-
disableForceRetrieveKnowledge
|
|
135
|
+
disableForceRetrieveKnowledge
|
|
126
136
|
};
|
|
127
137
|
const { agent } = await this.getSpecialistAgentAndTools(botContext, aiAgentSpecialistArgs, aiAgentArgs.outputMessagesSchemas || [], authToken, inferenceId, llmConfig);
|
|
128
|
-
return
|
|
138
|
+
return handoff(agent, {
|
|
129
139
|
toolNameOverride: specialistData.name,
|
|
130
|
-
toolDescriptionOverride: specialistData.description
|
|
140
|
+
toolDescriptionOverride: specialistData.description
|
|
131
141
|
});
|
|
132
142
|
}));
|
|
133
|
-
const router = await
|
|
143
|
+
const router = await RouterAgent.create({
|
|
134
144
|
name,
|
|
135
145
|
instructions,
|
|
136
146
|
llmConfig,
|
|
@@ -141,8 +151,8 @@ class BotonicPluginAiAgents {
|
|
|
141
151
|
botId: botContext.session.bot.id,
|
|
142
152
|
isTest: botContext.session.is_test_integration,
|
|
143
153
|
authToken,
|
|
144
|
-
inferenceId
|
|
145
|
-
}
|
|
154
|
+
inferenceId
|
|
155
|
+
}
|
|
146
156
|
});
|
|
147
157
|
// Get messages
|
|
148
158
|
const messages = await this.getMessages(botContext, authToken, aiAgentArgs.previousHubtypeMessages || []);
|
|
@@ -153,21 +163,21 @@ class BotonicPluginAiAgents {
|
|
|
153
163
|
query: '',
|
|
154
164
|
sourceIds: [],
|
|
155
165
|
chunksIds: [],
|
|
156
|
-
chunkTexts: []
|
|
166
|
+
chunkTexts: []
|
|
157
167
|
},
|
|
158
|
-
request: botContext
|
|
168
|
+
request: botContext
|
|
159
169
|
};
|
|
160
170
|
// Run agent
|
|
161
171
|
const routerAgent = router.getAgent();
|
|
162
|
-
const runner = new
|
|
172
|
+
const runner = new RouterRunner(routerAgent, llmConfig, inferenceId, this.logger);
|
|
163
173
|
return await runner.run(messages, context);
|
|
164
174
|
}
|
|
165
175
|
async getSpecialistAgentAndTools(botContext, aiAgentArgs, outputMessagesSchemas, authToken, inferenceId, llmConfig) {
|
|
166
176
|
// Build tools
|
|
167
177
|
const tools = this.buildTools(aiAgentArgs);
|
|
168
178
|
// Build agent
|
|
169
|
-
const sourceIds = aiAgentArgs.type ===
|
|
170
|
-
const specialist = await
|
|
179
|
+
const sourceIds = aiAgentArgs.type === AiAgentType.Specialist ? aiAgentArgs.sourceIds : [];
|
|
180
|
+
const specialist = await SpecialistAgent.create({
|
|
171
181
|
name: aiAgentArgs.name,
|
|
172
182
|
instructions: aiAgentArgs.instructions,
|
|
173
183
|
tools: tools,
|
|
@@ -182,38 +192,68 @@ class BotonicPluginAiAgents {
|
|
|
182
192
|
botId: botContext.session.bot.id,
|
|
183
193
|
isTest: botContext.session.is_test_integration,
|
|
184
194
|
authToken,
|
|
185
|
-
inferenceId
|
|
195
|
+
inferenceId
|
|
186
196
|
},
|
|
187
197
|
forceToolNameOverride: aiAgentArgs.forceToolNameOverride,
|
|
188
|
-
disableForceRetrieveKnowledge: aiAgentArgs.disableForceRetrieveKnowledge
|
|
198
|
+
disableForceRetrieveKnowledge: aiAgentArgs.disableForceRetrieveKnowledge
|
|
189
199
|
});
|
|
190
200
|
const specialistAgent = specialist.getAgent();
|
|
191
|
-
return {
|
|
201
|
+
return {
|
|
202
|
+
agent: specialistAgent,
|
|
203
|
+
tools
|
|
204
|
+
};
|
|
192
205
|
}
|
|
193
206
|
async getMessages(botContext, authToken, previousHubtypeMessages) {
|
|
194
|
-
const hubtypeClient = new
|
|
195
|
-
if (!
|
|
196
|
-
return await hubtypeClient.getLocalMessages(
|
|
207
|
+
const hubtypeClient = new HubtypeApiClient(authToken);
|
|
208
|
+
if (!isProd) {
|
|
209
|
+
return await hubtypeClient.getLocalMessages(MAX_MEMORY_LENGTH, previousHubtypeMessages, this.localStorageKey);
|
|
197
210
|
}
|
|
198
211
|
// Default to V2
|
|
199
212
|
const result = await hubtypeClient.getMessagesV2(botContext, this.memory, previousHubtypeMessages);
|
|
200
213
|
return result.messages;
|
|
201
214
|
}
|
|
202
215
|
buildTools(aiAgentArgs) {
|
|
203
|
-
const activeTools = aiAgentArgs.type ===
|
|
204
|
-
const activeToolNames = activeTools.map(tool
|
|
205
|
-
const availableTools = this.toolDefinitions.filter(tool
|
|
206
|
-
return availableTools.map(toolDefinition
|
|
207
|
-
return (
|
|
216
|
+
const activeTools = aiAgentArgs.type === AiAgentType.Router ? [] : aiAgentArgs.activeTools;
|
|
217
|
+
const activeToolNames = activeTools.map((tool)=>tool.name);
|
|
218
|
+
const availableTools = this.toolDefinitions.filter((tool)=>activeToolNames.includes(tool.name));
|
|
219
|
+
return availableTools.map((toolDefinition)=>{
|
|
220
|
+
return agents_tool({
|
|
208
221
|
name: toolDefinition.name,
|
|
209
222
|
description: toolDefinition.description,
|
|
210
223
|
parameters: toolDefinition.schema,
|
|
211
|
-
execute: toolDefinition.func
|
|
224
|
+
execute: toolDefinition.func
|
|
212
225
|
});
|
|
213
226
|
});
|
|
214
227
|
}
|
|
228
|
+
constructor(options){
|
|
229
|
+
_define_property(this, "authToken", void 0);
|
|
230
|
+
_define_property(this, "memory", void 0);
|
|
231
|
+
_define_property(this, "logger", void 0);
|
|
232
|
+
_define_property(this, "timeout", void 0);
|
|
233
|
+
_define_property(this, "maxRetries", void 0);
|
|
234
|
+
_define_property(this, "toolDefinitions", []);
|
|
235
|
+
_define_property(this, "localStorageKey", void 0);
|
|
236
|
+
this.authToken = options?.authToken;
|
|
237
|
+
this.toolDefinitions = options?.customTools || [];
|
|
238
|
+
this.memory = this.getMemoryOptions(options?.memory);
|
|
239
|
+
this.timeout = options?.timeout ?? DEFAULT_TIMEOUT_16_SECONDS;
|
|
240
|
+
this.maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
241
|
+
this.logger = createDebugLogger(options?.enableDebug ?? false);
|
|
242
|
+
this.localStorageKey = options?.localStorageKey ?? 'botonicState';
|
|
243
|
+
setTracingDisabled(true);
|
|
244
|
+
this.logger.logInitialConfig({
|
|
245
|
+
messageHistoryApiVersion: 'v2',
|
|
246
|
+
maxRetries: options?.maxRetries ?? DEFAULT_MAX_RETRIES,
|
|
247
|
+
timeout: options?.timeout ?? DEFAULT_TIMEOUT_16_SECONDS,
|
|
248
|
+
customToolNames: this.toolDefinitions.map((t)=>t.name),
|
|
249
|
+
memory: this.memory
|
|
250
|
+
});
|
|
251
|
+
}
|
|
215
252
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
export default BotonicPluginAiAgents;
|
|
258
|
+
|
|
219
259
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import {\n type AIAgentRouterArgs,\n type AiAgentArgs,\n type AiAgentSpecialistArgs,\n AiAgentType,\n type BotContext,\n type HubtypeAssistantMessage,\n type Plugin,\n type ResolvedPlugins,\n} from '@botonic/core'\nimport { handoff, setTracingDisabled, tool } from '@openai/agents'\nimport { v7 as uuidv7 } from 'uuid'\nimport type { ZodObject } from 'zod'\nimport { RouterAgent, SpecialistAgent } from './agents'\nimport {\n DEFAULT_MAX_RETRIES,\n DEFAULT_TIMEOUT_16_SECONDS,\n isProd,\n MAX_MEMORY_LENGTH,\n} from './constants'\nimport { createDebugLogger, type DebugLogger } from './debug-logger'\nimport { LLMConfig } from './llm-config'\nimport { RouterRunner, SpecialistRunner } from './runners'\nimport { HubtypeApiClient } from './services/hubtype-api-client'\nimport type {\n AgenticInputMessage,\n Context,\n CustomTool,\n InferenceResponse,\n MemoryOptions,\n PluginAiAgentOptions,\n Tool,\n} from './types'\n\nexport default class BotonicPluginAiAgents<\n TPlugins extends ResolvedPlugins = ResolvedPlugins,\n TExtraData = any,\n> implements Plugin\n{\n private readonly authToken?: string\n private readonly memory: MemoryOptions\n private readonly logger: DebugLogger\n private readonly timeout: number\n private readonly maxRetries: number\n public toolDefinitions: CustomTool<TPlugins, TExtraData>[] = []\n private readonly localStorageKey: string\n\n constructor(options?: PluginAiAgentOptions<TPlugins, TExtraData>) {\n this.authToken = options?.authToken\n this.toolDefinitions = options?.customTools || []\n this.memory = this.getMemoryOptions(options?.memory)\n this.timeout = options?.timeout ?? DEFAULT_TIMEOUT_16_SECONDS\n this.maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES\n this.logger = createDebugLogger(options?.enableDebug ?? false)\n this.localStorageKey = options?.localStorageKey ?? 'botonicState'\n setTracingDisabled(true)\n\n this.logger.logInitialConfig({\n messageHistoryApiVersion: 'v2',\n maxRetries: options?.maxRetries ?? DEFAULT_MAX_RETRIES,\n timeout: options?.timeout ?? DEFAULT_TIMEOUT_16_SECONDS,\n customToolNames: this.toolDefinitions.map(t => t.name),\n memory: this.memory,\n })\n }\n\n private getMemoryOptions(memory?: Partial<MemoryOptions>): MemoryOptions {\n return {\n maxMessages: memory?.maxMessages ?? MAX_MEMORY_LENGTH,\n includeToolCalls: memory?.includeToolCalls ?? true,\n maxFullToolResults: memory?.maxFullToolResults ?? 1,\n debugMode: memory?.debugMode ?? false,\n }\n }\n\n pre(): void {\n return\n }\n\n async getInference(\n botContext: BotContext<TPlugins, TExtraData>,\n aiAgentArgs: AiAgentArgs\n ): Promise<InferenceResponse> {\n const authToken = isProd ? botContext.session._access_token : this.authToken\n if (!authToken) {\n throw new Error('Auth token is required')\n }\n\n const inferenceId = uuidv7()\n\n try {\n if (aiAgentArgs.type === AiAgentType.Specialist) {\n return await this.executeSpecialistAIAgent(\n botContext,\n aiAgentArgs,\n authToken,\n inferenceId\n )\n }\n\n if (aiAgentArgs.type === AiAgentType.Router) {\n return await this.executeRouterAIAgent(\n botContext,\n aiAgentArgs,\n authToken,\n inferenceId\n )\n }\n\n throw new Error('Invalid agent type')\n } catch (error) {\n console.error('error plugin returns undefined', error)\n return {\n messages: [],\n toolsExecuted: [],\n memoryLength: 0,\n exit: true,\n error: true,\n inputGuardrailsTriggered: [],\n outputGuardrailsTriggered: [],\n startingAgentName: '',\n lastAgentName: '',\n availableSpecialists: [],\n isTransferredToSpecialist: false,\n }\n }\n }\n\n private async executeSpecialistAIAgent(\n botContext: BotContext<TPlugins, TExtraData>,\n aiAgentArgs: AiAgentSpecialistArgs,\n authToken: string,\n inferenceId: string\n ) {\n const llmConfig = new LLMConfig({\n maxRetries: this.maxRetries,\n timeout: this.timeout,\n modelName: aiAgentArgs.model,\n verbosity: aiAgentArgs.verbosity,\n botContext,\n reasoningEffort: aiAgentArgs.reasoningEffort,\n })\n\n // Get LLM config, tools and agent\n const { tools, agent } = await this.getSpecialistAgentAndTools(\n botContext,\n aiAgentArgs,\n aiAgentArgs.outputMessagesSchemas || [],\n authToken,\n inferenceId,\n llmConfig\n )\n\n // Get messages\n const messages = await this.getMessages(\n botContext,\n authToken,\n aiAgentArgs.previousHubtypeMessages || []\n )\n\n // Build context\n const context: Context<TPlugins, TExtraData> = {\n authToken,\n knowledgeUsed: {\n query: '',\n sourceIds: [],\n chunksIds: [],\n chunkTexts: [],\n },\n request: botContext,\n }\n\n // Log agent debug info\n this.logger.logAgentDebugInfo(\n aiAgentArgs,\n tools.map(t => t.name),\n messages\n )\n\n // Run agent\n const runner = new SpecialistRunner<TPlugins, TExtraData>(\n agent,\n llmConfig,\n inferenceId,\n this.logger\n )\n return await runner.run(messages, context)\n }\n\n private async executeRouterAIAgent(\n botContext: BotContext<TPlugins, TExtraData>,\n aiAgentArgs: AIAgentRouterArgs,\n authToken: string,\n inferenceId: string\n ) {\n const { specialists, name, instructions } = aiAgentArgs\n\n const llmConfig = new LLMConfig({\n maxRetries: this.maxRetries,\n timeout: this.timeout,\n modelName: aiAgentArgs.model,\n verbosity: aiAgentArgs.verbosity,\n botContext,\n reasoningEffort: aiAgentArgs.reasoningEffort,\n })\n\n const specialistsAgents = await Promise.all(\n specialists.map(async specialistData => {\n // If the forceToolNameOverride is set, we force this override for all specialists\n const forceToolNameOverride = aiAgentArgs.forceToolNameOverride\n const reasoningEffort = aiAgentArgs.reasoningEffort\n const disableForceRetrieveKnowledge =\n aiAgentArgs.disableForceRetrieveKnowledge\n\n // Create AiAgentArgs for the specialist, with values from AIAgentRouterArgs\n const aiAgentSpecialistArgs: AiAgentArgs = {\n ...specialistData,\n forceToolNameOverride,\n reasoningEffort,\n disableForceRetrieveKnowledge,\n }\n\n const { agent } = await this.getSpecialistAgentAndTools(\n botContext,\n aiAgentSpecialistArgs,\n aiAgentArgs.outputMessagesSchemas || [],\n authToken,\n inferenceId,\n llmConfig\n )\n\n return handoff(agent, {\n toolNameOverride: specialistData.name,\n toolDescriptionOverride: specialistData.description,\n })\n })\n )\n\n const router = await RouterAgent.create<TPlugins, TExtraData>({\n name,\n instructions,\n llmConfig,\n handoffs: specialistsAgents,\n inputGuardrailRules: aiAgentArgs.inputGuardrailRules || [],\n outputMessagesSchemas: aiAgentArgs.outputMessagesSchemas || [],\n guardrailTrackingContext: {\n botId: botContext.session.bot.id,\n isTest: botContext.session.is_test_integration,\n authToken,\n inferenceId,\n },\n })\n\n // Get messages\n const messages = await this.getMessages(\n botContext,\n authToken,\n aiAgentArgs.previousHubtypeMessages || []\n )\n\n // Build context\n const context: Context<TPlugins, TExtraData> = {\n authToken,\n knowledgeUsed: {\n query: '',\n sourceIds: [],\n chunksIds: [],\n chunkTexts: [],\n },\n request: botContext,\n }\n\n // Run agent\n const routerAgent = router.getAgent()\n const runner = new RouterRunner<TPlugins, TExtraData>(\n routerAgent,\n llmConfig,\n inferenceId,\n this.logger\n )\n\n return await runner.run(messages, context)\n }\n\n private async getSpecialistAgentAndTools(\n botContext: BotContext,\n aiAgentArgs: AiAgentArgs,\n outputMessagesSchemas: ZodObject<any>[],\n authToken: string,\n inferenceId: string,\n llmConfig: LLMConfig\n ) {\n // Build tools\n const tools = this.buildTools(aiAgentArgs)\n\n // Build agent\n const sourceIds =\n aiAgentArgs.type === AiAgentType.Specialist ? aiAgentArgs.sourceIds : []\n\n const specialist = await SpecialistAgent.create<TPlugins, TExtraData>({\n name: aiAgentArgs.name,\n instructions: aiAgentArgs.instructions,\n tools: tools,\n contactInfo: botContext.session.user.contact_info || [],\n inputGuardrailRules: aiAgentArgs.inputGuardrailRules || [],\n sourceIds,\n outputMessagesSchemas: outputMessagesSchemas || [],\n campaignsContext: botContext.input.context?.campaigns_v2,\n logger: this.logger,\n llmConfig,\n guardrailTrackingContext: {\n botId: botContext.session.bot.id,\n isTest: botContext.session.is_test_integration,\n authToken,\n inferenceId,\n },\n forceToolNameOverride: aiAgentArgs.forceToolNameOverride,\n disableForceRetrieveKnowledge: aiAgentArgs.disableForceRetrieveKnowledge,\n })\n const specialistAgent = specialist.getAgent()\n\n return { agent: specialistAgent, tools }\n }\n\n private async getMessages(\n botContext: BotContext,\n authToken: string,\n previousHubtypeMessages: HubtypeAssistantMessage[]\n ): Promise<AgenticInputMessage[]> {\n const hubtypeClient = new HubtypeApiClient(authToken)\n if (!isProd) {\n return await hubtypeClient.getLocalMessages(\n MAX_MEMORY_LENGTH,\n previousHubtypeMessages,\n this.localStorageKey\n )\n }\n\n // Default to V2\n const result = await hubtypeClient.getMessagesV2(\n botContext,\n this.memory,\n previousHubtypeMessages\n )\n return result.messages\n }\n\n private buildTools(aiAgentArgs: AiAgentArgs): Tool<TPlugins, TExtraData>[] {\n const activeTools =\n aiAgentArgs.type === AiAgentType.Router ? [] : aiAgentArgs.activeTools\n const activeToolNames = activeTools.map(tool => tool.name)\n const availableTools = this.toolDefinitions.filter(tool =>\n activeToolNames.includes(tool.name)\n )\n return availableTools.map(toolDefinition => {\n return tool<any, Context<TPlugins, TExtraData>, any>({\n name: toolDefinition.name,\n description: toolDefinition.description,\n parameters: toolDefinition.schema,\n execute: toolDefinition.func,\n })\n })\n }\n}\n\nexport * from './bot-config-tools'\nexport * from './types'\n"],"names":["AiAgentType","handoff","setTracingDisabled","tool","v7","uuidv7","RouterAgent","SpecialistAgent","DEFAULT_MAX_RETRIES","DEFAULT_TIMEOUT_16_SECONDS","isProd","MAX_MEMORY_LENGTH","createDebugLogger","LLMConfig","RouterRunner","SpecialistRunner","HubtypeApiClient","BotonicPluginAiAgents","memory","botContext","aiAgentArgs","authToken","Error","inferenceId","error","console","llmConfig","tools","agent","messages","context","t","runner","specialists","name","instructions","specialistsAgents","Promise","specialistData","forceToolNameOverride","reasoningEffort","disableForceRetrieveKnowledge","aiAgentSpecialistArgs","router","routerAgent","outputMessagesSchemas","sourceIds","specialist","specialistAgent","previousHubtypeMessages","hubtypeClient","result","activeTools","activeToolNames","availableTools","toolDefinition","options"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type BotContext, type ReasoningEffort, VerbosityLevel } from '@botonic/core';
|
|
2
2
|
import { type Model, type ModelProvider, type ModelSettings } from '@openai/agents';
|
|
3
|
-
import { type LLMProviderType } from './constants';
|
|
3
|
+
import { type LLMProviderType } from './constants.js';
|
|
4
4
|
export interface LLMConfigParams {
|
|
5
5
|
maxRetries: number;
|
|
6
6
|
timeout: number;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { VerbosityLevel } from "@botonic/core";
|
|
2
|
+
import { OpenAIProvider } from "@openai/agents";
|
|
3
|
+
import openai, { AzureOpenAI } from "openai";
|
|
4
|
+
import { LITELLM_TAG_KEYS, LLM_API_KEY, LLM_API_URL, LLM_AZURE_API_VERSION, LLM_OPENAI_MODEL, LLM_PROVIDER, LLM_PROVIDERS, isProd } from "./constants.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
function _define_property(obj, key, value) {
|
|
11
|
+
if (key in obj) {
|
|
12
|
+
Object.defineProperty(obj, key, {
|
|
13
|
+
value: value,
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true
|
|
17
|
+
});
|
|
18
|
+
} else obj[key] = value;
|
|
19
|
+
return obj;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class LLMConfig {
|
|
26
|
+
async getModel() {
|
|
27
|
+
return await this.modelProvider.getModel(this.modelName);
|
|
28
|
+
}
|
|
29
|
+
getModelProvider() {
|
|
30
|
+
const client = this.getClient();
|
|
31
|
+
return new OpenAIProvider({
|
|
32
|
+
openAIClient: client,
|
|
33
|
+
useResponses: false
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
getProviderName() {
|
|
37
|
+
if (this.botContext.settings.LITELLM_API_URL || LLM_PROVIDER === LLM_PROVIDERS.LITELLM) {
|
|
38
|
+
return LLM_PROVIDERS.LITELLM;
|
|
39
|
+
}
|
|
40
|
+
return LLM_PROVIDER;
|
|
41
|
+
}
|
|
42
|
+
getClient() {
|
|
43
|
+
if (this.getProviderName() === LLM_PROVIDERS.LITELLM) {
|
|
44
|
+
const litellmUrl = this.botContext.settings.LITELLM_API_URL || LLM_API_URL || '';
|
|
45
|
+
return this.getLiteLLMClient(litellmUrl);
|
|
46
|
+
}
|
|
47
|
+
if (LLM_PROVIDER === LLM_PROVIDERS.OPENAI) {
|
|
48
|
+
return this.getOpenAIClient();
|
|
49
|
+
}
|
|
50
|
+
return this.getAzureOpenAiClient();
|
|
51
|
+
}
|
|
52
|
+
buildLiteLLMTags() {
|
|
53
|
+
const botId = this.botContext.session.bot.id;
|
|
54
|
+
const orgId = this.botContext.session.organization_id;
|
|
55
|
+
const parts = [];
|
|
56
|
+
if (botId) {
|
|
57
|
+
parts.push(`${LITELLM_TAG_KEYS.BOT_ID}:${botId}`);
|
|
58
|
+
}
|
|
59
|
+
if (orgId) {
|
|
60
|
+
parts.push(`${LITELLM_TAG_KEYS.ORG_ID}:${orgId}`);
|
|
61
|
+
}
|
|
62
|
+
return parts.length > 0 ? {
|
|
63
|
+
'x-litellm-tags': parts.join(LITELLM_TAG_KEYS.SEPARATOR)
|
|
64
|
+
} : undefined;
|
|
65
|
+
}
|
|
66
|
+
getLiteLLMClient(litellmUrl) {
|
|
67
|
+
return new openai({
|
|
68
|
+
apiKey: this.botContext.secrets.LITELLM_API_KEY || LLM_API_KEY,
|
|
69
|
+
baseURL: litellmUrl,
|
|
70
|
+
timeout: this.timeout,
|
|
71
|
+
maxRetries: this.maxRetries,
|
|
72
|
+
dangerouslyAllowBrowser: !isProd,
|
|
73
|
+
defaultHeaders: this.buildLiteLLMTags()
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
getOpenAIClient() {
|
|
77
|
+
return new openai({
|
|
78
|
+
apiKey: this.botContext.secrets.AZURE_OPENAI_API_KEY || LLM_API_KEY,
|
|
79
|
+
timeout: this.timeout,
|
|
80
|
+
maxRetries: this.maxRetries,
|
|
81
|
+
dangerouslyAllowBrowser: !isProd
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
getAzureOpenAiClient() {
|
|
85
|
+
const baseURL = `${this.botContext.settings.AZURE_OPENAI_API_BASE || LLM_API_URL}openai/`;
|
|
86
|
+
return new AzureOpenAI({
|
|
87
|
+
apiKey: this.botContext.secrets.AZURE_OPENAI_API_KEY || LLM_API_KEY,
|
|
88
|
+
apiVersion: this.botContext.settings.AZURE_OPENAI_API_VERSION || LLM_AZURE_API_VERSION,
|
|
89
|
+
deployment: this.modelName,
|
|
90
|
+
baseURL,
|
|
91
|
+
timeout: this.timeout,
|
|
92
|
+
maxRetries: this.maxRetries,
|
|
93
|
+
dangerouslyAllowBrowser: !isProd
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
getModelSettings(model, verbosity, reasoningEffort) {
|
|
97
|
+
if (model.includes('gpt-4')) {
|
|
98
|
+
return {
|
|
99
|
+
temperature: 0,
|
|
100
|
+
text: {
|
|
101
|
+
verbosity: VerbosityLevel.Medium
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (reasoningEffort) {
|
|
106
|
+
return {
|
|
107
|
+
reasoning: {
|
|
108
|
+
effort: reasoningEffort
|
|
109
|
+
},
|
|
110
|
+
temperature: 1,
|
|
111
|
+
text: {
|
|
112
|
+
verbosity
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
temperature: 1,
|
|
118
|
+
text: {
|
|
119
|
+
verbosity
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
getApiVersion() {
|
|
124
|
+
if (this.getProviderName() === LLM_PROVIDERS.LITELLM) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
if (LLM_PROVIDER !== LLM_PROVIDERS.AZURE) {
|
|
128
|
+
return 'NOT_API_VERSION_FOR_OPENAI_PROVIDER';
|
|
129
|
+
}
|
|
130
|
+
return this.botContext.settings.AZURE_OPENAI_API_VERSION || LLM_AZURE_API_VERSION;
|
|
131
|
+
}
|
|
132
|
+
constructor({ maxRetries, timeout, modelName, verbosity, botContext, reasoningEffort }){
|
|
133
|
+
_define_property(this, "maxRetries", void 0);
|
|
134
|
+
_define_property(this, "timeout", void 0);
|
|
135
|
+
_define_property(this, "botContext", void 0);
|
|
136
|
+
_define_property(this, "modelName", void 0);
|
|
137
|
+
_define_property(this, "modelSettings", void 0);
|
|
138
|
+
_define_property(this, "modelProvider", void 0);
|
|
139
|
+
this.maxRetries = maxRetries;
|
|
140
|
+
this.timeout = timeout;
|
|
141
|
+
this.botContext = botContext;
|
|
142
|
+
this.modelName = LLM_PROVIDER === LLM_PROVIDERS.OPENAI ? LLM_OPENAI_MODEL : modelName;
|
|
143
|
+
this.modelProvider = this.getModelProvider();
|
|
144
|
+
this.modelSettings = this.getModelSettings(modelName, verbosity, reasoningEffort);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export { LLMConfig };
|
|
149
|
+
|
|
150
|
+
//# sourceMappingURL=llm-config.js.map
|