@botonic/plugin-ai-agents 0.57.0-rslib-esm.1 → 0.57.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/{agents → cjs/agents}/base-agent.d.ts +4 -4
- package/lib/cjs/agents/base-agent.js +39 -0
- package/lib/cjs/agents/base-agent.js.map +1 -0
- package/lib/cjs/agents/index.d.ts +2 -0
- package/lib/cjs/agents/index.js +8 -0
- package/lib/cjs/agents/index.js.map +1 -0
- package/lib/{agents → cjs/agents}/router-agent.d.ts +5 -5
- package/lib/cjs/agents/router-agent.js +33 -0
- package/lib/cjs/agents/router-agent.js.map +1 -0
- package/lib/{agents → cjs/agents}/specialist-agent.d.ts +5 -5
- package/lib/{agents → cjs/agents}/specialist-agent.js +45 -65
- package/lib/cjs/agents/specialist-agent.js.map +1 -0
- package/lib/{bot-config-tools.d.ts → cjs/bot-config-tools.d.ts} +1 -1
- package/lib/cjs/bot-config-tools.js +18 -0
- package/lib/cjs/bot-config-tools.js.map +1 -0
- package/lib/cjs/constants.js +25 -0
- package/lib/cjs/constants.js.map +1 -0
- package/lib/{debug-logger.d.ts → cjs/debug-logger.d.ts} +1 -1
- package/lib/{debug-logger.js → cjs/debug-logger.js} +9 -14
- package/lib/cjs/debug-logger.js.map +1 -0
- package/lib/cjs/guardrails/index.d.ts +1 -0
- package/lib/cjs/guardrails/index.js +5 -0
- package/lib/cjs/guardrails/index.js.map +1 -0
- package/lib/{guardrails → cjs/guardrails}/input.d.ts +2 -2
- package/lib/cjs/guardrails/input.js +96 -0
- package/lib/cjs/guardrails/input.js.map +1 -0
- package/lib/{index.d.ts → cjs/index.d.ts} +3 -3
- package/lib/{index.js → cjs/index.js} +75 -114
- package/lib/cjs/index.js.map +1 -0
- package/lib/{llm-config.d.ts → cjs/llm-config.d.ts} +1 -1
- package/lib/cjs/llm-config.js +121 -0
- package/lib/cjs/llm-config.js.map +1 -0
- package/lib/{runners → cjs/runners}/base-runner.d.ts +4 -4
- package/lib/{runners → cjs/runners}/base-runner.js +74 -81
- package/lib/cjs/runners/base-runner.js.map +1 -0
- package/lib/cjs/runners/index.d.ts +2 -0
- package/lib/cjs/runners/index.js +8 -0
- package/lib/cjs/runners/index.js.map +1 -0
- package/lib/{runners → cjs/runners}/router-runner.d.ts +2 -2
- package/lib/{runners → cjs/runners}/router-runner.js +14 -19
- package/lib/cjs/runners/router-runner.js.map +1 -0
- package/lib/{runners → cjs/runners}/specialist-runner.d.ts +1 -1
- package/lib/cjs/runners/specialist-runner.js +8 -0
- package/lib/cjs/runners/specialist-runner.js.map +1 -0
- package/lib/{services → cjs/services}/hubtype-api-client.d.ts +2 -2
- package/lib/cjs/services/hubtype-api-client.js +176 -0
- package/lib/cjs/services/hubtype-api-client.js.map +1 -0
- package/lib/{services → cjs/services}/types.d.ts +1 -1
- package/lib/cjs/services/types.js +13 -0
- package/lib/cjs/services/types.js.map +1 -0
- package/lib/cjs/structured-output/bot-executor.js +18 -0
- package/lib/cjs/structured-output/bot-executor.js.map +1 -0
- package/lib/cjs/structured-output/carousel.js +23 -0
- package/lib/cjs/structured-output/carousel.js.map +1 -0
- package/lib/cjs/structured-output/do-nothing.d.ts +6 -0
- package/lib/cjs/structured-output/do-nothing.js +11 -0
- package/lib/cjs/structured-output/do-nothing.js.map +1 -0
- package/lib/cjs/structured-output/exit.js +11 -0
- package/lib/cjs/structured-output/exit.js.map +1 -0
- package/lib/{structured-output → cjs/structured-output}/index.d.ts +14 -0
- package/lib/cjs/structured-output/index.js +47 -0
- package/lib/cjs/structured-output/index.js.map +1 -0
- package/lib/cjs/structured-output/request-contact-info.d.ts +9 -0
- package/lib/cjs/structured-output/request-contact-info.js +14 -0
- package/lib/cjs/structured-output/request-contact-info.js.map +1 -0
- package/lib/cjs/structured-output/text-with-buttons.js +24 -0
- package/lib/cjs/structured-output/text-with-buttons.js.map +1 -0
- package/lib/cjs/structured-output/text.js +14 -0
- package/lib/cjs/structured-output/text.js.map +1 -0
- package/lib/{tools → cjs/tools}/index.d.ts +2 -2
- package/lib/cjs/tools/index.js +8 -0
- package/lib/cjs/tools/index.js.map +1 -0
- package/lib/{tools → cjs/tools}/retrieve-knowledge.d.ts +2 -2
- package/lib/cjs/tools/retrieve-knowledge.js +34 -0
- package/lib/cjs/tools/retrieve-knowledge.js.map +1 -0
- package/lib/{types.d.ts → cjs/types.d.ts} +1 -1
- package/lib/cjs/types.js +3 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/esm/agents/base-agent.d.ts +28 -0
- package/lib/esm/agents/base-agent.js +39 -0
- package/lib/esm/agents/base-agent.js.map +1 -0
- package/lib/esm/agents/index.d.ts +2 -0
- package/lib/esm/agents/index.js +8 -0
- package/lib/esm/agents/index.js.map +1 -0
- package/lib/esm/agents/router-agent.d.ts +25 -0
- package/lib/esm/agents/router-agent.js +33 -0
- package/lib/esm/agents/router-agent.js.map +1 -0
- package/lib/esm/agents/specialist-agent.d.ts +39 -0
- package/lib/esm/agents/specialist-agent.js +108 -0
- package/lib/esm/agents/specialist-agent.js.map +1 -0
- package/lib/esm/bot-config-tools.d.ts +7 -0
- package/lib/esm/bot-config-tools.js +18 -0
- package/lib/esm/bot-config-tools.js.map +1 -0
- package/lib/esm/constants.d.ts +21 -0
- package/lib/esm/constants.js +25 -0
- package/lib/esm/constants.js.map +1 -0
- package/lib/esm/debug-logger.d.ts +33 -0
- package/lib/esm/debug-logger.js +116 -0
- package/lib/esm/debug-logger.js.map +1 -0
- package/lib/esm/guardrails/index.d.ts +1 -0
- package/lib/esm/guardrails/index.js +5 -0
- package/lib/esm/guardrails/index.js.map +1 -0
- package/lib/esm/guardrails/input.d.ts +10 -0
- package/lib/esm/guardrails/input.js +96 -0
- package/lib/esm/guardrails/input.js.map +1 -0
- package/lib/esm/index.d.ts +22 -0
- package/lib/esm/index.js +220 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/llm-config.d.ts +30 -0
- package/lib/esm/llm-config.js +121 -0
- package/lib/esm/llm-config.js.map +1 -0
- package/lib/esm/runners/base-runner.d.ts +31 -0
- package/lib/esm/runners/base-runner.js +194 -0
- package/lib/esm/runners/base-runner.js.map +1 -0
- package/lib/esm/runners/index.d.ts +2 -0
- package/lib/esm/runners/index.js +8 -0
- package/lib/esm/runners/index.js.map +1 -0
- package/lib/esm/runners/router-runner.d.ts +8 -0
- package/lib/esm/runners/router-runner.js +44 -0
- package/lib/esm/runners/router-runner.js.map +1 -0
- package/lib/esm/runners/specialist-runner.d.ts +4 -0
- package/lib/esm/runners/specialist-runner.js +8 -0
- package/lib/esm/runners/specialist-runner.js.map +1 -0
- package/lib/esm/services/hubtype-api-client.d.ts +13 -0
- package/lib/esm/services/hubtype-api-client.js +176 -0
- package/lib/esm/services/hubtype-api-client.js.map +1 -0
- package/lib/esm/services/types.d.ts +72 -0
- package/lib/esm/services/types.js +13 -0
- package/lib/esm/services/types.js.map +1 -0
- package/lib/esm/structured-output/bot-executor.d.ts +13 -0
- package/lib/esm/structured-output/bot-executor.js +18 -0
- package/lib/esm/structured-output/bot-executor.js.map +1 -0
- package/lib/esm/structured-output/carousel.d.ts +18 -0
- package/lib/esm/structured-output/carousel.js +23 -0
- package/lib/esm/structured-output/carousel.js.map +1 -0
- package/lib/esm/structured-output/do-nothing.d.ts +6 -0
- package/lib/esm/structured-output/do-nothing.js +11 -0
- package/lib/esm/structured-output/do-nothing.js.map +1 -0
- package/lib/esm/structured-output/exit.d.ts +6 -0
- package/lib/esm/structured-output/exit.js +11 -0
- package/lib/esm/structured-output/exit.js.map +1 -0
- package/lib/esm/structured-output/index.d.ts +112 -0
- package/lib/esm/structured-output/index.js +47 -0
- package/lib/esm/structured-output/index.js.map +1 -0
- package/lib/esm/structured-output/request-contact-info.d.ts +9 -0
- package/lib/esm/structured-output/request-contact-info.js +14 -0
- package/lib/esm/structured-output/request-contact-info.js.map +1 -0
- package/lib/esm/structured-output/text-with-buttons.d.ts +17 -0
- package/lib/esm/structured-output/text-with-buttons.js +24 -0
- package/lib/esm/structured-output/text-with-buttons.js.map +1 -0
- package/lib/esm/structured-output/text.d.ts +9 -0
- package/lib/esm/structured-output/text.js +14 -0
- package/lib/esm/structured-output/text.js.map +1 -0
- package/lib/esm/tools/index.d.ts +3 -0
- package/lib/esm/tools/index.js +8 -0
- package/lib/esm/tools/index.js.map +1 -0
- package/lib/esm/tools/retrieve-knowledge.d.ts +6 -0
- package/lib/esm/tools/retrieve-knowledge.js +34 -0
- package/lib/esm/tools/retrieve-knowledge.js.map +1 -0
- package/lib/esm/types.d.ts +53 -0
- package/lib/esm/types.js +3 -0
- package/lib/esm/types.js.map +1 -0
- package/package.json +9 -11
- package/src/index.ts +1 -0
- package/src/runners/base-runner.ts +20 -10
- package/src/structured-output/do-nothing.ts +12 -0
- package/src/structured-output/index.ts +4 -0
- package/src/structured-output/request-contact-info.ts +18 -0
- package/lib/agents/base-agent.js +0 -66
- package/lib/agents/base-agent.js.map +0 -1
- package/lib/agents/index.d.ts +0 -2
- package/lib/agents/index.js +0 -9
- package/lib/agents/index.js.map +0 -1
- package/lib/agents/router-agent.js +0 -50
- package/lib/agents/router-agent.js.map +0 -1
- package/lib/agents/specialist-agent.js.map +0 -1
- package/lib/bot-config-tools.js +0 -20
- package/lib/bot-config-tools.js.map +0 -1
- package/lib/constants.js +0 -26
- package/lib/constants.js.map +0 -1
- package/lib/debug-logger.js.map +0 -1
- package/lib/guardrails/index.d.ts +0 -1
- package/lib/guardrails/index.js +0 -6
- package/lib/guardrails/index.js.map +0 -1
- package/lib/guardrails/input.js +0 -119
- package/lib/guardrails/input.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/llm-config.js +0 -150
- package/lib/llm-config.js.map +0 -1
- package/lib/runners/base-runner.js.map +0 -1
- package/lib/runners/index.d.ts +0 -2
- package/lib/runners/index.js +0 -9
- package/lib/runners/index.js.map +0 -1
- package/lib/runners/router-runner.js.map +0 -1
- package/lib/runners/specialist-runner.js +0 -10
- package/lib/runners/specialist-runner.js.map +0 -1
- package/lib/services/hubtype-api-client.js +0 -191
- package/lib/services/hubtype-api-client.js.map +0 -1
- package/lib/services/types.js +0 -13
- package/lib/services/types.js.map +0 -1
- package/lib/structured-output/bot-executor.js +0 -21
- package/lib/structured-output/bot-executor.js.map +0 -1
- package/lib/structured-output/carousel.js +0 -26
- package/lib/structured-output/carousel.js.map +0 -1
- package/lib/structured-output/exit.js +0 -14
- package/lib/structured-output/exit.js.map +0 -1
- package/lib/structured-output/index.js +0 -55
- package/lib/structured-output/index.js.map +0 -1
- package/lib/structured-output/text-with-buttons.js +0 -25
- package/lib/structured-output/text-with-buttons.js.map +0 -1
- package/lib/structured-output/text.js +0 -17
- package/lib/structured-output/text.js.map +0 -1
- package/lib/tools/index.js +0 -8
- package/lib/tools/index.js.map +0 -1
- package/lib/tools/retrieve-knowledge.js +0 -40
- package/lib/tools/retrieve-knowledge.js.map +0 -1
- package/lib/types.js +0 -5
- package/lib/types.js.map +0 -1
- /package/lib/{constants.d.ts → cjs/constants.d.ts} +0 -0
- /package/lib/{structured-output → cjs/structured-output}/bot-executor.d.ts +0 -0
- /package/lib/{structured-output → cjs/structured-output}/carousel.d.ts +0 -0
- /package/lib/{structured-output → cjs/structured-output}/exit.d.ts +0 -0
- /package/lib/{structured-output → cjs/structured-output}/text-with-buttons.d.ts +0 -0
- /package/lib/{structured-output → cjs/structured-output}/text.d.ts +0 -0
package/lib/guardrails/input.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
package/lib/llm-config.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
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
|
package/lib/llm-config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-config.js","sources":["../src/llm-config.ts"],"sourcesContent":["import {\n type BotContext,\n type ReasoningEffort,\n VerbosityLevel,\n} from '@botonic/core'\nimport {\n type Model,\n type ModelProvider,\n type ModelSettings,\n OpenAIProvider,\n} from '@openai/agents'\nimport OpenAI, { AzureOpenAI } from 'openai'\nimport {\n isProd,\n LITELLM_TAG_KEYS,\n LLM_API_KEY,\n LLM_API_URL,\n LLM_AZURE_API_VERSION,\n LLM_OPENAI_MODEL,\n LLM_PROVIDER,\n LLM_PROVIDERS,\n type LLMProviderType,\n} from './constants'\n\nexport interface LLMConfigParams {\n maxRetries: number\n timeout: number\n modelName: string\n verbosity: VerbosityLevel\n botContext: BotContext\n reasoningEffort?: ReasoningEffort\n}\n\nexport class LLMConfig {\n private readonly maxRetries: number\n private readonly timeout: number\n private readonly botContext: BotContext\n public readonly modelName: string\n public readonly modelSettings: ModelSettings\n public readonly modelProvider: ModelProvider\n\n constructor({\n maxRetries,\n timeout,\n modelName,\n verbosity,\n botContext,\n reasoningEffort,\n }: LLMConfigParams) {\n this.maxRetries = maxRetries\n this.timeout = timeout\n this.botContext = botContext\n this.modelName =\n LLM_PROVIDER === LLM_PROVIDERS.OPENAI ? LLM_OPENAI_MODEL : modelName\n this.modelProvider = this.getModelProvider()\n this.modelSettings = this.getModelSettings(\n modelName,\n verbosity,\n reasoningEffort\n )\n }\n\n async getModel(): Promise<Model> {\n return await this.modelProvider.getModel(this.modelName)\n }\n\n private getModelProvider(): ModelProvider {\n const client = this.getClient()\n return new OpenAIProvider({\n openAIClient: client,\n useResponses: false,\n })\n }\n\n getProviderName(): LLMProviderType {\n if (\n this.botContext.settings.LITELLM_API_URL ||\n LLM_PROVIDER === LLM_PROVIDERS.LITELLM\n ) {\n return LLM_PROVIDERS.LITELLM\n }\n return LLM_PROVIDER\n }\n\n private getClient(): OpenAI | AzureOpenAI {\n if (this.getProviderName() === LLM_PROVIDERS.LITELLM) {\n const litellmUrl =\n this.botContext.settings.LITELLM_API_URL || LLM_API_URL || ''\n return this.getLiteLLMClient(litellmUrl)\n }\n if (LLM_PROVIDER === LLM_PROVIDERS.OPENAI) {\n return this.getOpenAIClient()\n }\n return this.getAzureOpenAiClient()\n }\n\n private buildLiteLLMTags(): { 'x-litellm-tags': string } | undefined {\n const botId = this.botContext.session.bot.id\n const orgId = this.botContext.session.organization_id\n const parts: string[] = []\n if (botId) {\n parts.push(`${LITELLM_TAG_KEYS.BOT_ID}:${botId}`)\n }\n if (orgId) {\n parts.push(`${LITELLM_TAG_KEYS.ORG_ID}:${orgId}`)\n }\n return parts.length > 0\n ? { 'x-litellm-tags': parts.join(LITELLM_TAG_KEYS.SEPARATOR) }\n : undefined\n }\n\n private getLiteLLMClient(litellmUrl: string): OpenAI {\n return new OpenAI({\n apiKey: this.botContext.secrets.LITELLM_API_KEY || LLM_API_KEY,\n baseURL: litellmUrl,\n timeout: this.timeout,\n maxRetries: this.maxRetries,\n dangerouslyAllowBrowser: !isProd,\n defaultHeaders: this.buildLiteLLMTags(),\n })\n }\n\n private getOpenAIClient(): OpenAI {\n return new OpenAI({\n apiKey: this.botContext.secrets.AZURE_OPENAI_API_KEY || LLM_API_KEY,\n timeout: this.timeout,\n maxRetries: this.maxRetries,\n dangerouslyAllowBrowser: !isProd,\n })\n }\n\n private getAzureOpenAiClient(): AzureOpenAI {\n const baseURL = `${this.botContext.settings.AZURE_OPENAI_API_BASE || LLM_API_URL}openai/`\n\n return new AzureOpenAI({\n apiKey: this.botContext.secrets.AZURE_OPENAI_API_KEY || LLM_API_KEY,\n apiVersion:\n this.botContext.settings.AZURE_OPENAI_API_VERSION ||\n LLM_AZURE_API_VERSION,\n deployment: this.modelName,\n baseURL,\n timeout: this.timeout,\n maxRetries: this.maxRetries,\n dangerouslyAllowBrowser: !isProd,\n })\n }\n\n private getModelSettings(\n model: string,\n verbosity: VerbosityLevel,\n reasoningEffort?: ReasoningEffort\n ): ModelSettings {\n if (model.includes('gpt-4')) {\n return {\n temperature: 0,\n text: { verbosity: VerbosityLevel.Medium },\n }\n }\n\n if (reasoningEffort) {\n return {\n reasoning: { effort: reasoningEffort },\n temperature: 1,\n text: { verbosity },\n }\n }\n\n return {\n temperature: 1,\n text: { verbosity },\n }\n }\n\n getApiVersion(): string | undefined {\n if (this.getProviderName() === LLM_PROVIDERS.LITELLM) {\n return undefined\n }\n if (LLM_PROVIDER !== LLM_PROVIDERS.AZURE) {\n return 'NOT_API_VERSION_FOR_OPENAI_PROVIDER'\n }\n return (\n this.botContext.settings.AZURE_OPENAI_API_VERSION || LLM_AZURE_API_VERSION\n )\n }\n}\n"],"names":["VerbosityLevel","OpenAIProvider","OpenAI","AzureOpenAI","isProd","LITELLM_TAG_KEYS","LLM_API_KEY","LLM_API_URL","LLM_AZURE_API_VERSION","LLM_OPENAI_MODEL","LLM_PROVIDER","LLM_PROVIDERS","LLMConfig","client","litellmUrl","botId","orgId","parts","undefined","baseURL","model","verbosity","reasoningEffort","maxRetries","timeout","modelName","botContext"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runners/base-runner.js","sources":["../../src/runners/base-runner.ts"],"sourcesContent":["import type {\n OutputMessage,\n ResolvedPlugins,\n ToolExecution,\n} from '@botonic/core'\nimport {\n InputGuardrailTripwireTriggered,\n RunContext,\n Runner,\n RunToolCallItem,\n RunToolCallOutputItem,\n} from '@openai/agents'\nimport { isProd, LLM_PROVIDERS } from '../constants'\nimport type { DebugLogger } from '../debug-logger'\nimport type { LLMConfig } from '../llm-config'\nimport { HubtypeApiClient } from '../services/hubtype-api-client'\nimport { TrackFeature, TrackProductName } from '../services/types'\nimport { RETRIEVE_KNOWLEDGE_TOOL_NAME } from '../tools'\nimport type {\n AgenticInputMessage,\n AgenticOutputMessage,\n AIAgent,\n Context,\n ResultRawResponse,\n RunResult,\n} from '../types'\n\n// Minimal interface matching the properties we actually use from Runner.run() result.\n// This bypasses strict type checking while maintaining type safety for accessed properties.\nexport interface RunnerResult {\n finalOutput?: {\n messages?: OutputMessage[]\n }\n rawResponses?: ResultRawResponse[]\n newItems?: unknown[]\n lastAgent?: { name?: string }\n // biome-ignore lint/suspicious/noExplicitAny: state is a complex internal type\n state?: any\n}\n\nexport abstract class BaseRunner<\n TPlugins extends ResolvedPlugins = ResolvedPlugins,\n TExtraData = unknown,\n> {\n protected agent: AIAgent<TPlugins, TExtraData>\n protected llmConfig: LLMConfig\n protected inferenceId: string\n protected logger: DebugLogger\n\n constructor(\n agent: AIAgent<TPlugins, TExtraData>,\n llmConfig: LLMConfig,\n inferenceId: string,\n logger: DebugLogger\n ) {\n this.agent = agent\n this.llmConfig = llmConfig\n this.inferenceId = inferenceId\n this.logger = logger\n }\n\n async run(\n messages: AgenticInputMessage[],\n context: Context<TPlugins, TExtraData>\n ): Promise<RunResult> {\n const startTime = Date.now()\n\n const runContext = new RunContext(context)\n const prompt = (await this.agent.getSystemPrompt(runContext)) ?? ''\n this.logger.logRunnerStart(\n this.llmConfig.modelName,\n this.llmConfig.modelSettings,\n prompt\n )\n\n try {\n const runner = new Runner({\n tracingDisabled: true,\n })\n const result = (await runner.run(this.agent, messages, {\n context,\n })) as RunnerResult\n const endTime = Date.now()\n\n await this.sendLlmRunTracking(result, context, startTime, endTime)\n\n const runResult = this.buildRunResult(result, context, messages.length)\n\n this.logger.logRunResult(runResult, startTime)\n\n return runResult\n } catch (error) {\n const runResult = this.handleInputGuardrailTripwireTriggered(\n error,\n startTime\n )\n if (runResult) {\n return runResult\n }\n\n this.logger.logRunnerError(startTime, error)\n\n throw error\n }\n }\n\n protected getToolsExecuted(\n result: RunnerResult,\n context: Context<TPlugins, TExtraData>\n ): ToolExecution[] {\n const toolResultsByCallId = this.getToolResultsByCallId(result.newItems)\n\n return (\n result.newItems\n ?.filter(item => item instanceof RunToolCallItem)\n .map((item: RunToolCallItem) =>\n this.getToolExecutionInfo(\n item as RunToolCallItem,\n context,\n toolResultsByCallId\n )\n )\n .filter(\n (toolExecution: ToolExecution) => toolExecution.toolName !== ''\n ) || []\n )\n }\n\n private getToolResultsByCallId(\n newItems: unknown[] = []\n ): Map<string, string> {\n const map = new Map<string, string>()\n for (const item of newItems) {\n if (!(item instanceof RunToolCallOutputItem)) {\n continue\n }\n const rawItem = item.rawItem as {\n callId?: string\n output?: string | { type?: string; text?: string }\n }\n const callId = rawItem?.callId\n const output = rawItem?.output\n if (callId == null || output == null) {\n continue\n }\n const text = this.extractToolResult(output)\n if (text != null) {\n map.set(callId, text)\n }\n }\n return map\n }\n\n private extractToolResult(\n output: string | { type?: string; text?: string }\n ): string | undefined {\n if (typeof output === 'string') {\n return output\n }\n return output?.type === 'text' && typeof output?.text === 'string'\n ? output.text\n : undefined\n }\n\n private getToolExecutionInfo(\n item: RunToolCallItem,\n context: Context<TPlugins, TExtraData>,\n toolResultsByCallId: Map<string, string>\n ): ToolExecution {\n if (item.rawItem.type !== 'function_call') {\n return {\n toolName: '',\n toolArguments: {},\n }\n }\n const toolName = item.rawItem.name\n const toolArguments = this.getSafeToolArguments(item.rawItem.arguments)\n const toolResults = item.rawItem.callId\n ? toolResultsByCallId.get(item.rawItem.callId)\n : undefined\n\n const toolExecution: ToolExecution = {\n toolName,\n toolArguments,\n toolResults,\n }\n\n if (toolName === RETRIEVE_KNOWLEDGE_TOOL_NAME) {\n return {\n ...toolExecution,\n knowledgebaseSourcesIds: context.knowledgeUsed.sourceIds,\n knowledgebaseChunksIds: context.knowledgeUsed.chunksIds,\n }\n }\n\n return toolExecution\n }\n\n private getSafeToolArguments(\n rawToolArguments: string\n ): Record<string, unknown> {\n try {\n return JSON.parse(rawToolArguments)\n } catch (_error) {\n return {}\n }\n }\n\n protected buildRunResult(\n result: RunnerResult,\n context: Context<TPlugins, TExtraData>,\n memoryLength: number\n ): RunResult {\n const outputMessages = result.finalOutput?.messages || []\n const hasExit =\n outputMessages.length === 0 ||\n outputMessages.some(message => message.type === 'exit')\n\n return {\n startingAgentName: '',\n lastAgentName: '',\n availableSpecialists: [],\n isTransferredToSpecialist: false,\n messages: hasExit\n ? []\n : (outputMessages.filter(\n message => message.type !== 'exit'\n ) as AgenticOutputMessage[]),\n toolsExecuted: this.getToolsExecuted(result, context),\n exit: hasExit,\n memoryLength,\n error: false,\n inputGuardrailsTriggered: [],\n outputGuardrailsTriggered: [],\n }\n }\n\n private async sendLlmRunTracking(\n result: RunnerResult,\n context: Context<TPlugins, TExtraData>,\n startTime: number,\n endTime: number\n ): Promise<void> {\n if (!isProd) {\n return\n }\n if (this.llmConfig.getProviderName() === LLM_PROVIDERS.LITELLM) {\n return\n }\n const rawResponses = result.rawResponses ?? []\n if (rawResponses.length === 0) {\n return\n }\n const botId = context.request.session.bot.id\n const isTest = context.request.session.is_test_integration\n const totalDuration = endTime - startTime\n const durationPerCall = Math.round(totalDuration / rawResponses.length)\n const temperature =\n (this.llmConfig.modelSettings.temperature as number | undefined) ?? 0\n const llmRuns = rawResponses.map(response => ({\n inference_id: this.inferenceId,\n is_test: isTest,\n product_name: TrackProductName.AI_AGENT,\n deployment_name: this.llmConfig.modelName,\n model_name:\n (response.providerData?.model as string | undefined) ??\n this.llmConfig.modelName,\n feature: TrackFeature.AI_AGENT_RUN,\n api_version: this.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(context.authToken)\n await client.trackLlmRuns(botId, {\n llm_runs: llmRuns,\n })\n }\n\n protected handleInputGuardrailTripwireTriggered(\n error: unknown,\n startTime: number\n ): RunResult | undefined {\n if (error instanceof InputGuardrailTripwireTriggered) {\n const runResult: RunResult = {\n startingAgentName: '',\n lastAgentName: '',\n availableSpecialists: [],\n isTransferredToSpecialist: false,\n messages: [],\n memoryLength: 0,\n toolsExecuted: [],\n exit: true,\n error: false,\n inputGuardrailsTriggered: error.result.output.outputInfo,\n outputGuardrailsTriggered: [],\n }\n\n this.logger.logGuardrailTriggered()\n this.logger.logRunResult(runResult, startTime)\n\n return runResult\n }\n }\n}\n"],"names":["InputGuardrailTripwireTriggered","RunContext","Runner","RunToolCallItem","RunToolCallOutputItem","isProd","LLM_PROVIDERS","HubtypeApiClient","TrackFeature","TrackProductName","RETRIEVE_KNOWLEDGE_TOOL_NAME","BaseRunner","messages","context","startTime","Date","runContext","prompt","runner","result","endTime","runResult","error","toolResultsByCallId","item","toolExecution","newItems","map","Map","rawItem","callId","output","text","undefined","toolName","toolArguments","toolResults","rawToolArguments","JSON","_error","memoryLength","outputMessages","hasExit","message","rawResponses","botId","isTest","totalDuration","durationPerCall","Math","temperature","llmRuns","response","client","agent","llmConfig","inferenceId","logger"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWuB;AAC6B;AAGa;AACC;AACX;AAuBhD,MAAeW,UAAUA;IAqB9B,MAAM,IACJC,QAA+B,EAC/BC,OAAsC,EAClB;QACpB,MAAMC,YAAYC,KAAK,GAAG;QAE1B,MAAMC,aAAa,IAAIf,UAAUA,CAACY;QAClC,MAAMI,SAAU,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAACD,eAAgB;QACjE,IAAI,CAAC,MAAM,CAAC,cAAc,CACxB,IAAI,CAAC,SAAS,CAAC,SAAS,EACxB,IAAI,CAAC,SAAS,CAAC,aAAa,EAC5BC;QAGF,IAAI;YACF,MAAMC,SAAS,IAAIhB,MAAMA,CAAC;gBACxB,iBAAiB;YACnB;YACA,MAAMiB,SAAU,MAAMD,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAEN,UAAU;gBACrDC;YACF;YACA,MAAMO,UAAUL,KAAK,GAAG;YAExB,MAAM,IAAI,CAAC,kBAAkB,CAACI,QAAQN,SAASC,WAAWM;YAE1D,MAAMC,YAAY,IAAI,CAAC,cAAc,CAACF,QAAQN,SAASD,SAAS,MAAM;YAEtE,IAAI,CAAC,MAAM,CAAC,YAAY,CAACS,WAAWP;YAEpC,OAAOO;QACT,EAAE,OAAOC,OAAO;YACd,MAAMD,YAAY,IAAI,CAAC,qCAAqC,CAC1DC,OACAR;YAEF,IAAIO,WAAW;gBACb,OAAOA;YACT;YAEA,IAAI,CAAC,MAAM,CAAC,cAAc,CAACP,WAAWQ;YAEtC,MAAMA;QACR;IACF;IAEU,iBACRH,MAAoB,EACpBN,OAAsC,EACrB;QACjB,MAAMU,sBAAsB,IAAI,CAAC,sBAAsB,CAACJ,OAAO,QAAQ;QAEvE,OACEA,OAAO,QAAQ,EACX,OAAOK,CAAAA,OAAQA,gBAAgBrB,eAAeA,EAC/C,IAAI,CAACqB,OACJ,IAAI,CAAC,oBAAoB,CACvBA,MACAX,SACAU,sBAGH,OACC,CAACE,gBAAiCA,cAAc,QAAQ,KAAK,OAC1D,EAAE;IAEb;IAEQ,uBACNC,WAAsB,EAAE,EACH;QACrB,MAAMC,MAAM,IAAIC;QAChB,KAAK,MAAMJ,QAAQE,SAAU;YAC3B,IAAI,CAAEF,CAAAA,gBAAgBpB,qBAAoB,GAAI;gBAC5C;YACF;YACA,MAAMyB,UAAUL,KAAK,OAAO;YAI5B,MAAMM,SAASD,SAAS;YACxB,MAAME,SAASF,SAAS;YACxB,IAAIC,UAAU,QAAQC,UAAU,MAAM;gBACpC;YACF;YACA,MAAMC,OAAO,IAAI,CAAC,iBAAiB,CAACD;YACpC,IAAIC,QAAQ,MAAM;gBAChBL,IAAI,GAAG,CAACG,QAAQE;YAClB;QACF;QACA,OAAOL;IACT;IAEQ,kBACNI,MAAiD,EAC7B;QACpB,IAAI,OAAOA,WAAW,UAAU;YAC9B,OAAOA;QACT;QACA,OAAOA,QAAQ,SAAS,UAAU,OAAOA,QAAQ,SAAS,WACtDA,OAAO,IAAI,GACXE;IACN;IAEQ,qBACNT,IAAqB,EACrBX,OAAsC,EACtCU,mBAAwC,EACzB;QACf,IAAIC,KAAK,OAAO,CAAC,IAAI,KAAK,iBAAiB;YACzC,OAAO;gBACL,UAAU;gBACV,eAAe,CAAC;YAClB;QACF;QACA,MAAMU,WAAWV,KAAK,OAAO,CAAC,IAAI;QAClC,MAAMW,gBAAgB,IAAI,CAAC,oBAAoB,CAACX,KAAK,OAAO,CAAC,SAAS;QACtE,MAAMY,cAAcZ,KAAK,OAAO,CAAC,MAAM,GACnCD,oBAAoB,GAAG,CAACC,KAAK,OAAO,CAAC,MAAM,IAC3CS;QAEJ,MAAMR,gBAA+B;YACnCS;YACAC;YACAC;QACF;QAEA,IAAIF,aAAaxB,4BAA4BA,EAAE;YAC7C,OAAO;gBACL,GAAGe,aAAa;gBAChB,yBAAyBZ,QAAQ,aAAa,CAAC,SAAS;gBACxD,wBAAwBA,QAAQ,aAAa,CAAC,SAAS;YACzD;QACF;QAEA,OAAOY;IACT;IAEQ,qBACNY,gBAAwB,EACC;QACzB,IAAI;YACF,OAAOC,KAAK,KAAK,CAACD;QACpB,EAAE,OAAOE,QAAQ;YACf,OAAO,CAAC;QACV;IACF;IAEU,eACRpB,MAAoB,EACpBN,OAAsC,EACtC2B,YAAoB,EACT;QACX,MAAMC,iBAAiBtB,OAAO,WAAW,EAAE,YAAY,EAAE;QACzD,MAAMuB,UACJD,eAAe,MAAM,KAAK,KAC1BA,eAAe,IAAI,CAACE,CAAAA,UAAWA,QAAQ,IAAI,KAAK;QAElD,OAAO;YACL,mBAAmB;YACnB,eAAe;YACf,sBAAsB,EAAE;YACxB,2BAA2B;YAC3B,UAAUD,UACN,EAAE,GACDD,eAAe,MAAM,CACpBE,CAAAA,UAAWA,QAAQ,IAAI,KAAK;YAElC,eAAe,IAAI,CAAC,gBAAgB,CAACxB,QAAQN;YAC7C,MAAM6B;YACNF;YACA,OAAO;YACP,0BAA0B,EAAE;YAC5B,2BAA2B,EAAE;QAC/B;IACF;IAEA,MAAc,mBACZrB,MAAoB,EACpBN,OAAsC,EACtCC,SAAiB,EACjBM,OAAe,EACA;QACf,IAAI,CAACf,MAAMA,EAAE;YACX;QACF;QACA,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,OAAOC,qBAAqB,EAAE;YAC9D;QACF;QACA,MAAMsC,eAAezB,OAAO,YAAY,IAAI,EAAE;QAC9C,IAAIyB,aAAa,MAAM,KAAK,GAAG;YAC7B;QACF;QACA,MAAMC,QAAQhC,QAAQ,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC5C,MAAMiC,SAASjC,QAAQ,OAAO,CAAC,OAAO,CAAC,mBAAmB;QAC1D,MAAMkC,gBAAgB3B,UAAUN;QAChC,MAAMkC,kBAAkBC,KAAK,KAAK,CAACF,gBAAgBH,aAAa,MAAM;QACtE,MAAMM,cACH,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,WAAW,IAA2B;QACtE,MAAMC,UAAUP,aAAa,GAAG,CAACQ,CAAAA,WAAa;gBAC5C,cAAc,IAAI,CAAC,WAAW;gBAC9B,SAASN;gBACT,cAAcrC,yBAAyB;gBACvC,iBAAiB,IAAI,CAAC,SAAS,CAAC,SAAS;gBACzC,YACG2C,SAAS,YAAY,EAAE,SACxB,IAAI,CAAC,SAAS,CAAC,SAAS;gBAC1B,SAAS5C,yBAAyB;gBAClC,aAAa,IAAI,CAAC,SAAS,CAAC,aAAa;gBACzC,mBAAmB4C,SAAS,KAAK,CAAC,WAAW;gBAC7C,uBAAuBA,SAAS,KAAK,CAAC,YAAY;gBAClD,0BAA0BJ;gBAC1BE;gBACA,OAAO;YACT;QAEA,MAAMG,SAAS,IAAI9C,gBAAgBA,CAACM,QAAQ,SAAS;QACrD,MAAMwC,OAAO,YAAY,CAACR,OAAO;YAC/B,UAAUM;QACZ;IACF;IAEU,sCACR7B,KAAc,EACdR,SAAiB,EACM;QACvB,IAAIQ,iBAAiBtB,+BAA+BA,EAAE;YACpD,MAAMqB,YAAuB;gBAC3B,mBAAmB;gBACnB,eAAe;gBACf,sBAAsB,EAAE;gBACxB,2BAA2B;gBAC3B,UAAU,EAAE;gBACZ,cAAc;gBACd,eAAe,EAAE;gBACjB,MAAM;gBACN,OAAO;gBACP,0BAA0BC,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU;gBACxD,2BAA2B,EAAE;YAC/B;YAEA,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACjC,IAAI,CAAC,MAAM,CAAC,YAAY,CAACD,WAAWP;YAEpC,OAAOO;QACT;IACF;IAjQA,YACEiC,KAAoC,EACpCC,SAAoB,EACpBC,WAAmB,EACnBC,MAAmB,CACnB;QAVF,uBAAU,SAAV;QACA,uBAAU,aAAV;QACA,uBAAU,eAAV;QACA,uBAAU,UAAV;QAQE,IAAI,CAAC,KAAK,GAAGH;QACb,IAAI,CAAC,SAAS,GAAGC;QACjB,IAAI,CAAC,WAAW,GAAGC;QACnB,IAAI,CAAC,MAAM,GAAGC;IAChB;AAwPF"}
|
package/lib/runners/index.d.ts
DELETED
package/lib/runners/index.js
DELETED
package/lib/runners/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runners/index.js","sources":["../../src/runners/index.ts"],"sourcesContent":["export { RouterRunner } from './router-runner'\nexport { SpecialistRunner } from './specialist-runner'\n"],"names":["RouterRunner","SpecialistRunner"],"mappings":";;AAA8C;AACQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runners/router-runner.js","sources":["../../src/runners/router-runner.ts"],"sourcesContent":["import type { AvailableSpecialist, ResolvedPlugins } from '@botonic/core'\nimport { Handoff } from '@openai/agents'\nimport type { Agent } from '@openai/agents-core'\n\nimport type { Context, RunResult } from '../types'\nimport { BaseRunner, type RunnerResult } from './base-runner'\n\nexport class RouterRunner<\n TPlugins extends ResolvedPlugins = ResolvedPlugins,\n TExtraData = unknown,\n> extends BaseRunner<TPlugins, TExtraData> {\n protected override buildRunResult(\n result: RunnerResult,\n context: Context<TPlugins, TExtraData>,\n memoryLength: number\n ): RunResult {\n const base = super.buildRunResult(result, context, memoryLength)\n\n const availableSpecialists = this.getAvailableSpecialists()\n const startingAgentName = this.agent.name ?? ''\n const lastAgentName = result.lastAgent?.name ?? ''\n\n return {\n ...base,\n startingAgentName,\n lastAgentName,\n availableSpecialists,\n isTransferredToSpecialist: startingAgentName !== lastAgentName,\n }\n }\n\n protected override handleInputGuardrailTripwireTriggered(\n error: unknown,\n startTime: number\n ): RunResult | undefined {\n const runResult = super.handleInputGuardrailTripwireTriggered(\n error,\n startTime\n )\n if (runResult) {\n // Override attributes to match router agent\n runResult.startingAgentName = this.agent.name\n runResult.lastAgentName = this.agent.name\n runResult.availableSpecialists = this.getAvailableSpecialists()\n runResult.isTransferredToSpecialist = false\n\n return runResult\n }\n return undefined\n }\n\n private getAvailableSpecialists(): AvailableSpecialist[] {\n return (this.agent.handoffs ?? []).map(\n (entry: Agent<any, any> | Handoff<any, any>) => {\n const isHandoff = entry instanceof Handoff\n const agent = isHandoff ? entry.agent : (entry as Agent<any, any>)\n const description = isHandoff\n ? entry.toolDescription\n : agent.handoffDescription\n return { name: agent.name, description }\n }\n )\n }\n}\n"],"names":["Handoff","BaseRunner","RouterRunner","result","context","memoryLength","base","availableSpecialists","startingAgentName","lastAgentName","error","startTime","runResult","undefined","entry","isHandoff","agent","description"],"mappings":";;;;;AACwC;AAIqB;AAEtD,MAAME,YAAYA,SAGfD,UAAUA;IACC,eACjBE,MAAoB,EACpBC,OAAsC,EACtCC,YAAoB,EACT;QACX,MAAMC,OAAO,KAAK,CAAC,eAAeH,QAAQC,SAASC;QAEnD,MAAME,uBAAuB,IAAI,CAAC,uBAAuB;QACzD,MAAMC,oBAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;QAC7C,MAAMC,gBAAgBN,OAAO,SAAS,EAAE,QAAQ;QAEhD,OAAO;YACL,GAAGG,IAAI;YACPE;YACAC;YACAF;YACA,2BAA2BC,sBAAsBC;QACnD;IACF;IAEmB,sCACjBC,KAAc,EACdC,SAAiB,EACM;QACvB,MAAMC,YAAY,KAAK,CAAC,sCACtBF,OACAC;QAEF,IAAIC,WAAW;YACb,4CAA4C;YAC5CA,UAAU,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;YAC7CA,UAAU,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;YACzCA,UAAU,oBAAoB,GAAG,IAAI,CAAC,uBAAuB;YAC7DA,UAAU,yBAAyB,GAAG;YAEtC,OAAOA;QACT;QACA,OAAOC;IACT;IAEQ,0BAAiD;QACvD,OAAQ,KAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAC,EAAG,GAAG,CACpC,CAACC;YACC,MAAMC,YAAYD,iBAAiBd,OAAOA;YAC1C,MAAMgB,QAAQD,YAAYD,MAAM,KAAK,GAAIA;YACzC,MAAMG,cAAcF,YAChBD,MAAM,eAAe,GACrBE,MAAM,kBAAkB;YAC5B,OAAO;gBAAE,MAAMA,MAAM,IAAI;gBAAEC;YAAY;QACzC;IAEJ;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runners/specialist-runner.js","sources":["../../src/runners/specialist-runner.ts"],"sourcesContent":["import type { ResolvedPlugins } from '@botonic/core'\nimport { BaseRunner } from './base-runner'\n\nexport class SpecialistRunner<\n TPlugins extends ResolvedPlugins = ResolvedPlugins,\n TExtraData = unknown,\n> extends BaseRunner<TPlugins, TExtraData> {}\n"],"names":["BaseRunner","SpecialistRunner"],"mappings":";;;AAC0C;AAEnC,MAAMC,gBAAgBA,SAGnBD,UAAUA;AAAwB"}
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
|
-
import { HUBTYPE_API_URL } from "../constants.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
/* eslint-disable @typescript-eslint/naming-convention */ function _define_property(obj, key, value) {
|
|
7
|
-
if (key in obj) {
|
|
8
|
-
Object.defineProperty(obj, key, {
|
|
9
|
-
value: value,
|
|
10
|
-
enumerable: true,
|
|
11
|
-
configurable: true,
|
|
12
|
-
writable: true
|
|
13
|
-
});
|
|
14
|
-
} else obj[key] = value;
|
|
15
|
-
return obj;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class HubtypeApiClient {
|
|
20
|
-
async retrieveSimilarChunks(query, sourceIds) {
|
|
21
|
-
const url = `${HUBTYPE_API_URL}/external/v1/ai/knowledge_base/similar_chunks/`;
|
|
22
|
-
const headers = {
|
|
23
|
-
'Content-Type': 'application/json',
|
|
24
|
-
Authorization: `Bearer ${this.authToken}`
|
|
25
|
-
};
|
|
26
|
-
const params = {
|
|
27
|
-
query,
|
|
28
|
-
source_ids: sourceIds,
|
|
29
|
-
num_chunks: 5
|
|
30
|
-
};
|
|
31
|
-
const response = await axios.post(url, params, {
|
|
32
|
-
headers
|
|
33
|
-
});
|
|
34
|
-
const chunks = response.data.chunks.map((chunk)=>({
|
|
35
|
-
id: chunk.id,
|
|
36
|
-
text: chunk.text
|
|
37
|
-
}));
|
|
38
|
-
return chunks;
|
|
39
|
-
}
|
|
40
|
-
async getLocalMessages(maxMemoryLength, previousHubtypeMessages, localStorageKey) {
|
|
41
|
-
const localBotonicState = typeof globalThis !== 'undefined' && globalThis.localStorage ? globalThis.localStorage.getItem(localStorageKey) : null;
|
|
42
|
-
const botonicState = JSON.parse(localBotonicState || '{}');
|
|
43
|
-
const messages = botonicState.messages;
|
|
44
|
-
const filteredMessages = messages.filter((message)=>message.data.text).map((message)=>({
|
|
45
|
-
role: message.sentBy === 'user' ? 'user' : 'assistant',
|
|
46
|
-
content: message.data.text
|
|
47
|
-
})).map((message)=>this.formatMessage(message));
|
|
48
|
-
const resultMessages = [
|
|
49
|
-
...filteredMessages,
|
|
50
|
-
...previousHubtypeMessages
|
|
51
|
-
];
|
|
52
|
-
return resultMessages.slice(-maxMemoryLength);
|
|
53
|
-
}
|
|
54
|
-
async getMessagesV2(botContext, options, previousHubtypeMessages) {
|
|
55
|
-
const url = `${HUBTYPE_API_URL}/external/v2/ai/agent/message_history/`;
|
|
56
|
-
const headers = {
|
|
57
|
-
'Content-Type': 'application/json',
|
|
58
|
-
Authorization: `Bearer ${this.authToken}`
|
|
59
|
-
};
|
|
60
|
-
const params = {
|
|
61
|
-
last_message_id: botContext.input.message_id,
|
|
62
|
-
max_messages: options.maxMessages,
|
|
63
|
-
include_tool_calls: options.includeToolCalls,
|
|
64
|
-
max_full_tool_results: options.maxFullToolResults,
|
|
65
|
-
debug_mode: options.debugMode
|
|
66
|
-
};
|
|
67
|
-
try {
|
|
68
|
-
const response = await axios.get(url, {
|
|
69
|
-
headers,
|
|
70
|
-
params
|
|
71
|
-
});
|
|
72
|
-
const { messages, conversation_id, truncated } = response.data;
|
|
73
|
-
const formattedMessages = [
|
|
74
|
-
...messages,
|
|
75
|
-
...previousHubtypeMessages
|
|
76
|
-
].map((message)=>this.formatMessageV2(message)).filter((message)=>message !== null);
|
|
77
|
-
return {
|
|
78
|
-
messages: formattedMessages,
|
|
79
|
-
conversationId: conversation_id,
|
|
80
|
-
truncated
|
|
81
|
-
};
|
|
82
|
-
} catch (error) {
|
|
83
|
-
console.error(error);
|
|
84
|
-
throw new Error('Failed to get messages from Hubtype V2 API');
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
formatMessageV2(message) {
|
|
88
|
-
switch(message.role){
|
|
89
|
-
case 'user':
|
|
90
|
-
return {
|
|
91
|
-
role: 'user',
|
|
92
|
-
content: message.content ?? ''
|
|
93
|
-
};
|
|
94
|
-
case 'assistant':
|
|
95
|
-
{
|
|
96
|
-
const assistantMessage = message;
|
|
97
|
-
// If assistant message has tool_calls, include them for context
|
|
98
|
-
// Using double assertion as the OpenAI API supports this format,
|
|
99
|
-
// but the agents SDK types are more restrictive
|
|
100
|
-
if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {
|
|
101
|
-
return {
|
|
102
|
-
role: 'assistant',
|
|
103
|
-
content: assistantMessage.content ?? '',
|
|
104
|
-
tool_calls: assistantMessage.tool_calls.map((tc)=>({
|
|
105
|
-
id: tc.id,
|
|
106
|
-
type: tc.type,
|
|
107
|
-
function: {
|
|
108
|
-
name: tc.function.name,
|
|
109
|
-
arguments: tc.function.arguments
|
|
110
|
-
}
|
|
111
|
-
}))
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
// Regular assistant message without tool_calls
|
|
115
|
-
return {
|
|
116
|
-
role: 'assistant',
|
|
117
|
-
content: [
|
|
118
|
-
{
|
|
119
|
-
type: 'output_text',
|
|
120
|
-
text: assistantMessage.content ?? ''
|
|
121
|
-
}
|
|
122
|
-
],
|
|
123
|
-
status: 'completed'
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
case 'tool':
|
|
127
|
-
{
|
|
128
|
-
// Tool messages provide context about previous tool executions
|
|
129
|
-
// Using double assertion as the OpenAI API supports this format,
|
|
130
|
-
// but the agents SDK types are more restrictive
|
|
131
|
-
const toolMessage = message;
|
|
132
|
-
return {
|
|
133
|
-
role: 'tool',
|
|
134
|
-
tool_call_id: toolMessage.tool_call_id,
|
|
135
|
-
content: toolMessage.content ?? ''
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
case 'system':
|
|
139
|
-
return {
|
|
140
|
-
role: 'system',
|
|
141
|
-
content: message.content ?? ''
|
|
142
|
-
};
|
|
143
|
-
default:
|
|
144
|
-
throw new Error(`Invalid message role: ${message.role}`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
async trackLlmRuns(botId, data) {
|
|
148
|
-
// Not stop the bot execution if the tracking fails, just log the error
|
|
149
|
-
try {
|
|
150
|
-
const url = `${HUBTYPE_API_URL}/external/v2/conversational_apps/${botId}/track_llm_runs/`;
|
|
151
|
-
const headers = {
|
|
152
|
-
'Content-Type': 'application/json',
|
|
153
|
-
Authorization: `Bearer ${this.authToken}`
|
|
154
|
-
};
|
|
155
|
-
await axios.post(url, data, {
|
|
156
|
-
headers
|
|
157
|
-
});
|
|
158
|
-
} catch (error) {
|
|
159
|
-
console.error('Failed to track LLM runs:', error);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
formatMessage(message) {
|
|
163
|
-
if (message.role === 'user') {
|
|
164
|
-
return {
|
|
165
|
-
content: message.content,
|
|
166
|
-
role: 'user'
|
|
167
|
-
};
|
|
168
|
-
} else if (message.role === 'assistant') {
|
|
169
|
-
return {
|
|
170
|
-
role: 'assistant',
|
|
171
|
-
content: [
|
|
172
|
-
{
|
|
173
|
-
type: 'output_text',
|
|
174
|
-
text: message.content
|
|
175
|
-
}
|
|
176
|
-
],
|
|
177
|
-
status: 'completed'
|
|
178
|
-
};
|
|
179
|
-
} else {
|
|
180
|
-
throw new Error('Invalid message role');
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
constructor(authToken){
|
|
184
|
-
_define_property(this, "authToken", void 0);
|
|
185
|
-
this.authToken = authToken;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
export { HubtypeApiClient };
|
|
190
|
-
|
|
191
|
-
//# sourceMappingURL=hubtype-api-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"services/hubtype-api-client.js","sources":["../../src/services/hubtype-api-client.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport type { BotContext, HubtypeAssistantMessage } from '@botonic/core'\nimport axios from 'axios'\n\nimport { HUBTYPE_API_URL } from '../constants'\nimport type { AgenticInputMessage, Chunk, MemoryOptions } from '../types'\nimport type {\n GetMessagesV2Result,\n HubtypeAssistantMessageV2,\n HubtypeMessage,\n HubtypeMessageV2,\n HubtypeToolMessageV2,\n MessageHistoryResponseV2,\n MessageHistoryV2Params,\n TrackLlmRunsData,\n} from './types'\n\nexport class HubtypeApiClient {\n private readonly authToken: string\n\n constructor(authToken: string) {\n this.authToken = authToken\n }\n\n async retrieveSimilarChunks(\n query: string,\n sourceIds: string[]\n ): Promise<Chunk[]> {\n const url = `${HUBTYPE_API_URL}/external/v1/ai/knowledge_base/similar_chunks/`\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.authToken}`,\n }\n const params = {\n query,\n source_ids: sourceIds,\n num_chunks: 5,\n }\n const response = await axios.post(url, params, { headers })\n const chunks = response.data.chunks.map((chunk: Chunk) => ({\n id: chunk.id,\n text: chunk.text,\n }))\n return chunks\n }\n\n async getLocalMessages(\n maxMemoryLength: number,\n previousHubtypeMessages: HubtypeAssistantMessage[],\n localStorageKey: string\n ): Promise<AgenticInputMessage[]> {\n const localBotonicState =\n typeof globalThis !== 'undefined' && globalThis.localStorage\n ? globalThis.localStorage.getItem(localStorageKey)\n : null\n const botonicState = JSON.parse(localBotonicState || '{}')\n const messages = botonicState.messages\n const filteredMessages = messages\n .filter(message => message.data.text)\n .map(message => ({\n role: message.sentBy === 'user' ? 'user' : 'assistant',\n content: message.data.text,\n }))\n .map(message => this.formatMessage(message))\n const resultMessages = [...filteredMessages, ...previousHubtypeMessages]\n\n return resultMessages.slice(-maxMemoryLength)\n }\n\n async getMessagesV2(\n botContext: BotContext,\n options: MemoryOptions,\n previousHubtypeMessages: HubtypeAssistantMessage[]\n ): Promise<GetMessagesV2Result> {\n const url = `${HUBTYPE_API_URL}/external/v2/ai/agent/message_history/`\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.authToken}`,\n }\n const params: MessageHistoryV2Params = {\n last_message_id: botContext.input.message_id,\n max_messages: options.maxMessages,\n include_tool_calls: options.includeToolCalls,\n max_full_tool_results: options.maxFullToolResults,\n debug_mode: options.debugMode,\n }\n\n try {\n const response = await axios.get<MessageHistoryResponseV2>(url, {\n headers,\n params,\n })\n const { messages, conversation_id, truncated } = response.data\n const formattedMessages = [...messages, ...previousHubtypeMessages]\n .map(message => this.formatMessageV2(message))\n .filter((message): message is AgenticInputMessage => message !== null)\n\n return {\n messages: formattedMessages,\n conversationId: conversation_id,\n truncated,\n }\n } catch (error) {\n console.error(error)\n throw new Error('Failed to get messages from Hubtype V2 API')\n }\n }\n\n private formatMessageV2(\n message: HubtypeMessageV2\n ): AgenticInputMessage | null {\n switch (message.role) {\n case 'user':\n return {\n role: 'user',\n content: message.content ?? '',\n }\n case 'assistant': {\n const assistantMessage = message as HubtypeAssistantMessageV2\n // If assistant message has tool_calls, include them for context\n // Using double assertion as the OpenAI API supports this format,\n // but the agents SDK types are more restrictive\n if (\n assistantMessage.tool_calls &&\n assistantMessage.tool_calls.length > 0\n ) {\n return {\n role: 'assistant',\n content: assistantMessage.content ?? '',\n tool_calls: assistantMessage.tool_calls.map(tc => ({\n id: tc.id,\n type: tc.type,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n })),\n } as unknown as AgenticInputMessage\n }\n // Regular assistant message without tool_calls\n return {\n role: 'assistant',\n content: [\n {\n type: 'output_text',\n text: assistantMessage.content ?? '',\n },\n ],\n status: 'completed',\n }\n }\n case 'tool': {\n // Tool messages provide context about previous tool executions\n // Using double assertion as the OpenAI API supports this format,\n // but the agents SDK types are more restrictive\n const toolMessage = message as HubtypeToolMessageV2\n return {\n role: 'tool',\n tool_call_id: toolMessage.tool_call_id,\n content: toolMessage.content ?? '',\n } as unknown as AgenticInputMessage\n }\n case 'system':\n return {\n role: 'system',\n content: message.content ?? '',\n }\n default:\n throw new Error(\n `Invalid message role: ${(message as HubtypeMessageV2).role}`\n )\n }\n }\n\n async trackLlmRuns(botId: string, data: TrackLlmRunsData): Promise<void> {\n // Not stop the bot execution if the tracking fails, just log the error\n try {\n const url = `${HUBTYPE_API_URL}/external/v2/conversational_apps/${botId}/track_llm_runs/`\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.authToken}`,\n }\n await axios.post(url, data, { headers })\n } catch (error) {\n console.error('Failed to track LLM runs:', error)\n }\n }\n\n private formatMessage(message: HubtypeMessage): AgenticInputMessage {\n if (message.role === 'user') {\n return {\n content: message.content,\n role: 'user',\n }\n } else if (message.role === 'assistant') {\n return {\n role: 'assistant',\n content: [\n {\n type: 'output_text',\n text: message.content,\n },\n ],\n status: 'completed',\n }\n } else {\n throw new Error('Invalid message role')\n }\n }\n}\n"],"names":["axios","HUBTYPE_API_URL","HubtypeApiClient","query","sourceIds","url","headers","params","response","chunks","chunk","maxMemoryLength","previousHubtypeMessages","localStorageKey","localBotonicState","globalThis","botonicState","JSON","messages","filteredMessages","message","resultMessages","botContext","options","conversation_id","truncated","formattedMessages","error","console","Error","assistantMessage","tc","toolMessage","botId","data","authToken"],"mappings":"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"}
|