ai-functions 2.1.1 → 2.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/.turbo/turbo-build.log +1 -4
- package/CHANGELOG.md +68 -1
- package/README.md +397 -157
- package/dist/ai-promise.d.ts +50 -3
- package/dist/ai-promise.d.ts.map +1 -1
- package/dist/ai-promise.js +410 -51
- package/dist/ai-promise.js.map +1 -1
- package/dist/ai-schemas.d.ts +56 -0
- package/dist/ai-schemas.d.ts.map +1 -0
- package/dist/ai-schemas.js +53 -0
- package/dist/ai-schemas.js.map +1 -0
- package/dist/ai.d.ts +16 -242
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +54 -837
- package/dist/ai.js.map +1 -1
- package/dist/batch/anthropic.d.ts +6 -4
- package/dist/batch/anthropic.d.ts.map +1 -1
- package/dist/batch/anthropic.js +83 -145
- package/dist/batch/anthropic.js.map +1 -1
- package/dist/batch/bedrock.d.ts +8 -30
- package/dist/batch/bedrock.d.ts.map +1 -1
- package/dist/batch/bedrock.js +155 -338
- package/dist/batch/bedrock.js.map +1 -1
- package/dist/batch/cloudflare.d.ts +8 -20
- package/dist/batch/cloudflare.d.ts.map +1 -1
- package/dist/batch/cloudflare.js +68 -189
- package/dist/batch/cloudflare.js.map +1 -1
- package/dist/batch/google.d.ts +6 -20
- package/dist/batch/google.d.ts.map +1 -1
- package/dist/batch/google.js +70 -238
- package/dist/batch/google.js.map +1 -1
- package/dist/batch/index.d.ts +4 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js +4 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/batch/memory.d.ts +1 -1
- package/dist/batch/memory.d.ts.map +1 -1
- package/dist/batch/memory.js +14 -10
- package/dist/batch/memory.js.map +1 -1
- package/dist/batch/openai.d.ts +11 -14
- package/dist/batch/openai.d.ts.map +1 -1
- package/dist/batch/openai.js +52 -156
- package/dist/batch/openai.js.map +1 -1
- package/dist/batch/provider.d.ts +111 -0
- package/dist/batch/provider.d.ts.map +1 -0
- package/dist/batch/provider.js +233 -0
- package/dist/batch/provider.js.map +1 -0
- package/dist/batch-map.d.ts.map +1 -1
- package/dist/batch-map.js +23 -17
- package/dist/batch-map.js.map +1 -1
- package/dist/batch-queue.d.ts +65 -0
- package/dist/batch-queue.d.ts.map +1 -1
- package/dist/batch-queue.js +169 -14
- package/dist/batch-queue.js.map +1 -1
- package/dist/budget.d.ts +272 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +513 -0
- package/dist/budget.js.map +1 -0
- package/dist/cache.d.ts +295 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +433 -0
- package/dist/cache.js.map +1 -0
- package/dist/context.d.ts +42 -8
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +64 -62
- package/dist/context.js.map +1 -1
- package/dist/digital-objects-registry.d.ts +229 -0
- package/dist/digital-objects-registry.d.ts.map +1 -0
- package/dist/digital-objects-registry.js +617 -0
- package/dist/digital-objects-registry.js.map +1 -0
- package/dist/embeddings.d.ts +2 -2
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/errors.js.map +1 -0
- package/dist/eval/runner.d.ts +10 -1
- package/dist/eval/runner.d.ts.map +1 -1
- package/dist/eval/runner.js +41 -35
- package/dist/eval/runner.js.map +1 -1
- package/dist/eval-log/in-memory.d.ts +34 -0
- package/dist/eval-log/in-memory.d.ts.map +1 -0
- package/dist/eval-log/in-memory.js +84 -0
- package/dist/eval-log/in-memory.js.map +1 -0
- package/dist/eval-log/index.d.ts +29 -0
- package/dist/eval-log/index.d.ts.map +1 -0
- package/dist/eval-log/index.js +39 -0
- package/dist/eval-log/index.js.map +1 -0
- package/dist/eval-log/types.d.ts +101 -0
- package/dist/eval-log/types.d.ts.map +1 -0
- package/dist/eval-log/types.js +16 -0
- package/dist/eval-log/types.js.map +1 -0
- package/dist/function-registry.d.ts +116 -0
- package/dist/function-registry.d.ts.map +1 -0
- package/dist/function-registry.js +546 -0
- package/dist/function-registry.js.map +1 -0
- package/dist/generate.d.ts +9 -3
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +18 -22
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +35 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +89 -42
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +118 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +187 -0
- package/dist/logger.js.map +1 -0
- package/dist/middleware/budget.d.ts +84 -0
- package/dist/middleware/budget.d.ts.map +1 -0
- package/dist/middleware/budget.js +110 -0
- package/dist/middleware/budget.js.map +1 -0
- package/dist/middleware/cache.d.ts +103 -0
- package/dist/middleware/cache.d.ts.map +1 -0
- package/dist/middleware/cache.js +228 -0
- package/dist/middleware/cache.js.map +1 -0
- package/dist/middleware/embed-cache.d.ts +99 -0
- package/dist/middleware/embed-cache.d.ts.map +1 -0
- package/dist/middleware/embed-cache.js +128 -0
- package/dist/middleware/embed-cache.js.map +1 -0
- package/dist/middleware/index.d.ts +11 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +11 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/trace.d.ts +103 -0
- package/dist/middleware/trace.d.ts.map +1 -0
- package/dist/middleware/trace.js +176 -0
- package/dist/middleware/trace.js.map +1 -0
- package/dist/primitives.d.ts +120 -1
- package/dist/primitives.d.ts.map +1 -1
- package/dist/primitives.js +398 -26
- package/dist/primitives.js.map +1 -1
- package/dist/retry.d.ts +368 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +646 -0
- package/dist/retry.js.map +1 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -10
- package/dist/schema.js.map +1 -1
- package/dist/telemetry.d.ts +128 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +285 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/template.d.ts.map +1 -1
- package/dist/template.js +6 -1
- package/dist/template.js.map +1 -1
- package/dist/tool-orchestration.d.ts +453 -0
- package/dist/tool-orchestration.d.ts.map +1 -0
- package/dist/tool-orchestration.js +763 -0
- package/dist/tool-orchestration.js.map +1 -0
- package/dist/type-guards.d.ts +28 -0
- package/dist/type-guards.d.ts.map +1 -0
- package/dist/type-guards.js +29 -0
- package/dist/type-guards.js.map +1 -0
- package/dist/types.d.ts +135 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +36 -1
- package/dist/types.js.map +1 -1
- package/dist/wrap-for-v3.d.ts +80 -0
- package/dist/wrap-for-v3.d.ts.map +1 -0
- package/dist/wrap-for-v3.js +89 -0
- package/dist/wrap-for-v3.js.map +1 -0
- package/examples/00-quickstart.ts +232 -0
- package/examples/01-rag-chatbot.ts +212 -0
- package/examples/02-multi-agent-research.ts +290 -0
- package/examples/03-email-classification.ts +379 -0
- package/examples/04-content-moderation.ts +400 -0
- package/examples/05-document-extraction.ts +455 -0
- package/examples/06-streaming-chat-nextjs.ts +437 -0
- package/examples/07-cloudflare-worker.ts +483 -0
- package/examples/08-batch-processing.ts +491 -0
- package/examples/09-budget-constrained.ts +527 -0
- package/examples/10-tool-orchestration.ts +565 -0
- package/examples/11-retry-resilience.ts +403 -0
- package/examples/12-caching-strategies.ts +422 -0
- package/examples/README.md +145 -0
- package/package.json +10 -6
- package/src/ai-promise.ts +528 -99
- package/src/ai-schemas.ts +122 -0
- package/src/ai.ts +69 -1153
- package/src/batch/anthropic.ts +96 -161
- package/src/batch/bedrock.ts +203 -454
- package/src/batch/cloudflare.ts +99 -282
- package/src/batch/google.ts +91 -297
- package/src/batch/index.ts +4 -1
- package/src/batch/memory.ts +15 -10
- package/src/batch/openai.ts +65 -193
- package/src/batch/provider.ts +336 -0
- package/src/batch-map.ts +29 -24
- package/src/batch-queue.ts +200 -11
- package/src/budget.ts +740 -0
- package/src/cache.ts +681 -0
- package/src/context.ts +122 -76
- package/src/digital-objects-registry.ts +750 -0
- package/src/errors.ts +37 -0
- package/src/eval/runner.ts +63 -38
- package/src/eval-log/in-memory.ts +90 -0
- package/src/eval-log/index.ts +46 -0
- package/src/eval-log/types.ts +110 -0
- package/src/function-registry.ts +671 -0
- package/src/generate.ts +33 -33
- package/src/index.ts +325 -49
- package/src/logger.ts +232 -0
- package/src/middleware/budget.ts +171 -0
- package/src/middleware/cache.ts +299 -0
- package/src/middleware/embed-cache.ts +195 -0
- package/src/middleware/index.ts +23 -0
- package/src/middleware/trace.ts +248 -0
- package/src/primitives.ts +589 -62
- package/src/retry.ts +902 -0
- package/src/schema.ts +8 -17
- package/src/telemetry.ts +403 -0
- package/src/template.ts +8 -4
- package/src/tool-orchestration.ts +1173 -0
- package/src/type-guards.ts +31 -0
- package/src/types.ts +164 -25
- package/src/wrap-for-v3.ts +105 -0
- package/test/ai-promise.test.ts +1080 -0
- package/test/ai-proxy.test.ts +1 -1
- package/test/backward-compat.test.ts +147 -0
- package/test/batch-autosubmit-errors.test.ts +610 -0
- package/test/batch-blog-posts.test.ts +87 -129
- package/test/budget-tracking.test.ts +800 -0
- package/test/cache.test.ts +712 -0
- package/test/context-isolation.test.ts +687 -0
- package/test/core-functions.test.ts +183 -579
- package/test/decide.test.ts +154 -322
- package/test/define.test.ts +211 -8
- package/test/digital-objects-registry.test.ts +760 -0
- package/test/embedding-cache-middleware.test.ts +140 -0
- package/test/evals/deterministic.eval.test.ts +376 -0
- package/test/generate-core.test.ts +140 -229
- package/test/implicit-batch.test.ts +22 -65
- package/test/json-parse-error-handling.test.ts +463 -0
- package/test/retry-policy-integration.test.ts +117 -0
- package/test/retry.test.ts +1016 -0
- package/test/schema.test.ts +55 -19
- package/test/streaming.test.ts +316 -0
- package/test/template.test.ts +1164 -0
- package/test/tool-orchestration.test.ts +1040 -0
- package/test/wrap-for-v3.test.ts +612 -0
- package/vitest.config.js +6 -0
- package/vitest.config.ts +20 -0
- package/dist/rpc/auth.d.ts +0 -69
- package/dist/rpc/auth.d.ts.map +0 -1
- package/dist/rpc/auth.js +0 -136
- package/dist/rpc/auth.js.map +0 -1
- package/dist/rpc/client.d.ts +0 -62
- package/dist/rpc/client.d.ts.map +0 -1
- package/dist/rpc/client.js +0 -103
- package/dist/rpc/client.js.map +0 -1
- package/dist/rpc/deferred.d.ts +0 -60
- package/dist/rpc/deferred.d.ts.map +0 -1
- package/dist/rpc/deferred.js +0 -96
- package/dist/rpc/deferred.js.map +0 -1
- package/dist/rpc/index.d.ts +0 -22
- package/dist/rpc/index.d.ts.map +0 -1
- package/dist/rpc/index.js +0 -38
- package/dist/rpc/index.js.map +0 -1
- package/dist/rpc/local.d.ts +0 -42
- package/dist/rpc/local.d.ts.map +0 -1
- package/dist/rpc/local.js +0 -50
- package/dist/rpc/local.js.map +0 -1
- package/dist/rpc/server.d.ts +0 -165
- package/dist/rpc/server.d.ts.map +0 -1
- package/dist/rpc/server.js +0 -405
- package/dist/rpc/server.js.map +0 -1
- package/dist/rpc/session.d.ts +0 -32
- package/dist/rpc/session.d.ts.map +0 -1
- package/dist/rpc/session.js +0 -43
- package/dist/rpc/session.js.map +0 -1
- package/dist/rpc/transport.d.ts +0 -306
- package/dist/rpc/transport.d.ts.map +0 -1
- package/dist/rpc/transport.js +0 -731
- package/dist/rpc/transport.js.map +0 -1
- package/src/batch/anthropic.js +0 -256
- package/src/batch/bedrock.js +0 -584
- package/src/batch/cloudflare.js +0 -287
- package/src/batch/google.js +0 -359
- package/src/batch/index.js +0 -30
- package/src/batch/memory.js +0 -187
- package/src/batch/openai.js +0 -402
- package/src/eval/index.js +0 -7
- package/src/eval/models.js +0 -119
- package/src/eval/runner.js +0 -147
- package/test/schema.test.js +0 -96
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Function Registry - Storage and management of defined AI functions
|
|
3
|
+
*
|
|
4
|
+
* This module provides the registry for storing and retrieving defined functions,
|
|
5
|
+
* including the global registry and factory for creating isolated registries.
|
|
6
|
+
*/
|
|
7
|
+
import type { JSONSchema, FunctionDefinition, DefinedFunction, CodeGenerationDefinition, FunctionRegistry } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Convert args schema to JSON Schema
|
|
10
|
+
*/
|
|
11
|
+
export declare function convertArgsToJSONSchema(args: unknown): JSONSchema;
|
|
12
|
+
/**
|
|
13
|
+
* Fill template with values
|
|
14
|
+
*/
|
|
15
|
+
export declare function fillTemplate(template: string, args: Record<string, unknown>): string;
|
|
16
|
+
/**
|
|
17
|
+
* Author code with a model — the explicit, opt-in code-*generation* path.
|
|
18
|
+
*
|
|
19
|
+
* This is the behavior `type: 'code'` used to have implicitly at call time.
|
|
20
|
+
* It has been split out so that `Code` functions can be deterministic. Calling
|
|
21
|
+
* this **does** consult a model and returns the generated source as a string;
|
|
22
|
+
* it does not produce a deterministic, repeatable handler.
|
|
23
|
+
*
|
|
24
|
+
* @param definition - The code-authoring spec ({@link CodeGenerationDefinition})
|
|
25
|
+
* @param args - Concrete inputs / refinements for the requested code
|
|
26
|
+
* @returns The generated source code as a string
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { generateCode } from 'ai-functions'
|
|
31
|
+
*
|
|
32
|
+
* const src = await generateCode(
|
|
33
|
+
* { name: 'calculateTax', args: { amount: '(number)', rate: '(number)' }, language: 'typescript' },
|
|
34
|
+
* { amount: 100, rate: 0.2 }
|
|
35
|
+
* )
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateCode<TInput>(definition: CodeGenerationDefinition<TInput>, args?: TInput): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Create a defined function from a function definition
|
|
41
|
+
*/
|
|
42
|
+
export declare function createDefinedFunction<TOutput, TInput>(definition: FunctionDefinition<TOutput, TInput>): DefinedFunction<TOutput, TInput>;
|
|
43
|
+
/**
|
|
44
|
+
* Standalone function for defining AI functions
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { defineFunction } from 'ai-functions'
|
|
49
|
+
*
|
|
50
|
+
* const summarize = defineFunction({
|
|
51
|
+
* type: 'generative',
|
|
52
|
+
* name: 'summarize',
|
|
53
|
+
* args: { text: 'Text to summarize' },
|
|
54
|
+
* output: 'string',
|
|
55
|
+
* promptTemplate: 'Summarize: {{text}}',
|
|
56
|
+
* })
|
|
57
|
+
*
|
|
58
|
+
* const result = await summarize.call({ text: 'Long article...' })
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function defineFunction<TOutput, TInput>(definition: FunctionDefinition<TOutput, TInput>): DefinedFunction<TOutput, TInput>;
|
|
62
|
+
/**
|
|
63
|
+
* Factory function to create a new isolated function registry instance.
|
|
64
|
+
*
|
|
65
|
+
* Use this when you need:
|
|
66
|
+
* - Test isolation: Each test can have its own registry
|
|
67
|
+
* - Scoped registries: Different parts of an app can have separate registries
|
|
68
|
+
* - Custom lifecycle management: Control when registries are created/destroyed
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* // Create isolated registry for tests
|
|
73
|
+
* const registry = createFunctionRegistry()
|
|
74
|
+
* const fn = defineFunction({ ... })
|
|
75
|
+
* registry.set('myFunc', fn)
|
|
76
|
+
*
|
|
77
|
+
* // Later, registry can be discarded without affecting global state
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* @returns A new FunctionRegistry instance
|
|
81
|
+
*/
|
|
82
|
+
export declare function createFunctionRegistry(): FunctionRegistry;
|
|
83
|
+
/**
|
|
84
|
+
* Global function registry
|
|
85
|
+
*
|
|
86
|
+
* Note: This is in-memory only. For persistence, use mdxai or mdxdb packages.
|
|
87
|
+
*
|
|
88
|
+
* **Lifecycle:**
|
|
89
|
+
* - Created once at module load time
|
|
90
|
+
* - Shared across the entire application
|
|
91
|
+
* - Use `resetGlobalRegistry()` in tests to clear state between test runs
|
|
92
|
+
* - For isolated registries, use `createFunctionRegistry()` instead
|
|
93
|
+
*/
|
|
94
|
+
export declare const functions: FunctionRegistry;
|
|
95
|
+
/**
|
|
96
|
+
* Reset the global function registry to a clean state.
|
|
97
|
+
*
|
|
98
|
+
* **Important:** This is primarily intended for test cleanup to ensure
|
|
99
|
+
* test isolation. In production code, prefer using `createFunctionRegistry()`
|
|
100
|
+
* for isolated registries.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* // In test setup/teardown
|
|
105
|
+
* beforeEach(() => {
|
|
106
|
+
* resetGlobalRegistry()
|
|
107
|
+
* })
|
|
108
|
+
*
|
|
109
|
+
* // Or after each test
|
|
110
|
+
* afterEach(() => {
|
|
111
|
+
* resetGlobalRegistry()
|
|
112
|
+
* })
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function resetGlobalRegistry(): void;
|
|
116
|
+
//# sourceMappingURL=function-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-registry.d.ts","sourceRoot":"","sources":["../src/function-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAEV,UAAU,EACV,kBAAkB,EAClB,eAAe,EAEf,wBAAwB,EAKxB,gBAAgB,EACjB,MAAM,YAAY,CAAA;AASnB;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAuBjE;AAuDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEpF;AAqFD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,YAAY,CAAC,MAAM,EACvC,UAAU,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAC5C,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAwQD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EACnD,UAAU,EAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,GAC9C,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CA0BlC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAC5C,UAAU,EAAE,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,GAC9C,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAElC;AAqCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,EAAE,gBAAiD,CAAA;AAEzE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
|
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Function Registry - Storage and management of defined AI functions
|
|
3
|
+
*
|
|
4
|
+
* This module provides the registry for storing and retrieving defined functions,
|
|
5
|
+
* including the global registry and factory for creating isolated registries.
|
|
6
|
+
*/
|
|
7
|
+
import { generateObject } from './generate.js';
|
|
8
|
+
import { PENDING_HUMAN_RESULT_SYMBOL } from './types.js';
|
|
9
|
+
import { schema as convertSchema } from './schema.js';
|
|
10
|
+
import { getLogger } from './logger.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// JSON Schema Conversion
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Convert args schema to JSON Schema
|
|
16
|
+
*/
|
|
17
|
+
export function convertArgsToJSONSchema(args) {
|
|
18
|
+
// If it's already a JSON schema-like object
|
|
19
|
+
if (typeof args === 'object' && args !== null && 'type' in args) {
|
|
20
|
+
return args;
|
|
21
|
+
}
|
|
22
|
+
// Convert SimpleSchema to JSON Schema
|
|
23
|
+
const properties = {};
|
|
24
|
+
const required = [];
|
|
25
|
+
if (typeof args === 'object' && args !== null) {
|
|
26
|
+
for (const [key, value] of Object.entries(args)) {
|
|
27
|
+
required.push(key); // All properties required for cross-provider compatibility
|
|
28
|
+
properties[key] = convertValueToJSONSchema(value);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties,
|
|
34
|
+
required,
|
|
35
|
+
additionalProperties: false, // Required for OpenAI compatibility
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Convert a single value to JSON Schema
|
|
40
|
+
*/
|
|
41
|
+
function convertValueToJSONSchema(value) {
|
|
42
|
+
if (typeof value === 'string') {
|
|
43
|
+
// Check for type hints: 'description (number)', 'description (boolean)', etc.
|
|
44
|
+
const typeMatch = value.match(/^(.+?)\s*\((number|boolean|integer|date)\)$/i);
|
|
45
|
+
if (typeMatch) {
|
|
46
|
+
const description = typeMatch[1];
|
|
47
|
+
const type = typeMatch[2];
|
|
48
|
+
switch (type.toLowerCase()) {
|
|
49
|
+
case 'number':
|
|
50
|
+
return { type: 'number', description: description.trim() };
|
|
51
|
+
case 'integer':
|
|
52
|
+
return { type: 'integer', description: description.trim() };
|
|
53
|
+
case 'boolean':
|
|
54
|
+
return { type: 'boolean', description: description.trim() };
|
|
55
|
+
case 'date':
|
|
56
|
+
return { type: 'string', format: 'date-time', description: description.trim() };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Check for enum: 'option1 | option2 | option3'
|
|
60
|
+
if (value.includes(' | ')) {
|
|
61
|
+
const options = value.split(' | ').map((s) => s.trim());
|
|
62
|
+
return { type: 'string', enum: options };
|
|
63
|
+
}
|
|
64
|
+
return { type: 'string', description: value };
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(value) && value.length === 1) {
|
|
67
|
+
const [desc] = value;
|
|
68
|
+
if (typeof desc === 'string') {
|
|
69
|
+
return { type: 'array', items: { type: 'string' }, description: desc };
|
|
70
|
+
}
|
|
71
|
+
if (typeof desc === 'number') {
|
|
72
|
+
return { type: 'array', items: { type: 'number' } };
|
|
73
|
+
}
|
|
74
|
+
return { type: 'array', items: convertValueToJSONSchema(desc) };
|
|
75
|
+
}
|
|
76
|
+
if (typeof value === 'object' && value !== null) {
|
|
77
|
+
return convertArgsToJSONSchema(value);
|
|
78
|
+
}
|
|
79
|
+
return { type: 'string' };
|
|
80
|
+
}
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Template Utilities
|
|
83
|
+
// ============================================================================
|
|
84
|
+
/**
|
|
85
|
+
* Fill template with values
|
|
86
|
+
*/
|
|
87
|
+
export function fillTemplate(template, args) {
|
|
88
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => String(args[key] ?? ''));
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Function Executors
|
|
92
|
+
// ============================================================================
|
|
93
|
+
/**
|
|
94
|
+
* Execute a **deterministic** code function.
|
|
95
|
+
*
|
|
96
|
+
* `Code` is the deterministic kind: no model is consulted at call time. This
|
|
97
|
+
* invokes the definition's `handler` (canonical) or, if only an inline `code`
|
|
98
|
+
* body was supplied, deterministically compiles and runs it. The result is
|
|
99
|
+
* returned directly.
|
|
100
|
+
*
|
|
101
|
+
* This is a deliberate change from the previous behavior, where `type: 'code'`
|
|
102
|
+
* LLM-generated source at call time. That code-*authoring* behavior now lives
|
|
103
|
+
* in {@link generateCode} (and the `generate('code', …)` primitive), so that
|
|
104
|
+
* `Code` can carry the "deterministic handler" contract consumers depend on
|
|
105
|
+
* (ADR-0033). See the package README migration note.
|
|
106
|
+
*
|
|
107
|
+
* @throws if neither `handler` nor `code` is provided, or if an inline `code`
|
|
108
|
+
* body is in a non-evaluable language.
|
|
109
|
+
*/
|
|
110
|
+
async function executeCodeFunction(definition, args) {
|
|
111
|
+
const { handler, code, language = 'typescript', name } = definition;
|
|
112
|
+
if (typeof handler === 'function') {
|
|
113
|
+
return await handler(args);
|
|
114
|
+
}
|
|
115
|
+
if (typeof code === 'string' && code.length > 0) {
|
|
116
|
+
return await runInlineCode(code, args, language, name);
|
|
117
|
+
}
|
|
118
|
+
throw new Error(`Code function '${name}' has no handler or inline code. ` +
|
|
119
|
+
`'code' functions are deterministic and require a handler: (input) => output ` +
|
|
120
|
+
`(or an inline 'code' body). To have a model *author* code instead, use ` +
|
|
121
|
+
`generateCode() or define a 'generative' function.`);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Deterministically compile and run an inline `code` body for a Code function.
|
|
125
|
+
*
|
|
126
|
+
* The body is treated as a function whose single parameter is the parsed
|
|
127
|
+
* `args` object and whose `return` value is the result. Only the
|
|
128
|
+
* JS/TS-compatible languages can be evaluated in-process; other languages are
|
|
129
|
+
* carried as metadata for an external runtime and are rejected here.
|
|
130
|
+
*
|
|
131
|
+
* No model is involved — this is a pure `new Function(...)` compile of the
|
|
132
|
+
* supplied source, so the same body always produces the same behavior.
|
|
133
|
+
*/
|
|
134
|
+
async function runInlineCode(code, args, language, name) {
|
|
135
|
+
if (language !== 'typescript' && language !== 'javascript') {
|
|
136
|
+
throw new Error(`Code function '${name}' has an inline 'code' body in language '${language}', ` +
|
|
137
|
+
`which cannot be evaluated in-process. Pass a 'handler' instead, or run it ` +
|
|
138
|
+
`in an external deterministic runtime.`);
|
|
139
|
+
}
|
|
140
|
+
const body = /\breturn\b/.test(code) ? code : `return (${code})`;
|
|
141
|
+
let fn;
|
|
142
|
+
try {
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
144
|
+
fn = new Function('args', `"use strict";\n${body}`);
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
throw new Error(`Code function '${name}' has an invalid inline 'code' body: ${e.message}`);
|
|
148
|
+
}
|
|
149
|
+
return await fn(args);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Author code with a model — the explicit, opt-in code-*generation* path.
|
|
153
|
+
*
|
|
154
|
+
* This is the behavior `type: 'code'` used to have implicitly at call time.
|
|
155
|
+
* It has been split out so that `Code` functions can be deterministic. Calling
|
|
156
|
+
* this **does** consult a model and returns the generated source as a string;
|
|
157
|
+
* it does not produce a deterministic, repeatable handler.
|
|
158
|
+
*
|
|
159
|
+
* @param definition - The code-authoring spec ({@link CodeGenerationDefinition})
|
|
160
|
+
* @param args - Concrete inputs / refinements for the requested code
|
|
161
|
+
* @returns The generated source code as a string
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```ts
|
|
165
|
+
* import { generateCode } from 'ai-functions'
|
|
166
|
+
*
|
|
167
|
+
* const src = await generateCode(
|
|
168
|
+
* { name: 'calculateTax', args: { amount: '(number)', rate: '(number)' }, language: 'typescript' },
|
|
169
|
+
* { amount: 100, rate: 0.2 }
|
|
170
|
+
* )
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export async function generateCode(definition, args) {
|
|
174
|
+
const { name, description, language = 'typescript', instructions, returnType, model = 'sonnet' } = definition;
|
|
175
|
+
const argsDescription = JSON.stringify(args ?? definition.args, null, 2);
|
|
176
|
+
const result = await generateObject({
|
|
177
|
+
model,
|
|
178
|
+
schema: {
|
|
179
|
+
code: `The complete ${language} implementation code. Output ONLY the raw code without markdown formatting or code blocks.`,
|
|
180
|
+
},
|
|
181
|
+
system: `You are an expert ${language} developer. Generate clean, well-documented, production-ready code. Output ONLY the code itself, without any markdown code fences or language tags.`,
|
|
182
|
+
prompt: `Generate a ${language} function/query with the following specification:
|
|
183
|
+
|
|
184
|
+
Name: ${name}
|
|
185
|
+
Description: ${description || 'No description provided'}
|
|
186
|
+
Arguments: ${argsDescription}
|
|
187
|
+
Return Type: ${JSON.stringify(returnType)}
|
|
188
|
+
|
|
189
|
+
${instructions ? `Additional Instructions: ${instructions}` : ''}
|
|
190
|
+
|
|
191
|
+
Requirements:
|
|
192
|
+
- Include appropriate comments/documentation
|
|
193
|
+
- Follow best practices for ${language}
|
|
194
|
+
- Handle edge cases appropriately
|
|
195
|
+
- Return ONLY the code without markdown formatting`,
|
|
196
|
+
});
|
|
197
|
+
return result.object.code;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Execute a generative function - uses AI to generate content
|
|
201
|
+
*/
|
|
202
|
+
async function executeGenerativeFunction(definition, args) {
|
|
203
|
+
const { output, system, promptTemplate, model = 'sonnet', temperature, returnType } = definition;
|
|
204
|
+
const prompt = promptTemplate
|
|
205
|
+
? fillTemplate(promptTemplate, args)
|
|
206
|
+
: JSON.stringify(args);
|
|
207
|
+
switch (output) {
|
|
208
|
+
case 'string': {
|
|
209
|
+
const result = await generateObject({
|
|
210
|
+
model,
|
|
211
|
+
schema: { text: 'The generated text response' },
|
|
212
|
+
prompt,
|
|
213
|
+
...(system !== undefined && { system }),
|
|
214
|
+
...(temperature !== undefined && { temperature }),
|
|
215
|
+
});
|
|
216
|
+
return result.object.text;
|
|
217
|
+
}
|
|
218
|
+
case 'object': {
|
|
219
|
+
const objectSchema = returnType || { result: 'The generated result' };
|
|
220
|
+
const result = await generateObject({
|
|
221
|
+
model,
|
|
222
|
+
schema: objectSchema,
|
|
223
|
+
prompt,
|
|
224
|
+
...(system !== undefined && { system }),
|
|
225
|
+
...(temperature !== undefined && { temperature }),
|
|
226
|
+
});
|
|
227
|
+
return result.object;
|
|
228
|
+
}
|
|
229
|
+
case 'image':
|
|
230
|
+
throw new Error('Image generation via generative functions is not yet implemented. ' +
|
|
231
|
+
'Use the image() primitive directly instead.');
|
|
232
|
+
case 'video':
|
|
233
|
+
throw new Error('Video generation via generative functions is not yet implemented. ' +
|
|
234
|
+
'Use the video() primitive directly instead.');
|
|
235
|
+
default:
|
|
236
|
+
throw new Error(`Unknown output type: ${output}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Execute an agentic function - runs in a loop with tools
|
|
241
|
+
*/
|
|
242
|
+
async function executeAgenticFunction(definition, args) {
|
|
243
|
+
const { instructions, promptTemplate, tools = [], maxIterations = 10, model = 'sonnet', returnType, } = definition;
|
|
244
|
+
const prompt = promptTemplate
|
|
245
|
+
? fillTemplate(promptTemplate, args)
|
|
246
|
+
: JSON.stringify(args);
|
|
247
|
+
// Build system prompt with tool descriptions
|
|
248
|
+
const toolDescriptions = tools.map((t) => `- ${t.name}: ${t.description}`).join('\n');
|
|
249
|
+
const systemPrompt = `${instructions}
|
|
250
|
+
|
|
251
|
+
Available tools:
|
|
252
|
+
${toolDescriptions || 'No tools available'}
|
|
253
|
+
|
|
254
|
+
Work step by step to accomplish the task. When you have completed the task, provide your final result.`;
|
|
255
|
+
let iteration = 0;
|
|
256
|
+
const toolResults = [];
|
|
257
|
+
// Simple agent loop
|
|
258
|
+
while (iteration < maxIterations) {
|
|
259
|
+
iteration++;
|
|
260
|
+
const result = await generateObject({
|
|
261
|
+
model,
|
|
262
|
+
schema: {
|
|
263
|
+
thinking: 'Your step-by-step reasoning',
|
|
264
|
+
toolCall: {
|
|
265
|
+
name: 'Tool to call (or "done" if finished)',
|
|
266
|
+
arguments: 'Arguments for the tool as JSON string',
|
|
267
|
+
},
|
|
268
|
+
finalResult: returnType || 'The final result if done',
|
|
269
|
+
},
|
|
270
|
+
system: systemPrompt,
|
|
271
|
+
prompt: `Task: ${prompt}
|
|
272
|
+
|
|
273
|
+
Previous tool results:
|
|
274
|
+
${toolResults.map((r, i) => `Step ${i + 1}: ${JSON.stringify(r)}`).join('\n') || 'None yet'}
|
|
275
|
+
|
|
276
|
+
What is your next step?`,
|
|
277
|
+
});
|
|
278
|
+
const response = result.object;
|
|
279
|
+
if (response.toolCall.name === 'done' || response.finalResult) {
|
|
280
|
+
return response.finalResult;
|
|
281
|
+
}
|
|
282
|
+
// Execute tool call
|
|
283
|
+
const tool = tools.find((t) => t.name === response.toolCall.name);
|
|
284
|
+
if (tool) {
|
|
285
|
+
let toolArgs;
|
|
286
|
+
try {
|
|
287
|
+
toolArgs = JSON.parse(response.toolCall.arguments || '{}');
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
toolResults.push({
|
|
291
|
+
error: `Invalid tool arguments: ${e.message}`,
|
|
292
|
+
});
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const toolResult = await tool.handler(toolArgs);
|
|
296
|
+
toolResults.push({ tool: response.toolCall.name, result: toolResult });
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
toolResults.push({ error: `Tool not found: ${response.toolCall.name}` });
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
throw new Error(`Agent exceeded maximum iterations (${maxIterations})`);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Execute a human function - generates UI and waits for human input
|
|
306
|
+
*
|
|
307
|
+
* **Note: This function currently returns a pending placeholder.**
|
|
308
|
+
*
|
|
309
|
+
* In a complete implementation, this function would:
|
|
310
|
+
* 1. Generate channel-specific UI (Slack blocks, email templates, web forms, etc.)
|
|
311
|
+
* 2. Send the generated UI to the appropriate channel
|
|
312
|
+
* 3. Wait for human response with optional timeout
|
|
313
|
+
* 4. Validate and return the human's response
|
|
314
|
+
*
|
|
315
|
+
* The current implementation generates the UI artifacts but returns a pending
|
|
316
|
+
* placeholder instead of actually sending to the channel and waiting for response.
|
|
317
|
+
* This allows testing the UI generation without requiring actual channel integrations.
|
|
318
|
+
*
|
|
319
|
+
* **Important:** Use `isPendingHumanResult()` to check if the result is pending
|
|
320
|
+
* before attempting to use it as the expected output type.
|
|
321
|
+
*
|
|
322
|
+
* @param definition - The human function definition with channel and instructions
|
|
323
|
+
* @param args - Arguments to pass to the function
|
|
324
|
+
* @returns Either the actual TOutput from human input, or a HumanFunctionPending placeholder
|
|
325
|
+
*
|
|
326
|
+
* @example
|
|
327
|
+
* ```ts
|
|
328
|
+
* import { isPendingHumanResult } from 'ai-functions'
|
|
329
|
+
*
|
|
330
|
+
* const result = await approveRefund({ amount: 500 })
|
|
331
|
+
*
|
|
332
|
+
* if (isPendingHumanResult(result)) {
|
|
333
|
+
* // Handle pending state
|
|
334
|
+
* console.log('Awaiting human approval via:', result.channel)
|
|
335
|
+
* return { status: 'pending' }
|
|
336
|
+
* }
|
|
337
|
+
*
|
|
338
|
+
* // result is the actual approval response
|
|
339
|
+
* console.log('Approved:', result.approved)
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
async function executeHumanFunction(definition, args) {
|
|
343
|
+
const { channel, instructions, promptTemplate, returnType } = definition;
|
|
344
|
+
const prompt = promptTemplate
|
|
345
|
+
? fillTemplate(promptTemplate, args)
|
|
346
|
+
: JSON.stringify(args);
|
|
347
|
+
// Generate channel-specific UI
|
|
348
|
+
const uiSchema = {
|
|
349
|
+
// New HumanChannel types
|
|
350
|
+
chat: {
|
|
351
|
+
message: 'Chat message to send',
|
|
352
|
+
options: ['Response options if applicable'],
|
|
353
|
+
},
|
|
354
|
+
email: {
|
|
355
|
+
subject: 'Email subject',
|
|
356
|
+
html: 'Email HTML body',
|
|
357
|
+
text: 'Plain text fallback',
|
|
358
|
+
},
|
|
359
|
+
phone: {
|
|
360
|
+
script: 'Phone call script',
|
|
361
|
+
keyPoints: ['Key points to cover'],
|
|
362
|
+
},
|
|
363
|
+
sms: {
|
|
364
|
+
text: 'SMS message text (max 160 chars)',
|
|
365
|
+
},
|
|
366
|
+
workspace: {
|
|
367
|
+
blocks: ['Workspace/Slack BlockKit blocks as JSON array'],
|
|
368
|
+
text: 'Plain text fallback',
|
|
369
|
+
},
|
|
370
|
+
web: {
|
|
371
|
+
component: 'React component code for the form',
|
|
372
|
+
schema: 'JSON schema for the form fields',
|
|
373
|
+
},
|
|
374
|
+
// Legacy fallback
|
|
375
|
+
custom: {
|
|
376
|
+
data: 'Structured data for custom implementation',
|
|
377
|
+
instructions: 'Instructions for the human',
|
|
378
|
+
},
|
|
379
|
+
};
|
|
380
|
+
const result = await generateObject({
|
|
381
|
+
model: 'sonnet',
|
|
382
|
+
schema: uiSchema[channel] ?? uiSchema['custom'],
|
|
383
|
+
system: `Generate ${channel} UI/content for a human-in-the-loop task.`,
|
|
384
|
+
prompt: `Task: ${instructions}
|
|
385
|
+
|
|
386
|
+
Input data:
|
|
387
|
+
${prompt}
|
|
388
|
+
|
|
389
|
+
Expected response format:
|
|
390
|
+
${JSON.stringify(returnType)}
|
|
391
|
+
|
|
392
|
+
Generate the appropriate ${channel} UI/content to collect this response from a human.`,
|
|
393
|
+
});
|
|
394
|
+
// Runtime warning for developers
|
|
395
|
+
getLogger().warn(`[HumanFunction] Returning pending placeholder for channel '${channel}'. ` +
|
|
396
|
+
`Use isPendingHumanResult() to check before using the result. ` +
|
|
397
|
+
`Full channel integration is not yet implemented.`);
|
|
398
|
+
// Return a properly typed pending result
|
|
399
|
+
// The symbol marker allows isPendingHumanResult() to reliably identify this
|
|
400
|
+
const pendingResult = {
|
|
401
|
+
[PENDING_HUMAN_RESULT_SYMBOL]: true,
|
|
402
|
+
_pending: true,
|
|
403
|
+
channel,
|
|
404
|
+
artifacts: result.object,
|
|
405
|
+
expectedResponseType: returnType,
|
|
406
|
+
};
|
|
407
|
+
return pendingResult;
|
|
408
|
+
}
|
|
409
|
+
// ============================================================================
|
|
410
|
+
// Defined Function Creation
|
|
411
|
+
// ============================================================================
|
|
412
|
+
/**
|
|
413
|
+
* Create a defined function from a function definition
|
|
414
|
+
*/
|
|
415
|
+
export function createDefinedFunction(definition) {
|
|
416
|
+
const call = async (args) => {
|
|
417
|
+
switch (definition.type) {
|
|
418
|
+
case 'code':
|
|
419
|
+
return executeCodeFunction(definition, args);
|
|
420
|
+
case 'generative':
|
|
421
|
+
return executeGenerativeFunction(definition, args);
|
|
422
|
+
case 'agentic':
|
|
423
|
+
return executeAgenticFunction(definition, args);
|
|
424
|
+
case 'human':
|
|
425
|
+
return executeHumanFunction(definition, args);
|
|
426
|
+
default:
|
|
427
|
+
throw new Error(`Unknown function type: ${definition.type}`);
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
const asTool = () => {
|
|
431
|
+
return {
|
|
432
|
+
name: definition.name,
|
|
433
|
+
description: definition.description || `Execute ${definition.name}`,
|
|
434
|
+
parameters: convertArgsToJSONSchema(definition.args),
|
|
435
|
+
handler: call,
|
|
436
|
+
};
|
|
437
|
+
};
|
|
438
|
+
return { definition, call, asTool };
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Standalone function for defining AI functions
|
|
442
|
+
*
|
|
443
|
+
* @example
|
|
444
|
+
* ```ts
|
|
445
|
+
* import { defineFunction } from 'ai-functions'
|
|
446
|
+
*
|
|
447
|
+
* const summarize = defineFunction({
|
|
448
|
+
* type: 'generative',
|
|
449
|
+
* name: 'summarize',
|
|
450
|
+
* args: { text: 'Text to summarize' },
|
|
451
|
+
* output: 'string',
|
|
452
|
+
* promptTemplate: 'Summarize: {{text}}',
|
|
453
|
+
* })
|
|
454
|
+
*
|
|
455
|
+
* const result = await summarize.call({ text: 'Long article...' })
|
|
456
|
+
* ```
|
|
457
|
+
*/
|
|
458
|
+
export function defineFunction(definition) {
|
|
459
|
+
return createDefinedFunction(definition);
|
|
460
|
+
}
|
|
461
|
+
// ============================================================================
|
|
462
|
+
// Function Registry Implementation
|
|
463
|
+
// ============================================================================
|
|
464
|
+
/**
|
|
465
|
+
* In-memory function registry
|
|
466
|
+
*/
|
|
467
|
+
class InMemoryFunctionRegistry {
|
|
468
|
+
functions = new Map();
|
|
469
|
+
get(name) {
|
|
470
|
+
return this.functions.get(name);
|
|
471
|
+
}
|
|
472
|
+
set(name, fn) {
|
|
473
|
+
this.functions.set(name, fn);
|
|
474
|
+
}
|
|
475
|
+
has(name) {
|
|
476
|
+
return this.functions.has(name);
|
|
477
|
+
}
|
|
478
|
+
list() {
|
|
479
|
+
return Array.from(this.functions.keys());
|
|
480
|
+
}
|
|
481
|
+
delete(name) {
|
|
482
|
+
return this.functions.delete(name);
|
|
483
|
+
}
|
|
484
|
+
clear() {
|
|
485
|
+
this.functions.clear();
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Factory function to create a new isolated function registry instance.
|
|
490
|
+
*
|
|
491
|
+
* Use this when you need:
|
|
492
|
+
* - Test isolation: Each test can have its own registry
|
|
493
|
+
* - Scoped registries: Different parts of an app can have separate registries
|
|
494
|
+
* - Custom lifecycle management: Control when registries are created/destroyed
|
|
495
|
+
*
|
|
496
|
+
* @example
|
|
497
|
+
* ```ts
|
|
498
|
+
* // Create isolated registry for tests
|
|
499
|
+
* const registry = createFunctionRegistry()
|
|
500
|
+
* const fn = defineFunction({ ... })
|
|
501
|
+
* registry.set('myFunc', fn)
|
|
502
|
+
*
|
|
503
|
+
* // Later, registry can be discarded without affecting global state
|
|
504
|
+
* ```
|
|
505
|
+
*
|
|
506
|
+
* @returns A new FunctionRegistry instance
|
|
507
|
+
*/
|
|
508
|
+
export function createFunctionRegistry() {
|
|
509
|
+
return new InMemoryFunctionRegistry();
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Global function registry
|
|
513
|
+
*
|
|
514
|
+
* Note: This is in-memory only. For persistence, use mdxai or mdxdb packages.
|
|
515
|
+
*
|
|
516
|
+
* **Lifecycle:**
|
|
517
|
+
* - Created once at module load time
|
|
518
|
+
* - Shared across the entire application
|
|
519
|
+
* - Use `resetGlobalRegistry()` in tests to clear state between test runs
|
|
520
|
+
* - For isolated registries, use `createFunctionRegistry()` instead
|
|
521
|
+
*/
|
|
522
|
+
export const functions = new InMemoryFunctionRegistry();
|
|
523
|
+
/**
|
|
524
|
+
* Reset the global function registry to a clean state.
|
|
525
|
+
*
|
|
526
|
+
* **Important:** This is primarily intended for test cleanup to ensure
|
|
527
|
+
* test isolation. In production code, prefer using `createFunctionRegistry()`
|
|
528
|
+
* for isolated registries.
|
|
529
|
+
*
|
|
530
|
+
* @example
|
|
531
|
+
* ```ts
|
|
532
|
+
* // In test setup/teardown
|
|
533
|
+
* beforeEach(() => {
|
|
534
|
+
* resetGlobalRegistry()
|
|
535
|
+
* })
|
|
536
|
+
*
|
|
537
|
+
* // Or after each test
|
|
538
|
+
* afterEach(() => {
|
|
539
|
+
* resetGlobalRegistry()
|
|
540
|
+
* })
|
|
541
|
+
* ```
|
|
542
|
+
*/
|
|
543
|
+
export function resetGlobalRegistry() {
|
|
544
|
+
functions.clear();
|
|
545
|
+
}
|
|
546
|
+
//# sourceMappingURL=function-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-registry.js","sourceRoot":"","sources":["../src/function-registry.ts"],"names":[],"mappings":"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"}
|