ai-functions 0.2.18 → 0.3.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.
- package/LICENSE +1 -1
- package/README.md +112 -21
- package/bin/cli.js +5 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.test.d.ts +2 -0
- package/dist/cli/index.test.d.ts.map +1 -0
- package/dist/cli/index.test.js +35 -0
- package/dist/cli/index.test.js.map +1 -0
- package/dist/constants/models.d.ts +10 -0
- package/dist/constants/models.d.ts.map +1 -0
- package/dist/constants/models.js +12 -0
- package/dist/constants/models.js.map +1 -0
- package/dist/converters/index.d.ts +3 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +3 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/model.d.ts +4 -0
- package/dist/converters/model.d.ts.map +1 -0
- package/dist/converters/model.js +19 -0
- package/dist/converters/model.js.map +1 -0
- package/dist/converters/schema.d.ts +4 -0
- package/dist/converters/schema.d.ts.map +1 -0
- package/dist/converters/schema.js +25 -0
- package/dist/converters/schema.js.map +1 -0
- package/dist/core/responses.d.ts +5 -0
- package/dist/core/responses.d.ts.map +1 -0
- package/dist/core/responses.js +16 -0
- package/dist/core/responses.js.map +1 -0
- package/dist/core/responses.test.d.ts +2 -0
- package/dist/core/responses.test.d.ts.map +1 -0
- package/dist/core/responses.test.js +31 -0
- package/dist/core/responses.test.js.map +1 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/examples/streaming.test.d.ts +2 -0
- package/dist/examples/streaming.test.d.ts.map +1 -0
- package/dist/examples/streaming.test.js +176 -0
- package/dist/examples/streaming.test.js.map +1 -0
- package/dist/factory/__tests__/index.test.d.ts +2 -0
- package/dist/factory/__tests__/index.test.d.ts.map +1 -0
- package/dist/factory/__tests__/index.test.js +430 -0
- package/dist/factory/__tests__/index.test.js.map +1 -0
- package/dist/factory/__tests__/list.test.d.ts +2 -0
- package/dist/factory/__tests__/list.test.d.ts.map +1 -0
- package/dist/factory/__tests__/list.test.js +92 -0
- package/dist/factory/__tests__/list.test.js.map +1 -0
- package/dist/factory/index.d.ts +20 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/factory/index.js +287 -0
- package/dist/factory/index.js.map +1 -0
- package/dist/factory/index.test.d.ts +2 -0
- package/dist/factory/index.test.d.ts.map +1 -0
- package/dist/factory/index.test.js +287 -0
- package/dist/factory/index.test.js.map +1 -0
- package/dist/factory/list.d.ts +3 -0
- package/dist/factory/list.d.ts.map +1 -0
- package/dist/factory/list.js +221 -0
- package/dist/factory/list.js.map +1 -0
- package/dist/factory/list.test.d.ts +2 -0
- package/dist/factory/list.test.d.ts.map +1 -0
- package/dist/factory/list.test.js +84 -0
- package/dist/factory/list.test.js.map +1 -0
- package/dist/generate/index.d.ts +5 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +17 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +59 -0
- package/dist/index.test.js.map +1 -0
- package/dist/list/await.d.ts +3 -0
- package/dist/list/await.d.ts.map +1 -0
- package/dist/list/await.js +28 -0
- package/dist/list/await.js.map +1 -0
- package/dist/list/constants.d.ts +4 -0
- package/dist/list/constants.d.ts.map +1 -0
- package/dist/list/constants.js +5 -0
- package/dist/list/constants.js.map +1 -0
- package/dist/list/create-function.d.ts +3 -0
- package/dist/list/create-function.d.ts.map +1 -0
- package/dist/list/create-function.js +11 -0
- package/dist/list/create-function.js.map +1 -0
- package/dist/list/index.d.ts +4 -0
- package/dist/list/index.d.ts.map +1 -0
- package/dist/list/index.js +5 -0
- package/dist/list/index.js.map +1 -0
- package/dist/list/prompt.d.ts +3 -0
- package/dist/list/prompt.d.ts.map +1 -0
- package/dist/list/prompt.js +6 -0
- package/dist/list/prompt.js.map +1 -0
- package/dist/list/schemas.d.ts +4 -0
- package/dist/list/schemas.d.ts.map +1 -0
- package/dist/list/schemas.js +8 -0
- package/dist/list/schemas.js.map +1 -0
- package/dist/list/stream.d.ts +3 -0
- package/dist/list/stream.d.ts.map +1 -0
- package/dist/list/stream.js +33 -0
- package/dist/list/stream.js.map +1 -0
- package/dist/list/types.d.ts +11 -0
- package/dist/list/types.d.ts.map +1 -0
- package/dist/list/types.js +2 -0
- package/dist/list/types.js.map +1 -0
- package/dist/list/validation.d.ts +3 -0
- package/dist/list/validation.d.ts.map +1 -0
- package/dist/list/validation.js +12 -0
- package/dist/list/validation.js.map +1 -0
- package/dist/providers/config.d.ts +4 -0
- package/dist/providers/config.d.ts.map +1 -0
- package/dist/providers/config.js +21 -0
- package/dist/providers/config.js.map +1 -0
- package/dist/providers/config.test.d.ts +2 -0
- package/dist/providers/config.test.d.ts.map +1 -0
- package/dist/providers/config.test.js +37 -0
- package/dist/providers/config.test.js.map +1 -0
- package/dist/proxy/constants.d.ts +4 -0
- package/dist/proxy/constants.d.ts.map +1 -0
- package/dist/proxy/constants.js +5 -0
- package/dist/proxy/constants.js.map +1 -0
- package/dist/proxy/create-function.d.ts +4 -0
- package/dist/proxy/create-function.d.ts.map +1 -0
- package/dist/proxy/create-function.js +24 -0
- package/dist/proxy/create-function.js.map +1 -0
- package/dist/proxy/create-proxy.d.ts +2 -0
- package/dist/proxy/create-proxy.d.ts.map +1 -0
- package/dist/proxy/create-proxy.js +11 -0
- package/dist/proxy/create-proxy.js.map +1 -0
- package/dist/proxy/function-generator.d.ts +9 -0
- package/dist/proxy/function-generator.d.ts.map +1 -0
- package/dist/proxy/function-generator.js +29 -0
- package/dist/proxy/function-generator.js.map +1 -0
- package/dist/proxy/index.d.ts +4 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +4 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/prompt.d.ts +2 -0
- package/dist/proxy/prompt.d.ts.map +1 -0
- package/dist/proxy/prompt.js +6 -0
- package/dist/proxy/prompt.js.map +1 -0
- package/dist/proxy/types.d.ts +7 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +2 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/queue/manager.d.ts +5 -0
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/queue/manager.js +37 -0
- package/dist/queue/manager.js.map +1 -0
- package/dist/queue/manager.test.d.ts +2 -0
- package/dist/queue/manager.test.d.ts.map +1 -0
- package/dist/queue/manager.test.js +52 -0
- package/dist/queue/manager.test.js.map +1 -0
- package/dist/schema-converter.d.ts +4 -0
- package/dist/schema-converter.d.ts.map +1 -0
- package/dist/schema-converter.js +30 -0
- package/dist/schema-converter.js.map +1 -0
- package/dist/stream/index.d.ts +7 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +23 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/streaming/utils.d.ts +4 -0
- package/dist/streaming/utils.d.ts.map +1 -0
- package/dist/streaming/utils.js +131 -0
- package/dist/streaming/utils.js.map +1 -0
- package/dist/streaming/utils.test.d.ts +2 -0
- package/dist/streaming/utils.test.d.ts.map +1 -0
- package/dist/streaming/utils.test.js +84 -0
- package/dist/streaming/utils.test.js.map +1 -0
- package/dist/templates/result.d.ts +7 -0
- package/dist/templates/result.d.ts.map +1 -0
- package/dist/templates/result.js +40 -0
- package/dist/templates/result.js.map +1 -0
- package/dist/templates/result.test.d.ts +2 -0
- package/dist/templates/result.test.d.ts.map +1 -0
- package/dist/templates/result.test.js +75 -0
- package/dist/templates/result.test.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +21 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/test-types.d.ts +13 -0
- package/dist/test-types.d.ts.map +1 -0
- package/dist/test-types.js +55 -0
- package/dist/test-types.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/list.d.ts +10 -0
- package/dist/types/list.d.ts.map +1 -0
- package/dist/types/list.js +2 -0
- package/dist/types/list.js.map +1 -0
- package/dist/types/model.d.ts +7 -0
- package/dist/types/model.d.ts.map +1 -0
- package/dist/types/model.js +2 -0
- package/dist/types/model.js.map +1 -0
- package/dist/types/options.d.ts +25 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +2 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/schema.d.ts +5 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +2 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/types.d.ts +113 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/__tests__/request-handler.test.d.ts +2 -0
- package/dist/utils/__tests__/request-handler.test.d.ts.map +1 -0
- package/dist/utils/__tests__/request-handler.test.js +134 -0
- package/dist/utils/__tests__/request-handler.test.js.map +1 -0
- package/dist/utils/__tests__/schema.test.d.ts +2 -0
- package/dist/utils/__tests__/schema.test.d.ts.map +1 -0
- package/dist/utils/__tests__/schema.test.js +49 -0
- package/dist/utils/__tests__/schema.test.js.map +1 -0
- package/dist/utils/__tests__/stream-progress.test.d.ts +2 -0
- package/dist/utils/__tests__/stream-progress.test.d.ts.map +1 -0
- package/dist/utils/__tests__/stream-progress.test.js +85 -0
- package/dist/utils/__tests__/stream-progress.test.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/request-handler.d.ts +17 -0
- package/dist/utils/request-handler.d.ts.map +1 -0
- package/dist/utils/request-handler.js +105 -0
- package/dist/utils/request-handler.js.map +1 -0
- package/dist/utils/schema.d.ts +11 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +51 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/stream-progress.d.ts +17 -0
- package/dist/utils/stream-progress.d.ts.map +1 -0
- package/dist/utils/stream-progress.js +86 -0
- package/dist/utils/stream-progress.js.map +1 -0
- package/dist/utils/validation.d.ts +3 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +30 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +56 -40
- package/db/cache.ts +0 -6
- package/db/mongo.ts +0 -75
- package/dist/mjs/db/cache.d.ts +0 -1
- package/dist/mjs/db/cache.js +0 -5
- package/dist/mjs/db/mongo.d.ts +0 -31
- package/dist/mjs/db/mongo.js +0 -48
- package/dist/mjs/examples/data.d.ts +0 -1105
- package/dist/mjs/examples/data.js +0 -1105
- package/dist/mjs/functions/ai.d.ts +0 -20
- package/dist/mjs/functions/ai.js +0 -83
- package/dist/mjs/functions/ai.test.d.ts +0 -1
- package/dist/mjs/functions/ai.test.js +0 -29
- package/dist/mjs/functions/gpt.d.ts +0 -4
- package/dist/mjs/functions/gpt.js +0 -10
- package/dist/mjs/functions/list.d.ts +0 -7
- package/dist/mjs/functions/list.js +0 -72
- package/dist/mjs/index.d.ts +0 -3
- package/dist/mjs/index.js +0 -3
- package/dist/mjs/queue/kafka.d.ts +0 -0
- package/dist/mjs/queue/kafka.js +0 -1
- package/dist/mjs/queue/memory.d.ts +0 -0
- package/dist/mjs/queue/memory.js +0 -1
- package/dist/mjs/queue/mongo.d.ts +0 -30
- package/dist/mjs/queue/mongo.js +0 -42
- package/dist/mjs/streams/kafka.d.ts +0 -0
- package/dist/mjs/streams/kafka.js +0 -1
- package/dist/mjs/streams/memory.d.ts +0 -0
- package/dist/mjs/streams/memory.js +0 -1
- package/dist/mjs/streams/mongo.d.ts +0 -0
- package/dist/mjs/streams/mongo.js +0 -1
- package/dist/mjs/streams/types.d.ts +0 -0
- package/dist/mjs/streams/types.js +0 -1
- package/dist/mjs/types.d.ts +0 -11
- package/dist/mjs/types.js +0 -1
- package/dist/mjs/utils/completion.d.ts +0 -9
- package/dist/mjs/utils/completion.js +0 -20
- package/dist/mjs/utils/schema.d.ts +0 -10
- package/dist/mjs/utils/schema.js +0 -72
- package/dist/mjs/utils/schema.test.d.ts +0 -1
- package/dist/mjs/utils/schema.test.js +0 -60
- package/dist/mjs/utils/state.d.ts +0 -1
- package/dist/mjs/utils/state.js +0 -19
- package/examples/data.ts +0 -1105
- package/fixup +0 -11
- package/functions/ai.test.ts +0 -41
- package/functions/ai.ts +0 -115
- package/functions/gpt.ts +0 -12
- package/functions/list.ts +0 -84
- package/index.ts +0 -3
- package/queue/kafka.ts +0 -0
- package/queue/memory.ts +0 -0
- package/queue/mongo.ts +0 -88
- package/streams/kafka.ts +0 -0
- package/streams/memory.ts +0 -0
- package/streams/mongo.ts +0 -0
- package/streams/types.ts +0 -0
- package/tsconfig-backup.json +0 -105
- package/tsconfig-base.json +0 -26
- package/tsconfig-cjs.json +0 -8
- package/tsconfig.json +0 -8
- package/types.ts +0 -12
- package/utils/completion.ts +0 -28
- package/utils/schema.test.ts +0 -69
- package/utils/schema.ts +0 -74
- package/utils/state.ts +0 -23
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach } from 'vitest';
|
|
2
|
+
import { createTemplateFunction } from './index';
|
|
3
|
+
import { openai } from '@ai-sdk/openai';
|
|
4
|
+
// import { anthropic } from '@ai-sdk/anthropic' // Commented out as it's just for test demonstration
|
|
5
|
+
describe('Template Function', () => {
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
process.env.OPENAI_API_KEY = process.env.OPENAI_API_KEY || 'test-key';
|
|
8
|
+
});
|
|
9
|
+
const model = openai('gpt-4o-mini');
|
|
10
|
+
describe('Template Literals', () => {
|
|
11
|
+
it('should support markdown generation', async () => {
|
|
12
|
+
const ai = createTemplateFunction();
|
|
13
|
+
const title = 'AI Functions';
|
|
14
|
+
const result = await ai `write a blog post in markdown starting with "# ${title}"`({ model });
|
|
15
|
+
expect(result).toMatch(/^# AI Functions/);
|
|
16
|
+
expect(result).toContain('# ');
|
|
17
|
+
expect(result).toContain('\n');
|
|
18
|
+
}, 30000);
|
|
19
|
+
// it('should support complex object summarization', async () => {
|
|
20
|
+
// const ai = createTemplateFunction()
|
|
21
|
+
// const itinerary = {
|
|
22
|
+
// dates: ['2024-01-01', '2024-01-02'],
|
|
23
|
+
// location: 'Miami Beach',
|
|
24
|
+
// activities: ['Swimming', 'Surfing']
|
|
25
|
+
// }
|
|
26
|
+
// const result = await ai`Summarize the itinerary: ${JSON.stringify(itinerary)}`({ model })
|
|
27
|
+
// expect(result).toContain('Miami Beach')
|
|
28
|
+
// expect(result).toMatch(/[Ss]wimming/)
|
|
29
|
+
// })
|
|
30
|
+
it('should support multiple interpolated values', async () => {
|
|
31
|
+
const ai = createTemplateFunction();
|
|
32
|
+
const city = 'Paris';
|
|
33
|
+
const days = 3;
|
|
34
|
+
const interests = ['art', 'food'];
|
|
35
|
+
const result = await ai `Create an itinerary for ${days} days in ${city} focusing on ${interests.join(' and ')}`({ model });
|
|
36
|
+
expect(result).toContain('Paris');
|
|
37
|
+
expect(result).toContain('art');
|
|
38
|
+
expect(result).toContain('food');
|
|
39
|
+
}, 30000);
|
|
40
|
+
});
|
|
41
|
+
// describe('Structured Outputs', () => {
|
|
42
|
+
// it('should support getting and using schema functions', async () => {
|
|
43
|
+
// const ai = new Proxy(createTemplateFunction(), {
|
|
44
|
+
// get: (target, prop) => {
|
|
45
|
+
// if (prop === 'categorizeProduct') {
|
|
46
|
+
// return createAIFunction(z.object({
|
|
47
|
+
// productType: z.enum(['App', 'API', 'Marketplace', 'Platform', 'Service', 'Website']),
|
|
48
|
+
// customer: z.string().describe('ideal customer profile'),
|
|
49
|
+
// solution: z.string().describe('describe the offer'),
|
|
50
|
+
// description: z.string().describe('website meta description')
|
|
51
|
+
// }))
|
|
52
|
+
// }
|
|
53
|
+
// return target[prop]
|
|
54
|
+
// }
|
|
55
|
+
// })
|
|
56
|
+
// // Get the function and use it later
|
|
57
|
+
// const categorizeProduct = ai.categorizeProduct
|
|
58
|
+
// const result1 = await categorizeProduct({ domain: 'stripe.com' }, { model })
|
|
59
|
+
// expect(result1).toHaveProperty('productType')
|
|
60
|
+
// expect(result1).toHaveProperty('customer')
|
|
61
|
+
// expect(result1).toHaveProperty('solution')
|
|
62
|
+
// expect(result1).toHaveProperty('description')
|
|
63
|
+
// expect(['App', 'API', 'Marketplace', 'Platform', 'Service', 'Website']).toContain(result1.productType)
|
|
64
|
+
// // Immediate invocation pattern
|
|
65
|
+
// const result2 = await ai.categorizeProduct({
|
|
66
|
+
// productType: 'App | API | Marketplace | Platform | Service | Website',
|
|
67
|
+
// customer: 'ideal customer profile',
|
|
68
|
+
// solution: 'describe the offer',
|
|
69
|
+
// description: 'website meta description',
|
|
70
|
+
// })({ name: 'drively AI' }, { model })
|
|
71
|
+
// expect(result2).toHaveProperty('productType')
|
|
72
|
+
// expect(result2).toHaveProperty('customer')
|
|
73
|
+
// expect(result2).toHaveProperty('solution')
|
|
74
|
+
// expect(result2).toHaveProperty('description')
|
|
75
|
+
// expect(['App', 'API', 'Marketplace', 'Platform', 'Service', 'Website']).toContain(result2.productType)
|
|
76
|
+
// }, 30000)
|
|
77
|
+
// it('should support enum output format', async () => {
|
|
78
|
+
// const ai = new Proxy(createTemplateFunction(), {
|
|
79
|
+
// get: (target, prop) => {
|
|
80
|
+
// if (prop === 'classifyMovie') {
|
|
81
|
+
// return createAIFunction(z.enum(['action', 'comedy', 'drama', 'horror', 'sci-fi']))
|
|
82
|
+
// }
|
|
83
|
+
// return target[prop]
|
|
84
|
+
// }
|
|
85
|
+
// })
|
|
86
|
+
// // Get the function and use it later
|
|
87
|
+
// const classifyMovie = ai.classifyMovie
|
|
88
|
+
// const result1 = await classifyMovie({
|
|
89
|
+
// plot: 'A group of astronauts travel through a wormhole in search of a new habitable planet for humanity.'
|
|
90
|
+
// }, { model })
|
|
91
|
+
// expect(['action', 'comedy', 'drama', 'horror', 'sci-fi']).toContain(result1)
|
|
92
|
+
// // Immediate invocation pattern
|
|
93
|
+
// const result2 = await ai.classifyMovie({
|
|
94
|
+
// genre: ['action', 'comedy', 'drama', 'horror', 'sci-fi']
|
|
95
|
+
// })({
|
|
96
|
+
// plot: 'A detective investigates a series of mysterious disappearances in a small town.'
|
|
97
|
+
// }, { model })
|
|
98
|
+
// expect(['action', 'comedy', 'drama', 'horror', 'sci-fi']).toContain(result2)
|
|
99
|
+
// }, 30000)
|
|
100
|
+
// })
|
|
101
|
+
describe('Configuration', () => {
|
|
102
|
+
it('should support model specification', async () => {
|
|
103
|
+
const ai = createTemplateFunction();
|
|
104
|
+
const result = await ai `Hello`({ model: openai('gpt-4o-mini') });
|
|
105
|
+
expect(result).toBeDefined();
|
|
106
|
+
});
|
|
107
|
+
it('should support system prompts', async () => {
|
|
108
|
+
const ai = createTemplateFunction();
|
|
109
|
+
const result = await ai `List fun activities`({
|
|
110
|
+
model,
|
|
111
|
+
system: 'You are an expert tour guide',
|
|
112
|
+
temperature: 0.2
|
|
113
|
+
});
|
|
114
|
+
expect(result).toBeDefined();
|
|
115
|
+
});
|
|
116
|
+
it('should support concurrency limits', async () => {
|
|
117
|
+
const ai = createTemplateFunction();
|
|
118
|
+
const startTime = Date.now();
|
|
119
|
+
const results = await Promise.all([
|
|
120
|
+
ai `task 1`({ model, concurrency: 2 }),
|
|
121
|
+
ai `task 2`({ model, concurrency: 2 }),
|
|
122
|
+
ai `task 3`({ model, concurrency: 2 })
|
|
123
|
+
]);
|
|
124
|
+
const endTime = Date.now();
|
|
125
|
+
expect(results).toHaveLength(3);
|
|
126
|
+
// With concurrency of 2, it should take at least 2 batches
|
|
127
|
+
expect(endTime - startTime).toBeGreaterThan(100);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
// describe('Composable Functions & Workflows', () => {
|
|
131
|
+
// it('should support function composition', async () => {
|
|
132
|
+
// const ai = createTemplateFunction()
|
|
133
|
+
// const list = createTemplateFunction()
|
|
134
|
+
// const listBlogPosts = (count: number, topic: string) =>
|
|
135
|
+
// list`${count} blog post titles about ${topic}`({ model })
|
|
136
|
+
// const writeBlogPost = (title: string) =>
|
|
137
|
+
// ai`write a blog post in markdown starting with "# ${title}"`({ model })
|
|
138
|
+
// async function* writeBlog(count: number, topic: string) {
|
|
139
|
+
// for await (const title of await listBlogPosts(count, topic)) {
|
|
140
|
+
// const content = await writeBlogPost(title)
|
|
141
|
+
// yield { title, content }
|
|
142
|
+
// }
|
|
143
|
+
// }
|
|
144
|
+
// const posts = []
|
|
145
|
+
// for await (const post of writeBlog(2, 'future of car sales')) {
|
|
146
|
+
// posts.push(post)
|
|
147
|
+
// }
|
|
148
|
+
// expect(posts).toHaveLength(2)
|
|
149
|
+
// posts.forEach(post => {
|
|
150
|
+
// expect(post).toHaveProperty('title')
|
|
151
|
+
// expect(post).toHaveProperty('content')
|
|
152
|
+
// expect(post.content).toMatch(new RegExp(`^# ${post.title}`))
|
|
153
|
+
// })
|
|
154
|
+
// })
|
|
155
|
+
// it('should support nested template functions', async () => {
|
|
156
|
+
// const ai = createTemplateFunction()
|
|
157
|
+
// const generateName = (type: string) => ai`generate a name for a ${type}`({ model })
|
|
158
|
+
// const generateFunction = (name: string) =>
|
|
159
|
+
// ai`write a function in TypeScript called ${name}`({ model })
|
|
160
|
+
// const name = await generateName('utility function')
|
|
161
|
+
// const result = await generateFunction(name)
|
|
162
|
+
// expect(result).toContain('function')
|
|
163
|
+
// expect(result).toContain(name)
|
|
164
|
+
// expect(result).toContain('export')
|
|
165
|
+
// })
|
|
166
|
+
// })
|
|
167
|
+
// describe('Alternative Providers', () => {
|
|
168
|
+
// it('should support OpenAI provider', async () => {
|
|
169
|
+
// const ai = createTemplateFunction()
|
|
170
|
+
// const result = await ai`Hello`({ model: openai('gpt-4o-mini') })
|
|
171
|
+
// expect(result).toBeDefined()
|
|
172
|
+
// })
|
|
173
|
+
// // This test is commented out as we don't want to actually import anthropic
|
|
174
|
+
// // but it demonstrates how the test would look
|
|
175
|
+
// /*
|
|
176
|
+
// it('should support Anthropic provider', async () => {
|
|
177
|
+
// const ai = createTemplateFunction()
|
|
178
|
+
// const result = await ai`write a function in TypeScript called ${name}`({
|
|
179
|
+
// model: anthropic('claude-3-5-sonnet-20241022')
|
|
180
|
+
// })
|
|
181
|
+
// expect(result).toContain('function')
|
|
182
|
+
// expect(result).toContain('export')
|
|
183
|
+
// })
|
|
184
|
+
// */
|
|
185
|
+
// it('should support custom provider configuration', async () => {
|
|
186
|
+
// const ai = createTemplateFunction()
|
|
187
|
+
// const result = await ai`Hello`({
|
|
188
|
+
// model: openai('gpt-4o-mini', { structuredOutputs: true })
|
|
189
|
+
// })
|
|
190
|
+
// expect(result).toBeDefined()
|
|
191
|
+
// })
|
|
192
|
+
// })
|
|
193
|
+
// describe('Advanced Features', () => {
|
|
194
|
+
// it('should support streaming with onChunk callback', async () => {
|
|
195
|
+
// const ai = createTemplateFunction()
|
|
196
|
+
// const chunks: string[] = []
|
|
197
|
+
// const result = await ai`Write a short story`({
|
|
198
|
+
// model,
|
|
199
|
+
// streaming: {
|
|
200
|
+
// onProgress: (chunk) => chunks.push(chunk)
|
|
201
|
+
// }
|
|
202
|
+
// })
|
|
203
|
+
// expect(result).toBeDefined()
|
|
204
|
+
// expect(chunks.length).toBeGreaterThan(0)
|
|
205
|
+
// expect(chunks.join('')).toBe(result)
|
|
206
|
+
// })
|
|
207
|
+
// it('should support structured outputs with OpenAI', async () => {
|
|
208
|
+
// const schema = z.object({
|
|
209
|
+
// name: z.string(),
|
|
210
|
+
// ingredients: z.array(z.object({
|
|
211
|
+
// name: z.string(),
|
|
212
|
+
// amount: z.string().nullable() // Note: using nullable instead of optional
|
|
213
|
+
// })),
|
|
214
|
+
// steps: z.array(z.string())
|
|
215
|
+
// })
|
|
216
|
+
// const ai = createTemplateFunction()
|
|
217
|
+
// const result = await ai`Generate a recipe`({
|
|
218
|
+
// model: openai('gpt-4o-mini', { structuredOutputs: true }),
|
|
219
|
+
// outputFormat: 'object',
|
|
220
|
+
// schema,
|
|
221
|
+
// schemaName: 'recipe',
|
|
222
|
+
// schemaDescription: 'A cooking recipe with ingredients and steps.'
|
|
223
|
+
// })
|
|
224
|
+
// const parsed = JSON.parse(result)
|
|
225
|
+
// expect(() => schema.parse(parsed)).not.toThrow()
|
|
226
|
+
// })
|
|
227
|
+
// it('should support long text generation', async () => {
|
|
228
|
+
// const ai = createTemplateFunction()
|
|
229
|
+
// const result = await ai`Write a detailed essay about the history of Rome`({
|
|
230
|
+
// model,
|
|
231
|
+
// maxSteps: 3,
|
|
232
|
+
// experimental_continueSteps: true,
|
|
233
|
+
// system: 'Stop when sufficient information was provided.'
|
|
234
|
+
// })
|
|
235
|
+
// expect(result.length).toBeGreaterThan(1000) // Assuming it generates substantial content
|
|
236
|
+
// expect(result).toContain('Rome')
|
|
237
|
+
// })
|
|
238
|
+
// it('should support predicted outputs', async () => {
|
|
239
|
+
// const ai = createTemplateFunction()
|
|
240
|
+
// const existingCode = `interface User {
|
|
241
|
+
// Username: string;
|
|
242
|
+
// Age: number;
|
|
243
|
+
// }`
|
|
244
|
+
// const result = await ai`Replace the Username property with an Email property`({
|
|
245
|
+
// model,
|
|
246
|
+
// experimental_providerMetadata: {
|
|
247
|
+
// openai: {
|
|
248
|
+
// prediction: {
|
|
249
|
+
// type: 'content',
|
|
250
|
+
// content: existingCode
|
|
251
|
+
// }
|
|
252
|
+
// }
|
|
253
|
+
// }
|
|
254
|
+
// })
|
|
255
|
+
// expect(result).toContain('interface User')
|
|
256
|
+
// expect(result).toContain('Email: string')
|
|
257
|
+
// expect(result).not.toContain('Username')
|
|
258
|
+
// })
|
|
259
|
+
// it('should support streaming with tool calls', async () => {
|
|
260
|
+
// const ai = createTemplateFunction()
|
|
261
|
+
// const toolCalls: any[] = []
|
|
262
|
+
// const toolResults: any[] = []
|
|
263
|
+
// await ai`What are some San Francisco tourist attractions?`({
|
|
264
|
+
// model,
|
|
265
|
+
// tools: {
|
|
266
|
+
// cityAttractions: {
|
|
267
|
+
// parameters: z.object({ city: z.string() }),
|
|
268
|
+
// execute: async ({ city }) => ({
|
|
269
|
+
// attractions: ['Alcatraz', 'Golden Gate Bridge', 'Fisherman\'s Wharf']
|
|
270
|
+
// })
|
|
271
|
+
// }
|
|
272
|
+
// },
|
|
273
|
+
// streaming: {
|
|
274
|
+
// onProgress: (chunk) => {
|
|
275
|
+
// if (chunk.type === 'tool-call') toolCalls.push(chunk)
|
|
276
|
+
// if (chunk.type === 'tool-result') toolResults.push(chunk)
|
|
277
|
+
// }
|
|
278
|
+
// }
|
|
279
|
+
// })
|
|
280
|
+
// expect(toolCalls.length).toBeGreaterThan(0)
|
|
281
|
+
// expect(toolResults.length).toBeGreaterThan(0)
|
|
282
|
+
// expect(toolCalls[0].toolName).toBe('cityAttractions')
|
|
283
|
+
// })
|
|
284
|
+
// })
|
|
285
|
+
// })
|
|
286
|
+
});
|
|
287
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/factory/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,EAAE,sBAAsB,EAAoB,MAAM,SAAS,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,qGAAqG;AAErG,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,UAAU,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;IAEnC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAA;YACnC,MAAM,KAAK,GAAG,cAAc,CAAA;YAC5B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA,kDAAkD,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YAC5F,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC,EAAE,KAAK,CAAC,CAAA;QAET,kEAAkE;QAClE,wCAAwC;QACxC,wBAAwB;QACxB,2CAA2C;QAC3C,+BAA+B;QAC/B,0CAA0C;QAC1C,MAAM;QACN,8FAA8F;QAC9F,4CAA4C;QAC5C,0CAA0C;QAC1C,KAAK;QAEL,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAA;YACnC,MAAM,IAAI,GAAG,OAAO,CAAA;YACpB,MAAM,IAAI,GAAG,CAAC,CAAA;YACd,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA,2BAA2B,IAAI,YAAY,IAAI,gBAAgB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YAC1H,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAClC,CAAC,EAAE,KAAK,CAAC,CAAA;IACX,CAAC,CAAC,CAAA;IAEF,yCAAyC;IACzC,0EAA0E;IAC1E,uDAAuD;IACvD,iCAAiC;IACjC,8CAA8C;IAC9C,+CAA+C;IAC/C,oGAAoG;IACpG,uEAAuE;IACvE,mEAAmE;IACnE,2EAA2E;IAC3E,gBAAgB;IAChB,YAAY;IACZ,8BAA8B;IAC9B,UAAU;IACV,SAAS;IAET,2CAA2C;IAC3C,qDAAqD;IACrD,mFAAmF;IACnF,oDAAoD;IACpD,iDAAiD;IACjD,iDAAiD;IACjD,oDAAoD;IACpD,6GAA6G;IAE7G,sCAAsC;IACtC,mDAAmD;IACnD,+EAA+E;IAC/E,4CAA4C;IAC5C,wCAAwC;IACxC,iDAAiD;IACjD,4CAA4C;IAE5C,oDAAoD;IACpD,iDAAiD;IACjD,iDAAiD;IACjD,oDAAoD;IACpD,6GAA6G;IAC7G,cAAc;IAEd,0DAA0D;IAC1D,uDAAuD;IACvD,iCAAiC;IACjC,0CAA0C;IAC1C,+FAA+F;IAC/F,YAAY;IACZ,8BAA8B;IAC9B,UAAU;IACV,SAAS;IAET,2CAA2C;IAC3C,6CAA6C;IAC7C,4CAA4C;IAC5C,kHAAkH;IAClH,oBAAoB;IACpB,mFAAmF;IAEnF,sCAAsC;IACtC,+CAA+C;IAC/C,iEAAiE;IACjE,YAAY;IACZ,gGAAgG;IAChG,oBAAoB;IACpB,mFAAmF;IACnF,cAAc;IACd,KAAK;IAEL,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAA;YACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YAChE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAA;YACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA,qBAAqB,CAAC;gBAC3C,KAAK;gBACL,MAAM,EAAE,8BAA8B;gBACtC,WAAW,EAAE,GAAG;aACjB,CAAC,CAAA;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAA;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAE5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChC,EAAE,CAAA,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBACrC,EAAE,CAAA,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBACrC,EAAE,CAAA,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;aACtC,CAAC,CAAA;YAEF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC/B,2DAA2D;YAC3D,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,yDAAyD;IACzD,8DAA8D;IAC9D,4CAA4C;IAC5C,8CAA8C;IAE9C,iEAAiE;IACjE,oEAAoE;IACpE,kDAAkD;IAClD,kFAAkF;IAElF,kEAAkE;IAClE,yEAAyE;IACzE,uDAAuD;IACvD,qCAAqC;IACrC,YAAY;IACZ,UAAU;IAEV,yBAAyB;IACzB,wEAAwE;IACxE,2BAA2B;IAC3B,UAAU;IAEV,sCAAsC;IACtC,gCAAgC;IAChC,+CAA+C;IAC/C,iDAAiD;IACjD,uEAAuE;IACvE,WAAW;IACX,SAAS;IAET,mEAAmE;IACnE,4CAA4C;IAC5C,4FAA4F;IAC5F,oDAAoD;IACpD,uEAAuE;IAEvE,4DAA4D;IAC5D,oDAAoD;IAEpD,6CAA6C;IAC7C,uCAAuC;IACvC,2CAA2C;IAC3C,SAAS;IACT,OAAO;IAEP,8CAA8C;IAC9C,yDAAyD;IACzD,4CAA4C;IAC5C,yEAAyE;IACzE,qCAAqC;IACrC,SAAS;IAET,kFAAkF;IAClF,qDAAqD;IACrD,SAAS;IACT,4DAA4D;IAC5D,4CAA4C;IAC5C,kFAAkF;IAClF,yDAAyD;IACzD,WAAW;IACX,6CAA6C;IAC7C,2CAA2C;IAC3C,SAAS;IACT,SAAS;IAET,uEAAuE;IACvE,4CAA4C;IAC5C,0CAA0C;IAC1C,oEAAoE;IACpE,WAAW;IACX,qCAAqC;IACrC,SAAS;IACT,OAAO;IAEP,0CAA0C;IAC1C,yEAAyE;IACzE,4CAA4C;IAC5C,oCAAoC;IAEpC,uDAAuD;IACvD,iBAAiB;IACjB,uBAAuB;IACvB,sDAAsD;IACtD,YAAY;IACZ,WAAW;IAEX,qCAAqC;IACrC,iDAAiD;IACjD,6CAA6C;IAC7C,SAAS;IAET,wEAAwE;IACxE,kCAAkC;IAClC,4BAA4B;IAC5B,0CAA0C;IAC1C,8BAA8B;IAC9B,sFAAsF;IACtF,eAAe;IACf,qCAAqC;IACrC,WAAW;IAEX,4CAA4C;IAC5C,qDAAqD;IACrD,qEAAqE;IACrE,kCAAkC;IAClC,kBAAkB;IAClB,gCAAgC;IAChC,4EAA4E;IAC5E,WAAW;IAEX,0CAA0C;IAC1C,yDAAyD;IACzD,SAAS;IAET,8DAA8D;IAC9D,4CAA4C;IAC5C,oFAAoF;IACpF,iBAAiB;IACjB,uBAAuB;IACvB,4CAA4C;IAC5C,mEAAmE;IACnE,WAAW;IAEX,iGAAiG;IACjG,yCAAyC;IACzC,SAAS;IAET,2DAA2D;IAC3D,4CAA4C;IAC5C,+CAA+C;IAC/C,4BAA4B;IAC5B,uBAAuB;IACvB,WAAW;IAEX,wFAAwF;IACxF,iBAAiB;IACjB,2CAA2C;IAC3C,sBAAsB;IACtB,4BAA4B;IAC5B,iCAAiC;IACjC,sCAAsC;IACtC,gBAAgB;IAChB,cAAc;IACd,YAAY;IACZ,WAAW;IAEX,mDAAmD;IACnD,kDAAkD;IAClD,iDAAiD;IACjD,SAAS;IAET,mEAAmE;IACnE,4CAA4C;IAC5C,oCAAoC;IACpC,sCAAsC;IAEtC,qEAAqE;IACrE,iBAAiB;IACjB,mBAAmB;IACnB,+BAA+B;IAC/B,0DAA0D;IAC1D,8CAA8C;IAC9C,sFAAsF;IACtF,iBAAiB;IACjB,cAAc;IACd,aAAa;IACb,uBAAuB;IACvB,qCAAqC;IACrC,oEAAoE;IACpE,wEAAwE;IACxE,cAAc;IACd,YAAY;IACZ,WAAW;IAEX,oDAAoD;IACpD,sDAAsD;IACtD,8DAA8D;IAC9D,SAAS;IACT,OAAO;IACP,KAAK;AACL,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/factory/list.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAyB,MAAM,UAAU,CAAA;AAc9F,wBAAgB,kBAAkB,CAAC,cAAc,GAAE,iBAAsB,GAAG,oBAAoB,CAwO/F"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { streamObject } from 'ai';
|
|
2
|
+
import { openai } from '@ai-sdk/openai';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import PQueue from 'p-queue';
|
|
5
|
+
function createQueue(options) {
|
|
6
|
+
if (!options.concurrency) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
return new PQueue({
|
|
10
|
+
concurrency: options.concurrency,
|
|
11
|
+
autoStart: true,
|
|
12
|
+
carryoverConcurrencyCount: true,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function createListFunction(defaultOptions = {}) {
|
|
16
|
+
let currentPrompt;
|
|
17
|
+
let currentQueue;
|
|
18
|
+
let queueOptions;
|
|
19
|
+
const getQueue = (options) => {
|
|
20
|
+
if (!options.concurrency) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
// Create a new queue if options have changed
|
|
24
|
+
if (!currentQueue ||
|
|
25
|
+
!queueOptions?.concurrency ||
|
|
26
|
+
queueOptions.concurrency !== options.concurrency) {
|
|
27
|
+
currentQueue = createQueue(options);
|
|
28
|
+
queueOptions = options;
|
|
29
|
+
}
|
|
30
|
+
return currentQueue;
|
|
31
|
+
};
|
|
32
|
+
const executeRequest = async (prompt, options) => {
|
|
33
|
+
const modelParams = {
|
|
34
|
+
temperature: options.temperature,
|
|
35
|
+
maxTokens: options.maxTokens,
|
|
36
|
+
topP: options.topP,
|
|
37
|
+
frequencyPenalty: options.frequencyPenalty,
|
|
38
|
+
presencePenalty: options.presencePenalty,
|
|
39
|
+
stopSequences: options.stop ? Array.isArray(options.stop) ? options.stop : [options.stop] : undefined,
|
|
40
|
+
seed: options.seed
|
|
41
|
+
};
|
|
42
|
+
const performRequest = async () => {
|
|
43
|
+
try {
|
|
44
|
+
const model = options.model || openai(process.env.OPENAI_DEFAULT_MODEL || 'gpt-4o');
|
|
45
|
+
const streamOptions = {
|
|
46
|
+
model,
|
|
47
|
+
output: 'array',
|
|
48
|
+
schema: z.string(),
|
|
49
|
+
prompt: `Generate a list of items based on this prompt: ${prompt}`,
|
|
50
|
+
system: options.system,
|
|
51
|
+
...modelParams
|
|
52
|
+
};
|
|
53
|
+
const { elementStream } = streamObject(streamOptions);
|
|
54
|
+
const elements = [];
|
|
55
|
+
for await (const item of elementStream) {
|
|
56
|
+
elements.push(item);
|
|
57
|
+
}
|
|
58
|
+
return elements.join('\n');
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof Error) {
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
throw new Error('Failed to generate list');
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const queue = getQueue(options);
|
|
68
|
+
const result = queue
|
|
69
|
+
? await queue.add(performRequest)
|
|
70
|
+
: await performRequest();
|
|
71
|
+
return result;
|
|
72
|
+
};
|
|
73
|
+
const executeStreamingRequest = async function* (prompt, options) {
|
|
74
|
+
const modelParams = {
|
|
75
|
+
temperature: options.temperature,
|
|
76
|
+
maxTokens: options.maxTokens,
|
|
77
|
+
topP: options.topP,
|
|
78
|
+
frequencyPenalty: options.frequencyPenalty,
|
|
79
|
+
presencePenalty: options.presencePenalty,
|
|
80
|
+
stopSequences: options.stop ? Array.isArray(options.stop) ? options.stop : [options.stop] : undefined,
|
|
81
|
+
seed: options.seed
|
|
82
|
+
};
|
|
83
|
+
const performRequest = async function* () {
|
|
84
|
+
try {
|
|
85
|
+
const model = options.model || openai(process.env.OPENAI_DEFAULT_MODEL || 'gpt-4o');
|
|
86
|
+
const streamOptions = {
|
|
87
|
+
model,
|
|
88
|
+
output: 'array',
|
|
89
|
+
schema: z.string(),
|
|
90
|
+
prompt: `Generate a list of items based on this prompt: ${prompt}`,
|
|
91
|
+
system: options.system,
|
|
92
|
+
...modelParams
|
|
93
|
+
};
|
|
94
|
+
const { elementStream } = streamObject(streamOptions);
|
|
95
|
+
for await (const item of elementStream) {
|
|
96
|
+
yield item;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (error instanceof Error) {
|
|
101
|
+
if (error.name === 'AbortError') {
|
|
102
|
+
throw new Error('Stream was aborted');
|
|
103
|
+
}
|
|
104
|
+
else if (error.name === 'TimeoutError') {
|
|
105
|
+
throw new Error('Stream timed out');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
throw new Error('Failed to generate list: Unknown error occurred');
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const queue = getQueue(options);
|
|
115
|
+
if (queue) {
|
|
116
|
+
const operation = performRequest();
|
|
117
|
+
// Queue the operation based on its type
|
|
118
|
+
if (operation[Symbol.asyncIterator]) {
|
|
119
|
+
// For AsyncGenerator, queue each value
|
|
120
|
+
for await (const value of operation) {
|
|
121
|
+
yield await queue.add(async () => value);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// For Promise, queue the entire operation
|
|
126
|
+
yield await queue.add(async () => {
|
|
127
|
+
const result = await operation;
|
|
128
|
+
return result;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
yield* performRequest();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const templateFn = async (prompt, options = defaultOptions) => {
|
|
137
|
+
currentPrompt = prompt;
|
|
138
|
+
const mergedOptions = { ...defaultOptions, ...options };
|
|
139
|
+
try {
|
|
140
|
+
return await executeRequest(prompt, mergedOptions);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (error instanceof Error) {
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
throw new Error('Failed to generate list');
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const asyncIterator = async function* (prompt, options = defaultOptions) {
|
|
150
|
+
currentPrompt = prompt;
|
|
151
|
+
const mergedOptions = { ...defaultOptions, ...options };
|
|
152
|
+
try {
|
|
153
|
+
for await (const item of executeStreamingRequest(prompt, mergedOptions)) {
|
|
154
|
+
yield item;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error instanceof Error) {
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
throw new Error('Failed to generate list');
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
function createTemplateResult(prompt, options) {
|
|
165
|
+
const promise = templateFn(prompt, options);
|
|
166
|
+
const result = Object.assign((opts) => templateFn(prompt, { ...options, ...opts }), {
|
|
167
|
+
[Symbol.asyncIterator]: () => asyncIterator(prompt, options),
|
|
168
|
+
call: (opts) => templateFn(prompt, { ...options, ...opts }),
|
|
169
|
+
then: promise.then.bind(promise),
|
|
170
|
+
catch: promise.catch.bind(promise),
|
|
171
|
+
finally: promise.finally.bind(promise),
|
|
172
|
+
});
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
function createBaseFunction() {
|
|
176
|
+
function fn(stringsOrOptions, ...values) {
|
|
177
|
+
if (!stringsOrOptions) {
|
|
178
|
+
return createTemplateResult('', defaultOptions);
|
|
179
|
+
}
|
|
180
|
+
if (Array.isArray(stringsOrOptions)) {
|
|
181
|
+
const strings = stringsOrOptions;
|
|
182
|
+
if (strings.length - 1 !== values.length) {
|
|
183
|
+
throw new Error('Template literal slots must match provided values');
|
|
184
|
+
}
|
|
185
|
+
const lastValue = values[values.length - 1];
|
|
186
|
+
const options = typeof lastValue === 'object' && !Array.isArray(lastValue) && lastValue !== null
|
|
187
|
+
? { ...defaultOptions, ...lastValue }
|
|
188
|
+
: defaultOptions;
|
|
189
|
+
const actualValues = typeof lastValue === 'object' && !Array.isArray(lastValue) && lastValue !== null
|
|
190
|
+
? values.slice(0, -1)
|
|
191
|
+
: values;
|
|
192
|
+
const prompt = strings.reduce((acc, str, i) => acc + str + (actualValues[i] || ''), '');
|
|
193
|
+
currentPrompt = prompt;
|
|
194
|
+
return createTemplateResult(prompt, options);
|
|
195
|
+
}
|
|
196
|
+
const options = { ...defaultOptions, ...stringsOrOptions };
|
|
197
|
+
return createTemplateResult('', options);
|
|
198
|
+
}
|
|
199
|
+
// Add the asyncIterator to the base function
|
|
200
|
+
Object.defineProperty(fn, Symbol.asyncIterator, {
|
|
201
|
+
value: () => asyncIterator(currentPrompt || '', defaultOptions),
|
|
202
|
+
enumerable: false,
|
|
203
|
+
configurable: true
|
|
204
|
+
});
|
|
205
|
+
// Add the withOptions method
|
|
206
|
+
Object.defineProperty(fn, 'withOptions', {
|
|
207
|
+
value: (opts) => templateFn(currentPrompt || '', { ...defaultOptions, ...opts }),
|
|
208
|
+
enumerable: false,
|
|
209
|
+
configurable: true
|
|
210
|
+
});
|
|
211
|
+
// Add the queue property
|
|
212
|
+
Object.defineProperty(fn, 'queue', {
|
|
213
|
+
get: () => currentQueue,
|
|
214
|
+
enumerable: false,
|
|
215
|
+
configurable: true
|
|
216
|
+
});
|
|
217
|
+
return fn;
|
|
218
|
+
}
|
|
219
|
+
return createBaseFunction();
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/factory/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/factory/list.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach } from 'vitest';
|
|
2
|
+
import { createListFunction } from './list';
|
|
3
|
+
import { openai } from '@ai-sdk/openai';
|
|
4
|
+
describe('List Function', () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
process.env.OPENAI_API_KEY = process.env.OPENAI_API_KEY || 'test-key';
|
|
7
|
+
});
|
|
8
|
+
const model = openai('gpt-4o-mini');
|
|
9
|
+
describe('Template Literals', () => {
|
|
10
|
+
it('should generate list using template literal', async () => {
|
|
11
|
+
const list = createListFunction();
|
|
12
|
+
const result = await list `fun things to do in Miami`({ model });
|
|
13
|
+
expect(result).toBeDefined();
|
|
14
|
+
const items = result.split('\n');
|
|
15
|
+
expect(items.length).toBeGreaterThan(0);
|
|
16
|
+
items.forEach(item => expect(typeof item).toBe('string'));
|
|
17
|
+
});
|
|
18
|
+
it('should support async iteration', async () => {
|
|
19
|
+
const list = createListFunction();
|
|
20
|
+
const items = [];
|
|
21
|
+
for await (const item of list `fun things to do in Miami`({ model })) {
|
|
22
|
+
items.push(item);
|
|
23
|
+
}
|
|
24
|
+
expect(items.length).toBeGreaterThan(0);
|
|
25
|
+
items.forEach(item => expect(typeof item).toBe('string'));
|
|
26
|
+
});
|
|
27
|
+
it('should support interpolation', async () => {
|
|
28
|
+
const list = createListFunction();
|
|
29
|
+
const city = 'Paris';
|
|
30
|
+
const category = 'museums';
|
|
31
|
+
const result = await list `top ${category} to visit in ${city}`({ model });
|
|
32
|
+
expect(result).toContain('Louvre');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('Configuration', () => {
|
|
36
|
+
it('should support system prompts', async () => {
|
|
37
|
+
const list = createListFunction();
|
|
38
|
+
const result = await list `fun things to do in Miami`({
|
|
39
|
+
model,
|
|
40
|
+
system: 'You are an expert tour guide',
|
|
41
|
+
temperature: 0.2
|
|
42
|
+
});
|
|
43
|
+
expect(result).toBeDefined();
|
|
44
|
+
expect(result.split('\n').length).toBeGreaterThan(0);
|
|
45
|
+
});
|
|
46
|
+
it('should support concurrency for multiple lists', async () => {
|
|
47
|
+
const list = createListFunction();
|
|
48
|
+
const cities = ['Paris', 'London', 'Tokyo'];
|
|
49
|
+
const results = await Promise.all(cities.map(city => list `top attractions in ${city}`({ model, concurrency: 2 })));
|
|
50
|
+
expect(results).toHaveLength(3);
|
|
51
|
+
results.forEach(result => {
|
|
52
|
+
expect(result.split('\n').length).toBeGreaterThan(0);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('Streaming', () => {
|
|
57
|
+
it('should stream list items', async () => {
|
|
58
|
+
const list = createListFunction();
|
|
59
|
+
const items = [];
|
|
60
|
+
const progressItems = [];
|
|
61
|
+
for await (const item of list `fun things to do in Miami`({
|
|
62
|
+
model,
|
|
63
|
+
streaming: {
|
|
64
|
+
onProgress: chunk => progressItems.push(chunk)
|
|
65
|
+
}
|
|
66
|
+
})) {
|
|
67
|
+
items.push(item);
|
|
68
|
+
}
|
|
69
|
+
expect(items.length).toBeGreaterThan(0);
|
|
70
|
+
expect(progressItems.length).toBeGreaterThan(0);
|
|
71
|
+
});
|
|
72
|
+
it('should handle streaming errors gracefully', async () => {
|
|
73
|
+
const list = createListFunction();
|
|
74
|
+
await expect(async () => {
|
|
75
|
+
for await (const item of list `fun things to do in Miami`({
|
|
76
|
+
model: undefined // Force an error
|
|
77
|
+
})) {
|
|
78
|
+
console.log(item);
|
|
79
|
+
}
|
|
80
|
+
}).rejects.toThrow();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=list.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../src/factory/list.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GenerateObjectOptions, SimpleSchema } from '@/types';
|
|
2
|
+
export declare function generateObject<T extends SimpleSchema>(options: GenerateObjectOptions<T>): Promise<import("ai").GenerateObjectResult<{
|
|
3
|
+
[x: string]: any;
|
|
4
|
+
}>>;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generate/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAElE,wBAAsB,cAAc,CAAC,CAAC,SAAS,YAAY,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;;IAa7F"}
|