@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 @@
|
|
|
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,7 +1,7 @@
|
|
|
1
1
|
import type { OutputMessage, ResolvedPlugins, ToolExecution } from '@botonic/core';
|
|
2
|
-
import type { DebugLogger } from '../debug-logger';
|
|
3
|
-
import type { LLMConfig } from '../llm-config';
|
|
4
|
-
import type { AgenticInputMessage, AIAgent, Context, ResultRawResponse, RunResult } from '../types';
|
|
2
|
+
import type { DebugLogger } from '../debug-logger.js';
|
|
3
|
+
import type { LLMConfig } from '../llm-config.js';
|
|
4
|
+
import type { AgenticInputMessage, AIAgent, Context, ResultRawResponse, RunResult } from '../types.js';
|
|
5
5
|
export interface RunnerResult {
|
|
6
6
|
finalOutput?: {
|
|
7
7
|
messages?: OutputMessage[];
|
|
@@ -1,37 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { InputGuardrailTripwireTriggered, RunContext, RunToolCallItem, RunToolCallOutputItem, Runner } from "@openai/agents";
|
|
2
|
+
import { LLM_PROVIDERS, isProd } from "../constants.js";
|
|
3
|
+
import { HubtypeApiClient } from "../services/hubtype-api-client.js";
|
|
4
|
+
import { TrackFeature, TrackProductName } from "../services/types.js";
|
|
5
|
+
import { RETRIEVE_KNOWLEDGE_TOOL_NAME } from "../tools/index.js";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
function _define_property(obj, key, value) {
|
|
13
|
+
if (key in obj) {
|
|
14
|
+
Object.defineProperty(obj, key, {
|
|
15
|
+
value: value,
|
|
16
|
+
enumerable: true,
|
|
17
|
+
configurable: true,
|
|
18
|
+
writable: true
|
|
19
|
+
});
|
|
20
|
+
} else obj[key] = value;
|
|
21
|
+
return obj;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
9
28
|
class BaseRunner {
|
|
10
|
-
constructor(agent, llmConfig, inferenceId, logger) {
|
|
11
|
-
this.agent = agent;
|
|
12
|
-
this.llmConfig = llmConfig;
|
|
13
|
-
this.inferenceId = inferenceId;
|
|
14
|
-
this.logger = logger;
|
|
15
|
-
}
|
|
16
29
|
async run(messages, context) {
|
|
17
30
|
const startTime = Date.now();
|
|
18
|
-
const runContext = new
|
|
19
|
-
const prompt =
|
|
31
|
+
const runContext = new RunContext(context);
|
|
32
|
+
const prompt = await this.agent.getSystemPrompt(runContext) ?? '';
|
|
20
33
|
this.logger.logRunnerStart(this.llmConfig.modelName, this.llmConfig.modelSettings, prompt);
|
|
21
34
|
try {
|
|
22
|
-
const runner = new
|
|
23
|
-
tracingDisabled: true
|
|
35
|
+
const runner = new Runner({
|
|
36
|
+
tracingDisabled: true
|
|
37
|
+
});
|
|
38
|
+
const result = await runner.run(this.agent, messages, {
|
|
39
|
+
context
|
|
24
40
|
});
|
|
25
|
-
const result = (await runner.run(this.agent, messages, {
|
|
26
|
-
context,
|
|
27
|
-
}));
|
|
28
41
|
const endTime = Date.now();
|
|
29
42
|
await this.sendLlmRunTracking(result, context, startTime, endTime);
|
|
30
43
|
const runResult = this.buildRunResult(result, context, messages.length);
|
|
31
44
|
this.logger.logRunResult(runResult, startTime);
|
|
32
45
|
return runResult;
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
46
|
+
} catch (error) {
|
|
35
47
|
const runResult = this.handleInputGuardrailTripwireTriggered(error, startTime);
|
|
36
48
|
if (runResult) {
|
|
37
49
|
return runResult;
|
|
@@ -42,15 +54,12 @@ class BaseRunner {
|
|
|
42
54
|
}
|
|
43
55
|
getToolsExecuted(result, context) {
|
|
44
56
|
const toolResultsByCallId = this.getToolResultsByCallId(result.newItems);
|
|
45
|
-
return
|
|
46
|
-
?.filter(item => item instanceof agents_1.RunToolCallItem)
|
|
47
|
-
.map((item) => this.getToolExecutionInfo(item, context, toolResultsByCallId))
|
|
48
|
-
.filter((toolExecution) => toolExecution.toolName !== '') || []);
|
|
57
|
+
return result.newItems?.filter((item)=>item instanceof RunToolCallItem).map((item)=>this.getToolExecutionInfo(item, context, toolResultsByCallId)).filter((toolExecution)=>toolExecution.toolName !== '') || [];
|
|
49
58
|
}
|
|
50
59
|
getToolResultsByCallId(newItems = []) {
|
|
51
60
|
const map = new Map();
|
|
52
|
-
for (const item of newItems)
|
|
53
|
-
if (!(item instanceof
|
|
61
|
+
for (const item of newItems){
|
|
62
|
+
if (!(item instanceof RunToolCallOutputItem)) {
|
|
54
63
|
continue;
|
|
55
64
|
}
|
|
56
65
|
const rawItem = item.rawItem;
|
|
@@ -70,32 +79,28 @@ class BaseRunner {
|
|
|
70
79
|
if (typeof output === 'string') {
|
|
71
80
|
return output;
|
|
72
81
|
}
|
|
73
|
-
return output?.type === 'text' && typeof output?.text === 'string'
|
|
74
|
-
? output.text
|
|
75
|
-
: undefined;
|
|
82
|
+
return output?.type === 'text' && typeof output?.text === 'string' ? output.text : undefined;
|
|
76
83
|
}
|
|
77
84
|
getToolExecutionInfo(item, context, toolResultsByCallId) {
|
|
78
85
|
if (item.rawItem.type !== 'function_call') {
|
|
79
86
|
return {
|
|
80
87
|
toolName: '',
|
|
81
|
-
toolArguments: {}
|
|
88
|
+
toolArguments: {}
|
|
82
89
|
};
|
|
83
90
|
}
|
|
84
91
|
const toolName = item.rawItem.name;
|
|
85
92
|
const toolArguments = this.getSafeToolArguments(item.rawItem.arguments);
|
|
86
|
-
const toolResults = item.rawItem.callId
|
|
87
|
-
? toolResultsByCallId.get(item.rawItem.callId)
|
|
88
|
-
: undefined;
|
|
93
|
+
const toolResults = item.rawItem.callId ? toolResultsByCallId.get(item.rawItem.callId) : undefined;
|
|
89
94
|
const toolExecution = {
|
|
90
95
|
toolName,
|
|
91
96
|
toolArguments,
|
|
92
|
-
toolResults
|
|
97
|
+
toolResults
|
|
93
98
|
};
|
|
94
|
-
if (toolName ===
|
|
99
|
+
if (toolName === RETRIEVE_KNOWLEDGE_TOOL_NAME) {
|
|
95
100
|
return {
|
|
96
101
|
...toolExecution,
|
|
97
102
|
knowledgebaseSourcesIds: context.knowledgeUsed.sourceIds,
|
|
98
|
-
knowledgebaseChunksIds: context.knowledgeUsed.chunksIds
|
|
103
|
+
knowledgebaseChunksIds: context.knowledgeUsed.chunksIds
|
|
99
104
|
};
|
|
100
105
|
}
|
|
101
106
|
return toolExecution;
|
|
@@ -103,36 +108,32 @@ class BaseRunner {
|
|
|
103
108
|
getSafeToolArguments(rawToolArguments) {
|
|
104
109
|
try {
|
|
105
110
|
return JSON.parse(rawToolArguments);
|
|
106
|
-
}
|
|
107
|
-
catch (_error) {
|
|
111
|
+
} catch (_error) {
|
|
108
112
|
return {};
|
|
109
113
|
}
|
|
110
114
|
}
|
|
111
115
|
buildRunResult(result, context, memoryLength) {
|
|
112
116
|
const outputMessages = result.finalOutput?.messages || [];
|
|
113
|
-
const hasExit = outputMessages.length === 0 ||
|
|
114
|
-
outputMessages.some(message => message.type === 'exit');
|
|
117
|
+
const hasExit = outputMessages.length === 0 || outputMessages.some((message)=>message.type === 'exit');
|
|
115
118
|
return {
|
|
116
119
|
startingAgentName: '',
|
|
117
120
|
lastAgentName: '',
|
|
118
121
|
availableSpecialists: [],
|
|
119
122
|
isTransferredToSpecialist: false,
|
|
120
|
-
messages: hasExit
|
|
121
|
-
? []
|
|
122
|
-
: outputMessages.filter(message => message.type !== 'exit'),
|
|
123
|
+
messages: hasExit ? [] : outputMessages.filter((message)=>message.type !== 'exit'),
|
|
123
124
|
toolsExecuted: this.getToolsExecuted(result, context),
|
|
124
125
|
exit: hasExit,
|
|
125
126
|
memoryLength,
|
|
126
127
|
error: false,
|
|
127
128
|
inputGuardrailsTriggered: [],
|
|
128
|
-
outputGuardrailsTriggered: []
|
|
129
|
+
outputGuardrailsTriggered: []
|
|
129
130
|
};
|
|
130
131
|
}
|
|
131
132
|
async sendLlmRunTracking(result, context, startTime, endTime) {
|
|
132
|
-
if (!
|
|
133
|
+
if (!isProd) {
|
|
133
134
|
return;
|
|
134
135
|
}
|
|
135
|
-
if (this.llmConfig.getProviderName() ===
|
|
136
|
+
if (this.llmConfig.getProviderName() === LLM_PROVIDERS.LITELLM) {
|
|
136
137
|
return;
|
|
137
138
|
}
|
|
138
139
|
const rawResponses = result.rawResponses ?? [];
|
|
@@ -144,28 +145,27 @@ class BaseRunner {
|
|
|
144
145
|
const totalDuration = endTime - startTime;
|
|
145
146
|
const durationPerCall = Math.round(totalDuration / rawResponses.length);
|
|
146
147
|
const temperature = this.llmConfig.modelSettings.temperature ?? 0;
|
|
147
|
-
const llmRuns = rawResponses.map(response
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const client = new hubtype_api_client_1.HubtypeApiClient(context.authToken);
|
|
148
|
+
const llmRuns = rawResponses.map((response)=>({
|
|
149
|
+
inference_id: this.inferenceId,
|
|
150
|
+
is_test: isTest,
|
|
151
|
+
product_name: TrackProductName.AI_AGENT,
|
|
152
|
+
deployment_name: this.llmConfig.modelName,
|
|
153
|
+
model_name: response.providerData?.model ?? this.llmConfig.modelName,
|
|
154
|
+
feature: TrackFeature.AI_AGENT_RUN,
|
|
155
|
+
api_version: this.llmConfig.getApiVersion(),
|
|
156
|
+
num_prompt_tokens: response.usage.inputTokens,
|
|
157
|
+
num_completion_tokens: response.usage.outputTokens,
|
|
158
|
+
duration_in_milliseconds: durationPerCall,
|
|
159
|
+
temperature,
|
|
160
|
+
error: null
|
|
161
|
+
}));
|
|
162
|
+
const client = new HubtypeApiClient(context.authToken);
|
|
163
163
|
await client.trackLlmRuns(botId, {
|
|
164
|
-
llm_runs: llmRuns
|
|
164
|
+
llm_runs: llmRuns
|
|
165
165
|
});
|
|
166
166
|
}
|
|
167
167
|
handleInputGuardrailTripwireTriggered(error, startTime) {
|
|
168
|
-
if (error instanceof
|
|
168
|
+
if (error instanceof InputGuardrailTripwireTriggered) {
|
|
169
169
|
const runResult = {
|
|
170
170
|
startingAgentName: '',
|
|
171
171
|
lastAgentName: '',
|
|
@@ -177,13 +177,25 @@ class BaseRunner {
|
|
|
177
177
|
exit: true,
|
|
178
178
|
error: false,
|
|
179
179
|
inputGuardrailsTriggered: error.result.output.outputInfo,
|
|
180
|
-
outputGuardrailsTriggered: []
|
|
180
|
+
outputGuardrailsTriggered: []
|
|
181
181
|
};
|
|
182
182
|
this.logger.logGuardrailTriggered();
|
|
183
183
|
this.logger.logRunResult(runResult, startTime);
|
|
184
184
|
return runResult;
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
|
+
constructor(agent, llmConfig, inferenceId, logger){
|
|
188
|
+
_define_property(this, "agent", void 0);
|
|
189
|
+
_define_property(this, "llmConfig", void 0);
|
|
190
|
+
_define_property(this, "inferenceId", void 0);
|
|
191
|
+
_define_property(this, "logger", void 0);
|
|
192
|
+
this.agent = agent;
|
|
193
|
+
this.llmConfig = llmConfig;
|
|
194
|
+
this.inferenceId = inferenceId;
|
|
195
|
+
this.logger = logger;
|
|
196
|
+
}
|
|
187
197
|
}
|
|
188
|
-
|
|
198
|
+
|
|
199
|
+
export { BaseRunner };
|
|
200
|
+
|
|
189
201
|
//# sourceMappingURL=base-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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,6 +1,6 @@
|
|
|
1
1
|
import type { ResolvedPlugins } from '@botonic/core';
|
|
2
|
-
import type { Context, RunResult } from '../types';
|
|
3
|
-
import { BaseRunner, type RunnerResult } from './base-runner';
|
|
2
|
+
import type { Context, RunResult } from '../types.js';
|
|
3
|
+
import { BaseRunner, type RunnerResult } from './base-runner.js';
|
|
4
4
|
export declare class RouterRunner<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = unknown> extends BaseRunner<TPlugins, TExtraData> {
|
|
5
5
|
protected buildRunResult(result: RunnerResult, context: Context<TPlugins, TExtraData>, memoryLength: number): RunResult;
|
|
6
6
|
protected handleInputGuardrailTripwireTriggered(error: unknown, startTime: number): RunResult | undefined;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Handoff } from "@openai/agents";
|
|
2
|
+
import { BaseRunner } from "./base-runner.js";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RouterRunner extends BaseRunner {
|
|
7
9
|
buildRunResult(result, context, memoryLength) {
|
|
8
10
|
const base = super.buildRunResult(result, context, memoryLength);
|
|
9
11
|
const availableSpecialists = this.getAvailableSpecialists();
|
|
@@ -14,7 +16,7 @@ class RouterRunner extends base_runner_1.BaseRunner {
|
|
|
14
16
|
startingAgentName,
|
|
15
17
|
lastAgentName,
|
|
16
18
|
availableSpecialists,
|
|
17
|
-
isTransferredToSpecialist: startingAgentName !== lastAgentName
|
|
19
|
+
isTransferredToSpecialist: startingAgentName !== lastAgentName
|
|
18
20
|
};
|
|
19
21
|
}
|
|
20
22
|
handleInputGuardrailTripwireTriggered(error, startTime) {
|
|
@@ -30,15 +32,18 @@ class RouterRunner extends base_runner_1.BaseRunner {
|
|
|
30
32
|
return undefined;
|
|
31
33
|
}
|
|
32
34
|
getAvailableSpecialists() {
|
|
33
|
-
return (this.agent.handoffs ?? []).map((entry)
|
|
34
|
-
const isHandoff = entry instanceof
|
|
35
|
+
return (this.agent.handoffs ?? []).map((entry)=>{
|
|
36
|
+
const isHandoff = entry instanceof Handoff;
|
|
35
37
|
const agent = isHandoff ? entry.agent : entry;
|
|
36
|
-
const description = isHandoff
|
|
37
|
-
|
|
38
|
-
: agent.
|
|
39
|
-
|
|
38
|
+
const description = isHandoff ? entry.toolDescription : agent.handoffDescription;
|
|
39
|
+
return {
|
|
40
|
+
name: agent.name,
|
|
41
|
+
description
|
|
42
|
+
};
|
|
40
43
|
});
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
|
-
|
|
46
|
+
|
|
47
|
+
export { RouterRunner };
|
|
48
|
+
|
|
44
49
|
//# sourceMappingURL=router-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,4 +1,4 @@
|
|
|
1
1
|
import type { ResolvedPlugins } from '@botonic/core';
|
|
2
|
-
import { BaseRunner } from './base-runner';
|
|
2
|
+
import { BaseRunner } from './base-runner.js';
|
|
3
3
|
export declare class SpecialistRunner<TPlugins extends ResolvedPlugins = ResolvedPlugins, TExtraData = unknown> extends BaseRunner<TPlugins, TExtraData> {
|
|
4
4
|
}
|
|
@@ -0,0 +1 @@
|
|
|
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,6 +1,6 @@
|
|
|
1
1
|
import type { BotContext, HubtypeAssistantMessage } from '@botonic/core';
|
|
2
|
-
import type { AgenticInputMessage, Chunk, MemoryOptions } from '../types';
|
|
3
|
-
import type { GetMessagesV2Result, TrackLlmRunsData } from './types';
|
|
2
|
+
import type { AgenticInputMessage, Chunk, MemoryOptions } from '../types.js';
|
|
3
|
+
import type { GetMessagesV2Result, TrackLlmRunsData } from './types.js';
|
|
4
4
|
export declare class HubtypeApiClient {
|
|
5
5
|
private readonly authToken;
|
|
6
6
|
constructor(authToken: string);
|
|
@@ -0,0 +1,191 @@
|
|
|
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
|