import assert from 'node:assert'; import { z } from 'zod'; import { MockLanguageModelV1 } from '../test/mock-language-model-v1'; import { experimental_generateText } from './generate-text'; const dummyResponseValues = { rawCall: { rawPrompt: 'prompt', rawSettings: {} }, finishReason: 'stop' as const, usage: { promptTokens: 10, completionTokens: 20 }, }; describe('result.text', () => { it('should generate text', async () => { const result = await experimental_generateText({ model: new MockLanguageModelV1({ doGenerate: async ({ prompt, mode }) => { assert.deepStrictEqual(mode, { type: 'regular', tools: undefined }); assert.deepStrictEqual(prompt, [ { role: 'user', content: [{ type: 'text', text: 'prompt' }] }, ]); return { ...dummyResponseValues, text: `Hello, world!`, }; }, }), prompt: 'prompt', }); assert.deepStrictEqual(result.text, 'Hello, world!'); }); }); describe('result.toolCalls', () => { it('should contain tool calls', async () => { const result = await experimental_generateText({ model: new MockLanguageModelV1({ doGenerate: async ({ prompt, mode }) => { assert.deepStrictEqual(mode, { type: 'regular', tools: [ { type: 'function', name: 'tool1', description: undefined, parameters: { $schema: 'http://json-schema.org/draft-07/schema#', additionalProperties: false, properties: { value: { type: 'string' } }, required: ['value'], type: 'object', }, }, { type: 'function', name: 'tool2', description: undefined, parameters: { $schema: 'http://json-schema.org/draft-07/schema#', additionalProperties: false, properties: { somethingElse: { type: 'string' } }, required: ['somethingElse'], type: 'object', }, }, ], }); assert.deepStrictEqual(prompt, [ { role: 'user', content: [{ type: 'text', text: 'test-input' }] }, ]); return { ...dummyResponseValues, toolCalls: [ { toolCallType: 'function', toolCallId: 'call-1', toolName: 'tool1', args: `{ "value": "value" }`, }, ], }; }, }), tools: { tool1: { parameters: z.object({ value: z.string() }), }, // 2nd tool to show typing: tool2: { parameters: z.object({ somethingElse: z.string() }), }, }, prompt: 'test-input', }); // test type inference if (result.toolCalls[0].toolName === 'tool1') { assertType(result.toolCalls[0].args.value); } assert.deepStrictEqual(result.toolCalls, [ { type: 'tool-call', toolCallId: 'call-1', toolName: 'tool1', args: { value: 'value' }, }, ]); }); }); describe('result.toolResults', () => { it('should contain tool results', async () => { const result = await experimental_generateText({ model: new MockLanguageModelV1({ doGenerate: async ({ prompt, mode }) => { assert.deepStrictEqual(mode, { type: 'regular', tools: [ { type: 'function', name: 'tool1', description: undefined, parameters: { $schema: 'http://json-schema.org/draft-07/schema#', additionalProperties: false, properties: { value: { type: 'string' } }, required: ['value'], type: 'object', }, }, ], }); assert.deepStrictEqual(prompt, [ { role: 'user', content: [{ type: 'text', text: 'test-input' }] }, ]); return { ...dummyResponseValues, toolCalls: [ { toolCallType: 'function', toolCallId: 'call-1', toolName: 'tool1', args: `{ "value": "value" }`, }, ], }; }, }), tools: { tool1: { parameters: z.object({ value: z.string() }), execute: async args => { assert.deepStrictEqual(args, { value: 'value' }); return 'result1'; }, }, }, prompt: 'test-input', }); // test type inference if (result.toolResults[0].toolName === 'tool1') { assertType(result.toolResults[0].result); } assert.deepStrictEqual(result.toolResults, [ { toolCallId: 'call-1', toolName: 'tool1', args: { value: 'value' }, result: 'result1', }, ]); }); });