@botpress/cognitive 0.1.1 → 0.1.2

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,28 @@
1
1
 
2
- > @botpress/cognitive@0.1.1 build /home/runner/work/botpress/botpress/packages/cognitive
2
+ > @botpress/cognitive@0.1.2 build /home/runner/work/botpress/botpress/packages/cognitive
3
3
  > pnpm build:type && pnpm build:neutral && size-limit
4
4
 
5
5
 
6
- > @botpress/cognitive@0.1.1 build:type /home/runner/work/botpress/botpress/packages/cognitive
6
+ > @botpress/cognitive@0.1.2 build:type /home/runner/work/botpress/botpress/packages/cognitive
7
7
  > tsup --tsconfig tsconfig.build.json ./src/index.ts --dts-resolve --dts-only --clean
8
8
 
9
9
  CLI Building entry: ./src/index.ts
10
10
  CLI Using tsconfig: tsconfig.build.json
11
11
  CLI tsup v8.0.2
12
12
  DTS Build start
13
- DTS ⚡️ Build success in 7369ms
14
- DTS dist/index.d.ts 8.92 KB
13
+ DTS ⚡️ Build success in 1409ms
14
+ DTS dist/index.d.ts 8.97 KB
15
15
 
16
- > @botpress/cognitive@0.1.1 build:neutral /home/runner/work/botpress/botpress/packages/cognitive
16
+ > @botpress/cognitive@0.1.2 build:neutral /home/runner/work/botpress/botpress/packages/cognitive
17
17
  > ts-node -T ./build.ts --neutral
18
18
 
19
19
  Done
20
20
 
21
21
  dist/index.cjs
22
22
  Size limit: 50 kB
23
- Size: 6.4 kB brotlied
23
+ Size: 6.45 kB brotlied
24
24
 
25
25
  dist/index.mjs
26
26
  Size limit: 50 kB
27
- Size: 6.28 kB brotlied
27
+ Size: 6.33 kB brotlied
28
28
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @botpress/cognitive@0.1.1 generate /home/runner/work/botpress/botpress/packages/cognitive
2
+ > @botpress/cognitive@0.1.2 generate /home/runner/work/botpress/botpress/packages/cognitive
3
3
  > ts-node -T ./types.ts ./src/gen
4
4
 
package/dist/index.cjs CHANGED
@@ -721,7 +721,7 @@ var InterceptorManager = class {
721
721
 
722
722
  // src/models.ts
723
723
  var import_client = require("@botpress/client");
724
- var PreferencesFile = "models.config.json";
724
+ var PREFERENCES_FILE_SUFFIX = "models.config.json";
725
725
  var VendorPreferences = ["google-ai", "anthropic", "openai"];
726
726
  var BestModelPreferences = ["4o", "3-5-sonnet", "gemini-1.5-pro"];
727
727
  var FastModelPreferences = ["gemini-1.5-flash", "4o-mini", "flash", "haiku"];
@@ -822,7 +822,7 @@ var RemoteModelProvider = class extends ModelProvider {
822
822
  }
823
823
  async fetchModelPreferences() {
824
824
  try {
825
- const { file } = await this._client.getFile({ id: PreferencesFile });
825
+ const { file } = await this._client.getFile({ id: this._preferenceFileKey });
826
826
  const { data } = await this._client.axios.get(file.url, {
827
827
  // we piggy-back axios to avoid adding a new dependency
828
828
  // unset all headers to avoid S3 pre-signed signature mismatch
@@ -844,7 +844,7 @@ var RemoteModelProvider = class extends ModelProvider {
844
844
  }
845
845
  async saveModelPreferences(preferences) {
846
846
  await this._client.uploadFile({
847
- key: PreferencesFile,
847
+ key: this._preferenceFileKey,
848
848
  content: JSON.stringify(preferences, null, 2),
849
849
  index: false,
850
850
  tags: {
@@ -854,9 +854,12 @@ var RemoteModelProvider = class extends ModelProvider {
854
854
  });
855
855
  }
856
856
  async deleteModelPreferences() {
857
- await this._client.deleteFile({ id: PreferencesFile }).catch(() => {
857
+ await this._client.deleteFile({ id: this._preferenceFileKey }).catch(() => {
858
858
  });
859
859
  }
860
+ get _preferenceFileKey() {
861
+ return `bot->${this._client.botId}->${PREFERENCES_FILE_SUFFIX}`;
862
+ }
860
863
  };
861
864
 
862
865
  // src/client.ts
@@ -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 } from './models'\n", "import { backOff } from 'exponential-backoff'\nimport { createNanoEvents, Unsubscribe } from 'nanoevents'\n\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { getActionFromError } from './errors'\nimport { type GenerateContentOutput } from './gen'\nimport { InterceptorManager } from './interceptors'\nimport {\n getBestModels,\n getFastModels,\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 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\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n\n // debug('new cognitive client instance created')\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 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._provider.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 if (save) {\n await this._provider.saveModelPreferences(preferences)\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 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 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 if (error.type === 'Internal' || error.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 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 { ResourceNotFoundError } from '@botpress/client'\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { Model as RawModel } from './gen'\nimport { BotpressClientLike } from './types'\n\nconst PreferencesFile = '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 * 5 // 5 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: any[] = []\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 } satisfies Model)\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: PreferencesFile })\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 } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return null\n }\n throw err\n }\n }\n\n public async saveModelPreferences(preferences: ModelPreferences) {\n await this._client.uploadFile({\n key: PreferencesFile,\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: PreferencesFile }).catch(() => {})\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 } from './models'\n", "import { backOff } from 'exponential-backoff'\nimport { createNanoEvents, Unsubscribe } from 'nanoevents'\n\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { getActionFromError } from './errors'\nimport { type GenerateContentOutput } from './gen'\nimport { InterceptorManager } from './interceptors'\nimport {\n getBestModels,\n getFastModels,\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 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\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n\n // debug('new cognitive client instance created')\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 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._provider.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 if (save) {\n await this._provider.saveModelPreferences(preferences)\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 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 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 if (error.type === 'Internal' || error.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 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 { ResourceNotFoundError } from '@botpress/client'\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { Model as RawModel } from './gen'\nimport { BotpressClientLike } from './types'\n\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 * 5 // 5 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: any[] = []\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 } satisfies Model)\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 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 } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return null\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
@@ -128,7 +128,7 @@ type Model$1 = {
128
128
  id: string;
129
129
  name: string;
130
130
  description: string;
131
- tags: Array<"recommended" | "deprecated" | "general-purpose" | "low-cost" | "vision" | "coding" | "agents" | "function-calling" | "roleplay" | "storytelling" | "reasoning">;
131
+ tags: Array<"recommended" | "deprecated" | "general-purpose" | "low-cost" | "vision" | "coding" | "agents" | "function-calling" | "roleplay" | "storytelling" | "reasoning" | "preview">;
132
132
  input: {
133
133
  maxTokens: number;
134
134
  /** Cost per 1 million tokens, in U.S. dollars */
@@ -168,6 +168,7 @@ declare class RemoteModelProvider extends ModelProvider {
168
168
  fetchModelPreferences(): Promise<ModelPreferences | null>;
169
169
  saveModelPreferences(preferences: ModelPreferences): Promise<void>;
170
170
  deleteModelPreferences(): Promise<void>;
171
+ private get _preferenceFileKey();
171
172
  }
172
173
 
173
174
  type BotpressClientLike = {
package/dist/index.mjs CHANGED
@@ -706,7 +706,7 @@ var InterceptorManager = class {
706
706
 
707
707
  // src/models.ts
708
708
  import { ResourceNotFoundError } from "@botpress/client";
709
- var PreferencesFile = "models.config.json";
709
+ var PREFERENCES_FILE_SUFFIX = "models.config.json";
710
710
  var VendorPreferences = ["google-ai", "anthropic", "openai"];
711
711
  var BestModelPreferences = ["4o", "3-5-sonnet", "gemini-1.5-pro"];
712
712
  var FastModelPreferences = ["gemini-1.5-flash", "4o-mini", "flash", "haiku"];
@@ -807,7 +807,7 @@ var RemoteModelProvider = class extends ModelProvider {
807
807
  }
808
808
  async fetchModelPreferences() {
809
809
  try {
810
- const { file } = await this._client.getFile({ id: PreferencesFile });
810
+ const { file } = await this._client.getFile({ id: this._preferenceFileKey });
811
811
  const { data } = await this._client.axios.get(file.url, {
812
812
  // we piggy-back axios to avoid adding a new dependency
813
813
  // unset all headers to avoid S3 pre-signed signature mismatch
@@ -829,7 +829,7 @@ var RemoteModelProvider = class extends ModelProvider {
829
829
  }
830
830
  async saveModelPreferences(preferences) {
831
831
  await this._client.uploadFile({
832
- key: PreferencesFile,
832
+ key: this._preferenceFileKey,
833
833
  content: JSON.stringify(preferences, null, 2),
834
834
  index: false,
835
835
  tags: {
@@ -839,9 +839,12 @@ var RemoteModelProvider = class extends ModelProvider {
839
839
  });
840
840
  }
841
841
  async deleteModelPreferences() {
842
- await this._client.deleteFile({ id: PreferencesFile }).catch(() => {
842
+ await this._client.deleteFile({ id: this._preferenceFileKey }).catch(() => {
843
843
  });
844
844
  }
845
+ get _preferenceFileKey() {
846
+ return `bot->${this._client.botId}->${PREFERENCES_FILE_SUFFIX}`;
847
+ }
845
848
  };
846
849
 
847
850
  // src/client.ts
@@ -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 { type GenerateContentOutput } from './gen'\nimport { InterceptorManager } from './interceptors'\nimport {\n getBestModels,\n getFastModels,\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 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\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n\n // debug('new cognitive client instance created')\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 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._provider.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 if (save) {\n await this._provider.saveModelPreferences(preferences)\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 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 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 if (error.type === 'Internal' || error.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 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 { ResourceNotFoundError } from '@botpress/client'\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { Model as RawModel } from './gen'\nimport { BotpressClientLike } from './types'\n\nconst PreferencesFile = '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 * 5 // 5 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: any[] = []\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 } satisfies Model)\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: PreferencesFile })\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 } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return null\n }\n throw err\n }\n }\n\n public async saveModelPreferences(preferences: ModelPreferences) {\n await this._client.uploadFile({\n key: PreferencesFile,\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: PreferencesFile }).catch(() => {})\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 { type GenerateContentOutput } from './gen'\nimport { InterceptorManager } from './interceptors'\nimport {\n getBestModels,\n getFastModels,\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 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\n public constructor(props: CognitiveProps) {\n this._client = getExtendedClient(props.client)\n this._provider = props.provider ?? new RemoteModelProvider(props.client)\n\n // debug('new cognitive client instance created')\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 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._provider.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 if (save) {\n await this._provider.saveModelPreferences(preferences)\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 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 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 if (error.type === 'Internal' || error.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 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 { ResourceNotFoundError } from '@botpress/client'\nimport { ExtendedClient, getExtendedClient } from './bp-client'\nimport { Model as RawModel } from './gen'\nimport { BotpressClientLike } from './types'\n\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 * 5 // 5 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: any[] = []\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 } satisfies Model)\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 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 } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return null\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
  }
@@ -108,8 +108,7 @@ describe('Remote Model Provider', () => {
108
108
  expect(preferences).toEqual(null)
109
109
  })
110
110
 
111
- // TODO: fix this test
112
- test.skip('save file preferences', async () => {
111
+ test('save file preferences', async () => {
113
112
  const client = getTestClient()
114
113
  const provider = new RemoteModelProvider(client)
115
114
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cognitive",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Wrapper around the Botpress Client to call LLMs",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -31,7 +31,7 @@
31
31
  "devDependencies": {
32
32
  "@botpress/client": "workspace:*",
33
33
  "@botpress/common": "workspace:*",
34
- "@bpinternal/zui": "0.13.4",
34
+ "@bpinternal/zui": "0.13.5",
35
35
  "@size-limit/file": "^11.1.6",
36
36
  "@types/axios": "^0.14.4",
37
37
  "@types/debug": "^4.1.12",