@botpress/zai 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/adapters/adapter.js +2 -0
  2. package/dist/adapters/botpress-table.js +168 -0
  3. package/dist/adapters/memory.js +12 -0
  4. package/dist/index.d.ts +99 -98
  5. package/dist/index.js +9 -1873
  6. package/dist/models.js +387 -0
  7. package/dist/operations/check.js +141 -0
  8. package/dist/operations/constants.js +2 -0
  9. package/dist/operations/errors.js +15 -0
  10. package/dist/operations/extract.js +212 -0
  11. package/dist/operations/filter.js +179 -0
  12. package/dist/operations/label.js +237 -0
  13. package/dist/operations/rewrite.js +111 -0
  14. package/dist/operations/summarize.js +132 -0
  15. package/dist/operations/text.js +46 -0
  16. package/dist/utils.js +43 -0
  17. package/dist/zai.js +140 -0
  18. package/package.json +21 -19
  19. package/src/adapters/adapter.ts +35 -0
  20. package/src/adapters/botpress-table.ts +210 -0
  21. package/src/adapters/memory.ts +13 -0
  22. package/src/index.ts +11 -0
  23. package/src/models.ts +394 -0
  24. package/src/operations/__tests/botpress_docs.txt +26040 -0
  25. package/src/operations/__tests/cache.jsonl +101 -0
  26. package/src/operations/__tests/index.ts +87 -0
  27. package/src/operations/check.ts +187 -0
  28. package/src/operations/constants.ts +2 -0
  29. package/src/operations/errors.ts +9 -0
  30. package/src/operations/extract.ts +291 -0
  31. package/src/operations/filter.ts +231 -0
  32. package/src/operations/label.ts +332 -0
  33. package/src/operations/rewrite.ts +148 -0
  34. package/src/operations/summarize.ts +193 -0
  35. package/src/operations/text.ts +63 -0
  36. package/src/sdk-interfaces/llm/generateContent.ts +127 -0
  37. package/src/sdk-interfaces/llm/listLanguageModels.ts +19 -0
  38. package/src/utils.ts +61 -0
  39. package/src/zai.ts +193 -0
  40. package/tsconfig.json +2 -2
  41. package/dist/index.cjs +0 -1903
  42. package/dist/index.cjs.map +0 -1
  43. package/dist/index.d.cts +0 -916
  44. package/dist/index.js.map +0 -1
  45. package/tsup.config.ts +0 -16
  46. package/vitest.config.ts +0 -9
  47. package/vitest.setup.ts +0 -24
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/zai.ts","../src/adapters/botpress-table.ts","../src/utils.ts","../src/adapters/adapter.ts","../src/adapters/memory.ts","../src/models.ts","../src/operations/text.ts","../src/operations/constants.ts","../src/operations/rewrite.ts","../src/operations/summarize.ts","../src/operations/check.ts","../src/operations/filter.ts","../src/operations/extract.ts","../src/operations/errors.ts","../src/operations/label.ts"],"sourcesContent":["import { Zai } from './zai'\n\nimport './operations/text'\nimport './operations/rewrite'\nimport './operations/summarize'\nimport './operations/check'\nimport './operations/filter'\nimport './operations/extract'\nimport './operations/label'\n\nexport { Zai }\n","import { Client } from '@botpress/client'\nimport sdk from '@botpress/sdk'\nimport { type TextTokenizer, getWasmTokenizer } from '@botpress/wasm'\n\nimport { Adapter } from './adapters/adapter'\nimport { TableAdapter } from './adapters/botpress-table'\nimport { MemoryAdapter } from './adapters/memory'\nimport { Models } from './models'\nimport { llm } from './sdk-interfaces/llm/generateContent'\nimport { BotpressClient, GenerationMetadata } from './utils'\n\nconst { z } = sdk\ntype ModelId = (typeof Models)[number]['id']\n\ntype ActiveLearning = sdk.z.input<typeof ActiveLearning>\nconst ActiveLearning = z.object({\n enable: z.boolean().describe('Whether to enable active learning').default(false),\n tableName: z\n .string()\n .regex(\n /^[A-Za-z0-9_/-]{1,100}Table$/,\n 'Namespace must be alphanumeric and contain only letters, numbers, underscores, hyphens and slashes'\n )\n .describe('The name of the table to store active learning tasks')\n .default('ActiveLearningTable'),\n taskId: z\n .string()\n .regex(\n /^[A-Za-z0-9_/-]{1,100}$/,\n 'Namespace must be alphanumeric and contain only letters, numbers, underscores, hyphens and slashes'\n )\n .describe('The ID of the task')\n .default('default')\n})\n\ntype ZaiConfig = sdk.z.input<typeof ZaiConfig>\nconst ZaiConfig = z.object({\n client: BotpressClient,\n userId: z.string().describe('The ID of the user consuming the API').optional(),\n retry: z.object({ maxRetries: z.number().min(0).max(100) }).default({ maxRetries: 3 }),\n modelId: z\n .custom<ModelId | string>(\n (value) => {\n if (typeof value !== 'string' || !value.includes('__')) {\n return false\n }\n\n return true\n },\n {\n message: 'Invalid model ID'\n }\n )\n .describe('The ID of the model you want to use')\n .default('openai__gpt-4o-mini-2024-07-18' satisfies ModelId),\n activeLearning: ActiveLearning.default({ enable: false }),\n namespace: z\n .string()\n .regex(\n /^[A-Za-z0-9_/-]{1,100}$/,\n 'Namespace must be alphanumeric and contain only letters, numbers, underscores, hyphens and slashes'\n )\n .default('zai')\n})\n\nexport class Zai {\n protected static tokenizer: TextTokenizer = null!\n protected client: Client\n\n private originalConfig: ZaiConfig\n\n private userId: string | undefined\n private integration: string\n private model: string\n private retry: { maxRetries: number }\n\n protected Model: (typeof Models)[number]\n protected namespace: string\n protected adapter: Adapter\n protected activeLearning: ActiveLearning\n\n constructor(config: ZaiConfig) {\n this.originalConfig = config\n const parsed = ZaiConfig.parse(config)\n\n this.client = parsed.client\n const [integration, modelId] = parsed.modelId.split('__')\n\n if (!integration?.length || !modelId?.length) {\n throw new Error(`Invalid model ID: ${parsed.modelId}. Expected format: <integration>__<modelId>`)\n }\n\n this.integration = integration!\n this.model = modelId!\n this.namespace = parsed.namespace\n this.userId = parsed.userId\n this.retry = parsed.retry as { maxRetries: number }\n this.Model = Models.find((m) => m.id === parsed.modelId)!\n this.activeLearning = parsed.activeLearning\n\n this.adapter = parsed.activeLearning?.enable\n ? new TableAdapter({ client: this.client, tableName: parsed.activeLearning.tableName })\n : new MemoryAdapter([])\n }\n\n /** @internal */\n protected async callModel(\n props: Partial<llm.generateContent.Input>\n ): Promise<llm.generateContent.Output & { metadata: GenerationMetadata }> {\n let retries = this.retry.maxRetries\n while (retries-- >= 0) {\n try {\n return await this._callModel(props)\n } catch (e) {\n if (retries >= 0) {\n await new Promise((resolve) => setTimeout(resolve, 1000))\n } else {\n throw new Error('Failed to call model after multiple retries')\n }\n }\n }\n\n throw new Error('Failed to call model after multiple retries')\n }\n\n /** @internal */\n private async _callModel(\n props: Partial<llm.generateContent.Input>\n ): Promise<llm.generateContent.Output & { metadata: GenerationMetadata }> {\n let retries = this.retry.maxRetries\n do {\n const start = Date.now()\n const input: llm.generateContent.Input = {\n messages: [],\n temperature: 0.0,\n topP: 1,\n model: { id: this.model },\n userId: this.userId,\n ...props\n }\n\n const { output } = (await this.client.callAction({\n type: `${this.integration}:generateContent`,\n input\n })) as unknown as { output: llm.generateContent.Output }\n\n const latency = Date.now() - start\n\n return {\n ...output,\n metadata: {\n model: this.model,\n latency,\n cost: { input: output.usage.inputCost, output: output.usage.outputCost },\n tokens: { input: output.usage.inputTokens, output: output.usage.outputTokens }\n }\n }\n } while (--retries > 0)\n }\n\n protected async getTokenizer() {\n Zai.tokenizer ??= await (async () => {\n while (!getWasmTokenizer) {\n // there's an issue with wasm, it doesn't load immediately\n await new Promise((resolve) => setTimeout(resolve, 25))\n }\n return getWasmTokenizer()\n })()\n return Zai.tokenizer\n }\n\n protected get taskId() {\n if (!this.activeLearning.enable) {\n return undefined\n }\n\n return `${this.namespace}/${this.activeLearning.taskId}`.replace(/\\/+/g, '/')\n }\n\n public with(options: Partial<ZaiConfig>): Zai {\n return new Zai({\n ...this.originalConfig,\n ...options\n })\n }\n\n public learn(taskId: string) {\n return new Zai({\n ...this.originalConfig,\n activeLearning: { ...this.activeLearning, taskId, enable: true }\n })\n }\n}\n","import { type Client } from '@botpress/client'\nimport sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport { BotpressClient, GenerationMetadata } from '../utils'\nimport { Adapter, GetExamplesProps, SaveExampleProps } from './adapter'\n\nconst CRITICAL_TAGS = {\n system: 'true',\n 'schema-purpose': 'active-learning',\n 'schema-version': 'Oct-2024'\n} as const\n\nconst OPTIONAL_TAGS = {\n 'x-studio-title': 'Active Learning',\n 'x-studio-description': 'Table for storing active learning tasks and examples',\n 'x-studio-readonly': 'true',\n 'x-studio-icon': 'lucide://atom',\n 'x-studio-color': 'green'\n} as const\n\nconst FACTOR = 30\n\nconst Props = z.object({\n client: BotpressClient,\n tableName: z\n .string()\n .regex(\n /^[a-zA-Z0-9_]{1,45}Table$/,\n 'Table name must be lowercase and contain only letters, numbers and underscores'\n )\n})\n\nexport type TableSchema = sdk.z.input<typeof TableSchema>\nconst TableSchema = z.object({\n taskType: z.string().describe('The type of the task (filter, extract, etc.)'),\n taskId: z.string(),\n key: z.string().describe('A unique key for the task (e.g. a hash of the input, taskId, taskType and instructions)'),\n instructions: z.string(),\n input: z.object({}).passthrough().describe('The input to the task'),\n output: z.object({}).passthrough().describe('The expected output'),\n explanation: z.string().nullable(),\n metadata: GenerationMetadata,\n status: z.enum(['pending', 'rejected', 'approved']),\n feedback: z\n .object({\n rating: z.enum(['very-bad', 'bad', 'good', 'very-good']),\n comment: z.string().nullable()\n })\n .nullable()\n .default(null)\n})\n\nconst searchableColumns = ['input'] as const satisfies Array<keyof typeof TableSchema.shape> as string[]\n\nconst TableJsonSchema = Object.entries(TableSchema.shape).reduce((acc, [key, value]) => {\n acc[key] = value.toJsonSchema()\n acc[key]['x-zui'] ??= {}\n acc[key]['x-zui'].searchable = searchableColumns.includes(key)\n return acc\n}, {})\n\nexport class TableAdapter extends Adapter {\n private client: Client\n private tableName: string\n\n private status: 'initialized' | 'ready' | 'error'\n private errors = [] as string[]\n\n constructor(props: sdk.z.input<typeof Props>) {\n super()\n props = Props.parse(props)\n this.client = props.client\n this.tableName = props.tableName\n this.status = 'ready'\n }\n\n public async getExamples<TInput, TOutput>({ taskType, taskId, input }: GetExamplesProps<TInput>) {\n await this.assertTableExists()\n\n const { rows } = await this.client\n .findTableRows({\n table: this.tableName,\n search: JSON.stringify({ value: input }).substring(0, 1023), // Search is limited to 1024 characters\n limit: 10, // TODO\n filter: {\n // Proximity match of approved examples\n taskType,\n taskId,\n status: 'approved'\n } satisfies Partial<TableSchema>\n })\n .catch((err) => {\n // TODO: handle error\n console.error(`Error fetching examples: ${err.message}`)\n return { rows: [] }\n })\n\n return rows.map((row) => ({\n key: row.key,\n input: row.input.value as TInput,\n output: row.output.value as TOutput,\n explanation: row.explanation,\n similarity: row.similarity ?? 0\n }))\n }\n\n public async saveExample<TInput, TOutput>({\n key,\n taskType,\n taskId,\n instructions,\n input,\n output,\n explanation,\n metadata,\n status = 'pending'\n }: SaveExampleProps<TInput, TOutput>) {\n await this.assertTableExists()\n\n await this.client\n .upsertTableRows({\n table: this.tableName,\n keyColumn: 'key',\n rows: [\n {\n key,\n taskType,\n taskId,\n instructions,\n input: { value: input },\n output: { value: output },\n explanation: explanation ?? null,\n status,\n metadata\n } satisfies TableSchema\n ]\n })\n .catch(() => {\n // TODO: handle error\n })\n }\n\n private async assertTableExists() {\n if (this.status !== 'ready') {\n return\n }\n\n const { table, created } = await this.client\n .getOrCreateTable({\n table: this.tableName,\n factor: FACTOR,\n frozen: true,\n isComputeEnabled: false,\n tags: {\n ...CRITICAL_TAGS,\n ...OPTIONAL_TAGS\n },\n schema: TableJsonSchema\n })\n .catch((err) => {\n this.status = 'error'\n this.errors = [err.message]\n return { table: null, created: false }\n })\n\n if (!table) {\n return\n }\n\n if (!created) {\n const issues: string[] = []\n\n if (table.factor !== FACTOR) {\n issues.push(`Factor is ${table.factor} instead of ${FACTOR}`)\n }\n\n if (table.frozen !== true) {\n issues.push('Table is not frozen')\n }\n\n for (const [key, value] of Object.entries(CRITICAL_TAGS)) {\n if (table.tags?.[key] !== value) {\n issues.push(`Tag ${key} is ${table.tags?.[key]} instead of ${value}`)\n }\n }\n\n for (const key of Object.keys(TableJsonSchema)) {\n const column = table.schema?.properties[key]\n const expected = TableJsonSchema[key] as { type: string }\n\n if (!column) {\n issues.push(`Column ${key} is missing`)\n continue\n }\n\n if (column.type !== expected.type) {\n issues.push(`Column ${key} has type ${column.type} instead of ${expected.type}`)\n }\n\n if (expected['x-zui'].searchable && !column['x-zui'].searchable) {\n issues.push(`Column ${key} is not searchable but should be`)\n }\n }\n\n if (issues.length) {\n this.status = 'error'\n this.errors = issues\n }\n }\n\n this.status = 'initialized'\n }\n}\n","import type { Client } from '@botpress/client'\nimport sdk from '@botpress/sdk'\nconst { z } = sdk\n\nexport const stringify = (input: unknown, beautify = true) => {\n return typeof input === 'string' && !!input.length\n ? input\n : input\n ? JSON.stringify(input, beautify ? null : undefined, beautify ? 2 : undefined)\n : '<input is null, false, undefined or empty>'\n}\n\nexport const BotpressClient = z.custom<Client>(\n (value) =>\n typeof value === 'object' && value !== null && 'callAction' in value && typeof value.callAction === 'function',\n {\n message: 'Invalid Botpress Client. Make sure to pass an instance of @botpress/client'\n }\n)\n\nexport function fastHash(str: string): string {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n hash = (hash << 5) - hash + str.charCodeAt(i)\n hash |= 0 // Convert to 32bit integer\n }\n return (hash >>> 0).toString(16) // Convert to unsigned and then to hex\n}\n\nexport const takeUntilTokens = <T>(arr: T[], tokens: number, count: (el: T) => number) => {\n const result: T[] = []\n let total = 0\n\n for (const value of arr) {\n const valueTokens = count(value)\n if (total + valueTokens > tokens) {\n break\n }\n total += valueTokens\n result.push(value)\n }\n\n return result\n}\n\nexport type GenerationMetadata = sdk.z.input<typeof GenerationMetadata>\nexport const GenerationMetadata = z.object({\n model: z.string(),\n cost: z\n .object({\n input: z.number(),\n output: z.number()\n })\n .describe('Cost in $USD'),\n latency: z.number().describe('Latency in milliseconds'),\n tokens: z\n .object({\n input: z.number(),\n output: z.number()\n })\n .describe('Number of tokens used')\n})\n","import { GenerationMetadata } from '../utils'\n\nexport type SaveExampleProps<TInput, TOutput> = {\n key: string\n taskType: string\n taskId: string\n instructions: string\n input: TInput\n output: TOutput\n explanation?: string\n metadata: GenerationMetadata\n status?: 'pending' | 'approved'\n}\n\nexport type GetExamplesProps<TInput> = {\n taskType: string\n taskId: string\n input: TInput\n}\n\nexport abstract class Adapter {\n abstract getExamples<TInput, TOutput>(\n props: GetExamplesProps<TInput>\n ): Promise<\n Array<{\n key: string\n input: TInput\n output: TOutput\n explanation?: string\n similarity: number\n }>\n >\n\n abstract saveExample<TInput, TOutput>(props: SaveExampleProps<TInput, TOutput>): Promise<void>\n}\n","import { Adapter } from './adapter'\n\nexport class MemoryAdapter extends Adapter {\n constructor(public examples: any[]) {\n super()\n }\n\n async getExamples() {\n return this.examples\n }\n\n async saveExample() {}\n}\n","\n// This file is generated. Do not edit it manually.\n// See 'scripts/update-models.ts'\n\n/* eslint-disable */\n/* tslint:disable */\n\nexport const Models = [\n {\n \"id\": \"anthropic__claude-3-haiku-20240307\",\n \"name\": \"Claude 3 Haiku\",\n \"integration\": \"anthropic\",\n \"input\": {\n \"maxTokens\": 200000\n },\n \"output\": {\n \"maxTokens\": 4096\n }\n },\n {\n \"id\": \"anthropic__claude-3-5-sonnet-20240620\",\n \"name\": \"Claude 3.5 Sonnet\",\n \"integration\": \"anthropic\",\n \"input\": {\n \"maxTokens\": 200000\n },\n \"output\": {\n \"maxTokens\": 4096\n }\n },\n {\n \"id\": \"cerebras__llama3.1-70b\",\n \"name\": \"Llama 3.1 70B\",\n \"integration\": \"cerebras\",\n \"input\": {\n \"maxTokens\": 8192\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"cerebras__llama3.1-8b\",\n \"name\": \"Llama 3.1 8B\",\n \"integration\": \"cerebras\",\n \"input\": {\n \"maxTokens\": 8192\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/deepseek-coder-v2-instruct\",\n \"name\": \"DeepSeek Coder V2 Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 131072\n },\n \"output\": {\n \"maxTokens\": 131072\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/deepseek-coder-v2-lite-instruct\",\n \"name\": \"DeepSeek Coder V2 Lite\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 163840\n },\n \"output\": {\n \"maxTokens\": 163840\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/firellava-13b\",\n \"name\": \"FireLLaVA-13B\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 4096\n },\n \"output\": {\n \"maxTokens\": 4096\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/firefunction-v2\",\n \"name\": \"Firefunction V2\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 8192\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/gemma2-9b-it\",\n \"name\": \"Gemma 2 9B Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 8192\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/llama-v3p1-405b-instruct\",\n \"name\": \"Llama 3.1 405B Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 131072\n },\n \"output\": {\n \"maxTokens\": 131072\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/llama-v3p1-70b-instruct\",\n \"name\": \"Llama 3.1 70B Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 131072\n },\n \"output\": {\n \"maxTokens\": 131072\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/llama-v3p1-8b-instruct\",\n \"name\": \"Llama 3.1 8B Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 131072\n },\n \"output\": {\n \"maxTokens\": 131072\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/mixtral-8x22b-instruct\",\n \"name\": \"Mixtral MoE 8x22B Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 65536\n },\n \"output\": {\n \"maxTokens\": 65536\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/mixtral-8x7b-instruct\",\n \"name\": \"Mixtral MoE 8x7B Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 32768\n },\n \"output\": {\n \"maxTokens\": 32768\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/mythomax-l2-13b\",\n \"name\": \"MythoMax L2 13b\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 4096\n },\n \"output\": {\n \"maxTokens\": 4096\n }\n },\n {\n \"id\": \"fireworks-ai__accounts/fireworks/models/qwen2-72b-instruct\",\n \"name\": \"Qwen2 72b Instruct\",\n \"integration\": \"fireworks-ai\",\n \"input\": {\n \"maxTokens\": 32768\n },\n \"output\": {\n \"maxTokens\": 32768\n }\n },\n {\n \"id\": \"groq__gemma2-9b-it\",\n \"name\": \"Gemma2 9B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 8192\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama3-70b-8192\",\n \"name\": \"LLaMA 3 70B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 8192\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama3-8b-8192\",\n \"name\": \"LLaMA 3 8B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 8192\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama-3.1-70b-versatile\",\n \"name\": \"LLaMA 3.1 70B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama-3.1-8b-instant\",\n \"name\": \"LLaMA 3.1 8B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama-3.2-11b-vision-preview\",\n \"name\": \"LLaMA 3.2 11B Vision\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama-3.2-1b-preview\",\n \"name\": \"LLaMA 3.2 1B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama-3.2-3b-preview\",\n \"name\": \"LLaMA 3.2 3B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama-3.2-90b-vision-preview\",\n \"name\": \"LLaMA 3.2 90B Vision\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 8192\n }\n },\n {\n \"id\": \"groq__llama-3.3-70b-versatile\",\n \"name\": \"LLaMA 3.3 70B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 32768\n }\n },\n {\n \"id\": \"groq__mixtral-8x7b-32768\",\n \"name\": \"Mixtral 8x7B\",\n \"integration\": \"groq\",\n \"input\": {\n \"maxTokens\": 32768\n },\n \"output\": {\n \"maxTokens\": 32768\n }\n },\n {\n \"id\": \"openai__o1-2024-12-17\",\n \"name\": \"GPT o1\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 200000\n },\n \"output\": {\n \"maxTokens\": 100000\n }\n },\n {\n \"id\": \"openai__o1-mini-2024-09-12\",\n \"name\": \"GPT o1-mini\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 65536\n }\n },\n {\n \"id\": \"openai__gpt-3.5-turbo-0125\",\n \"name\": \"GPT-3.5 Turbo\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 4096\n }\n },\n {\n \"id\": \"openai__gpt-4-turbo-2024-04-09\",\n \"name\": \"GPT-4 Turbo\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 4096\n }\n },\n {\n \"id\": \"openai__gpt-4o-2024-08-06\",\n \"name\": \"GPT-4o (August 2024)\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 16384\n }\n },\n {\n \"id\": \"openai__gpt-4o-2024-05-13\",\n \"name\": \"GPT-4o (May 2024)\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 4096\n }\n },\n {\n \"id\": \"openai__gpt-4o-2024-11-20\",\n \"name\": \"GPT-4o (November 2024)\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 16384\n }\n },\n {\n \"id\": \"openai__gpt-4o-mini-2024-07-18\",\n \"name\": \"GPT-4o Mini\",\n \"integration\": \"openai\",\n \"input\": {\n \"maxTokens\": 128000\n },\n \"output\": {\n \"maxTokens\": 16384\n }\n }\n] as const","import sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport _ from 'lodash'\nimport { Zai } from '../zai'\nimport { PROMPT_INPUT_BUFFER, PROMPT_OUTPUT_BUFFER } from './constants'\n\nexport type Options = sdk.z.input<typeof Options>\nconst Options = z.object({\n length: z.number().min(1).max(100_000).optional().describe('The maximum number of tokens to generate')\n})\n\ndeclare module '@botpress/zai' {\n interface Zai {\n /** Generates a text of the desired length according to the prompt */\n text(prompt: string, options?: Options): Promise<string>\n }\n}\n\nZai.prototype.text = async function (this: Zai, prompt, _options) {\n const options = Options.parse(_options ?? {})\n const tokenizer = await this.getTokenizer()\n\n prompt = tokenizer.truncate(prompt, Math.max(this.Model.input.maxTokens - PROMPT_INPUT_BUFFER, 100))\n\n if (options.length) {\n options.length = Math.min(this.Model.output.maxTokens - PROMPT_OUTPUT_BUFFER, options.length)\n }\n\n const instructions: string[] = []\n let chart = ''\n\n if (options.length) {\n const length = _.clamp(options.length * 0.75, 5, options.length)\n instructions.push(`IMPORTANT: Length constraint: ${length} tokens/words`)\n instructions.push(`The text must be standalone and complete in less than ${length} tokens/words`)\n }\n\n if (options.length && options.length <= 500) {\n chart = `\n| Tokens | Text Length (approximate) |\n|-------------|--------------------------------------|\n| < 5 tokens | 1-3 words |\n| 5-10 tokens | 3-6 words |\n| 10-20 tokens| 6-15 words |\n| 20-50 tokens| A short sentence (15-30 words) |\n| 50-100 tokens| A medium sentence (30-70 words) |\n| 100-200 tokens| A short paragraph (70-150 words) |\n| 200-300 tokens| A medium paragraph (150-200 words) |\n| 300-500 tokens| A long paragraph (200-300 words) |`.trim()\n }\n\n const output = await this.callModel({\n systemPrompt: `\nGenerate a text that fulfills the user prompt below. Answer directly to the prompt, without any acknowledgements or fluff. Also, make sure the text is standalone and complete.\n${instructions.map((x) => `- ${x}`).join('\\n')}\n${chart}\n`.trim(),\n temperature: 0.7,\n messages: [{ type: 'text', content: prompt, role: 'user' }],\n maxTokens: options.length\n })\n return output?.choices?.[0]?.content! as string\n}\n","export const PROMPT_INPUT_BUFFER = 1048\nexport const PROMPT_OUTPUT_BUFFER = 512\n","import sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport { fastHash, stringify, takeUntilTokens } from '../utils'\nimport { Zai } from '../zai'\nimport { PROMPT_INPUT_BUFFER } from './constants'\n\ntype Example = sdk.z.input<typeof Example> & { instructions?: string }\nconst Example = z.object({\n input: z.string(),\n output: z.string()\n})\n\nexport type Options = sdk.z.input<typeof Options>\nconst Options = z.object({\n examples: z.array(Example).default([]),\n length: z.number().min(10).max(16_000).optional().describe('The maximum number of tokens to generate')\n})\n\ndeclare module '@botpress/zai' {\n interface Zai {\n /** Rewrites a string according to match the prompt */\n rewrite(original: string, prompt: string, options?: Options): Promise<string>\n }\n}\n\nconst START = '■START■'\nconst END = '■END■'\n\nZai.prototype.rewrite = async function (this: Zai, original, prompt, _options) {\n const options = Options.parse(_options ?? {})\n const tokenizer = await this.getTokenizer()\n\n const taskId = this.taskId\n const taskType = 'zai.rewrite'\n\n const INPUT_COMPONENT_SIZE = Math.max(100, (this.Model.input.maxTokens - PROMPT_INPUT_BUFFER) / 2)\n prompt = tokenizer.truncate(prompt, INPUT_COMPONENT_SIZE)\n\n const inputSize = tokenizer.count(original) + tokenizer.count(prompt)\n const maxInputSize = this.Model.input.maxTokens - tokenizer.count(prompt) - PROMPT_INPUT_BUFFER\n if (inputSize > maxInputSize) {\n throw new Error(\n `The input size is ${inputSize} tokens long, which is more than the maximum of ${maxInputSize} tokens for this model (${this.Model.name} = ${this.Model.input.maxTokens} tokens)`\n )\n }\n\n const instructions: string[] = []\n\n const originalSize = tokenizer.count(original)\n if (options.length && originalSize > options.length) {\n instructions.push(`The original text is ${originalSize} tokens long – it should be less than ${options.length}`)\n instructions.push(\n `The text must be standalone and complete in less than ${options.length} tokens, so it has to be shortened to fit the length as well`\n )\n }\n\n const format = (before: string, prompt: string) => {\n return `\nPrompt: ${prompt}\n\n${START}\n${before}\n${END}\n`.trim()\n }\n\n const Key = fastHash(\n stringify({\n taskId,\n taskType,\n input: original,\n prompt\n })\n )\n\n const formatExample = ({ input, output, instructions }: Example) => {\n return [\n { type: 'text' as const, role: 'user' as const, content: format(input, instructions || prompt) },\n { type: 'text' as const, role: 'assistant' as const, content: `${START}${output}${END}` }\n ]\n }\n\n const defaultExamples: Example[] = [\n { input: 'Hello, how are you?', output: 'Bonjour, comment ça va?', instructions: 'translate to French' },\n { input: '1\\n2\\n3', output: '3\\n2\\n1', instructions: 'reverse the order' }\n ]\n\n const tableExamples = taskId\n ? await this.adapter.getExamples<string, string>({\n input: original,\n taskId,\n taskType\n })\n : []\n\n const exactMatch = tableExamples.find((x) => x.key === Key)\n if (exactMatch) {\n return exactMatch.output\n }\n\n const savedExamples: Example[] = [\n ...tableExamples.map((x) => ({ input: x.input as string, output: x.output as string })),\n ...options.examples\n ]\n\n const REMAINING_TOKENS = this.Model.input.maxTokens - tokenizer.count(prompt) - PROMPT_INPUT_BUFFER\n const examples = takeUntilTokens(\n savedExamples.length ? savedExamples : defaultExamples,\n REMAINING_TOKENS,\n (el) => tokenizer.count(stringify(el.input)) + tokenizer.count(stringify(el.output))\n )\n .map(formatExample)\n .flat()\n\n const output = await this.callModel({\n systemPrompt: `\nRewrite the text between the ${START} and ${END} tags to match the user prompt.\n${instructions.map((x) => `• ${x}`).join('\\n')}\n`.trim(),\n messages: [...examples, { type: 'text', content: format(original, prompt), role: 'user' }],\n maxTokens: options.length,\n stopSequences: [END]\n })\n\n let result = output.choices[0]?.content as string\n\n if (result.includes(START)) {\n result = result.slice(result.indexOf(START) + START.length)\n }\n\n if (result.includes(END)) {\n result = result.slice(0, result.indexOf(END))\n }\n\n if (taskId) {\n await this.adapter.saveExample({\n key: Key,\n metadata: output.metadata,\n instructions: prompt,\n input: original,\n output: result,\n taskType,\n taskId\n })\n }\n\n return result\n}\n","import sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport _ from 'lodash'\nimport { Zai } from '../zai'\nimport { PROMPT_INPUT_BUFFER, PROMPT_OUTPUT_BUFFER } from './constants'\n\nexport type Options = sdk.z.input<typeof Options>\nconst Options = z.object({\n prompt: z\n .string()\n .describe('What should the text be summarized to?')\n .default('New information, concepts and ideas that are deemed important'),\n format: z\n .string()\n .describe('How to format the example text')\n .default(\n 'A normal text with multiple sentences and paragraphs. Use markdown to format the text into sections. Use headings, lists, and other markdown features to make the text more readable. Do not include links, images, or other non-text elements.'\n ),\n length: z.number().min(10).max(100_000).describe('The length of the summary in tokens').default(250),\n intermediateFactor: z\n .number()\n .min(1)\n .max(10)\n .describe('How many times longer (than final length) are the intermediate summaries generated')\n .default(4),\n maxIterations: z.number().min(1).default(100),\n sliding: z\n .object({\n window: z.number().min(10).max(100_000),\n overlap: z.number().min(0).max(100_000)\n })\n .describe('Sliding window options')\n .default({ window: 50_000, overlap: 250 })\n})\n\ndeclare module '@botpress/zai' {\n interface Zai {\n /** Summarizes a text of any length to a summary of the desired length */\n summarize(original: string, options?: Options): Promise<string>\n }\n}\n\nconst START = '■START■'\nconst END = '■END■'\n\nZai.prototype.summarize = async function (this: Zai, original, _options) {\n const options = Options.parse(_options ?? {})\n const tokenizer = await this.getTokenizer()\n\n const INPUT_COMPONENT_SIZE = Math.max(100, (this.Model.input.maxTokens - PROMPT_INPUT_BUFFER) / 4)\n options.prompt = tokenizer.truncate(options.prompt, INPUT_COMPONENT_SIZE)\n options.format = tokenizer.truncate(options.format, INPUT_COMPONENT_SIZE)\n\n const maxOutputSize = this.Model.output.maxTokens - PROMPT_OUTPUT_BUFFER\n if (options.length > maxOutputSize) {\n throw new Error(\n `The desired output length is ${maxOutputSize} tokens long, which is more than the maximum of ${this.Model.output.maxTokens} tokens for this model (${this.Model.name})`\n )\n }\n\n // Ensure the sliding window is not bigger than the model input size\n options.sliding.window = Math.min(options.sliding.window, this.Model.input.maxTokens - PROMPT_INPUT_BUFFER)\n\n // Ensure the overlap is not bigger than the window\n // Most extreme case possible (all 3 same size)\n // |ooooooooooooooooooo|wwwwwwwwwwwwwww|ooooooooooooooooooo|\n // |<---- overlap ---->|<-- window -->|<---- overlap ---->|\n options.sliding.overlap = Math.min(options.sliding.overlap, options.sliding.window - 3 * options.sliding.overlap)\n\n const format = (summary: string, newText: string) => {\n return `\n${START}\n${summary.length ? summary : '<summary still empty>'}\n${END}\n\nPlease amend the summary between the ${START} and ${END} tags to accurately reflect the prompt and the additional text below.\n\n<|start_new_information|>\n${newText}\n<|new_information|>`.trim()\n }\n\n const tokens = tokenizer.split(original)\n const parts = Math.ceil(tokens.length / (options.sliding.window - options.sliding.overlap))\n let iteration = 0\n\n // We split it recursively into smaller parts until we're at less than 4 window slides per part\n // Then we use a merge strategy to combine the sub-chunks summaries\n // This is basically a merge sort algorithm (but summary instead of sorting)\n const N = 2 // This is the merge sort exponent\n const useMergeSort = parts >= Math.pow(2, N)\n const chunkSize = Math.ceil(tokens.length / (parts * N))\n\n if (useMergeSort) {\n const chunks = _.chunk(tokens, chunkSize).map((x) => x.join(''))\n const allSummaries = await Promise.all(chunks.map((chunk) => this.summarize(chunk, options)))\n return this.summarize(allSummaries.join('\\n\\n============\\n\\n'), options)\n }\n\n const summaries: string[] = []\n let currentSummary = ''\n\n for (let i = 0; i < tokens.length; i += options.sliding.window) {\n const from = Math.max(0, i - options.sliding.overlap)\n const to = Math.min(tokens.length, i + options.sliding.window + options.sliding.overlap)\n const isFirst = i === 0\n const isLast = to >= tokens.length\n\n const slice = tokens.slice(from, to).join('')\n\n if (iteration++ >= options.maxIterations) {\n break\n }\n\n const instructions: string[] = [\n `At each step, you will receive a part of the text to summarize. Make sure to reply with the new summary in the tags ${START} and ${END}.`,\n 'Summarize the text and make sure that the main points are included.',\n 'Ignore any unnecessary details and focus on the main points.',\n 'Use short and concise sentences to increase readability and information density.',\n 'When looking at the new information, focus on: ' + options.prompt\n ]\n\n if (isFirst) {\n instructions.push(\n 'The current summary is empty. You need to generate a summary that covers the main points of the text.'\n )\n }\n\n let generationLength = options.length\n\n if (!isLast) {\n generationLength = Math.min(\n tokenizer.count(currentSummary) + options.length * options.intermediateFactor,\n maxOutputSize\n )\n\n instructions.push(\n 'You need to amend the summary to include the new information. Make sure the summary is complete and covers all the main points.'\n )\n\n instructions.push(`The current summary is ${currentSummary.length} tokens long.`)\n instructions.push(`You can amend the summary to be up to ${generationLength} tokens long.`)\n }\n\n if (isLast) {\n instructions.push(\n 'This is the last part you will have to summarize. Make sure the summary is complete and covers all the main points.'\n )\n instructions.push(\n `The current summary is ${currentSummary.length} tokens long. You need to make sure it is ${options.length} tokens or less.`\n )\n\n if (currentSummary.length > options.length) {\n instructions.push(\n `The current summary is already too long, so you need to shorten it to ${options.length} tokens while also including the new information.`\n )\n }\n }\n\n const output = await this.callModel({\n systemPrompt: `\nYou are summarizing a text. The text is split into ${parts} parts, and you are currently working on part ${iteration}.\nAt every step, you will receive the current summary and a new part of the text. You need to amend the summary to include the new information (if needed).\nThe summary needs to cover the main points of the text and must be concise.\n\nIMPORTANT INSTRUCTIONS:\n${instructions.map((x) => `- ${x.trim()}`).join('\\n')}\n\nFORMAT OF THE SUMMARY:\n${options.format}\n`.trim(),\n messages: [{ type: 'text', content: format(currentSummary, slice), role: 'user' }],\n maxTokens: generationLength,\n stopSequences: [END]\n })\n\n let result = output?.choices[0]?.content as string\n\n if (result.includes(START)) {\n result = result.slice(result.indexOf(START) + START.length)\n }\n\n if (result.includes('■')) {\n // can happen if the model truncates the text before the entire END tag is written\n result = result.slice(0, result.indexOf('■'))\n }\n\n summaries.push(result)\n currentSummary = result\n }\n\n return currentSummary.trim()\n}\n","import sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport { fastHash, stringify, takeUntilTokens } from '../utils'\nimport { Zai } from '../zai'\nimport { PROMPT_INPUT_BUFFER } from './constants'\n\nconst Example = z.object({\n input: z.any(),\n check: z.boolean(),\n reason: z.string().optional()\n})\n\nexport type Options = sdk.z.input<typeof Options>\nconst Options = z.object({\n examples: z.array(Example).describe('Examples to check the condition against').default([])\n})\n\ndeclare module '@botpress/zai' {\n interface Zai {\n /** Checks wether a condition is true or not */\n check(input: unknown, condition: string, options?: Options): Promise<boolean>\n }\n}\n\nconst TRUE = '■TRUE■'\nconst FALSE = '■FALSE■'\nconst END = '■END■'\n\nZai.prototype.check = async function (this: Zai, input, condition, _options) {\n const options = Options.parse(_options ?? {})\n const tokenizer = await this.getTokenizer()\n const PROMPT_COMPONENT = Math.max(this.Model.input.maxTokens - PROMPT_INPUT_BUFFER, 100)\n\n const taskId = this.taskId\n const taskType = 'zai.check'\n\n const PROMPT_TOKENS = {\n INPUT: Math.floor(0.5 * PROMPT_COMPONENT),\n CONDITION: Math.floor(0.2 * PROMPT_COMPONENT)\n }\n\n // Truncate the input to fit the model's input size\n const inputAsString = tokenizer.truncate(stringify(input), PROMPT_TOKENS.INPUT)\n condition = tokenizer.truncate(condition, PROMPT_TOKENS.CONDITION)\n\n // All tokens remaining after the input and condition are accounted can be used for examples\n const EXAMPLES_TOKENS = PROMPT_COMPONENT - tokenizer.count(inputAsString) - tokenizer.count(condition)\n\n const Key = fastHash(\n JSON.stringify({\n taskType,\n taskId,\n input: inputAsString,\n condition\n })\n )\n\n const examples = taskId\n ? await this.adapter.getExamples<string, boolean>({\n input: inputAsString,\n taskType,\n taskId\n })\n : []\n\n const exactMatch = examples.find((x) => x.key === Key)\n if (exactMatch) {\n return exactMatch.output\n }\n\n const defaultExamples = [\n { input: '50 Cent', check: true, reason: '50 Cent is widely recognized as a public personality.' },\n {\n input: ['apple', 'banana', 'carrot', 'house'],\n check: false,\n reason: 'The list contains a house, which is not a fruit. Also, the list contains a carrot, which is a vegetable.'\n }\n ]\n\n const userExamples = [\n ...examples.map((e) => ({ input: e.input, check: e.output, reason: e.explanation })),\n ...options.examples\n ]\n\n let exampleId = 1\n\n const formatInput = (input: string, condition: string) => {\n const header = userExamples.length ? `Expert Example #${exampleId++}` : `Example of condition: \"${condition}\"`\n\n return `\n${header}\n<|start_input|>\n${input.trim()}\n<|end_input|>\n`.trim()\n }\n\n const formatOutput = (answer: boolean, justification: string) => {\n return `\nAnalysis: ${justification}\nFinal Answer: ${answer ? TRUE : FALSE}\n${END}\n`.trim()\n }\n\n const formatExample = (example: { input?: any; check: boolean; reason?: string }) => [\n { type: 'text' as const, content: formatInput(stringify(example.input ?? null), condition), role: 'user' as const },\n {\n type: 'text' as const,\n content: formatOutput(example.check, example.reason ?? ''),\n role: 'assistant' as const\n }\n ]\n\n const allExamples = takeUntilTokens(\n userExamples.length ? userExamples : defaultExamples,\n EXAMPLES_TOKENS,\n (el) => tokenizer.count(stringify(el.input)) + tokenizer.count(el.reason ?? '')\n )\n .map(formatExample)\n .flat()\n\n const specialInstructions = userExamples.length\n ? `\n- You have been provided with examples from previous experts. Make sure to read them carefully before making your decision.\n- Make sure to refer to the examples provided by the experts to justify your decision (when applicable).\n- When in doubt, ground your decision on the examples provided by the experts instead of your own intuition.\n- When no example is similar to the input, make sure to provide a clear justification for your decision while inferring the decision-making process from the examples provided by the experts.\n`.trim()\n : ''\n\n const output = await this.callModel({\n systemPrompt: `\nCheck if the following condition is true or false for the given input. Before answering, make sure to read the input and the condition carefully.\nJustify your answer, then answer with either ${TRUE} or ${FALSE} at the very end, then add ${END} to finish the response.\nIMPORTANT: Make sure to answer with either ${TRUE} or ${FALSE} at the end of your response, but NOT both.\n---\nExpert Examples (#1 to #${exampleId - 1}):\n${specialInstructions}\n`.trim(),\n stopSequences: [END],\n messages: [\n ...allExamples,\n {\n type: 'text',\n content: `\nConsidering the below input and above examples, is the following condition true or false?\n${formatInput(inputAsString, condition)}\nIn your \"Analysis\", please refer to the Expert Examples # to justify your decision.`.trim(),\n role: 'user'\n }\n ]\n })\n\n const answer = output.choices[0]?.content as string\n\n const hasTrue = answer.includes(TRUE)\n const hasFalse = answer.includes(FALSE)\n\n if (!hasTrue && !hasFalse) {\n throw new Error(`The model did not return a valid answer. The response was: ${answer}`)\n }\n\n let finalAnswer: boolean\n\n if (hasTrue && hasFalse) {\n // If both TRUE and FALSE are present, we need to check which one was answered last\n finalAnswer = answer.lastIndexOf(TRUE) > answer.lastIndexOf(FALSE)\n } else {\n finalAnswer = hasTrue\n }\n\n if (taskId) {\n await this.adapter.saveExample({\n key: Key,\n taskType,\n taskId,\n input: inputAsString,\n instructions: condition,\n metadata: output.metadata,\n output: finalAnswer,\n explanation: answer.replace(TRUE, '').replace(FALSE, '').replace(END, '').replace('Final Answer:', '').trim()\n })\n }\n\n return finalAnswer\n}\n","import sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport _ from 'lodash'\nimport { fastHash, stringify, takeUntilTokens } from '../utils'\nimport { Zai } from '../zai'\nimport { PROMPT_INPUT_BUFFER, PROMPT_OUTPUT_BUFFER } from './constants'\n\ntype Example = sdk.z.input<typeof Example>\nconst Example = z.object({\n input: z.any(),\n filter: z.boolean(),\n reason: z.string().optional()\n})\n\nexport type Options = sdk.z.input<typeof Options>\nconst Options = z.object({\n tokensPerItem: z\n .number()\n .min(1)\n .max(100_000)\n .optional()\n .describe('The maximum number of tokens per item')\n .default(250),\n examples: z.array(Example).describe('Examples to filter the condition against').default([])\n})\n\ndeclare module '@botpress/zai' {\n interface Zai {\n /** Filters elements of an array against a condition */\n filter<T>(input: Array<T>, condition: string, options?: Options): Promise<Array<T>>\n }\n}\n\nconst END = '■END■'\n\nZai.prototype.filter = async function (this: Zai, input, condition, _options) {\n const options = Options.parse(_options ?? {})\n const tokenizer = await this.getTokenizer()\n\n const taskId = this.taskId\n const taskType = 'zai.filter'\n\n const MAX_ITEMS_PER_CHUNK = 50\n const TOKENS_TOTAL_MAX = this.Model.input.maxTokens - PROMPT_INPUT_BUFFER - PROMPT_OUTPUT_BUFFER\n const TOKENS_EXAMPLES_MAX = Math.floor(Math.max(250, TOKENS_TOTAL_MAX * 0.5))\n const TOKENS_CONDITION_MAX = _.clamp(TOKENS_TOTAL_MAX * 0.25, 250, tokenizer.count(condition))\n const TOKENS_INPUT_ARRAY_MAX = TOKENS_TOTAL_MAX - TOKENS_EXAMPLES_MAX - TOKENS_CONDITION_MAX\n\n condition = tokenizer.truncate(condition, TOKENS_CONDITION_MAX)\n\n let chunks: Array<typeof input> = []\n let currentChunk: typeof input = []\n let currentChunkTokens = 0\n\n for (const element of input) {\n const elementAsString = tokenizer.truncate(stringify(element, false), options.tokensPerItem)\n const elementTokens = tokenizer.count(elementAsString)\n\n if (currentChunkTokens + elementTokens > TOKENS_INPUT_ARRAY_MAX || currentChunk.length >= MAX_ITEMS_PER_CHUNK) {\n chunks.push(currentChunk)\n currentChunk = []\n currentChunkTokens = 0\n }\n\n currentChunk.push(element)\n currentChunkTokens += elementTokens\n }\n\n if (currentChunk.length > 0) {\n chunks.push(currentChunk)\n }\n\n chunks = chunks.filter((x) => x.length > 0)\n\n // ■1:true■2:true■3:true\n\n const formatInput = (input: Example[], condition: string) => {\n return `\nCondition to check:\n${condition}\n\nItems (from ■0 to ■${input.length - 1})\n==============================\n${input.map((x, idx) => `■${idx} = ${stringify(x.input ?? null, false)}`).join('\\n')}\n`.trim()\n }\n\n const formatExamples = (examples: Example[]) => {\n return `\n${examples.map((x, idx) => `■${idx}:${!!x.filter ? 'true' : 'false'}`).join('')}\n${END}\n====\nHere's the reasoning behind each example:\n${examples.map((x, idx) => `■${idx}:${!!x.filter ? 'true' : 'false'}:${x.reason ?? 'No reason provided'}`).join('\\n')}\n`.trim()\n }\n\n const genericExamples: Example[] = [\n {\n input: 'apple',\n filter: true,\n reason: 'Apples are fruits'\n },\n {\n input: 'Apple Inc.',\n filter: false,\n reason: 'Apple Inc. is a company, not a fruit'\n },\n {\n input: 'banana',\n filter: true,\n reason: 'Bananas are fruits'\n },\n {\n input: 'potato',\n filter: false,\n reason: 'Potatoes are vegetables'\n }\n ]\n\n const genericExamplesMessages = [\n {\n type: 'text' as const,\n content: formatInput(genericExamples, 'is a fruit'),\n role: 'user' as const\n },\n {\n type: 'text' as const,\n content: formatExamples(genericExamples),\n role: 'assistant' as const\n }\n ]\n\n const filterChunk = async (chunk: typeof input) => {\n const examples = taskId\n ? await this.adapter\n .getExamples<string, unknown>({\n // The Table API can't search for a huge input string\n input: JSON.stringify(chunk).slice(0, 1000),\n taskType,\n taskId\n })\n .then((x) =>\n x.map((y) => ({ filter: y.output as boolean, input: y.input, reason: y.explanation } satisfies Example))\n )\n : []\n\n const allExamples = takeUntilTokens([...examples, ...(options.examples ?? [])], TOKENS_EXAMPLES_MAX, (el) =>\n tokenizer.count(stringify(el.input))\n )\n\n const exampleMessages = [\n {\n type: 'text' as const,\n content: formatInput(allExamples, condition),\n role: 'user' as const\n },\n {\n type: 'text' as const,\n content: formatExamples(allExamples),\n role: 'assistant' as const\n }\n ]\n\n const output = await this.callModel({\n systemPrompt: `\nYou are given a list of items. Your task is to filter out the items that meet the condition below.\nYou need to return the full list of items with the format:\n■x:true■y:false■z:true (where x, y, z are the indices of the items in the list)\nYou need to start with \"■0\" and go up to the last index \"■${chunk.length - 1}\".\nIf an item meets the condition, you should return \":true\", otherwise \":false\".\n\nIMPORTANT: Make sure to read the condition and the examples carefully before making your decision.\nThe condition is: \"${condition}\"\n`.trim(),\n stopSequences: [END],\n messages: [\n ...(exampleMessages.length ? exampleMessages : genericExamplesMessages),\n {\n type: 'text',\n content: formatInput(\n chunk.map((x) => ({ input: x } as Example)),\n condition\n ),\n role: 'user'\n }\n ]\n })\n\n const answer = output.choices[0]?.content as string\n const indices = answer\n .trim()\n .split('■')\n .filter((x) => x.length > 0)\n .map((x) => {\n const [idx, filter] = x.split(':')\n return { idx: parseInt(idx?.trim() ?? ''), filter: filter?.toLowerCase().trim() === 'true' }\n })\n\n const partial = chunk.filter((_, idx) => {\n return indices.find((x) => x.idx === idx)?.filter ?? false\n })\n\n if (taskId) {\n const key = fastHash(\n stringify({\n taskId,\n taskType,\n input: JSON.stringify(chunk),\n condition\n })\n )\n\n await this.adapter.saveExample({\n key,\n taskType,\n taskId,\n input: JSON.stringify(chunk),\n output: partial,\n instructions: condition,\n metadata: output.metadata\n })\n }\n\n return partial\n }\n\n const filteredChunks = await Promise.all(chunks.map(filterChunk))\n\n return filteredChunks.flat()\n}\n","import sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport JSON5 from 'json5'\nimport { jsonrepair } from 'jsonrepair'\n\nimport _ from 'lodash'\nimport { fastHash, stringify, takeUntilTokens } from '../utils'\nimport { Zai } from '../zai'\nimport { PROMPT_INPUT_BUFFER } from './constants'\nimport { JsonParsingError } from './errors'\n\nexport type Options = sdk.z.input<typeof Options>\nconst Options = z.object({\n instructions: z.string().optional().describe('Instructions to guide the user on how to extract the data'),\n chunkLength: z\n .number()\n .min(100)\n .max(100_000)\n .optional()\n .describe('The maximum number of tokens per chunk')\n .default(16_000)\n})\n\ndeclare module '@botpress/zai' {\n interface Zai {\n /** Extracts one or many elements from an arbitrary input */\n extract<S extends sdk.z.AnyZodObject>(input: unknown, schema: S, options?: Options): Promise<sdk.z.infer<S>>\n extract<S extends sdk.z.AnyZodObject>(\n input: unknown,\n schema: sdk.z.ZodArray<S>,\n options?: Options\n ): Promise<Array<sdk.z.infer<S>>>\n }\n}\n\nconst START = '■json_start■'\nconst END = '■json_end■'\nconst NO_MORE = '■NO_MORE_ELEMENT■'\n\nZai.prototype.extract = async function (this: Zai, input, schema, _options) {\n const options = Options.parse(_options ?? {})\n const tokenizer = await this.getTokenizer()\n\n const taskId = this.taskId\n const taskType = 'zai.extract'\n\n const PROMPT_COMPONENT = Math.max(this.Model.input.maxTokens - PROMPT_INPUT_BUFFER, 100)\n\n let isArrayOfObjects = false\n const originalSchema = schema\n\n if (schema instanceof sdk.ZodObject) {\n // Do nothing\n } else if (schema instanceof sdk.ZodArray) {\n if (schema._def.type instanceof sdk.ZodObject) {\n isArrayOfObjects = true\n schema = schema._def.type\n } else {\n throw new Error('Schema must be a ZodObject or a ZodArray<ZodObject>')\n }\n } else {\n throw new Error('Schema must be either a ZuiObject or a ZuiArray<ZuiObject>')\n }\n\n const schemaTypescript = schema.toTypescript({ declaration: false })\n const schemaLength = tokenizer.count(schemaTypescript)\n\n options.chunkLength = Math.min(options.chunkLength, this.Model.input.maxTokens - PROMPT_INPUT_BUFFER - schemaLength)\n\n const keys = Object.keys(schema.shape)\n\n let inputAsString = stringify(input)\n\n if (tokenizer.count(inputAsString) > options.chunkLength) {\n // If we want to extract an array of objects, we will run this function recursively\n if (isArrayOfObjects) {\n const tokens = tokenizer.split(inputAsString)\n const chunks = _.chunk(tokens, options.chunkLength).map((x) => x.join(''))\n const all = await Promise.all(chunks.map((chunk) => this.extract(chunk, originalSchema as sdk.AnyZodObject)))\n\n return all.flat()\n } else {\n // Truncate the input to fit the model's input size\n inputAsString = tokenizer.truncate(stringify(input), options.chunkLength)\n }\n }\n\n const instructions: string[] = []\n\n if (options.instructions) {\n instructions.push(options.instructions)\n }\n\n const shape = `{ ${keys.map((key) => `\"${key}\": ...`).join(', ')} }`\n const abbv = '{ ... }'\n\n if (isArrayOfObjects) {\n instructions.push('You may have multiple elements, or zero elements in the input.')\n instructions.push('You must extract each element separately.')\n instructions.push(`Each element must be a JSON object with exactly the format: ${START}${shape}${END}`)\n instructions.push(`When you are done extracting all elements, type \"${NO_MORE}\" to finish.`)\n instructions.push(`For example, if you have zero elements, the output should look like this: ${NO_MORE}`)\n instructions.push(\n `For example, if you have two elements, the output should look like this: ${START}${abbv}${END}${START}${abbv}${END}${NO_MORE}`\n )\n } else {\n instructions.push('You may have exactly one element in the input.')\n instructions.push(`The element must be a JSON object with exactly the format: ${START}${shape}${END}`)\n }\n\n // All tokens remaining after the input and condition are accounted can be used for examples\n const EXAMPLES_TOKENS = PROMPT_COMPONENT - tokenizer.count(inputAsString) - tokenizer.count(instructions.join('\\n'))\n\n const Key = fastHash(\n JSON.stringify({\n taskType,\n taskId,\n input: inputAsString,\n instructions: options.instructions\n })\n )\n\n const examples = taskId\n ? await this.adapter.getExamples<string, unknown>({\n input: inputAsString,\n taskType,\n taskId\n })\n : []\n\n const exactMatch = examples.find((x) => x.key === Key)\n if (exactMatch) {\n return exactMatch.output\n }\n\n const defaultExample = isArrayOfObjects\n ? {\n input: `The story goes as follow.\nOnce upon a time, there was a person named Alice who was 30 years old.\nThen, there was a person named Bob who was 25 years old.\nThe end.`,\n schema: 'Array<{ name: string, age: number }>',\n instructions: 'Extract all people',\n extracted: [\n {\n name: 'Alice',\n age: 30\n },\n {\n name: 'Bob',\n age: 25\n }\n ]\n }\n : {\n input: `The story goes as follow.\nOnce upon a time, there was a person named Alice who was 30 years old.\nThe end.`,\n schema: '{ name: string, age: number }',\n instructions: 'Extract the person',\n extracted: { name: 'Alice', age: 30 }\n }\n\n const userExamples = examples.map((e) => ({\n input: e.input,\n extracted: e.output,\n schema: schemaTypescript,\n instructions: options.instructions\n }))\n\n let exampleId = 1\n\n const formatInput = (input: string, schema: string, instructions?: string) => {\n const header = userExamples.length\n ? `Expert Example #${exampleId++}`\n : \"Here's an example to help you understand the format:\"\n\n return `\n${header}\n\n<|start_schema|>\n${schema}\n<|end_schema|>\n\n<|start_instructions|>\n${instructions ?? 'No specific instructions, just follow the schema above.'}\n<|end_instructions|>\n\n<|start_input|>\n${input.trim()}\n<|end_input|>\n `.trim()\n }\n\n const formatOutput = (extracted: any) => {\n extracted = _.isArray(extracted) ? extracted : [extracted]\n\n return (\n extracted\n .map((x: string) =>\n `\n${START}\n${JSON.stringify(x, null, 2)}\n${END}`.trim()\n )\n .join('\\n') + NO_MORE\n )\n }\n\n const formatExample = (example: { input?: any; schema: string; instructions?: string; extracted: any }) => [\n {\n type: 'text' as const,\n content: formatInput(stringify(example.input ?? null), example.schema, example.instructions),\n role: 'user' as const\n },\n {\n type: 'text' as const,\n content: formatOutput(example.extracted),\n role: 'assistant' as const\n }\n ]\n\n const allExamples = takeUntilTokens(\n userExamples.length ? userExamples : [defaultExample],\n EXAMPLES_TOKENS,\n (el) => tokenizer.count(stringify(el.input)) + tokenizer.count(stringify(el.extracted))\n )\n .map(formatExample)\n .flat()\n\n const output = await this.callModel({\n systemPrompt: `\nExtract the following information from the input:\n${schemaTypescript}\n====\n\n${instructions.map((x) => `• ${x}`).join('\\n')}\n`.trim(),\n stopSequences: [isArrayOfObjects ? NO_MORE : END],\n messages: [\n ...allExamples,\n {\n role: 'user',\n type: 'text',\n content: formatInput(inputAsString, schemaTypescript, options.instructions ?? '')\n }\n ]\n })\n\n const answer = output.choices[0]?.content as string\n\n const elements = answer\n .split(START)\n .filter((x) => x.trim().length > 0)\n .map((x) => {\n try {\n const json = x.slice(0, x.indexOf(END)).trim()\n const repairedJson = jsonrepair(json)\n const parsedJson = JSON5.parse(repairedJson)\n\n return schema.parse(parsedJson)\n } catch (error) {\n throw new JsonParsingError(x, error instanceof Error ? error : new Error('Unknown error'))\n }\n })\n .filter((x) => x !== null)\n\n let final: any\n\n if (isArrayOfObjects) {\n final = elements\n } else if (elements.length === 0) {\n final = schema.parse({})\n } else {\n final = elements[0]\n }\n\n if (taskId) {\n await this.adapter.saveExample({\n key: Key,\n taskId: `zai/${taskId}`,\n taskType,\n instructions: options.instructions ?? 'No specific instructions',\n input: inputAsString,\n output: final,\n metadata: output.metadata\n })\n }\n\n return final\n}\n","export class JsonParsingError extends Error {\n constructor(\n public json: unknown,\n public error: Error\n ) {\n const message = `Error parsing JSON:\\n\\n---JSON---\\n${json}\\n\\n---Error---\\n\\n ${error}`\n super(message)\n }\n}\n","import sdk from '@botpress/sdk'\nconst { z } = sdk\n\nimport _ from 'lodash'\nimport { fastHash, stringify, takeUntilTokens } from '../utils'\nimport { Zai } from '../zai'\nimport { PROMPT_INPUT_BUFFER } from './constants'\n\ntype Label = keyof typeof LABELS\nconst LABELS = {\n ABSOLUTELY_NOT: 'ABSOLUTELY_NOT',\n PROBABLY_NOT: 'PROBABLY_NOT',\n AMBIGUOUS: 'AMBIGUOUS',\n PROBABLY_YES: 'PROBABLY_YES',\n ABSOLUTELY_YES: 'ABSOLUTELY_YES'\n} as const\nconst ALL_LABELS = Object.values(LABELS).join(' | ')\n\ntype Example<T extends string> = {\n input: unknown\n labels: Partial<Record<T, { label: Label; explanation?: string }>>\n}\n\nexport type Options<T extends string> = Omit<sdk.z.input<typeof Options>, 'examples'> & {\n examples?: Array<Partial<Example<T>>>\n}\n\nconst Options = z.object({\n examples: z\n .array(\n z.object({\n input: z.any(),\n labels: z.record(z.object({ label: z.enum(ALL_LABELS as never), explanation: z.string().optional() }))\n })\n )\n .default([])\n .describe('Examples to help the user make a decision'),\n instructions: z.string().optional().describe('Instructions to guide the user on how to extract the data'),\n chunkLength: z\n .number()\n .min(100)\n .max(100_000)\n .optional()\n .describe('The maximum number of tokens per chunk')\n .default(16_000)\n})\n\ntype Labels<T extends string> = Record<T, string>\n\nconst Labels = z.record(z.string().min(1).max(250), z.string()).superRefine((labels, ctx) => {\n const keys = Object.keys(labels)\n\n for (const key of keys) {\n if (key.length < 1 || key.length > 250) {\n ctx.addIssue({ message: `The label key \"${key}\" must be between 1 and 250 characters long`, code: 'custom' })\n }\n\n if (keys.lastIndexOf(key) !== keys.indexOf(key)) {\n ctx.addIssue({ message: `Duplicate label: ${labels[key]}`, code: 'custom' })\n }\n\n if (/[^a-zA-Z0-9_]/.test(key)) {\n ctx.addIssue({\n message: `The label key \"${key}\" must only contain alphanumeric characters and underscores`,\n code: 'custom'\n })\n }\n }\n\n return true\n})\n\ndeclare module '@botpress/zai' {\n interface Zai {\n /** Tags the provided input with a list of predefined labels */\n label<T extends string>(\n input: unknown,\n labels: Labels<T>,\n options?: Options<T>\n ): Promise<{\n [K in T]: boolean\n }>\n }\n}\n\nconst parseLabel = (label: string): Label => {\n label = label.toUpperCase().replace(/\\s+/g, '_').replace(/_{2,}/g, '_').trim()\n if (label.includes('ABSOLUTELY') && label.includes('NOT')) {\n return LABELS.ABSOLUTELY_NOT\n } else if (label.includes('NOT')) {\n return LABELS.PROBABLY_NOT\n } else if (label.includes('AMBIGUOUS')) {\n return LABELS.AMBIGUOUS\n }\n if (label.includes('YES')) {\n return LABELS.PROBABLY_YES\n } else if (label.includes('ABSOLUTELY') && label.includes('YES')) {\n return LABELS.ABSOLUTELY_YES\n }\n return LABELS.AMBIGUOUS\n}\n\nZai.prototype.label = async function <T extends string>(this: Zai, input, _labels, _options) {\n const options = Options.parse(_options ?? {})\n const labels = Labels.parse(_labels)\n const tokenizer = await this.getTokenizer()\n\n const taskId = this.taskId\n const taskType = 'zai.label'\n\n const TOTAL_MAX_TOKENS = _.clamp(options.chunkLength, 1000, this.Model.input.maxTokens - PROMPT_INPUT_BUFFER)\n const CHUNK_EXAMPLES_MAX_TOKENS = _.clamp(Math.floor(TOTAL_MAX_TOKENS * 0.5), 250, 10_000)\n const CHUNK_INPUT_MAX_TOKENS = _.clamp(\n TOTAL_MAX_TOKENS - CHUNK_EXAMPLES_MAX_TOKENS,\n TOTAL_MAX_TOKENS * 0.5,\n TOTAL_MAX_TOKENS\n )\n\n const inputAsString = stringify(input)\n\n if (tokenizer.count(inputAsString) > CHUNK_INPUT_MAX_TOKENS) {\n const tokens = tokenizer.split(inputAsString)\n const chunks = _.chunk(tokens, CHUNK_INPUT_MAX_TOKENS).map((x) => x.join(''))\n const allLabels = await Promise.all(chunks.map((chunk) => this.label(chunk, _labels)))\n\n // Merge all the labels together (those who are true will remain true)\n return allLabels.reduce((acc, x) => {\n Object.keys(x).forEach((key) => {\n if (acc[key] === true) {\n acc[key] = true\n } else {\n acc[key] = acc[key] || x[key]\n }\n })\n return acc\n }, {}) as {\n [K in T]: boolean\n }\n }\n\n const END = '■END■'\n\n const Key = fastHash(\n JSON.stringify({\n taskType,\n taskId,\n input: inputAsString,\n instructions: options.instructions ?? ''\n })\n )\n\n const convertToAnswer = (mapping: { [K in T]: { explanation: string; label: Label } }) => {\n return Object.keys(labels).reduce((acc, key) => {\n acc[key] = mapping[key]?.label === 'ABSOLUTELY_YES' || mapping[key]?.label === 'PROBABLY_YES'\n return acc\n }, {}) as { [K in T]: boolean }\n }\n\n const examples = taskId\n ? await this.adapter.getExamples<\n string,\n {\n [K in T]: {\n explanation: string\n label: Label\n }\n }\n >({\n input: inputAsString,\n taskType,\n taskId\n })\n : []\n\n options.examples.forEach((example) => {\n examples.push({\n key: fastHash(JSON.stringify(example)),\n input: example.input,\n similarity: 1,\n explanation: '',\n output: example.labels as unknown as {\n [K in T]: {\n explanation: string\n label: Label\n }\n }\n })\n })\n\n const exactMatch = examples.find((x) => x.key === Key)\n if (exactMatch) {\n return convertToAnswer(exactMatch.output)\n }\n\n const allExamples = takeUntilTokens(\n examples,\n CHUNK_EXAMPLES_MAX_TOKENS,\n (el) =>\n tokenizer.count(stringify(el.input)) +\n tokenizer.count(stringify(el.output)) +\n tokenizer.count(el.explanation ?? '') +\n 100\n )\n .map((example, idx) => [\n {\n type: 'text' as const,\n role: 'user' as const,\n content: `\nExpert Example #${idx + 1}\n\n<|start_input|>\n${stringify(example.input)}\n<|end_input|>`.trim()\n },\n {\n type: 'text' as const,\n role: 'assistant' as const,\n content: `\nExpert Example #${idx + 1}\n============\n${Object.keys(example.output)\n .map((key) =>\n `\n■${key}:【${example.output[key]?.explanation}】:${example.output[key]?.label}■\n`.trim()\n )\n .join('\\n')}\n${END}\n`.trim()\n }\n ])\n .flat()\n\n const format = Object.keys(labels)\n .map((key) => {\n return `\n■${key}:【explanation (where \"explanation\" is answering the question \"${labels[key]}\")】:x■ (where x is ${ALL_LABELS})\n`.trim()\n })\n .join('\\n\\n')\n\n const output = await this.callModel({\n stopSequences: [END],\n systemPrompt: `\nYou need to tag the input with the following labels based on the question asked:\n${LABELS.ABSOLUTELY_NOT}: You are absolutely sure that the answer is \"NO\" to the question.\n${LABELS.PROBABLY_NOT}: You are leaning towards \"NO\" to the question.\n${LABELS.AMBIGUOUS}: You are unsure about the answer to the question.\n${LABELS.PROBABLY_YES}: You are leaning towards \"YES\" to the question.\n${LABELS.ABSOLUTELY_YES}: You are absolutely sure that the answer is \"YES\" to the question.\n\nYou need to return a mapping of the labels, an explanation and the answer for each label following the format below:\n\\`\\`\\`\n${format}\n${END}\n\\`\\`\\`\n\n${options.instructions}\n\n===\nYou should consider the Expert Examples below to help you make your decision.\nIn your \"Analysis\", please refer to the Expert Examples # to justify your decision.\n`.trim(),\n messages: [\n ...allExamples,\n {\n type: 'text',\n role: 'user',\n content: `\nInput to tag:\n<|start_input|>\n${inputAsString}\n<|end_input|>\n\nAnswer with this following format:\n\\`\\`\\`\n${format}\n${END}\n\\`\\`\\`\n\nFormat cheatsheet:\n\\`\\`\\`\n■label:【explanation】:x■\n\\`\\`\\`\n\nWhere \\`x\\` is one of the following: ${ALL_LABELS}\n\nRemember: In your \\`explanation\\`, please refer to the Expert Examples # (and quote them) that are relevant to ground your decision-making process.\nThe Expert Examples are there to help you make your decision. They have been provided by experts in the field and their answers (and reasoning) are considered the ground truth and should be used as a reference to make your decision when applicable.\nFor example, you can say: \"According to Expert Example #1, ...\"`.trim()\n }\n ]\n })\n\n const answer = output.choices[0].content as string\n\n const final = Object.keys(labels).reduce((acc, key) => {\n const match = answer.match(new RegExp(`■${key}:【(.+)】:(\\\\w{2,})■`, 'i'))\n if (match) {\n const explanation = match[1].trim()\n const label = parseLabel(match[2])\n acc[key] = {\n explanation,\n label\n }\n } else {\n acc[key] = {\n explanation: '',\n label: LABELS.AMBIGUOUS\n }\n }\n return acc\n }, {}) as {\n [K in T]: {\n explanation: string\n label: Label\n }\n }\n\n if (taskId) {\n await this.adapter.saveExample({\n key: Key,\n taskType,\n taskId,\n instructions: options.instructions ?? '',\n metadata: output.metadata,\n input: inputAsString,\n output: final\n })\n }\n\n return convertToAnswer(final)\n}\n"],"mappings":"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","names":["import_sdk","import_sdk","sdk","z","sdk","z","sdk","import_sdk","z","sdk","_","import_sdk","z","sdk","Options","prompt","output","instructions","import_sdk","import_lodash","z","sdk","Options","START","END","_","import_sdk","z","sdk","Example","Options","END","input","condition","answer","import_sdk","import_lodash","z","sdk","Example","Options","END","_","input","condition","import_sdk","import_lodash","z","sdk","Options","START","END","_","input","schema","instructions","JSON5","import_sdk","import_lodash","z","sdk","Options","_","END"]}