@botpress/cognitive 0.1.7 → 0.1.9

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.
@@ -1,28 +1,15 @@
1
-
2
- > @botpress/cognitive@0.1.7 build /home/runner/work/botpress/botpress/packages/cognitive
3
- > pnpm build:type && pnpm build:neutral && size-limit
4
-
5
-
6
- > @botpress/cognitive@0.1.7 build:type /home/runner/work/botpress/botpress/packages/cognitive
7
- > tsup --tsconfig tsconfig.build.json ./src/index.ts --dts-resolve --dts-only --clean
8
-
9
- CLI Building entry: ./src/index.ts
10
- CLI Using tsconfig: tsconfig.build.json
11
- CLI tsup v8.0.2
12
- DTS Build start
13
- DTS ⚡️ Build success in 18029ms
14
- DTS dist/index.d.ts 495.17 KB
15
-
16
- > @botpress/cognitive@0.1.7 build:neutral /home/runner/work/botpress/botpress/packages/cognitive
17
- > ts-node -T ./build.ts --neutral
18
-
19
- Done
20
-
21
- dist/index.cjs
22
- Size limit: 50 kB
23
- Size: 6.77 kB brotlied
24
-
25
- dist/index.mjs
26
- Size limit: 50 kB
27
- Size: 6.65 kB brotlied
28
-
1
+
2
+ 
3
+ > @botpress/cognitive@0.1.9 build /Users/sly/botpress/packages/cognitive
4
+ > pnpm build:type && pnpm build:neutral && size-limit
5
+
6
+
7
+ > @botpress/cognitive@0.1.9 build:type /Users/sly/botpress/packages/cognitive
8
+ > tsup --tsconfig tsconfig.build.json ./src/index.ts --dts-resolve --dts-only --clean
9
+
10
+ CLI Building entry: ./src/index.ts
11
+ CLI Using tsconfig: tsconfig.build.json
12
+ CLI tsup v8.0.2
13
+ DTS Build start
14
+  ELIFECYCLE  Command failed.
15
+  ELIFECYCLE  Command failed.
@@ -0,0 +1,5 @@
1
+
2
+ 
3
+ > @botpress/cognitive@0.1.1 generate /Users/sly/botpress/packages/cognitive
4
+ > ts-node -T ./types.ts ./src/gen
5
+
@@ -0,0 +1,14 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+ import * as input from "./input";
5
+ export * as input from "./input";
6
+ import * as output from "./output";
7
+ export * as output from "./output";
8
+
9
+ export const generateContent = {
10
+ "input": input.input,
11
+ "output": output.output,
12
+ "billable": true,
13
+ "cacheable": true,
14
+ }
@@ -0,0 +1,133 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ import { z } from "@botpress/sdk";
6
+ export const input = {
7
+ schema: z.object({
8
+ model: /** Model to use for content generation */ z.optional(
9
+ /** Model to use for content generation */ z.ref("modelRef"),
10
+ ),
11
+ reasoningEffort:
12
+ /** Reasoning effort level to use for models that support reasoning */ z.optional(
13
+ /** Reasoning effort level to use for models that support reasoning */ z.enum(
14
+ ["low", "medium", "high"],
15
+ ),
16
+ ),
17
+ systemPrompt: /** Optional system prompt to guide the model */ z.optional(
18
+ /** Optional system prompt to guide the model */ z.string(),
19
+ ),
20
+ messages: z.array(
21
+ z.object({
22
+ role: z.enum(["user", "assistant"]),
23
+ type: z
24
+ .enum(["text", "tool_calls", "tool_result", "multipart"])
25
+ .default("text"),
26
+ toolCalls: /** Required if `type` is "tool_calls" */ z.optional(
27
+ z.array(
28
+ z.object({
29
+ id: z.string(),
30
+ type: z.literal("function"),
31
+ function: z.object({
32
+ name: z.string(),
33
+ arguments:
34
+ /** Some LLMs may generate invalid JSON for a tool call, so this will be `null` when it happens. */ z.union(
35
+ [z.record(z.string(), z.any()), z.null()],
36
+ ),
37
+ }),
38
+ }),
39
+ ),
40
+ ),
41
+ toolResultCallId: /** Required if `type` is "tool_result" */ z.optional(
42
+ /** Required if `type` is "tool_result" */ z.string(),
43
+ ),
44
+ content:
45
+ /** Required unless `type` is "tool_call". If `type` is "multipart", this field must be an array of content objects. If `type` is "tool_result" then this field should be the result of the tool call (a plain string or a JSON-encoded array or object). If `type` is "tool_call" then the `toolCalls` field should be used instead. */ z.union(
46
+ [
47
+ z.union([
48
+ z.string(),
49
+ z.array(
50
+ z.object({
51
+ type: z.enum(["text", "image"]),
52
+ mimeType:
53
+ /** Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL. */ z.optional(
54
+ /** Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL. */ z.string(),
55
+ ),
56
+ text: /** Required if part type is "text" */ z.optional(
57
+ /** Required if part type is "text" */ z.string(),
58
+ ),
59
+ url: /** Required if part type is "image" */ z.optional(
60
+ /** Required if part type is "image" */ z.string(),
61
+ ),
62
+ }),
63
+ ),
64
+ ]),
65
+ z.null(),
66
+ ],
67
+ ),
68
+ }),
69
+ ),
70
+ responseFormat:
71
+ /** Response format expected from the model. If "json_object" is chosen, you must instruct the model to generate JSON either via the system prompt or a user message. */ z.optional(
72
+ /** Response format expected from the model. If "json_object" is chosen, you must instruct the model to generate JSON either via the system prompt or a user message. */ z.enum(
73
+ ["text", "json_object"],
74
+ ),
75
+ ),
76
+ maxTokens:
77
+ /** Maximum number of tokens allowed in the generated response */ z.optional(
78
+ /** Maximum number of tokens allowed in the generated response */ z.number(),
79
+ ),
80
+ temperature:
81
+ /** Sampling temperature for the model. Higher values result in more random outputs. */ /** Sampling temperature for the model. Higher values result in more random outputs. */ z
82
+ .number()
83
+ .default(1),
84
+ topP: /** Top-p sampling parameter. Limits sampling to the smallest set of tokens with a cumulative probability above the threshold. */ /** Top-p sampling parameter. Limits sampling to the smallest set of tokens with a cumulative probability above the threshold. */ z
85
+ .number()
86
+ .default(1),
87
+ stopSequences:
88
+ /** Sequences where the model should stop generating further tokens. */ z.optional(
89
+ z.array(z.string()),
90
+ ),
91
+ tools: z.optional(
92
+ z.array(
93
+ z.object({
94
+ type: z.literal("function"),
95
+ function: z.object({
96
+ name: /** Function name */ z.string(),
97
+ description: z.optional(z.string()),
98
+ argumentsSchema:
99
+ /** JSON schema of the function arguments */ z.optional(
100
+ /** JSON schema of the function arguments */ z.object({}),
101
+ ),
102
+ }),
103
+ }),
104
+ ),
105
+ ),
106
+ toolChoice: z.optional(
107
+ z.object({
108
+ type: z.optional(z.enum(["auto", "specific", "any", "none", ""])),
109
+ functionName: /** Required if `type` is "specific" */ z.optional(
110
+ /** Required if `type` is "specific" */ z.string(),
111
+ ),
112
+ }),
113
+ ),
114
+ userId: z.optional(z.string()),
115
+ debug:
116
+ /** Set to `true` to output debug information to the bot logs */ z.optional(
117
+ /** Set to `true` to output debug information to the bot logs */ z.boolean(),
118
+ ),
119
+ meta: z.optional(
120
+ z.object({
121
+ promptSource:
122
+ /** Source of the prompt, e.g. agent/:id/:version cards/ai-generate, cards/ai-task, nodes/autonomous, etc. */ z.optional(
123
+ /** Source of the prompt, e.g. agent/:id/:version cards/ai-generate, cards/ai-task, nodes/autonomous, etc. */ z.string(),
124
+ ),
125
+ promptCategory: z.optional(z.string()),
126
+ integrationName:
127
+ /** Name of the integration that originally received the message that initiated this action */ z.optional(
128
+ /** Name of the integration that originally received the message that initiated this action */ z.string(),
129
+ ),
130
+ }),
131
+ ),
132
+ }),
133
+ };
@@ -0,0 +1,81 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ import { z } from "@botpress/sdk";
6
+ export const output = {
7
+ schema: z.object({
8
+ id: /** Response ID from LLM provider */ z.string(),
9
+ provider: /** LLM provider name */ z.string(),
10
+ model: /** Model name */ z.string(),
11
+ choices: z.array(
12
+ z.object({
13
+ type: z
14
+ .enum(["text", "tool_calls", "tool_result", "multipart"])
15
+ .default("text"),
16
+ toolCalls: /** Required if `type` is "tool_calls" */ z.optional(
17
+ z.array(
18
+ z.object({
19
+ id: z.string(),
20
+ type: z.literal("function"),
21
+ function: z.object({
22
+ name: z.string(),
23
+ arguments:
24
+ /** Some LLMs may generate invalid JSON for a tool call, so this will be `null` when it happens. */ z.union(
25
+ [z.record(z.string(), z.any()), z.null()],
26
+ ),
27
+ }),
28
+ }),
29
+ ),
30
+ ),
31
+ toolResultCallId: /** Required if `type` is "tool_result" */ z.optional(
32
+ /** Required if `type` is "tool_result" */ z.string(),
33
+ ),
34
+ content:
35
+ /** Required unless `type` is "tool_call". If `type` is "multipart", this field must be an array of content objects. If `type` is "tool_result" then this field should be the result of the tool call (a plain string or a JSON-encoded array or object). If `type` is "tool_call" then the `toolCalls` field should be used instead. */ z.union(
36
+ [
37
+ z.union([
38
+ z.string(),
39
+ z.array(
40
+ z.object({
41
+ type: z.enum(["text", "image"]),
42
+ mimeType:
43
+ /** Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL. */ z.optional(
44
+ /** Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL. */ z.string(),
45
+ ),
46
+ text: /** Required if part type is "text" */ z.optional(
47
+ /** Required if part type is "text" */ z.string(),
48
+ ),
49
+ url: /** Required if part type is "image" */ z.optional(
50
+ /** Required if part type is "image" */ z.string(),
51
+ ),
52
+ }),
53
+ ),
54
+ ]),
55
+ z.null(),
56
+ ],
57
+ ),
58
+ role: z.literal("assistant"),
59
+ index: z.number(),
60
+ stopReason: z.enum([
61
+ "stop",
62
+ "max_tokens",
63
+ "tool_calls",
64
+ "content_filter",
65
+ "other",
66
+ ]),
67
+ }),
68
+ ),
69
+ usage: z.object({
70
+ inputTokens: /** Number of input tokens used by the model */ z.number(),
71
+ inputCost:
72
+ /** Cost of the input tokens received by the model, in U.S. dollars */ z.number(),
73
+ outputTokens: /** Number of output tokens used by the model */ z.number(),
74
+ outputCost:
75
+ /** Cost of the output tokens generated by the model, in U.S. dollars */ z.number(),
76
+ }),
77
+ botpress: z.object({
78
+ cost: /** Total cost of the content generation, in U.S. dollars */ z.number(),
79
+ }),
80
+ }),
81
+ };
@@ -0,0 +1,12 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+ import * as listLanguageModels from "./listLanguageModels/index";
5
+ export * as listLanguageModels from "./listLanguageModels/index";
6
+ import * as generateContent from "./generateContent/index";
7
+ export * as generateContent from "./generateContent/index";
8
+
9
+ export const actions = {
10
+ "listLanguageModels": listLanguageModels.listLanguageModels,
11
+ "generateContent": generateContent.generateContent,
12
+ }
@@ -0,0 +1,14 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+ import * as input from "./input";
5
+ export * as input from "./input";
6
+ import * as output from "./output";
7
+ export * as output from "./output";
8
+
9
+ export const listLanguageModels = {
10
+ "input": input.input,
11
+ "output": output.output,
12
+ "billable": false,
13
+ "cacheable": false,
14
+ }
@@ -0,0 +1,8 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ import { z } from "@botpress/sdk";
6
+ export const input = {
7
+ schema: z.object({}),
8
+ };
@@ -0,0 +1,45 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ import { z } from "@botpress/sdk";
6
+ export const output = {
7
+ schema: z.object({
8
+ models: z.array(
9
+ z.intersection(
10
+ z.object({
11
+ id: z.string(),
12
+ name: z.string(),
13
+ description: z.string(),
14
+ tags: z.array(
15
+ z.enum([
16
+ "recommended",
17
+ "deprecated",
18
+ "general-purpose",
19
+ "low-cost",
20
+ "vision",
21
+ "coding",
22
+ "agents",
23
+ "function-calling",
24
+ "roleplay",
25
+ "storytelling",
26
+ "reasoning",
27
+ "preview",
28
+ ]),
29
+ ),
30
+ input: z.object({
31
+ maxTokens: z.number(),
32
+ costPer1MTokens:
33
+ /** Cost per 1 million tokens, in U.S. dollars */ z.number(),
34
+ }),
35
+ output: z.object({
36
+ maxTokens: z.number(),
37
+ costPer1MTokens:
38
+ /** Cost per 1 million tokens, in U.S. dollars */ z.number(),
39
+ }),
40
+ }),
41
+ z.ref("modelRef"),
42
+ ),
43
+ ),
44
+ }),
45
+ };
@@ -0,0 +1,6 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ export const channels = {
6
+ }
@@ -0,0 +1,9 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+ import * as modelRef from "./modelRef";
5
+ export * as modelRef from "./modelRef";
6
+
7
+ export const entities = {
8
+ "modelRef": modelRef.modelRef,
9
+ }
@@ -0,0 +1,10 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ import { z } from "@botpress/sdk";
6
+ export const modelRef = {
7
+ schema: z.object({
8
+ id: z.string(),
9
+ }),
10
+ };
@@ -0,0 +1,6 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ export const events = {
6
+ }
@@ -0,0 +1,23 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ import * as sdk from "@botpress/sdk"
6
+
7
+ import * as actions from "./actions/index"
8
+ import * as channels from "./channels/index"
9
+ import * as events from "./events/index"
10
+ import * as entities from "./entities/index"
11
+ export * as actions from "./actions/index"
12
+ export * as channels from "./channels/index"
13
+ export * as events from "./events/index"
14
+ export * as entities from "./entities/index"
15
+
16
+ export default {
17
+ name: "llm",
18
+ version: "8.0.0",
19
+ actions: actions.actions,
20
+ channels: channels.channels,
21
+ events: events.events,
22
+ entities: entities.entities,
23
+ } satisfies sdk.InterfacePackage["definition"]
@@ -0,0 +1,16 @@
1
+ /* eslint-disable */
2
+ /* tslint:disable */
3
+ // This file is generated. Do not edit it manually.
4
+
5
+ import * as sdk from "@botpress/sdk"
6
+
7
+ import definition from "./definition"
8
+
9
+ export default {
10
+ type: "interface",
11
+ id: "b759e577-2ce7-451a-abff-68085b224985",
12
+ uri: undefined,
13
+ name: "llm",
14
+ version: "8.0.0",
15
+ definition,
16
+ } satisfies sdk.InterfacePackage
package/build.ts CHANGED
@@ -1,4 +1,9 @@
1
+ import { llm } from '@botpress/common'
2
+ import { z } from '@botpress/sdk'
1
3
  import esbuild from 'esbuild'
4
+ import { writeFileSync } from 'fs'
5
+ import { format, resolveConfig } from 'prettier'
6
+
2
7
  import { devDependencies } from './package.json'
3
8
 
4
9
  const common: esbuild.BuildOptions = {
@@ -7,6 +12,20 @@ const common: esbuild.BuildOptions = {
7
12
  sourcemap: true,
8
13
  }
9
14
 
15
+ async function generateTypes() {
16
+ const code = `export type GenerateContentInput = ${llm.schemas.GenerateContentInputSchema(z.any()).toTypescript()};
17
+
18
+ export type GenerateContentOutput = ${llm.schemas.GenerateContentOutputSchema.toTypescript()};
19
+
20
+ export type Model = ${llm.schemas.ModelSchema.toTypescript()};
21
+ `.trim()
22
+
23
+ const filePath = './src/schemas.gen.ts'
24
+ const prettierConfig = await resolveConfig(filePath)
25
+ const formattedCode = await format(code, { ...prettierConfig!, filepath: filePath })
26
+ writeFileSync(filePath, formattedCode)
27
+ }
28
+
10
29
  const external = Object.keys(devDependencies)
11
30
 
12
31
  const buildCjs = () =>
@@ -34,6 +53,8 @@ const buildEsm = () =>
34
53
  })
35
54
 
36
55
  const main = async (argv: string[]) => {
56
+ await generateTypes()
57
+
37
58
  if (argv.includes('--neutral')) {
38
59
  await buildCjs()
39
60
  await buildEsm()
package/dist/index.cjs CHANGED
@@ -672,6 +672,7 @@ var getActionFromError = (error) => {
672
672
  return "abort";
673
673
  };
674
674
  var isNotFoundError = (error) => isBotpressError(error) && error.type === "ResourceNotFound";
675
+ var isForbiddenOrUnauthorizedError = (error) => isBotpressError(error) && (error.type === "Forbidden" || error.type === "Unauthorized");
675
676
  var isBotpressError = (error) => typeof error === "object" && error !== null && "isApiError" in error && "code" in error && "type" in error && "id" in error;
676
677
 
677
678
  // src/interceptors.ts
@@ -723,6 +724,7 @@ var InterceptorManager = class {
723
724
  // src/models.ts
724
725
  var DOWNTIME_THRESHOLD_MINUTES = 5;
725
726
  var PREFERENCES_FILE_SUFFIX = "models.config.json";
727
+ var DEFAULT_INTEGRATIONS = ["google-ai", "anthropic", "openai", "cerebras", "fireworks-ai", "groq"];
726
728
  var VendorPreferences = ["google-ai", "anthropic", "openai"];
727
729
  var BestModelPreferences = ["4o", "3-5-sonnet", "gemini-1.5-pro"];
728
730
  var FastModelPreferences = ["gemini-1.5-flash", "4o-mini", "flash", "haiku"];
@@ -790,14 +792,25 @@ var RemoteModelProvider = class extends ModelProvider {
790
792
  super();
791
793
  this._client = getExtendedClient(client);
792
794
  }
795
+ async _fetchInstalledIntegrationNames() {
796
+ try {
797
+ const { bot } = await this._client.getBot({ id: this._client.botId });
798
+ const integrations = Object.values(bot.integrations).filter((x) => x.status === "registered");
799
+ return integrations.map((x) => x.name);
800
+ } catch (err) {
801
+ if (isForbiddenOrUnauthorizedError(err)) {
802
+ return DEFAULT_INTEGRATIONS;
803
+ }
804
+ throw err;
805
+ }
806
+ }
793
807
  async fetchInstalledModels() {
794
- const { bot } = await this._client.getBot({ id: this._client.botId });
808
+ const integrationNames = await this._fetchInstalledIntegrationNames();
795
809
  const models = [];
796
- const registered = Object.values(bot.integrations).filter((x) => x.status === "registered");
797
810
  await Promise.allSettled(
798
- registered.map(async (integration) => {
811
+ integrationNames.map(async (integration) => {
799
812
  const { output } = await this._client.callAction({
800
- type: `${integration.name}:listLanguageModels`,
813
+ type: `${integration}:listLanguageModels`,
801
814
  input: {}
802
815
  });
803
816
  if (!output?.models?.length) {
@@ -806,8 +819,8 @@ var RemoteModelProvider = class extends ModelProvider {
806
819
  for (const model of output.models) {
807
820
  if (model.name && model.id && model.input && model.tags) {
808
821
  models.push({
809
- ref: `${integration.name}:${model.id}`,
810
- integration: integration.name,
822
+ ref: `${integration}:${model.id}`,
823
+ integration,
811
824
  id: model.id,
812
825
  name: model.name,
813
826
  description: model.description,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/options.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/jitter/full/full.jitter.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/jitter/no/no.jitter.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/jitter/jitter.factory.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/delay.base.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/skip-first/skip-first.delay.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/always/always.delay.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/delay.factory.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/backoff.ts", "../src/index.ts", "../src/client.ts", "../../../node_modules/.pnpm/nanoevents@9.1.0/node_modules/nanoevents/index.js", "../src/bp-client.ts", "../src/errors.ts", "../src/interceptors.ts", "../src/models.ts"],
4
- "sourcesContent": [null, null, null, null, null, null, null, null, null, "export { Events, BotpressClientLike } from './types'\nexport * from './client'\nexport { ModelPreferences, ModelProvider, RemoteModelProvider, Model } from './models'\nexport { type GenerateContentInput, type GenerateContentOutput } from './llm'\n", "import { backOff } from 'exponential-backoff'\nimport { createNanoEvents, Unsubscribe } from 'nanoevents'\n\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { getActionFromError } from './errors'\nimport { InterceptorManager } from './interceptors'\nimport { GenerateContentOutput } from './llm'\nimport {\n DOWNTIME_THRESHOLD_MINUTES,\n getBestModels,\n getFastModels,\n Model,\n ModelPreferences,\n ModelProvider,\n ModelRef,\n pickModel,\n RemoteModelProvider,\n} from './models'\nimport { CognitiveProps, Events, InputProps, Request, Response } from './types'\n\nexport class Cognitive {\n public ['$$IS_COGNITIVE'] = true\n\n public static isCognitiveClient(obj: any): obj is Cognitive {\n return obj?.$$IS_COGNITIVE === true\n }\n\n public interceptors = {\n request: new InterceptorManager<Request>(),\n response: new InterceptorManager<Response>(),\n }\n\n private _client: ExtendedClient\n private _preferences: ModelPreferences | null = null\n private _provider: ModelProvider\n private _events = createNanoEvents<Events>()\n private _downtimes: ModelPreferences['downtimes'] = []\n private _models: Model[] = []\n\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n }\n\n public get client(): ExtendedClient {\n return this._client\n }\n\n public on<K extends keyof Events>(this: this, event: K, cb: Events[K]): Unsubscribe {\n return this._events.on(event, cb)\n }\n\n public async fetchInstalledModels(): Promise<Model[]> {\n if (!this._models.length) {\n this._models = await this._provider.fetchInstalledModels()\n }\n\n return this._models\n }\n\n public async fetchPreferences(): Promise<ModelPreferences> {\n if (this._preferences) {\n return this._preferences\n }\n\n this._preferences = await this._provider.fetchModelPreferences()\n\n if (this._preferences) {\n return this._preferences\n }\n\n const models = await this.fetchInstalledModels()\n\n this._preferences = {\n best: getBestModels(models).map((m) => m.ref),\n fast: getFastModels(models).map((m) => m.ref),\n downtimes: [],\n }\n\n await this._provider.saveModelPreferences(this._preferences)\n\n return this._preferences\n }\n\n public async setPreferences(preferences: ModelPreferences, save: boolean = false): Promise<void> {\n this._preferences = preferences\n\n if (save) {\n await this._provider.saveModelPreferences(preferences)\n }\n }\n\n private _cleanupOldDowntimes(): void {\n const now = Date.now()\n const thresholdMs = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n this._preferences!.downtimes = this._preferences!.downtimes.filter((downtime) => {\n const downtimeStart = new Date(downtime.startedAt).getTime()\n return now - downtimeStart <= thresholdMs\n })\n }\n\n private async _selectModel(ref: string): Promise<{ integration: string; model: string }> {\n const parseRef = (ref: string) => {\n const parts = ref.split(':')\n return { integration: parts[0]!, model: parts.slice(1).join(':') }\n }\n\n const preferences = await this.fetchPreferences()\n\n preferences.best ??= []\n preferences.fast ??= []\n preferences.downtimes ??= []\n\n const downtimes = [...preferences.downtimes, ...(this._downtimes ?? [])]\n\n if (ref === 'best') {\n return parseRef(pickModel(preferences.best, downtimes))\n }\n\n if (ref === 'fast') {\n return parseRef(pickModel(preferences.fast, downtimes))\n }\n\n return parseRef(pickModel([ref as ModelRef, ...preferences.best, ...preferences.fast], downtimes))\n }\n\n public async getModelDetails(model: string) {\n await this.fetchInstalledModels()\n const { integration, model: modelName } = await this._selectModel(model)\n const def = this._models.find((m) => m.integration === integration && (m.name === modelName || m.id === modelName))\n if (!def) {\n console.info('Models:', this._models)\n throw new Error(`Model ${modelName} not found`)\n }\n\n return def\n }\n\n public async generateContent(input: InputProps): Promise<Response> {\n const start = Date.now()\n\n const signal = input.signal ?? AbortSignal.timeout(30_000)\n\n const client = this._client.abortable(signal)\n\n let props: Request = { input }\n let integration: string\n let model: string\n\n const { output, meta } = await backOff<{\n output: GenerateContentOutput\n meta: any\n }>(\n async () => {\n const selection = await this._selectModel(input.model ?? 'best')\n\n integration = selection.integration\n model = selection.model\n\n props = await this.interceptors.request.run({ input }, signal)\n\n return client.callAction({\n type: `${integration}:generateContent`,\n input: {\n ...props.input,\n model: { id: model },\n },\n }) as Promise<{ output: GenerateContentOutput; meta: any }>\n },\n {\n retry: async (err, _attempt) => {\n if (signal?.aborted) {\n // We don't want to retry if the request was aborted\n this._events.emit('aborted', props, err)\n return false\n }\n\n if (_attempt > 3) {\n // We don't want to retry more than 3 times\n this._events.emit('error', props, err)\n return false\n }\n\n const action = getActionFromError(err)\n\n if (action === 'abort') {\n this._events.emit('error', props, err)\n return false\n }\n\n if (action === 'fallback') {\n // We don't want to retry if the request was already retried with a fallback model\n this._downtimes.push({\n ref: `${integration!}:${model!}`,\n startedAt: new Date().toISOString(),\n reason: 'Model is down',\n })\n\n this._cleanupOldDowntimes()\n\n await this._provider.saveModelPreferences({\n ...(this._preferences ?? { best: [], downtimes: [], fast: [] }),\n downtimes: [...(this._preferences!.downtimes ?? []), ...(this._downtimes ?? [])],\n })\n\n this._events.emit('fallback', props, err)\n return true\n }\n\n this._events.emit('retry', props, err)\n return true\n },\n }\n )\n\n const response = {\n output,\n meta: {\n cached: meta.cached ?? false,\n model: { integration: integration!, model: model! },\n latency: Date.now() - start,\n cost: { input: output.usage.inputCost, output: output.usage.outputCost },\n tokens: { input: output.usage.inputTokens, output: output.usage.outputTokens },\n },\n } satisfies Response\n\n this._events.emit('response', props, response)\n\n return this.interceptors.response.run(response, signal)\n }\n}\n", "export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let callbacks = this.events[event] || [],\n i = 0,\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n", "import { type Client } from '@botpress/client'\nimport { type AxiosInstance } from 'axios'\nimport { BotpressClientLike } from './types'\n\n/** @internal */\nexport type ExtendedClient = Client & {\n botId: string\n axios: AxiosInstance\n clone: () => ExtendedClient\n abortable: (signal: AbortSignal) => ExtendedClient\n}\n\nexport const getExtendedClient = (client: BotpressClientLike): ExtendedClient => {\n if (\n typeof client.constructor !== 'function' ||\n typeof client.callAction !== 'function' ||\n !client.config ||\n typeof client.config !== 'object' ||\n !client.config.headers\n ) {\n throw new Error('Client must be a valid instance of a Botpress client (@botpress/client)')\n }\n\n const botId = client.config.headers['x-bot-id'] as string\n\n if (!botId?.length) {\n throw new Error('Client must be instanciated with Bot ID')\n }\n\n const clone = () => {\n const c = client as any\n if (c.clone && typeof c.clone === 'function') {\n return getExtendedClient(c.clone())\n }\n return getExtendedClient(new c.constructor(c.config))\n }\n\n return {\n ...client,\n botId,\n axios: (client as any).axiosInstance as AxiosInstance,\n clone,\n abortable: (signal: AbortSignal) => {\n const abortable = clone()\n const instance = abortable.axios\n instance.defaults.signal = signal\n return abortable\n },\n } as ExtendedClient\n}\n", "import { type ErrorType } from '@botpress/client'\n\nexport type BotpressError = {\n isApiError: boolean\n code: number\n description: string\n type: ErrorType\n subtype?: string\n error?: unknown\n metadata?: unknown\n message?: string\n id: string\n}\n\ntype Action = 'fallback' | 'retry' | 'abort'\n\nexport const getActionFromError = (error: any): Action => {\n if (!isBotpressError(error)) {\n return 'retry'\n }\n\n if (error.type === 'InvalidDataFormat') {\n if (error.message?.includes('data/model/id')) {\n // Invalid Model ID, so we want to try another model\n return 'fallback'\n }\n\n // Usually means the request was malformed\n return 'abort'\n }\n\n const subtype = (error.metadata as any)?.subtype\n if (error.type === 'Internal' || subtype === 'UPSTREAM_PROVIDER_FAILED') {\n // The model is degraded, so we want to try another model\n return 'fallback'\n }\n\n return 'abort'\n}\n\nexport const isNotFoundError = (error: any): boolean => isBotpressError(error) && error.type === 'ResourceNotFound'\n\nexport const isBotpressError = (error: any): error is BotpressError =>\n typeof error === 'object' &&\n error !== null &&\n 'isApiError' in error &&\n 'code' in error &&\n 'type' in error &&\n 'id' in error\n", "export type Callback<T> = (error: any | null, value: T) => void\nexport type Interceptor<T> = (error: any | null, value: T, next: Callback<T>, done: Callback<T>) => Promise<void> | void\n\nexport class InterceptorManager<T> {\n private _interceptors: Interceptor<T>[] = []\n\n public use(interceptor: Interceptor<T>) {\n this._interceptors.push(interceptor)\n return () => this.remove(interceptor)\n }\n\n public remove(interceptor: Interceptor<T>) {\n this._interceptors = this._interceptors.filter((i) => i !== interceptor)\n }\n\n public async run(value: T, signal: AbortSignal): Promise<T> {\n let error: any | null = null\n let result: T = value\n let done = false\n\n for (const interceptor of this._interceptors) {\n if (done) {\n break\n }\n\n if (signal.aborted) {\n throw signal.reason\n }\n\n await new Promise<void>((resolve) => {\n void interceptor(\n error,\n result,\n (err, val) => {\n error = err\n result = val\n resolve()\n },\n (err, val) => {\n error = err\n result = val\n done = true\n resolve()\n }\n )\n })\n }\n\n if (error) {\n throw error\n }\n\n return result\n }\n}\n", "import { ExtendedClient, getExtendedClient } from './bp-client'\nimport { isNotFoundError } from './errors'\nimport { Model as RawModel } from './llm'\nimport { BotpressClientLike } from './types'\n\nexport const DOWNTIME_THRESHOLD_MINUTES = 5\nconst PREFERENCES_FILE_SUFFIX = 'models.config.json'\n\n// Biases for vendors and models\nconst VendorPreferences = ['google-ai', 'anthropic', 'openai']\nconst BestModelPreferences = ['4o', '3-5-sonnet', 'gemini-1.5-pro']\nconst FastModelPreferences = ['gemini-1.5-flash', '4o-mini', 'flash', 'haiku']\n\nconst InputPricePenalty = 3 // $3 per 1M tokens\nconst OutputPricePenalty = 10 // $10 per 1M tokens\nconst LowTokensPenalty = 128_000 // 128k tokens\n\nexport type Model = RawModel & {\n ref: ModelRef\n integration: string\n}\n\nexport type ModelRef = `${string}:${string}`\n\nexport type ModelPreferences = {\n best: ModelRef[]\n fast: ModelRef[]\n downtimes: Array<{ ref: ModelRef; startedAt: string; reason: string }>\n}\n\nconst isRecommended = (model: Model) => model.tags.includes('recommended')\nconst isDeprecated = (model: Model) => model.tags.includes('deprecated')\nconst isLowCost = (model: Model) => model.tags.includes('low-cost')\nconst hasVisionSupport = (model: Model) => model.tags.includes('vision')\nconst isGeneralPurpose = (model: Model) => model.tags.includes('general-purpose')\n\nconst scoreModel = (model: Model, type: 'best' | 'fast', boosts: Record<ModelRef, number> = {}) => {\n let score: number = 0\n\n const scores: Array<[string, boolean, number]> = [\n ['input price penalty', model.input.costPer1MTokens > InputPricePenalty, -1],\n ['output price penalty', model.output.costPer1MTokens > OutputPricePenalty, -1],\n ['low tokens penalty', (model.input.maxTokens ?? 0 + model.output.maxTokens ?? 0) < LowTokensPenalty, -1],\n ['recommended', isRecommended(model), 2],\n ['deprecated', isDeprecated(model), -2],\n ['vision support', hasVisionSupport(model), 1],\n ['general purpose', isGeneralPurpose(model), 1],\n ['vendor preference', VendorPreferences.includes(model.integration), 1],\n ['best model preference', type === 'best' && BestModelPreferences.some((x) => model.id.includes(x)), 1],\n ['fast model preference penalty', type === 'best' && FastModelPreferences.some((x) => model.id.includes(x)), -2],\n ['fast model preference', type === 'fast' && FastModelPreferences.some((x) => model.id.includes(x)), 2],\n ['low cost', type === 'fast' && isLowCost(model), 1],\n ]\n\n for (const rule in boosts) {\n if (model.ref.includes(rule)) {\n scores.push([`boost (${rule})`, true, Number(boosts[rule as ModelRef]) ?? 0] as const)\n }\n }\n\n for (const [, condition, value] of scores) {\n if (condition) {\n score += value\n }\n }\n\n return score\n}\n\nexport const getBestModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'best', boosts) - scoreModel(a, 'best', boosts))\n\nexport const getFastModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'fast', boosts) - scoreModel(a, 'fast', boosts))\n\nexport const pickModel = (models: ModelRef[], downtimes: ModelPreferences['downtimes'] = []) => {\n const copy = [...models]\n const elasped = (date: string) => new Date().getTime() - new Date(date).getTime()\n const DOWNTIME_THRESHOLD = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n if (!copy.length) {\n throw new Error('At least one model is required')\n }\n\n while (copy.length) {\n const ref = copy.shift() as ModelRef\n const downtime = downtimes.find((o) => o.ref === ref && elasped(o.startedAt) < DOWNTIME_THRESHOLD)\n if (downtime) {\n continue\n } else {\n return ref\n }\n }\n\n throw new Error(`All models are down: ${models.join(', ')}`)\n}\n\nexport abstract class ModelProvider {\n public abstract fetchInstalledModels(): Promise<Model[]>\n public abstract fetchModelPreferences(): Promise<ModelPreferences | null>\n public abstract saveModelPreferences(preferences: ModelPreferences): Promise<void>\n public abstract deleteModelPreferences(): Promise<void>\n}\n\nexport class RemoteModelProvider extends ModelProvider {\n private _client: ExtendedClient\n\n public constructor(client: BotpressClientLike) {\n super()\n this._client = getExtendedClient(client)\n }\n\n public async fetchInstalledModels() {\n const { bot } = await this._client.getBot({ id: this._client.botId })\n const models: Model[] = []\n\n const registered = Object.values(bot.integrations).filter((x) => x.status === 'registered')\n\n await Promise.allSettled(\n registered.map(async (integration) => {\n const { output } = await this._client.callAction({\n type: `${integration.name}:listLanguageModels`,\n input: {},\n })\n\n if (!output?.models?.length) {\n return\n }\n\n for (const model of output.models as RawModel[]) {\n if (model.name && model.id && model.input && model.tags) {\n models.push({\n ref: `${integration.name}:${model.id}`,\n integration: integration.name,\n id: model.id,\n name: model.name,\n description: model.description,\n input: model.input,\n output: model.output,\n tags: model.tags,\n })\n }\n }\n })\n )\n\n return models\n }\n\n public async fetchModelPreferences(): Promise<ModelPreferences | null> {\n try {\n const { file } = await this._client.getFile({ id: this._preferenceFileKey })\n\n if (globalThis.fetch !== undefined) {\n const response = await fetch(file.url)\n return (await response.json()) as ModelPreferences\n } else {\n const { data } = await this._client.axios.get(file.url, {\n // we piggy-back axios to avoid adding a new dependency\n // unset all headers to avoid S3 pre-signed signature mismatch\n headers: Object.keys(this._client.config.headers).reduce(\n (acc, key) => {\n acc[key] = undefined\n return acc\n },\n {} as Record<string, undefined>\n ),\n })\n return data as ModelPreferences\n }\n } catch (err) {\n if (isNotFoundError(err)) {\n return null\n }\n\n throw err\n }\n }\n\n public async saveModelPreferences(preferences: ModelPreferences) {\n await this._client.uploadFile({\n key: this._preferenceFileKey,\n content: JSON.stringify(preferences, null, 2),\n index: false,\n tags: {\n system: 'true',\n purpose: 'config',\n },\n })\n }\n\n public async deleteModelPreferences() {\n await this._client.deleteFile({ id: this._preferenceFileKey }).catch(() => {})\n }\n\n private get _preferenceFileKey() {\n return `bot->${this._client.botId}->${PREFERENCES_FILE_SUFFIX}`\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": [null, null, null, null, null, null, null, null, null, "export { Events, BotpressClientLike } from './types'\nexport * from './client'\nexport { ModelPreferences, ModelProvider, RemoteModelProvider, Model } from './models'\nexport { type GenerateContentInput, type GenerateContentOutput } from './schemas.gen'\n", "import { backOff } from 'exponential-backoff'\nimport { createNanoEvents, Unsubscribe } from 'nanoevents'\n\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { getActionFromError } from './errors'\nimport { InterceptorManager } from './interceptors'\nimport {\n DOWNTIME_THRESHOLD_MINUTES,\n getBestModels,\n getFastModels,\n Model,\n ModelPreferences,\n ModelProvider,\n ModelRef,\n pickModel,\n RemoteModelProvider,\n} from './models'\nimport { GenerateContentOutput } from './schemas.gen'\nimport { CognitiveProps, Events, InputProps, Request, Response } from './types'\n\nexport class Cognitive {\n public ['$$IS_COGNITIVE'] = true\n\n public static isCognitiveClient(obj: any): obj is Cognitive {\n return obj?.$$IS_COGNITIVE === true\n }\n\n public interceptors = {\n request: new InterceptorManager<Request>(),\n response: new InterceptorManager<Response>(),\n }\n\n private _client: ExtendedClient\n private _preferences: ModelPreferences | null = null\n private _provider: ModelProvider\n private _events = createNanoEvents<Events>()\n private _downtimes: ModelPreferences['downtimes'] = []\n private _models: Model[] = []\n\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n }\n\n public get client(): ExtendedClient {\n return this._client\n }\n\n public on<K extends keyof Events>(this: this, event: K, cb: Events[K]): Unsubscribe {\n return this._events.on(event, cb)\n }\n\n public async fetchInstalledModels(): Promise<Model[]> {\n if (!this._models.length) {\n this._models = await this._provider.fetchInstalledModels()\n }\n\n return this._models\n }\n\n public async fetchPreferences(): Promise<ModelPreferences> {\n if (this._preferences) {\n return this._preferences\n }\n\n this._preferences = await this._provider.fetchModelPreferences()\n\n if (this._preferences) {\n return this._preferences\n }\n\n const models = await this.fetchInstalledModels()\n\n this._preferences = {\n best: getBestModels(models).map((m) => m.ref),\n fast: getFastModels(models).map((m) => m.ref),\n downtimes: [],\n }\n\n await this._provider.saveModelPreferences(this._preferences)\n\n return this._preferences\n }\n\n public async setPreferences(preferences: ModelPreferences, save: boolean = false): Promise<void> {\n this._preferences = preferences\n\n if (save) {\n await this._provider.saveModelPreferences(preferences)\n }\n }\n\n private _cleanupOldDowntimes(): void {\n const now = Date.now()\n const thresholdMs = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n this._preferences!.downtimes = this._preferences!.downtimes.filter((downtime) => {\n const downtimeStart = new Date(downtime.startedAt).getTime()\n return now - downtimeStart <= thresholdMs\n })\n }\n\n private async _selectModel(ref: string): Promise<{ integration: string; model: string }> {\n const parseRef = (ref: string) => {\n const parts = ref.split(':')\n return { integration: parts[0]!, model: parts.slice(1).join(':') }\n }\n\n const preferences = await this.fetchPreferences()\n\n preferences.best ??= []\n preferences.fast ??= []\n preferences.downtimes ??= []\n\n const downtimes = [...preferences.downtimes, ...(this._downtimes ?? [])]\n\n if (ref === 'best') {\n return parseRef(pickModel(preferences.best, downtimes))\n }\n\n if (ref === 'fast') {\n return parseRef(pickModel(preferences.fast, downtimes))\n }\n\n return parseRef(pickModel([ref as ModelRef, ...preferences.best, ...preferences.fast], downtimes))\n }\n\n public async getModelDetails(model: string) {\n await this.fetchInstalledModels()\n const { integration, model: modelName } = await this._selectModel(model)\n const def = this._models.find((m) => m.integration === integration && (m.name === modelName || m.id === modelName))\n if (!def) {\n console.info('Models:', this._models)\n throw new Error(`Model ${modelName} not found`)\n }\n\n return def\n }\n\n public async generateContent(input: InputProps): Promise<Response> {\n const start = Date.now()\n\n const signal = input.signal ?? AbortSignal.timeout(30_000)\n\n const client = this._client.abortable(signal)\n\n let props: Request = { input }\n let integration: string\n let model: string\n\n const { output, meta } = await backOff<{\n output: GenerateContentOutput\n meta: any\n }>(\n async () => {\n const selection = await this._selectModel(input.model ?? 'best')\n\n integration = selection.integration\n model = selection.model\n\n props = await this.interceptors.request.run({ input }, signal)\n\n return client.callAction({\n type: `${integration}:generateContent`,\n input: {\n ...props.input,\n model: { id: model },\n },\n }) as Promise<{ output: GenerateContentOutput; meta: any }>\n },\n {\n retry: async (err, _attempt) => {\n if (signal?.aborted) {\n // We don't want to retry if the request was aborted\n this._events.emit('aborted', props, err)\n return false\n }\n\n if (_attempt > 3) {\n // We don't want to retry more than 3 times\n this._events.emit('error', props, err)\n return false\n }\n\n const action = getActionFromError(err)\n\n if (action === 'abort') {\n this._events.emit('error', props, err)\n return false\n }\n\n if (action === 'fallback') {\n // We don't want to retry if the request was already retried with a fallback model\n this._downtimes.push({\n ref: `${integration!}:${model!}`,\n startedAt: new Date().toISOString(),\n reason: 'Model is down',\n })\n\n this._cleanupOldDowntimes()\n\n await this._provider.saveModelPreferences({\n ...(this._preferences ?? { best: [], downtimes: [], fast: [] }),\n downtimes: [...(this._preferences!.downtimes ?? []), ...(this._downtimes ?? [])],\n })\n\n this._events.emit('fallback', props, err)\n return true\n }\n\n this._events.emit('retry', props, err)\n return true\n },\n }\n )\n\n const response = {\n output,\n meta: {\n cached: meta.cached ?? false,\n model: { integration: integration!, model: model! },\n latency: Date.now() - start,\n cost: { input: output.usage.inputCost, output: output.usage.outputCost },\n tokens: { input: output.usage.inputTokens, output: output.usage.outputTokens },\n },\n } satisfies Response\n\n this._events.emit('response', props, response)\n\n return this.interceptors.response.run(response, signal)\n }\n}\n", "export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let callbacks = this.events[event] || [],\n i = 0,\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n", "import { type Client } from '@botpress/client'\nimport { type AxiosInstance } from 'axios'\nimport { BotpressClientLike } from './types'\n\n/** @internal */\nexport type ExtendedClient = Client & {\n botId: string\n axios: AxiosInstance\n clone: () => ExtendedClient\n abortable: (signal: AbortSignal) => ExtendedClient\n}\n\nexport const getExtendedClient = (client: BotpressClientLike): ExtendedClient => {\n if (\n typeof client.constructor !== 'function' ||\n typeof client.callAction !== 'function' ||\n !client.config ||\n typeof client.config !== 'object' ||\n !client.config.headers\n ) {\n throw new Error('Client must be a valid instance of a Botpress client (@botpress/client)')\n }\n\n const botId = client.config.headers['x-bot-id'] as string\n\n if (!botId?.length) {\n throw new Error('Client must be instanciated with Bot ID')\n }\n\n const clone = () => {\n const c = client as any\n if (c.clone && typeof c.clone === 'function') {\n return getExtendedClient(c.clone())\n }\n return getExtendedClient(new c.constructor(c.config))\n }\n\n return {\n ...client,\n botId,\n axios: (client as any).axiosInstance as AxiosInstance,\n clone,\n abortable: (signal: AbortSignal) => {\n const abortable = clone()\n const instance = abortable.axios\n instance.defaults.signal = signal\n return abortable\n },\n } as ExtendedClient\n}\n", "import { type ErrorType } from '@botpress/client'\n\nexport type BotpressError = {\n isApiError: boolean\n code: number\n description: string\n type: ErrorType\n subtype?: string\n error?: unknown\n metadata?: unknown\n message?: string\n id: string\n}\n\ntype Action = 'fallback' | 'retry' | 'abort'\n\nexport const getActionFromError = (error: any): Action => {\n if (!isBotpressError(error)) {\n return 'retry'\n }\n\n if (error.type === 'InvalidDataFormat') {\n if (error.message?.includes('data/model/id')) {\n // Invalid Model ID, so we want to try another model\n return 'fallback'\n }\n\n // Usually means the request was malformed\n return 'abort'\n }\n\n const subtype = (error.metadata as any)?.subtype\n if (error.type === 'Internal' || subtype === 'UPSTREAM_PROVIDER_FAILED') {\n // The model is degraded, so we want to try another model\n return 'fallback'\n }\n\n return 'abort'\n}\n\nexport const isNotFoundError = (error: any): boolean => isBotpressError(error) && error.type === 'ResourceNotFound'\n\nexport const isForbiddenOrUnauthorizedError = (error: any): boolean =>\n isBotpressError(error) && (error.type === 'Forbidden' || error.type === 'Unauthorized')\n\nexport const isBotpressError = (error: any): error is BotpressError =>\n typeof error === 'object' &&\n error !== null &&\n 'isApiError' in error &&\n 'code' in error &&\n 'type' in error &&\n 'id' in error\n", "export type Callback<T> = (error: any | null, value: T) => void\nexport type Interceptor<T> = (error: any | null, value: T, next: Callback<T>, done: Callback<T>) => Promise<void> | void\n\nexport class InterceptorManager<T> {\n private _interceptors: Interceptor<T>[] = []\n\n public use(interceptor: Interceptor<T>) {\n this._interceptors.push(interceptor)\n return () => this.remove(interceptor)\n }\n\n public remove(interceptor: Interceptor<T>) {\n this._interceptors = this._interceptors.filter((i) => i !== interceptor)\n }\n\n public async run(value: T, signal: AbortSignal): Promise<T> {\n let error: any | null = null\n let result: T = value\n let done = false\n\n for (const interceptor of this._interceptors) {\n if (done) {\n break\n }\n\n if (signal.aborted) {\n throw signal.reason\n }\n\n await new Promise<void>((resolve) => {\n void interceptor(\n error,\n result,\n (err, val) => {\n error = err\n result = val\n resolve()\n },\n (err, val) => {\n error = err\n result = val\n done = true\n resolve()\n }\n )\n })\n }\n\n if (error) {\n throw error\n }\n\n return result\n }\n}\n", "import { ExtendedClient, getExtendedClient } from './bp-client'\nimport { isForbiddenOrUnauthorizedError, isNotFoundError } from './errors'\nimport { Model as RawModel } from './schemas.gen'\nimport { BotpressClientLike } from './types'\n\nexport const DOWNTIME_THRESHOLD_MINUTES = 5\nconst PREFERENCES_FILE_SUFFIX = 'models.config.json'\n\nexport const DEFAULT_INTEGRATIONS = ['google-ai', 'anthropic', 'openai', 'cerebras', 'fireworks-ai', 'groq']\n\n// Biases for vendors and models\nconst VendorPreferences = ['google-ai', 'anthropic', 'openai']\nconst BestModelPreferences = ['4o', '3-5-sonnet', 'gemini-1.5-pro']\nconst FastModelPreferences = ['gemini-1.5-flash', '4o-mini', 'flash', 'haiku']\n\nconst InputPricePenalty = 3 // $3 per 1M tokens\nconst OutputPricePenalty = 10 // $10 per 1M tokens\nconst LowTokensPenalty = 128_000 // 128k tokens\n\nexport type Model = RawModel & {\n ref: ModelRef\n integration: string\n}\n\nexport type ModelRef = `${string}:${string}`\n\nexport type ModelPreferences = {\n best: ModelRef[]\n fast: ModelRef[]\n downtimes: Array<{ ref: ModelRef; startedAt: string; reason: string }>\n}\n\nconst isRecommended = (model: Model) => model.tags.includes('recommended')\nconst isDeprecated = (model: Model) => model.tags.includes('deprecated')\nconst isLowCost = (model: Model) => model.tags.includes('low-cost')\nconst hasVisionSupport = (model: Model) => model.tags.includes('vision')\nconst isGeneralPurpose = (model: Model) => model.tags.includes('general-purpose')\n\nconst scoreModel = (model: Model, type: 'best' | 'fast', boosts: Record<ModelRef, number> = {}) => {\n let score: number = 0\n\n const scores: Array<[string, boolean, number]> = [\n ['input price penalty', model.input.costPer1MTokens > InputPricePenalty, -1],\n ['output price penalty', model.output.costPer1MTokens > OutputPricePenalty, -1],\n ['low tokens penalty', (model.input.maxTokens ?? 0 + model.output.maxTokens ?? 0) < LowTokensPenalty, -1],\n ['recommended', isRecommended(model), 2],\n ['deprecated', isDeprecated(model), -2],\n ['vision support', hasVisionSupport(model), 1],\n ['general purpose', isGeneralPurpose(model), 1],\n ['vendor preference', VendorPreferences.includes(model.integration), 1],\n ['best model preference', type === 'best' && BestModelPreferences.some((x) => model.id.includes(x)), 1],\n ['fast model preference penalty', type === 'best' && FastModelPreferences.some((x) => model.id.includes(x)), -2],\n ['fast model preference', type === 'fast' && FastModelPreferences.some((x) => model.id.includes(x)), 2],\n ['low cost', type === 'fast' && isLowCost(model), 1],\n ]\n\n for (const rule in boosts) {\n if (model.ref.includes(rule)) {\n scores.push([`boost (${rule})`, true, Number(boosts[rule as ModelRef]) ?? 0] as const)\n }\n }\n\n for (const [, condition, value] of scores) {\n if (condition) {\n score += value\n }\n }\n\n return score\n}\n\nexport const getBestModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'best', boosts) - scoreModel(a, 'best', boosts))\n\nexport const getFastModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'fast', boosts) - scoreModel(a, 'fast', boosts))\n\nexport const pickModel = (models: ModelRef[], downtimes: ModelPreferences['downtimes'] = []) => {\n const copy = [...models]\n const elasped = (date: string) => new Date().getTime() - new Date(date).getTime()\n const DOWNTIME_THRESHOLD = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n if (!copy.length) {\n throw new Error('At least one model is required')\n }\n\n while (copy.length) {\n const ref = copy.shift() as ModelRef\n const downtime = downtimes.find((o) => o.ref === ref && elasped(o.startedAt) < DOWNTIME_THRESHOLD)\n if (downtime) {\n continue\n } else {\n return ref\n }\n }\n\n throw new Error(`All models are down: ${models.join(', ')}`)\n}\n\nexport abstract class ModelProvider {\n public abstract fetchInstalledModels(): Promise<Model[]>\n public abstract fetchModelPreferences(): Promise<ModelPreferences | null>\n public abstract saveModelPreferences(preferences: ModelPreferences): Promise<void>\n public abstract deleteModelPreferences(): Promise<void>\n}\n\nexport class RemoteModelProvider extends ModelProvider {\n private _client: ExtendedClient\n\n public constructor(client: BotpressClientLike) {\n super()\n this._client = getExtendedClient(client)\n }\n\n private async _fetchInstalledIntegrationNames() {\n try {\n const { bot } = await this._client.getBot({ id: this._client.botId })\n const integrations = Object.values(bot.integrations).filter((x) => x.status === 'registered')\n return integrations.map((x) => x.name)\n } catch (err) {\n if (isForbiddenOrUnauthorizedError(err)) {\n // This happens when the bot (with a BAK token) tries to access the .getBot endpoint\n return DEFAULT_INTEGRATIONS\n }\n\n throw err\n }\n }\n\n public async fetchInstalledModels() {\n const integrationNames = await this._fetchInstalledIntegrationNames()\n const models: Model[] = []\n\n await Promise.allSettled(\n integrationNames.map(async (integration) => {\n const { output } = await this._client.callAction({\n type: `${integration}:listLanguageModels`,\n input: {},\n })\n\n if (!output?.models?.length) {\n return\n }\n\n for (const model of output.models as RawModel[]) {\n if (model.name && model.id && model.input && model.tags) {\n models.push({\n ref: `${integration}:${model.id}`,\n integration,\n id: model.id,\n name: model.name,\n description: model.description,\n input: model.input,\n output: model.output,\n tags: model.tags,\n })\n }\n }\n })\n )\n\n return models\n }\n\n public async fetchModelPreferences(): Promise<ModelPreferences | null> {\n try {\n const { file } = await this._client.getFile({ id: this._preferenceFileKey })\n\n if (globalThis.fetch !== undefined) {\n const response = await fetch(file.url)\n return (await response.json()) as ModelPreferences\n } else {\n const { data } = await this._client.axios.get(file.url, {\n // we piggy-back axios to avoid adding a new dependency\n // unset all headers to avoid S3 pre-signed signature mismatch\n headers: Object.keys(this._client.config.headers).reduce(\n (acc, key) => {\n acc[key] = undefined\n return acc\n },\n {} as Record<string, undefined>\n ),\n })\n return data as ModelPreferences\n }\n } catch (err) {\n if (isNotFoundError(err)) {\n return null\n }\n\n throw err\n }\n }\n\n public async saveModelPreferences(preferences: ModelPreferences) {\n await this._client.uploadFile({\n key: this._preferenceFileKey,\n content: JSON.stringify(preferences, null, 2),\n index: false,\n tags: {\n system: 'true',\n purpose: 'config',\n },\n })\n }\n\n public async deleteModelPreferences() {\n await this._client.deleteFile({ id: this._preferenceFileKey }).catch(() => {})\n }\n\n private get _preferenceFileKey() {\n return `bot->${this._client.botId}->${PREFERENCES_FILE_SUFFIX}`\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["Delay", "SkipFirstDelay", "AlwaysDelay", "backOff", "BackOff", "ref"]
7
7
  }
package/dist/index.d.ts CHANGED
@@ -1,9 +1,145 @@
1
- import { llm } from '@botpress/common';
2
1
  import { Unsubscribe } from 'nanoevents';
3
2
 
4
- type GenerateContentInput = llm.GenerateContentInput;
5
- type GenerateContentOutput = llm.GenerateContentOutput;
6
- type Model$1 = llm.Model;
3
+ type GenerateContentInput = {
4
+ /** Model to use for content generation */
5
+ model?: any;
6
+ /** Reasoning effort level to use for models that support reasoning */
7
+ reasoningEffort?: 'low' | 'medium' | 'high';
8
+ /** Optional system prompt to guide the model */
9
+ systemPrompt?: string;
10
+ /** Array of messages for the model to process */
11
+ messages: Array<{
12
+ role: 'user' | 'assistant';
13
+ type?: 'text' | 'tool_calls' | 'tool_result' | 'multipart';
14
+ /** Required if `type` is "tool_calls" */
15
+ toolCalls?: Array<{
16
+ id: string;
17
+ type: 'function';
18
+ function: {
19
+ name: string;
20
+ /** Some LLMs may generate invalid JSON for a tool call, so this will be `null` when it happens. */
21
+ arguments: {
22
+ [key: string]: any;
23
+ } | null;
24
+ };
25
+ }>;
26
+ /** Required if `type` is "tool_result" */
27
+ toolResultCallId?: string;
28
+ /** Required unless `type` is "tool_call". If `type` is "multipart", this field must be an array of content objects. If `type` is "tool_result" then this field should be the result of the tool call (a plain string or a JSON-encoded array or object). If `type` is "tool_call" then the `toolCalls` field should be used instead. */
29
+ content: string | Array<{
30
+ type: 'text' | 'image';
31
+ /** Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL. */
32
+ mimeType?: string;
33
+ /** Required if part type is "text" */
34
+ text?: string;
35
+ /** Required if part type is "image" */
36
+ url?: string;
37
+ }> | null;
38
+ }>;
39
+ /** Response format expected from the model. If "json_object" is chosen, you must instruct the model to generate JSON either via the system prompt or a user message. */
40
+ responseFormat?: 'text' | 'json_object';
41
+ /** Maximum number of tokens allowed in the generated response */
42
+ maxTokens?: number;
43
+ /** Sampling temperature for the model. Higher values result in more random outputs. */
44
+ temperature?: number;
45
+ /** Top-p sampling parameter. Limits sampling to the smallest set of tokens with a cumulative probability above the threshold. */
46
+ topP?: number;
47
+ /** Sequences where the model should stop generating further tokens. */
48
+ stopSequences?: string[];
49
+ tools?: Array<{
50
+ type: 'function';
51
+ function: {
52
+ /** Function name */
53
+ name: string;
54
+ description?: string;
55
+ /** JSON schema of the function arguments */
56
+ argumentsSchema?: {};
57
+ };
58
+ }>;
59
+ toolChoice?: {
60
+ type?: 'auto' | 'specific' | 'any' | 'none' | '';
61
+ /** Required if `type` is "specific" */
62
+ functionName?: string;
63
+ };
64
+ userId?: string;
65
+ /** Set to `true` to output debug information to the bot logs */
66
+ debug?: boolean;
67
+ meta?: {
68
+ /** Source of the prompt, e.g. agent/:id/:version cards/ai-generate, cards/ai-task, nodes/autonomous, etc. */
69
+ promptSource?: string;
70
+ promptCategory?: string;
71
+ /** Name of the integration that originally received the message that initiated this action */
72
+ integrationName?: string;
73
+ };
74
+ };
75
+ type GenerateContentOutput = {
76
+ /** Response ID from LLM provider */
77
+ id: string;
78
+ /** LLM provider name */
79
+ provider: string;
80
+ /** Model name */
81
+ model: string;
82
+ choices: Array<{
83
+ type?: 'text' | 'tool_calls' | 'tool_result' | 'multipart';
84
+ /** Required if `type` is "tool_calls" */
85
+ toolCalls?: Array<{
86
+ id: string;
87
+ type: 'function';
88
+ function: {
89
+ name: string;
90
+ /** Some LLMs may generate invalid JSON for a tool call, so this will be `null` when it happens. */
91
+ arguments: {
92
+ [key: string]: any;
93
+ } | null;
94
+ };
95
+ }>;
96
+ /** Required if `type` is "tool_result" */
97
+ toolResultCallId?: string;
98
+ /** Required unless `type` is "tool_call". If `type` is "multipart", this field must be an array of content objects. If `type` is "tool_result" then this field should be the result of the tool call (a plain string or a JSON-encoded array or object). If `type` is "tool_call" then the `toolCalls` field should be used instead. */
99
+ content: string | Array<{
100
+ type: 'text' | 'image';
101
+ /** Indicates the MIME type of the content. If not provided it will be detected from the content-type header of the provided URL. */
102
+ mimeType?: string;
103
+ /** Required if part type is "text" */
104
+ text?: string;
105
+ /** Required if part type is "image" */
106
+ url?: string;
107
+ }> | null;
108
+ role: 'assistant';
109
+ index: number;
110
+ stopReason: 'stop' | 'max_tokens' | 'tool_calls' | 'content_filter' | 'other';
111
+ }>;
112
+ usage: {
113
+ /** Number of input tokens used by the model */
114
+ inputTokens: number;
115
+ /** Cost of the input tokens received by the model, in U.S. dollars */
116
+ inputCost: number;
117
+ /** Number of output tokens used by the model */
118
+ outputTokens: number;
119
+ /** Cost of the output tokens generated by the model, in U.S. dollars */
120
+ outputCost: number;
121
+ };
122
+ botpress: {
123
+ /** Total cost of the content generation, in U.S. dollars */
124
+ cost: number;
125
+ };
126
+ };
127
+ type Model$1 = {
128
+ id: string;
129
+ name: string;
130
+ description: string;
131
+ tags: Array<'recommended' | 'deprecated' | 'general-purpose' | 'low-cost' | 'vision' | 'coding' | 'agents' | 'function-calling' | 'roleplay' | 'storytelling' | 'reasoning' | 'preview'>;
132
+ input: {
133
+ maxTokens: number;
134
+ /** Cost per 1 million tokens, in U.S. dollars */
135
+ costPer1MTokens: number;
136
+ };
137
+ output: {
138
+ maxTokens: number;
139
+ /** Cost per 1 million tokens, in U.S. dollars */
140
+ costPer1MTokens: number;
141
+ };
142
+ };
7
143
 
8
144
  type Model = Model$1 & {
9
145
  ref: ModelRef;
@@ -28,6 +164,7 @@ declare abstract class ModelProvider {
28
164
  declare class RemoteModelProvider extends ModelProvider {
29
165
  private _client;
30
166
  constructor(client: BotpressClientLike);
167
+ private _fetchInstalledIntegrationNames;
31
168
  fetchInstalledModels(): Promise<Model[]>;
32
169
  fetchModelPreferences(): Promise<ModelPreferences | null>;
33
170
  saveModelPreferences(preferences: ModelPreferences): Promise<void>;
@@ -11711,6 +11848,22 @@ interface ListPluginsResponse {
11711
11848
  * Version of the [Plugin](#schema_plugin)
11712
11849
  */
11713
11850
  version: string;
11851
+ /**
11852
+ * Title of the plugin. This is the name that will be displayed in the UI
11853
+ */
11854
+ title: string;
11855
+ /**
11856
+ * Description of the plugin. This is the description that will be displayed in the UI
11857
+ */
11858
+ description: string;
11859
+ /**
11860
+ * URL of the icon of the plugin. This is the icon that will be displayed in the UI
11861
+ */
11862
+ iconUrl: string;
11863
+ /**
11864
+ * URL of the readme of the plugin. This is the readme that will be displayed in the UI
11865
+ */
11866
+ readmeUrl: string;
11714
11867
  }[];
11715
11868
  meta: {
11716
11869
  /**
package/dist/index.mjs CHANGED
@@ -658,6 +658,7 @@ var getActionFromError = (error) => {
658
658
  return "abort";
659
659
  };
660
660
  var isNotFoundError = (error) => isBotpressError(error) && error.type === "ResourceNotFound";
661
+ var isForbiddenOrUnauthorizedError = (error) => isBotpressError(error) && (error.type === "Forbidden" || error.type === "Unauthorized");
661
662
  var isBotpressError = (error) => typeof error === "object" && error !== null && "isApiError" in error && "code" in error && "type" in error && "id" in error;
662
663
 
663
664
  // src/interceptors.ts
@@ -709,6 +710,7 @@ var InterceptorManager = class {
709
710
  // src/models.ts
710
711
  var DOWNTIME_THRESHOLD_MINUTES = 5;
711
712
  var PREFERENCES_FILE_SUFFIX = "models.config.json";
713
+ var DEFAULT_INTEGRATIONS = ["google-ai", "anthropic", "openai", "cerebras", "fireworks-ai", "groq"];
712
714
  var VendorPreferences = ["google-ai", "anthropic", "openai"];
713
715
  var BestModelPreferences = ["4o", "3-5-sonnet", "gemini-1.5-pro"];
714
716
  var FastModelPreferences = ["gemini-1.5-flash", "4o-mini", "flash", "haiku"];
@@ -776,14 +778,25 @@ var RemoteModelProvider = class extends ModelProvider {
776
778
  super();
777
779
  this._client = getExtendedClient(client);
778
780
  }
781
+ async _fetchInstalledIntegrationNames() {
782
+ try {
783
+ const { bot } = await this._client.getBot({ id: this._client.botId });
784
+ const integrations = Object.values(bot.integrations).filter((x) => x.status === "registered");
785
+ return integrations.map((x) => x.name);
786
+ } catch (err) {
787
+ if (isForbiddenOrUnauthorizedError(err)) {
788
+ return DEFAULT_INTEGRATIONS;
789
+ }
790
+ throw err;
791
+ }
792
+ }
779
793
  async fetchInstalledModels() {
780
- const { bot } = await this._client.getBot({ id: this._client.botId });
794
+ const integrationNames = await this._fetchInstalledIntegrationNames();
781
795
  const models = [];
782
- const registered = Object.values(bot.integrations).filter((x) => x.status === "registered");
783
796
  await Promise.allSettled(
784
- registered.map(async (integration) => {
797
+ integrationNames.map(async (integration) => {
785
798
  const { output } = await this._client.callAction({
786
- type: `${integration.name}:listLanguageModels`,
799
+ type: `${integration}:listLanguageModels`,
787
800
  input: {}
788
801
  });
789
802
  if (!output?.models?.length) {
@@ -792,8 +805,8 @@ var RemoteModelProvider = class extends ModelProvider {
792
805
  for (const model of output.models) {
793
806
  if (model.name && model.id && model.input && model.tags) {
794
807
  models.push({
795
- ref: `${integration.name}:${model.id}`,
796
- integration: integration.name,
808
+ ref: `${integration}:${model.id}`,
809
+ integration,
797
810
  id: model.id,
798
811
  name: model.name,
799
812
  description: model.description,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/options.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/jitter/full/full.jitter.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/jitter/no/no.jitter.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/jitter/jitter.factory.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/delay.base.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/skip-first/skip-first.delay.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/always/always.delay.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/delay/delay.factory.ts", "../../../node_modules/.pnpm/exponential-backoff@3.1.1/node_modules/exponential-backoff/src/backoff.ts", "../src/client.ts", "../../../node_modules/.pnpm/nanoevents@9.1.0/node_modules/nanoevents/index.js", "../src/bp-client.ts", "../src/errors.ts", "../src/interceptors.ts", "../src/models.ts"],
4
- "sourcesContent": [null, null, null, null, null, null, null, null, null, "import { backOff } from 'exponential-backoff'\nimport { createNanoEvents, Unsubscribe } from 'nanoevents'\n\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { getActionFromError } from './errors'\nimport { InterceptorManager } from './interceptors'\nimport { GenerateContentOutput } from './llm'\nimport {\n DOWNTIME_THRESHOLD_MINUTES,\n getBestModels,\n getFastModels,\n Model,\n ModelPreferences,\n ModelProvider,\n ModelRef,\n pickModel,\n RemoteModelProvider,\n} from './models'\nimport { CognitiveProps, Events, InputProps, Request, Response } from './types'\n\nexport class Cognitive {\n public ['$$IS_COGNITIVE'] = true\n\n public static isCognitiveClient(obj: any): obj is Cognitive {\n return obj?.$$IS_COGNITIVE === true\n }\n\n public interceptors = {\n request: new InterceptorManager<Request>(),\n response: new InterceptorManager<Response>(),\n }\n\n private _client: ExtendedClient\n private _preferences: ModelPreferences | null = null\n private _provider: ModelProvider\n private _events = createNanoEvents<Events>()\n private _downtimes: ModelPreferences['downtimes'] = []\n private _models: Model[] = []\n\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n }\n\n public get client(): ExtendedClient {\n return this._client\n }\n\n public on<K extends keyof Events>(this: this, event: K, cb: Events[K]): Unsubscribe {\n return this._events.on(event, cb)\n }\n\n public async fetchInstalledModels(): Promise<Model[]> {\n if (!this._models.length) {\n this._models = await this._provider.fetchInstalledModels()\n }\n\n return this._models\n }\n\n public async fetchPreferences(): Promise<ModelPreferences> {\n if (this._preferences) {\n return this._preferences\n }\n\n this._preferences = await this._provider.fetchModelPreferences()\n\n if (this._preferences) {\n return this._preferences\n }\n\n const models = await this.fetchInstalledModels()\n\n this._preferences = {\n best: getBestModels(models).map((m) => m.ref),\n fast: getFastModels(models).map((m) => m.ref),\n downtimes: [],\n }\n\n await this._provider.saveModelPreferences(this._preferences)\n\n return this._preferences\n }\n\n public async setPreferences(preferences: ModelPreferences, save: boolean = false): Promise<void> {\n this._preferences = preferences\n\n if (save) {\n await this._provider.saveModelPreferences(preferences)\n }\n }\n\n private _cleanupOldDowntimes(): void {\n const now = Date.now()\n const thresholdMs = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n this._preferences!.downtimes = this._preferences!.downtimes.filter((downtime) => {\n const downtimeStart = new Date(downtime.startedAt).getTime()\n return now - downtimeStart <= thresholdMs\n })\n }\n\n private async _selectModel(ref: string): Promise<{ integration: string; model: string }> {\n const parseRef = (ref: string) => {\n const parts = ref.split(':')\n return { integration: parts[0]!, model: parts.slice(1).join(':') }\n }\n\n const preferences = await this.fetchPreferences()\n\n preferences.best ??= []\n preferences.fast ??= []\n preferences.downtimes ??= []\n\n const downtimes = [...preferences.downtimes, ...(this._downtimes ?? [])]\n\n if (ref === 'best') {\n return parseRef(pickModel(preferences.best, downtimes))\n }\n\n if (ref === 'fast') {\n return parseRef(pickModel(preferences.fast, downtimes))\n }\n\n return parseRef(pickModel([ref as ModelRef, ...preferences.best, ...preferences.fast], downtimes))\n }\n\n public async getModelDetails(model: string) {\n await this.fetchInstalledModels()\n const { integration, model: modelName } = await this._selectModel(model)\n const def = this._models.find((m) => m.integration === integration && (m.name === modelName || m.id === modelName))\n if (!def) {\n console.info('Models:', this._models)\n throw new Error(`Model ${modelName} not found`)\n }\n\n return def\n }\n\n public async generateContent(input: InputProps): Promise<Response> {\n const start = Date.now()\n\n const signal = input.signal ?? AbortSignal.timeout(30_000)\n\n const client = this._client.abortable(signal)\n\n let props: Request = { input }\n let integration: string\n let model: string\n\n const { output, meta } = await backOff<{\n output: GenerateContentOutput\n meta: any\n }>(\n async () => {\n const selection = await this._selectModel(input.model ?? 'best')\n\n integration = selection.integration\n model = selection.model\n\n props = await this.interceptors.request.run({ input }, signal)\n\n return client.callAction({\n type: `${integration}:generateContent`,\n input: {\n ...props.input,\n model: { id: model },\n },\n }) as Promise<{ output: GenerateContentOutput; meta: any }>\n },\n {\n retry: async (err, _attempt) => {\n if (signal?.aborted) {\n // We don't want to retry if the request was aborted\n this._events.emit('aborted', props, err)\n return false\n }\n\n if (_attempt > 3) {\n // We don't want to retry more than 3 times\n this._events.emit('error', props, err)\n return false\n }\n\n const action = getActionFromError(err)\n\n if (action === 'abort') {\n this._events.emit('error', props, err)\n return false\n }\n\n if (action === 'fallback') {\n // We don't want to retry if the request was already retried with a fallback model\n this._downtimes.push({\n ref: `${integration!}:${model!}`,\n startedAt: new Date().toISOString(),\n reason: 'Model is down',\n })\n\n this._cleanupOldDowntimes()\n\n await this._provider.saveModelPreferences({\n ...(this._preferences ?? { best: [], downtimes: [], fast: [] }),\n downtimes: [...(this._preferences!.downtimes ?? []), ...(this._downtimes ?? [])],\n })\n\n this._events.emit('fallback', props, err)\n return true\n }\n\n this._events.emit('retry', props, err)\n return true\n },\n }\n )\n\n const response = {\n output,\n meta: {\n cached: meta.cached ?? false,\n model: { integration: integration!, model: model! },\n latency: Date.now() - start,\n cost: { input: output.usage.inputCost, output: output.usage.outputCost },\n tokens: { input: output.usage.inputTokens, output: output.usage.outputTokens },\n },\n } satisfies Response\n\n this._events.emit('response', props, response)\n\n return this.interceptors.response.run(response, signal)\n }\n}\n", "export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let callbacks = this.events[event] || [],\n i = 0,\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n", "import { type Client } from '@botpress/client'\nimport { type AxiosInstance } from 'axios'\nimport { BotpressClientLike } from './types'\n\n/** @internal */\nexport type ExtendedClient = Client & {\n botId: string\n axios: AxiosInstance\n clone: () => ExtendedClient\n abortable: (signal: AbortSignal) => ExtendedClient\n}\n\nexport const getExtendedClient = (client: BotpressClientLike): ExtendedClient => {\n if (\n typeof client.constructor !== 'function' ||\n typeof client.callAction !== 'function' ||\n !client.config ||\n typeof client.config !== 'object' ||\n !client.config.headers\n ) {\n throw new Error('Client must be a valid instance of a Botpress client (@botpress/client)')\n }\n\n const botId = client.config.headers['x-bot-id'] as string\n\n if (!botId?.length) {\n throw new Error('Client must be instanciated with Bot ID')\n }\n\n const clone = () => {\n const c = client as any\n if (c.clone && typeof c.clone === 'function') {\n return getExtendedClient(c.clone())\n }\n return getExtendedClient(new c.constructor(c.config))\n }\n\n return {\n ...client,\n botId,\n axios: (client as any).axiosInstance as AxiosInstance,\n clone,\n abortable: (signal: AbortSignal) => {\n const abortable = clone()\n const instance = abortable.axios\n instance.defaults.signal = signal\n return abortable\n },\n } as ExtendedClient\n}\n", "import { type ErrorType } from '@botpress/client'\n\nexport type BotpressError = {\n isApiError: boolean\n code: number\n description: string\n type: ErrorType\n subtype?: string\n error?: unknown\n metadata?: unknown\n message?: string\n id: string\n}\n\ntype Action = 'fallback' | 'retry' | 'abort'\n\nexport const getActionFromError = (error: any): Action => {\n if (!isBotpressError(error)) {\n return 'retry'\n }\n\n if (error.type === 'InvalidDataFormat') {\n if (error.message?.includes('data/model/id')) {\n // Invalid Model ID, so we want to try another model\n return 'fallback'\n }\n\n // Usually means the request was malformed\n return 'abort'\n }\n\n const subtype = (error.metadata as any)?.subtype\n if (error.type === 'Internal' || subtype === 'UPSTREAM_PROVIDER_FAILED') {\n // The model is degraded, so we want to try another model\n return 'fallback'\n }\n\n return 'abort'\n}\n\nexport const isNotFoundError = (error: any): boolean => isBotpressError(error) && error.type === 'ResourceNotFound'\n\nexport const isBotpressError = (error: any): error is BotpressError =>\n typeof error === 'object' &&\n error !== null &&\n 'isApiError' in error &&\n 'code' in error &&\n 'type' in error &&\n 'id' in error\n", "export type Callback<T> = (error: any | null, value: T) => void\nexport type Interceptor<T> = (error: any | null, value: T, next: Callback<T>, done: Callback<T>) => Promise<void> | void\n\nexport class InterceptorManager<T> {\n private _interceptors: Interceptor<T>[] = []\n\n public use(interceptor: Interceptor<T>) {\n this._interceptors.push(interceptor)\n return () => this.remove(interceptor)\n }\n\n public remove(interceptor: Interceptor<T>) {\n this._interceptors = this._interceptors.filter((i) => i !== interceptor)\n }\n\n public async run(value: T, signal: AbortSignal): Promise<T> {\n let error: any | null = null\n let result: T = value\n let done = false\n\n for (const interceptor of this._interceptors) {\n if (done) {\n break\n }\n\n if (signal.aborted) {\n throw signal.reason\n }\n\n await new Promise<void>((resolve) => {\n void interceptor(\n error,\n result,\n (err, val) => {\n error = err\n result = val\n resolve()\n },\n (err, val) => {\n error = err\n result = val\n done = true\n resolve()\n }\n )\n })\n }\n\n if (error) {\n throw error\n }\n\n return result\n }\n}\n", "import { ExtendedClient, getExtendedClient } from './bp-client'\nimport { isNotFoundError } from './errors'\nimport { Model as RawModel } from './llm'\nimport { BotpressClientLike } from './types'\n\nexport const DOWNTIME_THRESHOLD_MINUTES = 5\nconst PREFERENCES_FILE_SUFFIX = 'models.config.json'\n\n// Biases for vendors and models\nconst VendorPreferences = ['google-ai', 'anthropic', 'openai']\nconst BestModelPreferences = ['4o', '3-5-sonnet', 'gemini-1.5-pro']\nconst FastModelPreferences = ['gemini-1.5-flash', '4o-mini', 'flash', 'haiku']\n\nconst InputPricePenalty = 3 // $3 per 1M tokens\nconst OutputPricePenalty = 10 // $10 per 1M tokens\nconst LowTokensPenalty = 128_000 // 128k tokens\n\nexport type Model = RawModel & {\n ref: ModelRef\n integration: string\n}\n\nexport type ModelRef = `${string}:${string}`\n\nexport type ModelPreferences = {\n best: ModelRef[]\n fast: ModelRef[]\n downtimes: Array<{ ref: ModelRef; startedAt: string; reason: string }>\n}\n\nconst isRecommended = (model: Model) => model.tags.includes('recommended')\nconst isDeprecated = (model: Model) => model.tags.includes('deprecated')\nconst isLowCost = (model: Model) => model.tags.includes('low-cost')\nconst hasVisionSupport = (model: Model) => model.tags.includes('vision')\nconst isGeneralPurpose = (model: Model) => model.tags.includes('general-purpose')\n\nconst scoreModel = (model: Model, type: 'best' | 'fast', boosts: Record<ModelRef, number> = {}) => {\n let score: number = 0\n\n const scores: Array<[string, boolean, number]> = [\n ['input price penalty', model.input.costPer1MTokens > InputPricePenalty, -1],\n ['output price penalty', model.output.costPer1MTokens > OutputPricePenalty, -1],\n ['low tokens penalty', (model.input.maxTokens ?? 0 + model.output.maxTokens ?? 0) < LowTokensPenalty, -1],\n ['recommended', isRecommended(model), 2],\n ['deprecated', isDeprecated(model), -2],\n ['vision support', hasVisionSupport(model), 1],\n ['general purpose', isGeneralPurpose(model), 1],\n ['vendor preference', VendorPreferences.includes(model.integration), 1],\n ['best model preference', type === 'best' && BestModelPreferences.some((x) => model.id.includes(x)), 1],\n ['fast model preference penalty', type === 'best' && FastModelPreferences.some((x) => model.id.includes(x)), -2],\n ['fast model preference', type === 'fast' && FastModelPreferences.some((x) => model.id.includes(x)), 2],\n ['low cost', type === 'fast' && isLowCost(model), 1],\n ]\n\n for (const rule in boosts) {\n if (model.ref.includes(rule)) {\n scores.push([`boost (${rule})`, true, Number(boosts[rule as ModelRef]) ?? 0] as const)\n }\n }\n\n for (const [, condition, value] of scores) {\n if (condition) {\n score += value\n }\n }\n\n return score\n}\n\nexport const getBestModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'best', boosts) - scoreModel(a, 'best', boosts))\n\nexport const getFastModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'fast', boosts) - scoreModel(a, 'fast', boosts))\n\nexport const pickModel = (models: ModelRef[], downtimes: ModelPreferences['downtimes'] = []) => {\n const copy = [...models]\n const elasped = (date: string) => new Date().getTime() - new Date(date).getTime()\n const DOWNTIME_THRESHOLD = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n if (!copy.length) {\n throw new Error('At least one model is required')\n }\n\n while (copy.length) {\n const ref = copy.shift() as ModelRef\n const downtime = downtimes.find((o) => o.ref === ref && elasped(o.startedAt) < DOWNTIME_THRESHOLD)\n if (downtime) {\n continue\n } else {\n return ref\n }\n }\n\n throw new Error(`All models are down: ${models.join(', ')}`)\n}\n\nexport abstract class ModelProvider {\n public abstract fetchInstalledModels(): Promise<Model[]>\n public abstract fetchModelPreferences(): Promise<ModelPreferences | null>\n public abstract saveModelPreferences(preferences: ModelPreferences): Promise<void>\n public abstract deleteModelPreferences(): Promise<void>\n}\n\nexport class RemoteModelProvider extends ModelProvider {\n private _client: ExtendedClient\n\n public constructor(client: BotpressClientLike) {\n super()\n this._client = getExtendedClient(client)\n }\n\n public async fetchInstalledModels() {\n const { bot } = await this._client.getBot({ id: this._client.botId })\n const models: Model[] = []\n\n const registered = Object.values(bot.integrations).filter((x) => x.status === 'registered')\n\n await Promise.allSettled(\n registered.map(async (integration) => {\n const { output } = await this._client.callAction({\n type: `${integration.name}:listLanguageModels`,\n input: {},\n })\n\n if (!output?.models?.length) {\n return\n }\n\n for (const model of output.models as RawModel[]) {\n if (model.name && model.id && model.input && model.tags) {\n models.push({\n ref: `${integration.name}:${model.id}`,\n integration: integration.name,\n id: model.id,\n name: model.name,\n description: model.description,\n input: model.input,\n output: model.output,\n tags: model.tags,\n })\n }\n }\n })\n )\n\n return models\n }\n\n public async fetchModelPreferences(): Promise<ModelPreferences | null> {\n try {\n const { file } = await this._client.getFile({ id: this._preferenceFileKey })\n\n if (globalThis.fetch !== undefined) {\n const response = await fetch(file.url)\n return (await response.json()) as ModelPreferences\n } else {\n const { data } = await this._client.axios.get(file.url, {\n // we piggy-back axios to avoid adding a new dependency\n // unset all headers to avoid S3 pre-signed signature mismatch\n headers: Object.keys(this._client.config.headers).reduce(\n (acc, key) => {\n acc[key] = undefined\n return acc\n },\n {} as Record<string, undefined>\n ),\n })\n return data as ModelPreferences\n }\n } catch (err) {\n if (isNotFoundError(err)) {\n return null\n }\n\n throw err\n }\n }\n\n public async saveModelPreferences(preferences: ModelPreferences) {\n await this._client.uploadFile({\n key: this._preferenceFileKey,\n content: JSON.stringify(preferences, null, 2),\n index: false,\n tags: {\n system: 'true',\n purpose: 'config',\n },\n })\n }\n\n public async deleteModelPreferences() {\n await this._client.deleteFile({ id: this._preferenceFileKey }).catch(() => {})\n }\n\n private get _preferenceFileKey() {\n return `bot->${this._client.botId}->${PREFERENCES_FILE_SUFFIX}`\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": [null, null, null, null, null, null, null, null, null, "import { backOff } from 'exponential-backoff'\nimport { createNanoEvents, Unsubscribe } from 'nanoevents'\n\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { getActionFromError } from './errors'\nimport { InterceptorManager } from './interceptors'\nimport {\n DOWNTIME_THRESHOLD_MINUTES,\n getBestModels,\n getFastModels,\n Model,\n ModelPreferences,\n ModelProvider,\n ModelRef,\n pickModel,\n RemoteModelProvider,\n} from './models'\nimport { GenerateContentOutput } from './schemas.gen'\nimport { CognitiveProps, Events, InputProps, Request, Response } from './types'\n\nexport class Cognitive {\n public ['$$IS_COGNITIVE'] = true\n\n public static isCognitiveClient(obj: any): obj is Cognitive {\n return obj?.$$IS_COGNITIVE === true\n }\n\n public interceptors = {\n request: new InterceptorManager<Request>(),\n response: new InterceptorManager<Response>(),\n }\n\n private _client: ExtendedClient\n private _preferences: ModelPreferences | null = null\n private _provider: ModelProvider\n private _events = createNanoEvents<Events>()\n private _downtimes: ModelPreferences['downtimes'] = []\n private _models: Model[] = []\n\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n }\n\n public get client(): ExtendedClient {\n return this._client\n }\n\n public on<K extends keyof Events>(this: this, event: K, cb: Events[K]): Unsubscribe {\n return this._events.on(event, cb)\n }\n\n public async fetchInstalledModels(): Promise<Model[]> {\n if (!this._models.length) {\n this._models = await this._provider.fetchInstalledModels()\n }\n\n return this._models\n }\n\n public async fetchPreferences(): Promise<ModelPreferences> {\n if (this._preferences) {\n return this._preferences\n }\n\n this._preferences = await this._provider.fetchModelPreferences()\n\n if (this._preferences) {\n return this._preferences\n }\n\n const models = await this.fetchInstalledModels()\n\n this._preferences = {\n best: getBestModels(models).map((m) => m.ref),\n fast: getFastModels(models).map((m) => m.ref),\n downtimes: [],\n }\n\n await this._provider.saveModelPreferences(this._preferences)\n\n return this._preferences\n }\n\n public async setPreferences(preferences: ModelPreferences, save: boolean = false): Promise<void> {\n this._preferences = preferences\n\n if (save) {\n await this._provider.saveModelPreferences(preferences)\n }\n }\n\n private _cleanupOldDowntimes(): void {\n const now = Date.now()\n const thresholdMs = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n this._preferences!.downtimes = this._preferences!.downtimes.filter((downtime) => {\n const downtimeStart = new Date(downtime.startedAt).getTime()\n return now - downtimeStart <= thresholdMs\n })\n }\n\n private async _selectModel(ref: string): Promise<{ integration: string; model: string }> {\n const parseRef = (ref: string) => {\n const parts = ref.split(':')\n return { integration: parts[0]!, model: parts.slice(1).join(':') }\n }\n\n const preferences = await this.fetchPreferences()\n\n preferences.best ??= []\n preferences.fast ??= []\n preferences.downtimes ??= []\n\n const downtimes = [...preferences.downtimes, ...(this._downtimes ?? [])]\n\n if (ref === 'best') {\n return parseRef(pickModel(preferences.best, downtimes))\n }\n\n if (ref === 'fast') {\n return parseRef(pickModel(preferences.fast, downtimes))\n }\n\n return parseRef(pickModel([ref as ModelRef, ...preferences.best, ...preferences.fast], downtimes))\n }\n\n public async getModelDetails(model: string) {\n await this.fetchInstalledModels()\n const { integration, model: modelName } = await this._selectModel(model)\n const def = this._models.find((m) => m.integration === integration && (m.name === modelName || m.id === modelName))\n if (!def) {\n console.info('Models:', this._models)\n throw new Error(`Model ${modelName} not found`)\n }\n\n return def\n }\n\n public async generateContent(input: InputProps): Promise<Response> {\n const start = Date.now()\n\n const signal = input.signal ?? AbortSignal.timeout(30_000)\n\n const client = this._client.abortable(signal)\n\n let props: Request = { input }\n let integration: string\n let model: string\n\n const { output, meta } = await backOff<{\n output: GenerateContentOutput\n meta: any\n }>(\n async () => {\n const selection = await this._selectModel(input.model ?? 'best')\n\n integration = selection.integration\n model = selection.model\n\n props = await this.interceptors.request.run({ input }, signal)\n\n return client.callAction({\n type: `${integration}:generateContent`,\n input: {\n ...props.input,\n model: { id: model },\n },\n }) as Promise<{ output: GenerateContentOutput; meta: any }>\n },\n {\n retry: async (err, _attempt) => {\n if (signal?.aborted) {\n // We don't want to retry if the request was aborted\n this._events.emit('aborted', props, err)\n return false\n }\n\n if (_attempt > 3) {\n // We don't want to retry more than 3 times\n this._events.emit('error', props, err)\n return false\n }\n\n const action = getActionFromError(err)\n\n if (action === 'abort') {\n this._events.emit('error', props, err)\n return false\n }\n\n if (action === 'fallback') {\n // We don't want to retry if the request was already retried with a fallback model\n this._downtimes.push({\n ref: `${integration!}:${model!}`,\n startedAt: new Date().toISOString(),\n reason: 'Model is down',\n })\n\n this._cleanupOldDowntimes()\n\n await this._provider.saveModelPreferences({\n ...(this._preferences ?? { best: [], downtimes: [], fast: [] }),\n downtimes: [...(this._preferences!.downtimes ?? []), ...(this._downtimes ?? [])],\n })\n\n this._events.emit('fallback', props, err)\n return true\n }\n\n this._events.emit('retry', props, err)\n return true\n },\n }\n )\n\n const response = {\n output,\n meta: {\n cached: meta.cached ?? false,\n model: { integration: integration!, model: model! },\n latency: Date.now() - start,\n cost: { input: output.usage.inputCost, output: output.usage.outputCost },\n tokens: { input: output.usage.inputTokens, output: output.usage.outputTokens },\n },\n } satisfies Response\n\n this._events.emit('response', props, response)\n\n return this.interceptors.response.run(response, signal)\n }\n}\n", "export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let callbacks = this.events[event] || [],\n i = 0,\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n", "import { type Client } from '@botpress/client'\nimport { type AxiosInstance } from 'axios'\nimport { BotpressClientLike } from './types'\n\n/** @internal */\nexport type ExtendedClient = Client & {\n botId: string\n axios: AxiosInstance\n clone: () => ExtendedClient\n abortable: (signal: AbortSignal) => ExtendedClient\n}\n\nexport const getExtendedClient = (client: BotpressClientLike): ExtendedClient => {\n if (\n typeof client.constructor !== 'function' ||\n typeof client.callAction !== 'function' ||\n !client.config ||\n typeof client.config !== 'object' ||\n !client.config.headers\n ) {\n throw new Error('Client must be a valid instance of a Botpress client (@botpress/client)')\n }\n\n const botId = client.config.headers['x-bot-id'] as string\n\n if (!botId?.length) {\n throw new Error('Client must be instanciated with Bot ID')\n }\n\n const clone = () => {\n const c = client as any\n if (c.clone && typeof c.clone === 'function') {\n return getExtendedClient(c.clone())\n }\n return getExtendedClient(new c.constructor(c.config))\n }\n\n return {\n ...client,\n botId,\n axios: (client as any).axiosInstance as AxiosInstance,\n clone,\n abortable: (signal: AbortSignal) => {\n const abortable = clone()\n const instance = abortable.axios\n instance.defaults.signal = signal\n return abortable\n },\n } as ExtendedClient\n}\n", "import { type ErrorType } from '@botpress/client'\n\nexport type BotpressError = {\n isApiError: boolean\n code: number\n description: string\n type: ErrorType\n subtype?: string\n error?: unknown\n metadata?: unknown\n message?: string\n id: string\n}\n\ntype Action = 'fallback' | 'retry' | 'abort'\n\nexport const getActionFromError = (error: any): Action => {\n if (!isBotpressError(error)) {\n return 'retry'\n }\n\n if (error.type === 'InvalidDataFormat') {\n if (error.message?.includes('data/model/id')) {\n // Invalid Model ID, so we want to try another model\n return 'fallback'\n }\n\n // Usually means the request was malformed\n return 'abort'\n }\n\n const subtype = (error.metadata as any)?.subtype\n if (error.type === 'Internal' || subtype === 'UPSTREAM_PROVIDER_FAILED') {\n // The model is degraded, so we want to try another model\n return 'fallback'\n }\n\n return 'abort'\n}\n\nexport const isNotFoundError = (error: any): boolean => isBotpressError(error) && error.type === 'ResourceNotFound'\n\nexport const isForbiddenOrUnauthorizedError = (error: any): boolean =>\n isBotpressError(error) && (error.type === 'Forbidden' || error.type === 'Unauthorized')\n\nexport const isBotpressError = (error: any): error is BotpressError =>\n typeof error === 'object' &&\n error !== null &&\n 'isApiError' in error &&\n 'code' in error &&\n 'type' in error &&\n 'id' in error\n", "export type Callback<T> = (error: any | null, value: T) => void\nexport type Interceptor<T> = (error: any | null, value: T, next: Callback<T>, done: Callback<T>) => Promise<void> | void\n\nexport class InterceptorManager<T> {\n private _interceptors: Interceptor<T>[] = []\n\n public use(interceptor: Interceptor<T>) {\n this._interceptors.push(interceptor)\n return () => this.remove(interceptor)\n }\n\n public remove(interceptor: Interceptor<T>) {\n this._interceptors = this._interceptors.filter((i) => i !== interceptor)\n }\n\n public async run(value: T, signal: AbortSignal): Promise<T> {\n let error: any | null = null\n let result: T = value\n let done = false\n\n for (const interceptor of this._interceptors) {\n if (done) {\n break\n }\n\n if (signal.aborted) {\n throw signal.reason\n }\n\n await new Promise<void>((resolve) => {\n void interceptor(\n error,\n result,\n (err, val) => {\n error = err\n result = val\n resolve()\n },\n (err, val) => {\n error = err\n result = val\n done = true\n resolve()\n }\n )\n })\n }\n\n if (error) {\n throw error\n }\n\n return result\n }\n}\n", "import { ExtendedClient, getExtendedClient } from './bp-client'\nimport { isForbiddenOrUnauthorizedError, isNotFoundError } from './errors'\nimport { Model as RawModel } from './schemas.gen'\nimport { BotpressClientLike } from './types'\n\nexport const DOWNTIME_THRESHOLD_MINUTES = 5\nconst PREFERENCES_FILE_SUFFIX = 'models.config.json'\n\nexport const DEFAULT_INTEGRATIONS = ['google-ai', 'anthropic', 'openai', 'cerebras', 'fireworks-ai', 'groq']\n\n// Biases for vendors and models\nconst VendorPreferences = ['google-ai', 'anthropic', 'openai']\nconst BestModelPreferences = ['4o', '3-5-sonnet', 'gemini-1.5-pro']\nconst FastModelPreferences = ['gemini-1.5-flash', '4o-mini', 'flash', 'haiku']\n\nconst InputPricePenalty = 3 // $3 per 1M tokens\nconst OutputPricePenalty = 10 // $10 per 1M tokens\nconst LowTokensPenalty = 128_000 // 128k tokens\n\nexport type Model = RawModel & {\n ref: ModelRef\n integration: string\n}\n\nexport type ModelRef = `${string}:${string}`\n\nexport type ModelPreferences = {\n best: ModelRef[]\n fast: ModelRef[]\n downtimes: Array<{ ref: ModelRef; startedAt: string; reason: string }>\n}\n\nconst isRecommended = (model: Model) => model.tags.includes('recommended')\nconst isDeprecated = (model: Model) => model.tags.includes('deprecated')\nconst isLowCost = (model: Model) => model.tags.includes('low-cost')\nconst hasVisionSupport = (model: Model) => model.tags.includes('vision')\nconst isGeneralPurpose = (model: Model) => model.tags.includes('general-purpose')\n\nconst scoreModel = (model: Model, type: 'best' | 'fast', boosts: Record<ModelRef, number> = {}) => {\n let score: number = 0\n\n const scores: Array<[string, boolean, number]> = [\n ['input price penalty', model.input.costPer1MTokens > InputPricePenalty, -1],\n ['output price penalty', model.output.costPer1MTokens > OutputPricePenalty, -1],\n ['low tokens penalty', (model.input.maxTokens ?? 0 + model.output.maxTokens ?? 0) < LowTokensPenalty, -1],\n ['recommended', isRecommended(model), 2],\n ['deprecated', isDeprecated(model), -2],\n ['vision support', hasVisionSupport(model), 1],\n ['general purpose', isGeneralPurpose(model), 1],\n ['vendor preference', VendorPreferences.includes(model.integration), 1],\n ['best model preference', type === 'best' && BestModelPreferences.some((x) => model.id.includes(x)), 1],\n ['fast model preference penalty', type === 'best' && FastModelPreferences.some((x) => model.id.includes(x)), -2],\n ['fast model preference', type === 'fast' && FastModelPreferences.some((x) => model.id.includes(x)), 2],\n ['low cost', type === 'fast' && isLowCost(model), 1],\n ]\n\n for (const rule in boosts) {\n if (model.ref.includes(rule)) {\n scores.push([`boost (${rule})`, true, Number(boosts[rule as ModelRef]) ?? 0] as const)\n }\n }\n\n for (const [, condition, value] of scores) {\n if (condition) {\n score += value\n }\n }\n\n return score\n}\n\nexport const getBestModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'best', boosts) - scoreModel(a, 'best', boosts))\n\nexport const getFastModels = (models: Model[], boosts: Record<ModelRef, number> = {}) =>\n models.sort((a, b) => scoreModel(b, 'fast', boosts) - scoreModel(a, 'fast', boosts))\n\nexport const pickModel = (models: ModelRef[], downtimes: ModelPreferences['downtimes'] = []) => {\n const copy = [...models]\n const elasped = (date: string) => new Date().getTime() - new Date(date).getTime()\n const DOWNTIME_THRESHOLD = 1000 * 60 * DOWNTIME_THRESHOLD_MINUTES\n\n if (!copy.length) {\n throw new Error('At least one model is required')\n }\n\n while (copy.length) {\n const ref = copy.shift() as ModelRef\n const downtime = downtimes.find((o) => o.ref === ref && elasped(o.startedAt) < DOWNTIME_THRESHOLD)\n if (downtime) {\n continue\n } else {\n return ref\n }\n }\n\n throw new Error(`All models are down: ${models.join(', ')}`)\n}\n\nexport abstract class ModelProvider {\n public abstract fetchInstalledModels(): Promise<Model[]>\n public abstract fetchModelPreferences(): Promise<ModelPreferences | null>\n public abstract saveModelPreferences(preferences: ModelPreferences): Promise<void>\n public abstract deleteModelPreferences(): Promise<void>\n}\n\nexport class RemoteModelProvider extends ModelProvider {\n private _client: ExtendedClient\n\n public constructor(client: BotpressClientLike) {\n super()\n this._client = getExtendedClient(client)\n }\n\n private async _fetchInstalledIntegrationNames() {\n try {\n const { bot } = await this._client.getBot({ id: this._client.botId })\n const integrations = Object.values(bot.integrations).filter((x) => x.status === 'registered')\n return integrations.map((x) => x.name)\n } catch (err) {\n if (isForbiddenOrUnauthorizedError(err)) {\n // This happens when the bot (with a BAK token) tries to access the .getBot endpoint\n return DEFAULT_INTEGRATIONS\n }\n\n throw err\n }\n }\n\n public async fetchInstalledModels() {\n const integrationNames = await this._fetchInstalledIntegrationNames()\n const models: Model[] = []\n\n await Promise.allSettled(\n integrationNames.map(async (integration) => {\n const { output } = await this._client.callAction({\n type: `${integration}:listLanguageModels`,\n input: {},\n })\n\n if (!output?.models?.length) {\n return\n }\n\n for (const model of output.models as RawModel[]) {\n if (model.name && model.id && model.input && model.tags) {\n models.push({\n ref: `${integration}:${model.id}`,\n integration,\n id: model.id,\n name: model.name,\n description: model.description,\n input: model.input,\n output: model.output,\n tags: model.tags,\n })\n }\n }\n })\n )\n\n return models\n }\n\n public async fetchModelPreferences(): Promise<ModelPreferences | null> {\n try {\n const { file } = await this._client.getFile({ id: this._preferenceFileKey })\n\n if (globalThis.fetch !== undefined) {\n const response = await fetch(file.url)\n return (await response.json()) as ModelPreferences\n } else {\n const { data } = await this._client.axios.get(file.url, {\n // we piggy-back axios to avoid adding a new dependency\n // unset all headers to avoid S3 pre-signed signature mismatch\n headers: Object.keys(this._client.config.headers).reduce(\n (acc, key) => {\n acc[key] = undefined\n return acc\n },\n {} as Record<string, undefined>\n ),\n })\n return data as ModelPreferences\n }\n } catch (err) {\n if (isNotFoundError(err)) {\n return null\n }\n\n throw err\n }\n }\n\n public async saveModelPreferences(preferences: ModelPreferences) {\n await this._client.uploadFile({\n key: this._preferenceFileKey,\n content: JSON.stringify(preferences, null, 2),\n index: false,\n tags: {\n system: 'true',\n purpose: 'config',\n },\n })\n }\n\n public async deleteModelPreferences() {\n await this._client.deleteFile({ id: this._preferenceFileKey }).catch(() => {})\n }\n\n private get _preferenceFileKey() {\n return `bot->${this._client.botId}->${PREFERENCES_FILE_SUFFIX}`\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,QAAM,iBAAkC;MACtC,mBAAmB;MACnB,QAAQ;MACR,UAAU;MACV,eAAe;MACf,OAAO,WAAA;AAAM,eAAA;MAAA;MACb,eAAe;MACf,cAAc;;AAGhB,aAAgB,oBAAoB,SAAuB;AACzD,UAAM,YAAS,SAAA,SAAA,CAAA,GAAyB,cAAc,GAAK,OAAO;AAElE,UAAI,UAAU,gBAAgB,GAAG;AAC/B,kBAAU,gBAAgB;;AAG5B,aAAO;IACT;AARA,YAAA,sBAAA;;;;;;;;;ACxBA,aAAgB,WAAW,OAAa;AACpC,UAAM,gBAAgB,KAAK,OAAM,IAAK;AACtC,aAAO,KAAK,MAAM,aAAa;IACnC;AAHA,YAAA,aAAA;;;;;;;;;ACAA,aAAgB,SAAS,OAAa;AAClC,aAAO;IACX;AAFA,YAAA,WAAA;;;;;;;;;ACCA,QAAA,gBAAA;AACA,QAAA,cAAA;AAIA,aAAgB,cAAc,SAAwB;AACpD,cAAQ,QAAQ,QAAQ;QACtB,KAAK;AACH,iBAAO,cAAA;QAET,KAAK;QACL;AACE,iBAAO,YAAA;;IAEb;AATA,YAAA,gBAAA;;;;;;;;;ACJA,QAAA,mBAAA;AAEA,QAAA;;MAAA,WAAA;AAEE,iBAAAA,OAAoB,SAAwB;AAAxB,eAAA,UAAA;AADV,eAAA,UAAU;QAC2B;AAExC,QAAAA,OAAA,UAAA,QAAP,WAAA;AAAA,cAAA,QAAA;AACE,iBAAO,IAAI,QAAQ,SAAA,SAAO;AAAI,mBAAA,WAAW,SAAS,MAAK,aAAa;UAAtC,CAAuC;QACvE;AAEO,QAAAA,OAAA,UAAA,mBAAP,SAAwB,SAAe;AACrC,eAAK,UAAU;QACjB;AAEA,eAAA,eAAYA,OAAA,WAAA,iBAAa;eAAzB,WAAA;AACE,gBAAM,SAAS,iBAAA,cAAc,KAAK,OAAO;AACzC,mBAAO,OAAO,KAAK,KAAK;UAC1B;;;;AAEA,eAAA,eAAYA,OAAA,WAAA,SAAK;eAAjB,WAAA;AACE,gBAAM,WAAW,KAAK,QAAQ;AAC9B,gBAAM,OAAO,KAAK,QAAQ;AAC1B,gBAAM,QAAQ,KAAK;AACnB,gBAAM,QAAQ,WAAW,KAAK,IAAI,MAAM,KAAK;AAE7C,mBAAO,KAAK,IAAI,OAAO,KAAK,QAAQ,QAAQ;UAC9C;;;;AAEA,eAAA,eAAcA,OAAA,WAAA,wBAAoB;eAAlC,WAAA;AACE,mBAAO,KAAK;UACd;;;;AACF,eAAAA;MAAA,EA7BA;;AAAsB,YAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJtB,QAAA,eAAA;AAEA,QAAA;;MAAA,SAAA,QAAA;AAAoC,kBAAAC,iBAAA,MAAA;AAApC,iBAAAA,kBAAA;;QAYA;AAXiB,QAAAA,gBAAA,UAAA,QAAb,WAAA;;;AACI,qBAAA,CAAA,GAAO,KAAK,iBAAiB,OAAO,OAAA,UAAM,MAAK,KAAA,IAAA,CAAE;;;;AAGrD,eAAA,eAAYA,gBAAA,WAAA,kBAAc;eAA1B,WAAA;AACI,mBAAO,KAAK,YAAY;UAC5B;;;;AAEA,eAAA,eAAcA,gBAAA,WAAA,wBAAoB;eAAlC,WAAA;AACI,mBAAO,KAAK,UAAU;UAC1B;;;;AACJ,eAAAA;MAAA,EAZoC,aAAA,KAAK;;AAA5B,YAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFb,QAAA,eAAA;AAEA,QAAA;;MAAA,SAAA,QAAA;AAAiC,kBAAAC,cAAA,MAAA;AAAjC,iBAAAA,eAAA;;QAAwC;AAAA,eAAAA;MAAA,EAAP,aAAA,KAAK;;AAAzB,YAAA,cAAA;;;;;;;;;ACDb,QAAA,qBAAA;AACA,QAAA,iBAAA;AAGA,aAAgB,aAAa,SAA0B,SAAe;AAClE,UAAM,QAAQ,eAAe,OAAO;AACpC,YAAM,iBAAiB,OAAO;AAC9B,aAAO;IACX;AAJA,YAAA,eAAA;AAMA,aAAS,eAAe,SAAwB;AAC5C,UAAI,CAAC,QAAQ,mBAAmB;AAC5B,eAAO,IAAI,mBAAA,eAAe,OAAO;;AAGrC,aAAO,IAAI,eAAA,YAAY,OAAO;IAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjBA,QAAA,YAAA;AAKA,QAAA,kBAAA;AAIA,aAAsBC,SACpB,SACA,SAA4B;AAA5B,UAAA,YAAA,QAAA;AAAA,kBAAA,CAAA;MAA4B;;;;;;AAEtB,iCAAmB,UAAA,oBAAoB,OAAO;AAC9C,cAAAA,WAAU,IAAI,QAAQ,SAAS,gBAAgB;AAE9C,qBAAA,CAAA,GAAMA,SAAQ,QAAO,CAAE;;AAA9B,qBAAA,CAAA,GAAO,GAAA,KAAA,CAAuB;;;;;AAPhC,YAAA,UAAAA;AAUA,QAAA;;MAAA,WAAA;AAGE,iBAAAC,SACU,SACA,SAAwB;AADxB,eAAA,UAAA;AACA,eAAA,UAAA;AAJF,eAAA,gBAAgB;QAKrB;AAEU,QAAAA,SAAA,UAAA,UAAb,WAAA;;;;;;uBACS,CAAC,KAAK;AAAmB,2BAAA,CAAA,GAAA,CAAA;;;;AAE5B,yBAAA,CAAA,GAAM,KAAK,WAAU,CAAE;;AAAvB,qBAAA,KAAA;AACO,yBAAA,CAAA,GAAM,KAAK,QAAO,CAAE;;AAA3B,yBAAA,CAAA,GAAO,GAAA,KAAA,CAAoB;;;AAE3B,uBAAK;AACe,yBAAA,CAAA,GAAM,KAAK,QAAQ,MAAM,KAAG,KAAK,aAAa,CAAC;;AAA7D,gCAAc,GAAA,KAAA;AAEpB,sBAAI,CAAC,eAAe,KAAK,qBAAqB;AAC5C,0BAAM;;;;;;AAKZ,wBAAM,IAAI,MAAM,uBAAuB;;;;;AAGzC,eAAA,eAAYA,SAAA,WAAA,uBAAmB;eAA/B,WAAA;AACE,mBAAO,KAAK,iBAAiB,KAAK,QAAQ;UAC5C;;;;AAEc,QAAAA,SAAA,UAAA,aAAd,WAAA;;;;;;AACQ,0BAAQ,gBAAA,aAAa,KAAK,SAAS,KAAK,aAAa;AAC3D,yBAAA,CAAA,GAAM,MAAM,MAAK,CAAE;;AAAnB,qBAAA,KAAA;;;;;;;;;AAEJ,eAAAA;MAAA,EAlCA;;;;;;ACnBA,iCAAwB;;;ACAjB,IAAI,mBAAmB,OAAO;AAAA,EACnC,KAAK,UAAU,MAAM;AACnB,aACM,YAAY,KAAK,OAAO,KAAK,KAAK,CAAC,GACrC,IAAI,GACJ,SAAS,UAAU,QACrB,IAAI,QACJ,KACA;AACA,gBAAU,CAAC,EAAE,GAAG,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EACA,QAAQ,CAAC;AAAA,EACT,GAAG,OAAO,IAAI;AACZ;AAAC,KAAC,KAAK,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,EAAE;AACpC,WAAO,MAAM;AACX,WAAK,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,GAAG,OAAO,OAAK,OAAO,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;;;ACPO,IAAM,oBAAoB,CAAC,WAA+C;AAC/E,MACE,OAAO,OAAO,gBAAgB,cAC9B,OAAO,OAAO,eAAe,cAC7B,CAAC,OAAO,UACR,OAAO,OAAO,WAAW,YACzB,CAAC,OAAO,OAAO,SACf;AACA,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AAEA,QAAM,QAAQ,OAAO,OAAO,QAAQ,UAAU;AAE9C,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,QAAQ,MAAM;AAClB,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,OAAO,EAAE,UAAU,YAAY;AAC5C,aAAO,kBAAkB,EAAE,MAAM,CAAC;AAAA,IACpC;AACA,WAAO,kBAAkB,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,OAAQ,OAAe;AAAA,IACvB;AAAA,IACA,WAAW,CAAC,WAAwB;AAClC,YAAM,YAAY,MAAM;AACxB,YAAM,WAAW,UAAU;AAC3B,eAAS,SAAS,SAAS;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACjCO,IAAM,qBAAqB,CAAC,UAAuB;AACxD,MAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,qBAAqB;AACtC,QAAI,MAAM,SAAS,SAAS,eAAe,GAAG;AAE5C,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAEA,QAAM,UAAW,MAAM,UAAkB;AACzC,MAAI,MAAM,SAAS,cAAc,YAAY,4BAA4B;AAEvE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,kBAAkB,CAAC,UAAwB,gBAAgB,KAAK,KAAK,MAAM,SAAS;AAE1F,IAAM,iCAAiC,CAAC,UAC7C,gBAAgB,KAAK,MAAM,MAAM,SAAS,eAAe,MAAM,SAAS;AAEnE,IAAM,kBAAkB,CAAC,UAC9B,OAAO,UAAU,YACjB,UAAU,QACV,gBAAgB,SAChB,UAAU,SACV,UAAU,SACV,QAAQ;;;AChDH,IAAM,qBAAN,MAA4B;AAAA,EACzB,gBAAkC,CAAC;AAAA,EAEpC,IAAI,aAA6B;AACtC,SAAK,cAAc,KAAK,WAAW;AACnC,WAAO,MAAM,KAAK,OAAO,WAAW;AAAA,EACtC;AAAA,EAEO,OAAO,aAA6B;AACzC,SAAK,gBAAgB,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,WAAW;AAAA,EACzE;AAAA,EAEA,MAAa,IAAI,OAAU,QAAiC;AAC1D,QAAI,QAAoB;AACxB,QAAI,SAAY;AAChB,QAAI,OAAO;AAEX,eAAW,eAAe,KAAK,eAAe;AAC5C,UAAI,MAAM;AACR;AAAA,MACF;AAEA,UAAI,OAAO,SAAS;AAClB,cAAM,OAAO;AAAA,MACf;AAEA,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,aAAK;AAAA,UACH;AAAA,UACA;AAAA,UACA,CAAC,KAAK,QAAQ;AACZ,oBAAQ;AACR,qBAAS;AACT,oBAAQ;AAAA,UACV;AAAA,UACA,CAAC,KAAK,QAAQ;AACZ,oBAAQ;AACR,qBAAS;AACT,mBAAO;AACP,oBAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,OAAO;AACT,YAAM;AAAA,IACR;AAEA,WAAO;AAAA,EACT;AACF;;;ACjDO,IAAM,6BAA6B;AAC1C,IAAM,0BAA0B;AAEzB,IAAM,uBAAuB,CAAC,aAAa,aAAa,UAAU,YAAY,gBAAgB,MAAM;AAG3G,IAAM,oBAAoB,CAAC,aAAa,aAAa,QAAQ;AAC7D,IAAM,uBAAuB,CAAC,MAAM,cAAc,gBAAgB;AAClE,IAAM,uBAAuB,CAAC,oBAAoB,WAAW,SAAS,OAAO;AAE7E,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAezB,IAAM,gBAAgB,CAAC,UAAiB,MAAM,KAAK,SAAS,aAAa;AACzE,IAAM,eAAe,CAAC,UAAiB,MAAM,KAAK,SAAS,YAAY;AACvE,IAAM,YAAY,CAAC,UAAiB,MAAM,KAAK,SAAS,UAAU;AAClE,IAAM,mBAAmB,CAAC,UAAiB,MAAM,KAAK,SAAS,QAAQ;AACvE,IAAM,mBAAmB,CAAC,UAAiB,MAAM,KAAK,SAAS,iBAAiB;AAEhF,IAAM,aAAa,CAAC,OAAc,MAAuB,SAAmC,CAAC,MAAM;AACjG,MAAI,QAAgB;AAEpB,QAAM,SAA2C;AAAA,IAC/C,CAAC,uBAAuB,MAAM,MAAM,kBAAkB,mBAAmB,EAAE;AAAA,IAC3E,CAAC,wBAAwB,MAAM,OAAO,kBAAkB,oBAAoB,EAAE;AAAA,IAC9E,CAAC,uBAAuB,MAAM,MAAM,aAAa,IAAI,MAAM,OAAO,aAAa,KAAK,kBAAkB,EAAE;AAAA,IACxG,CAAC,eAAe,cAAc,KAAK,GAAG,CAAC;AAAA,IACvC,CAAC,cAAc,aAAa,KAAK,GAAG,EAAE;AAAA,IACtC,CAAC,kBAAkB,iBAAiB,KAAK,GAAG,CAAC;AAAA,IAC7C,CAAC,mBAAmB,iBAAiB,KAAK,GAAG,CAAC;AAAA,IAC9C,CAAC,qBAAqB,kBAAkB,SAAS,MAAM,WAAW,GAAG,CAAC;AAAA,IACtE,CAAC,yBAAyB,SAAS,UAAU,qBAAqB,KAAK,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC;AAAA,IACtG,CAAC,iCAAiC,SAAS,UAAU,qBAAqB,KAAK,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE;AAAA,IAC/G,CAAC,yBAAyB,SAAS,UAAU,qBAAqB,KAAK,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC;AAAA,IACtG,CAAC,YAAY,SAAS,UAAU,UAAU,KAAK,GAAG,CAAC;AAAA,EACrD;AAEA,aAAW,QAAQ,QAAQ;AACzB,QAAI,MAAM,IAAI,SAAS,IAAI,GAAG;AAC5B,aAAO,KAAK,CAAC,UAAU,SAAS,MAAM,OAAO,OAAO,IAAgB,CAAC,KAAK,CAAC,CAAU;AAAA,IACvF;AAAA,EACF;AAEA,aAAW,CAAC,EAAE,WAAW,KAAK,KAAK,QAAQ;AACzC,QAAI,WAAW;AACb,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,gBAAgB,CAAC,QAAiB,SAAmC,CAAC,MACjF,OAAO,KAAK,CAAC,GAAG,MAAM,WAAW,GAAG,QAAQ,MAAM,IAAI,WAAW,GAAG,QAAQ,MAAM,CAAC;AAE9E,IAAM,gBAAgB,CAAC,QAAiB,SAAmC,CAAC,MACjF,OAAO,KAAK,CAAC,GAAG,MAAM,WAAW,GAAG,QAAQ,MAAM,IAAI,WAAW,GAAG,QAAQ,MAAM,CAAC;AAE9E,IAAM,YAAY,CAAC,QAAoB,YAA2C,CAAC,MAAM;AAC9F,QAAM,OAAO,CAAC,GAAG,MAAM;AACvB,QAAM,UAAU,CAAC,SAAiB,IAAI,KAAK,EAAE,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,QAAQ;AAChF,QAAM,qBAAqB,MAAO,KAAK;AAEvC,MAAI,CAAC,KAAK,QAAQ;AAChB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,SAAO,KAAK,QAAQ;AAClB,UAAM,MAAM,KAAK,MAAM;AACvB,UAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO,QAAQ,EAAE,SAAS,IAAI,kBAAkB;AACjG,QAAI,UAAU;AACZ;AAAA,IACF,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,wBAAwB,OAAO,KAAK,IAAI,GAAG;AAC7D;AAEO,IAAe,gBAAf,MAA6B;AAKpC;AAEO,IAAM,sBAAN,cAAkC,cAAc;AAAA,EAC7C;AAAA,EAED,YAAY,QAA4B;AAC7C,UAAM;AACN,SAAK,UAAU,kBAAkB,MAAM;AAAA,EACzC;AAAA,EAEA,MAAc,kCAAkC;AAC9C,QAAI;AACF,YAAM,EAAE,IAAI,IAAI,MAAM,KAAK,QAAQ,OAAO,EAAE,IAAI,KAAK,QAAQ,MAAM,CAAC;AACpE,YAAM,eAAe,OAAO,OAAO,IAAI,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AAC5F,aAAO,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACvC,SAAS,KAAP;AACA,UAAI,+BAA+B,GAAG,GAAG;AAEvC,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,uBAAuB;AAClC,UAAM,mBAAmB,MAAM,KAAK,gCAAgC;AACpE,UAAM,SAAkB,CAAC;AAEzB,UAAM,QAAQ;AAAA,MACZ,iBAAiB,IAAI,OAAO,gBAAgB;AAC1C,cAAM,EAAE,OAAO,IAAI,MAAM,KAAK,QAAQ,WAAW;AAAA,UAC/C,MAAM,GAAG;AAAA,UACT,OAAO,CAAC;AAAA,QACV,CAAC;AAED,YAAI,CAAC,QAAQ,QAAQ,QAAQ;AAC3B;AAAA,QACF;AAEA,mBAAW,SAAS,OAAO,QAAsB;AAC/C,cAAI,MAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,MAAM,MAAM;AACvD,mBAAO,KAAK;AAAA,cACV,KAAK,GAAG,eAAe,MAAM;AAAA,cAC7B;AAAA,cACA,IAAI,MAAM;AAAA,cACV,MAAM,MAAM;AAAA,cACZ,aAAa,MAAM;AAAA,cACnB,OAAO,MAAM;AAAA,cACb,QAAQ,MAAM;AAAA,cACd,MAAM,MAAM;AAAA,YACd,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,wBAA0D;AACrE,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,QAAQ,QAAQ,EAAE,IAAI,KAAK,mBAAmB,CAAC;AAE3E,UAAI,WAAW,UAAU,QAAW;AAClC,cAAM,WAAW,MAAM,MAAM,KAAK,GAAG;AACrC,eAAQ,MAAM,SAAS,KAAK;AAAA,MAC9B,OAAO;AACL,cAAM,EAAE,KAAK,IAAI,MAAM,KAAK,QAAQ,MAAM,IAAI,KAAK,KAAK;AAAA;AAAA;AAAA,UAGtD,SAAS,OAAO,KAAK,KAAK,QAAQ,OAAO,OAAO,EAAE;AAAA,YAChD,CAAC,KAAK,QAAQ;AACZ,kBAAI,GAAG,IAAI;AACX,qBAAO;AAAA,YACT;AAAA,YACA,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF,SAAS,KAAP;AACA,UAAI,gBAAgB,GAAG,GAAG;AACxB,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,qBAAqB,aAA+B;AAC/D,UAAM,KAAK,QAAQ,WAAW;AAAA,MAC5B,KAAK,KAAK;AAAA,MACV,SAAS,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,MAC5C,OAAO;AAAA,MACP,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,yBAAyB;AACpC,UAAM,KAAK,QAAQ,WAAW,EAAE,IAAI,KAAK,mBAAmB,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/E;AAAA,EAEA,IAAY,qBAAqB;AAC/B,WAAO,QAAQ,KAAK,QAAQ,UAAU;AAAA,EACxC;AACF;;;ALjMO,IAAM,YAAN,MAAgB;AAAA,EACrB,CAAQ,gBAAgB,IAAI;AAAA,EAE5B,OAAc,kBAAkB,KAA4B;AAC1D,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAEO,eAAe;AAAA,IACpB,SAAS,IAAI,mBAA4B;AAAA,IACzC,UAAU,IAAI,mBAA6B;AAAA,EAC7C;AAAA,EAEQ;AAAA,EACA,eAAwC;AAAA,EACxC;AAAA,EACA,UAAU,iBAAyB;AAAA,EACnC,aAA4C,CAAC;AAAA,EAC7C,UAAmB,CAAC;AAAA,EAErB,YAAY,OAAuB;AACxC,SAAK,UAAU,kBAAkB,MAAM,MAAM;AAC7C,SAAK,YAAY,MAAM,YAAY,IAAI,oBAAoB,MAAM,MAAM;AAAA,EACzE;AAAA,EAEA,IAAW,SAAyB;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,GAAuC,OAAU,IAA4B;AAClF,WAAO,KAAK,QAAQ,GAAG,OAAO,EAAE;AAAA,EAClC;AAAA,EAEA,MAAa,uBAAyC;AACpD,QAAI,CAAC,KAAK,QAAQ,QAAQ;AACxB,WAAK,UAAU,MAAM,KAAK,UAAU,qBAAqB;AAAA,IAC3D;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,mBAA8C;AACzD,QAAI,KAAK,cAAc;AACrB,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,eAAe,MAAM,KAAK,UAAU,sBAAsB;AAE/D,QAAI,KAAK,cAAc;AACrB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,SAAS,MAAM,KAAK,qBAAqB;AAE/C,SAAK,eAAe;AAAA,MAClB,MAAM,cAAc,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,MAC5C,MAAM,cAAc,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,MAC5C,WAAW,CAAC;AAAA,IACd;AAEA,UAAM,KAAK,UAAU,qBAAqB,KAAK,YAAY;AAE3D,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,eAAe,aAA+B,OAAgB,OAAsB;AAC/F,SAAK,eAAe;AAEpB,QAAI,MAAM;AACR,YAAM,KAAK,UAAU,qBAAqB,WAAW;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,cAAc,MAAO,KAAK;AAEhC,SAAK,aAAc,YAAY,KAAK,aAAc,UAAU,OAAO,CAAC,aAAa;AAC/E,YAAM,gBAAgB,IAAI,KAAK,SAAS,SAAS,EAAE,QAAQ;AAC3D,aAAO,MAAM,iBAAiB;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,aAAa,KAA8D;AACvF,UAAM,WAAW,CAACC,SAAgB;AAChC,YAAM,QAAQA,KAAI,MAAM,GAAG;AAC3B,aAAO,EAAE,aAAa,MAAM,CAAC,GAAI,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE;AAAA,IACnE;AAEA,UAAM,cAAc,MAAM,KAAK,iBAAiB;AAEhD,gBAAY,SAAS,CAAC;AACtB,gBAAY,SAAS,CAAC;AACtB,gBAAY,cAAc,CAAC;AAE3B,UAAM,YAAY,CAAC,GAAG,YAAY,WAAW,GAAI,KAAK,cAAc,CAAC,CAAE;AAEvE,QAAI,QAAQ,QAAQ;AAClB,aAAO,SAAS,UAAU,YAAY,MAAM,SAAS,CAAC;AAAA,IACxD;AAEA,QAAI,QAAQ,QAAQ;AAClB,aAAO,SAAS,UAAU,YAAY,MAAM,SAAS,CAAC;AAAA,IACxD;AAEA,WAAO,SAAS,UAAU,CAAC,KAAiB,GAAG,YAAY,MAAM,GAAG,YAAY,IAAI,GAAG,SAAS,CAAC;AAAA,EACnG;AAAA,EAEA,MAAa,gBAAgB,OAAe;AAC1C,UAAM,KAAK,qBAAqB;AAChC,UAAM,EAAE,aAAa,OAAO,UAAU,IAAI,MAAM,KAAK,aAAa,KAAK;AACvE,UAAM,MAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,gBAAgB,EAAE,SAAS,aAAa,EAAE,OAAO,UAAU;AAClH,QAAI,CAAC,KAAK;AACR,cAAQ,KAAK,WAAW,KAAK,OAAO;AACpC,YAAM,IAAI,MAAM,SAAS,qBAAqB;AAAA,IAChD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,gBAAgB,OAAsC;AACjE,UAAM,QAAQ,KAAK,IAAI;AAEvB,UAAM,SAAS,MAAM,UAAU,YAAY,QAAQ,GAAM;AAEzD,UAAM,SAAS,KAAK,QAAQ,UAAU,MAAM;AAE5C,QAAI,QAAiB,EAAE,MAAM;AAC7B,QAAI;AACJ,QAAI;AAEJ,UAAM,EAAE,QAAQ,KAAK,IAAI,UAAM;AAAA,MAI7B,YAAY;AACV,cAAM,YAAY,MAAM,KAAK,aAAa,MAAM,SAAS,MAAM;AAE/D,sBAAc,UAAU;AACxB,gBAAQ,UAAU;AAElB,gBAAQ,MAAM,KAAK,aAAa,QAAQ,IAAI,EAAE,MAAM,GAAG,MAAM;AAE7D,eAAO,OAAO,WAAW;AAAA,UACvB,MAAM,GAAG;AAAA,UACT,OAAO;AAAA,YACL,GAAG,MAAM;AAAA,YACT,OAAO,EAAE,IAAI,MAAM;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,OAAO,OAAO,KAAK,aAAa;AAC9B,cAAI,QAAQ,SAAS;AAEnB,iBAAK,QAAQ,KAAK,WAAW,OAAO,GAAG;AACvC,mBAAO;AAAA,UACT;AAEA,cAAI,WAAW,GAAG;AAEhB,iBAAK,QAAQ,KAAK,SAAS,OAAO,GAAG;AACrC,mBAAO;AAAA,UACT;AAEA,gBAAM,SAAS,mBAAmB,GAAG;AAErC,cAAI,WAAW,SAAS;AACtB,iBAAK,QAAQ,KAAK,SAAS,OAAO,GAAG;AACrC,mBAAO;AAAA,UACT;AAEA,cAAI,WAAW,YAAY;AAEzB,iBAAK,WAAW,KAAK;AAAA,cACnB,KAAK,GAAG,eAAgB;AAAA,cACxB,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,cAClC,QAAQ;AAAA,YACV,CAAC;AAED,iBAAK,qBAAqB;AAE1B,kBAAM,KAAK,UAAU,qBAAqB;AAAA,cACxC,GAAI,KAAK,gBAAgB,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC,EAAE;AAAA,cAC7D,WAAW,CAAC,GAAI,KAAK,aAAc,aAAa,CAAC,GAAI,GAAI,KAAK,cAAc,CAAC,CAAE;AAAA,YACjF,CAAC;AAED,iBAAK,QAAQ,KAAK,YAAY,OAAO,GAAG;AACxC,mBAAO;AAAA,UACT;AAEA,eAAK,QAAQ,KAAK,SAAS,OAAO,GAAG;AACrC,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,QAAQ,KAAK,UAAU;AAAA,QACvB,OAAO,EAAE,aAA2B,MAAc;AAAA,QAClD,SAAS,KAAK,IAAI,IAAI;AAAA,QACtB,MAAM,EAAE,OAAO,OAAO,MAAM,WAAW,QAAQ,OAAO,MAAM,WAAW;AAAA,QACvE,QAAQ,EAAE,OAAO,OAAO,MAAM,aAAa,QAAQ,OAAO,MAAM,aAAa;AAAA,MAC/E;AAAA,IACF;AAEA,SAAK,QAAQ,KAAK,YAAY,OAAO,QAAQ;AAE7C,WAAO,KAAK,aAAa,SAAS,IAAI,UAAU,MAAM;AAAA,EACxD;AACF;",
6
6
  "names": ["Delay", "SkipFirstDelay", "AlwaysDelay", "backOff", "BackOff", "ref"]
7
7
  }
@@ -3,7 +3,7 @@ import { Cognitive } from '../src/client'
3
3
  import { getTestClient } from './client'
4
4
  import MODELS from './models.json'
5
5
  import { RemoteModelProvider } from '../src/models'
6
- import { GenerateContentOutput } from '../src/llm'
6
+ import { GenerateContentOutput } from '../src/schemas.gen'
7
7
 
8
8
  const RandomResponse = {
9
9
  output: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cognitive",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Wrapper around the Botpress Client to call LLMs",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",