@mzhub/promptc 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +224 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +111 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler/BootstrapFewShot.d.ts +13 -0
- package/dist/compiler/BootstrapFewShot.d.ts.map +1 -0
- package/dist/compiler/BootstrapFewShot.js +93 -0
- package/dist/compiler/BootstrapFewShot.js.map +1 -0
- package/dist/compiler/CandidatePool.d.ts +10 -0
- package/dist/compiler/CandidatePool.d.ts.map +1 -0
- package/dist/compiler/CandidatePool.js +29 -0
- package/dist/compiler/CandidatePool.js.map +1 -0
- package/dist/compiler/CompiledProgram.d.ts +43 -0
- package/dist/compiler/CompiledProgram.d.ts.map +1 -0
- package/dist/compiler/CompiledProgram.js +41 -0
- package/dist/compiler/CompiledProgram.js.map +1 -0
- package/dist/compiler/InstructionRewrite.d.ts +19 -0
- package/dist/compiler/InstructionRewrite.d.ts.map +1 -0
- package/dist/compiler/InstructionRewrite.js +117 -0
- package/dist/compiler/InstructionRewrite.js.map +1 -0
- package/dist/compiler/index.d.ts +8 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +5 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/types.d.ts +41 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/types.js +2 -0
- package/dist/compiler/types.js.map +1 -0
- package/dist/eval/exactMatch.d.ts +5 -0
- package/dist/eval/exactMatch.d.ts.map +1 -0
- package/dist/eval/exactMatch.js +58 -0
- package/dist/eval/exactMatch.js.map +1 -0
- package/dist/eval/index.d.ts +5 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +3 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/llmJudge.d.ts +9 -0
- package/dist/eval/llmJudge.d.ts.map +1 -0
- package/dist/eval/llmJudge.js +33 -0
- package/dist/eval/llmJudge.js.map +1 -0
- package/dist/eval/types.d.ts +2 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +2 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/program/ChainOfThought.d.ts +6 -0
- package/dist/program/ChainOfThought.d.ts.map +1 -0
- package/dist/program/ChainOfThought.js +44 -0
- package/dist/program/ChainOfThought.js.map +1 -0
- package/dist/program/Predict.d.ts +6 -0
- package/dist/program/Predict.d.ts.map +1 -0
- package/dist/program/Predict.js +33 -0
- package/dist/program/Predict.js.map +1 -0
- package/dist/program/Program.d.ts +33 -0
- package/dist/program/Program.d.ts.map +1 -0
- package/dist/program/Program.js +28 -0
- package/dist/program/Program.js.map +1 -0
- package/dist/program/index.d.ts +5 -0
- package/dist/program/index.d.ts.map +1 -0
- package/dist/program/index.js +4 -0
- package/dist/program/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +10 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +40 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/cerebras.d.ts +10 -0
- package/dist/providers/cerebras.d.ts.map +1 -0
- package/dist/providers/cerebras.js +39 -0
- package/dist/providers/cerebras.js.map +1 -0
- package/dist/providers/google.d.ts +10 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +42 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/groq.d.ts +10 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +42 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/index.d.ts +11 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +31 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +9 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +39 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +10 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +42 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +25 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/runtime/cache.d.ts +18 -0
- package/dist/runtime/cache.d.ts.map +1 -0
- package/dist/runtime/cache.js +45 -0
- package/dist/runtime/cache.js.map +1 -0
- package/dist/runtime/concurrency.d.ts +7 -0
- package/dist/runtime/concurrency.d.ts.map +1 -0
- package/dist/runtime/concurrency.js +14 -0
- package/dist/runtime/concurrency.js.map +1 -0
- package/dist/runtime/costTracker.d.ts +24 -0
- package/dist/runtime/costTracker.d.ts.map +1 -0
- package/dist/runtime/costTracker.js +37 -0
- package/dist/runtime/costTracker.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +5 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/retry.d.ts +10 -0
- package/dist/runtime/retry.d.ts.map +1 -0
- package/dist/runtime/retry.js +39 -0
- package/dist/runtime/retry.js.map +1 -0
- package/dist/schema/defineSchema.d.ts +18 -0
- package/dist/schema/defineSchema.d.ts.map +1 -0
- package/dist/schema/defineSchema.js +27 -0
- package/dist/schema/defineSchema.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/examples/README.md +42 -0
- package/examples/load-compiled.ts +62 -0
- package/examples/multi-provider.ts +77 -0
- package/examples/name-extractor.ts +113 -0
- package/examples/qa-system.ts +98 -0
- package/package.json +62 -0
- package/src/cli.ts +122 -0
- package/src/compiler/BootstrapFewShot.ts +149 -0
- package/src/compiler/CandidatePool.ts +39 -0
- package/src/compiler/CompiledProgram.ts +112 -0
- package/src/compiler/InstructionRewrite.ts +200 -0
- package/src/compiler/index.ts +19 -0
- package/src/compiler/types.ts +46 -0
- package/src/eval/exactMatch.ts +65 -0
- package/src/eval/index.ts +4 -0
- package/src/eval/llmJudge.ts +45 -0
- package/src/eval/types.ts +4 -0
- package/src/index.ts +71 -0
- package/src/program/ChainOfThought.ts +59 -0
- package/src/program/Predict.ts +47 -0
- package/src/program/Program.ts +64 -0
- package/src/program/index.ts +4 -0
- package/src/providers/anthropic.ts +55 -0
- package/src/providers/cerebras.ts +53 -0
- package/src/providers/google.ts +57 -0
- package/src/providers/groq.ts +57 -0
- package/src/providers/index.ts +50 -0
- package/src/providers/ollama.ts +54 -0
- package/src/providers/openai.ts +57 -0
- package/src/providers/types.ts +27 -0
- package/src/runtime/cache.ts +65 -0
- package/src/runtime/concurrency.ts +21 -0
- package/src/runtime/costTracker.ts +58 -0
- package/src/runtime/index.ts +8 -0
- package/src/runtime/retry.ts +59 -0
- package/src/schema/defineSchema.ts +44 -0
- package/src/schema/index.ts +2 -0
- package/tests/candidatePool.test.ts +46 -0
- package/tests/evaluators.test.ts +69 -0
- package/tests/runtime.test.ts +106 -0
- package/tests/schema.test.ts +59 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { createConcurrencyManager } from "./concurrency.js";
|
|
2
|
+
export type { ConcurrencyManager } from "./concurrency.js";
|
|
3
|
+
export { CostTracker, estimateCost } from "./costTracker.js";
|
|
4
|
+
export type { TokenUsage, CostEstimate } from "./costTracker.js";
|
|
5
|
+
export { withRetry, createRetryWrapper } from "./retry.js";
|
|
6
|
+
export type { RetryOptions } from "./retry.js";
|
|
7
|
+
export { PromptCache, createCache } from "./cache.js";
|
|
8
|
+
export type { CacheOptions } from "./cache.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createConcurrencyManager } from "./concurrency.js";
|
|
2
|
+
export { CostTracker, estimateCost } from "./costTracker.js";
|
|
3
|
+
export { withRetry, createRetryWrapper } from "./retry.js";
|
|
4
|
+
export { PromptCache, createCache } from "./cache.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface RetryOptions {
|
|
2
|
+
maxRetries?: number;
|
|
3
|
+
initialDelayMs?: number;
|
|
4
|
+
maxDelayMs?: number;
|
|
5
|
+
backoffMultiplier?: number;
|
|
6
|
+
retryOn?: (error: Error) => boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
9
|
+
export declare function createRetryWrapper(options?: RetryOptions): <T>(fn: () => Promise<T>) => Promise<T>;
|
|
10
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/runtime/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;CACrC;AAsBD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAqBZ;AAED,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,YAAiB,GACzB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const defaultRetryOptions = {
|
|
2
|
+
maxRetries: 3,
|
|
3
|
+
initialDelayMs: 1000,
|
|
4
|
+
maxDelayMs: 30000,
|
|
5
|
+
backoffMultiplier: 2,
|
|
6
|
+
retryOn: (error) => {
|
|
7
|
+
const message = error.message.toLowerCase();
|
|
8
|
+
return (message.includes("rate limit") ||
|
|
9
|
+
message.includes("429") ||
|
|
10
|
+
message.includes("503") ||
|
|
11
|
+
message.includes("timeout"));
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
function sleep(ms) {
|
|
15
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
16
|
+
}
|
|
17
|
+
export async function withRetry(fn, options = {}) {
|
|
18
|
+
const opts = { ...defaultRetryOptions, ...options };
|
|
19
|
+
let lastError = null;
|
|
20
|
+
let delay = opts.initialDelayMs;
|
|
21
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
22
|
+
try {
|
|
23
|
+
return await fn();
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
27
|
+
if (attempt === opts.maxRetries || !opts.retryOn(lastError)) {
|
|
28
|
+
throw lastError;
|
|
29
|
+
}
|
|
30
|
+
await sleep(delay);
|
|
31
|
+
delay = Math.min(delay * opts.backoffMultiplier, opts.maxDelayMs);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw lastError;
|
|
35
|
+
}
|
|
36
|
+
export function createRetryWrapper(options = {}) {
|
|
37
|
+
return (fn) => withRetry(fn, options);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/runtime/retry.ts"],"names":[],"mappings":"AAQA,MAAM,mBAAmB,GAA2B;IAClD,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC;IACpB,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC5B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,UAAwB,EAAE;IAE1B,MAAM,IAAI,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,OAAO,EAAE,CAAC;IACpD,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;IAEhC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5D,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,UAAwB,EAAE;IAE1B,OAAO,CAAI,EAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z, ZodObject, ZodRawShape } from "zod";
|
|
2
|
+
export interface SchemaDefinition<I extends ZodRawShape, O extends ZodRawShape> {
|
|
3
|
+
description: string;
|
|
4
|
+
inputs: I;
|
|
5
|
+
outputs: O;
|
|
6
|
+
}
|
|
7
|
+
export declare class Schema<I extends ZodRawShape, O extends ZodRawShape> {
|
|
8
|
+
readonly inputSchema: ZodObject<I>;
|
|
9
|
+
readonly outputSchema: ZodObject<O>;
|
|
10
|
+
readonly description: string;
|
|
11
|
+
constructor(definition: SchemaDefinition<I, O>);
|
|
12
|
+
validateInput(input: unknown): z.infer<ZodObject<I>>;
|
|
13
|
+
validateOutput(output: unknown): z.infer<ZodObject<O>>;
|
|
14
|
+
getInputKeys(): string[];
|
|
15
|
+
getOutputKeys(): string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function defineSchema<I extends ZodRawShape, O extends ZodRawShape>(definition: SchemaDefinition<I, O>): Schema<I, O>;
|
|
18
|
+
//# sourceMappingURL=defineSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineSchema.d.ts","sourceRoot":"","sources":["../../src/schema/defineSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEhD,MAAM,WAAW,gBAAgB,CAC/B,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,WAAW;IAErB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,qBAAa,MAAM,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,WAAW;IAC9D,SAAgB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1C,SAAgB,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3C,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;IAM9C,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAIpD,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAItD,YAAY,IAAI,MAAM,EAAE;IAIxB,aAAa,IAAI,MAAM,EAAE;CAG1B;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,WAAW,EACvE,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GACjC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAEd"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export class Schema {
|
|
3
|
+
inputSchema;
|
|
4
|
+
outputSchema;
|
|
5
|
+
description;
|
|
6
|
+
constructor(definition) {
|
|
7
|
+
this.description = definition.description;
|
|
8
|
+
this.inputSchema = z.object(definition.inputs);
|
|
9
|
+
this.outputSchema = z.object(definition.outputs);
|
|
10
|
+
}
|
|
11
|
+
validateInput(input) {
|
|
12
|
+
return this.inputSchema.parse(input);
|
|
13
|
+
}
|
|
14
|
+
validateOutput(output) {
|
|
15
|
+
return this.outputSchema.parse(output);
|
|
16
|
+
}
|
|
17
|
+
getInputKeys() {
|
|
18
|
+
return Object.keys(this.inputSchema.shape);
|
|
19
|
+
}
|
|
20
|
+
getOutputKeys() {
|
|
21
|
+
return Object.keys(this.outputSchema.shape);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function defineSchema(definition) {
|
|
25
|
+
return new Schema(definition);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=defineSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineSchema.js","sourceRoot":"","sources":["../../src/schema/defineSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAA0B,MAAM,KAAK,CAAC;AAWhD,MAAM,OAAO,MAAM;IACD,WAAW,CAAe;IAC1B,YAAY,CAAe;IAC3B,WAAW,CAAS;IAEpC,YAAY,UAAkC;QAC5C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,aAAa,CAAC,KAAc;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,MAAe;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,YAAY;QACV,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,aAAa;QACX,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAC1B,UAAkC;IAElC,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
These examples show how to use promptc for various tasks.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install dependencies
|
|
9
|
+
npm install promptc openai
|
|
10
|
+
|
|
11
|
+
# Set your API key
|
|
12
|
+
export OPENAI_API_KEY="sk-..."
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Running Examples
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Run with tsx (recommended)
|
|
19
|
+
npx tsx examples/name-extractor.ts
|
|
20
|
+
|
|
21
|
+
# Or compile first
|
|
22
|
+
npx tsc examples/name-extractor.ts
|
|
23
|
+
node examples/name-extractor.js
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Examples
|
|
27
|
+
|
|
28
|
+
### 1. Name Extractor (`name-extractor.ts`)
|
|
29
|
+
|
|
30
|
+
Complete workflow: define schema → compile → save → use
|
|
31
|
+
|
|
32
|
+
### 2. QA System (`qa-system.ts`)
|
|
33
|
+
|
|
34
|
+
Chain of Thought reasoning for question answering
|
|
35
|
+
|
|
36
|
+
### 3. Multi-Provider (`multi-provider.ts`)
|
|
37
|
+
|
|
38
|
+
Test the same program across different LLM providers
|
|
39
|
+
|
|
40
|
+
### 4. Load Compiled (`load-compiled.ts`)
|
|
41
|
+
|
|
42
|
+
Load a previously compiled program from JSON
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load Compiled Program Example
|
|
3
|
+
*
|
|
4
|
+
* Shows how to load a previously compiled program from JSON
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { readFileSync } from "fs";
|
|
8
|
+
import {
|
|
9
|
+
defineSchema,
|
|
10
|
+
ChainOfThought,
|
|
11
|
+
loadCompiledProgram,
|
|
12
|
+
createProvider,
|
|
13
|
+
z,
|
|
14
|
+
} from "@mzhub/promptc";
|
|
15
|
+
|
|
16
|
+
// Must match the schema used during compilation
|
|
17
|
+
const NameExtractor = defineSchema({
|
|
18
|
+
description: "Extract proper names of people from text",
|
|
19
|
+
inputs: { text: z.string() },
|
|
20
|
+
outputs: { names: z.array(z.string()) },
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
async function main() {
|
|
24
|
+
// 1. Load the saved config
|
|
25
|
+
const savedJson = readFileSync("name-extractor.json", "utf-8");
|
|
26
|
+
|
|
27
|
+
// 2. Create the same program (schema + provider)
|
|
28
|
+
const provider = createProvider("openai", {
|
|
29
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
30
|
+
});
|
|
31
|
+
const program = new ChainOfThought(NameExtractor, provider);
|
|
32
|
+
|
|
33
|
+
// 3. Load the compiled program
|
|
34
|
+
const compiled = loadCompiledProgram(savedJson, program);
|
|
35
|
+
|
|
36
|
+
console.log("Loaded compiled program:");
|
|
37
|
+
console.log(` Strategy: ${compiled.meta.strategy}`);
|
|
38
|
+
console.log(` Score: ${(compiled.meta.score * 100).toFixed(1)}%`);
|
|
39
|
+
console.log(` Examples: ${compiled.config.fewShotExamples.length}`);
|
|
40
|
+
|
|
41
|
+
// 4. Use it in production
|
|
42
|
+
const testCases = [
|
|
43
|
+
"Warren Buffett is a legendary investor.",
|
|
44
|
+
"The meeting with Sarah and John went well.",
|
|
45
|
+
"No specific people were mentioned.",
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
console.log("\nRunning inference:");
|
|
49
|
+
for (const text of testCases) {
|
|
50
|
+
const result = await compiled.run({ text });
|
|
51
|
+
console.log(`\n Input: "${text}"`);
|
|
52
|
+
console.log(
|
|
53
|
+
` Names: ${
|
|
54
|
+
result.result.names.length > 0
|
|
55
|
+
? result.result.names.join(", ")
|
|
56
|
+
: "(none)"
|
|
57
|
+
}`
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Provider Example
|
|
3
|
+
*
|
|
4
|
+
* Shows how to use different LLM providers with the same program
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { defineSchema, Predict, createProvider, z } from "@mzhub/promptc";
|
|
8
|
+
|
|
9
|
+
const SentimentAnalyzer = defineSchema({
|
|
10
|
+
description:
|
|
11
|
+
"Analyze the sentiment of text as positive, negative, or neutral",
|
|
12
|
+
inputs: { text: z.string() },
|
|
13
|
+
outputs: {
|
|
14
|
+
sentiment: z.enum(["positive", "negative", "neutral"]),
|
|
15
|
+
confidence: z.number(),
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
async function testProvider(providerName: string, apiKeyEnv: string) {
|
|
20
|
+
const apiKey = process.env[apiKeyEnv];
|
|
21
|
+
if (!apiKey) {
|
|
22
|
+
console.log(`⏭️ Skipping ${providerName} (no ${apiKeyEnv})`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const provider = createProvider(providerName as any, { apiKey });
|
|
28
|
+
const program = new Predict(SentimentAnalyzer, provider);
|
|
29
|
+
|
|
30
|
+
const start = Date.now();
|
|
31
|
+
const result = await program.run({
|
|
32
|
+
text: "I absolutely love this product!",
|
|
33
|
+
});
|
|
34
|
+
const latency = Date.now() - start;
|
|
35
|
+
|
|
36
|
+
console.log(`\n✅ ${providerName}`);
|
|
37
|
+
console.log(` Sentiment: ${result.result.sentiment}`);
|
|
38
|
+
console.log(
|
|
39
|
+
` Confidence: ${(result.result.confidence * 100).toFixed(0)}%`
|
|
40
|
+
);
|
|
41
|
+
console.log(` Latency: ${latency}ms`);
|
|
42
|
+
console.log(
|
|
43
|
+
` Tokens: ${
|
|
44
|
+
result.trace.usage.inputTokens + result.trace.usage.outputTokens
|
|
45
|
+
}`
|
|
46
|
+
);
|
|
47
|
+
} catch (error: any) {
|
|
48
|
+
console.log(`\n❌ ${providerName}: ${error.message}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function main() {
|
|
53
|
+
console.log("Testing sentiment analysis across providers...");
|
|
54
|
+
|
|
55
|
+
await testProvider("openai", "OPENAI_API_KEY");
|
|
56
|
+
await testProvider("anthropic", "ANTHROPIC_API_KEY");
|
|
57
|
+
await testProvider("google", "GOOGLE_API_KEY");
|
|
58
|
+
await testProvider("groq", "GROQ_API_KEY");
|
|
59
|
+
await testProvider("cerebras", "CEREBRAS_API_KEY");
|
|
60
|
+
|
|
61
|
+
// Ollama (local, no API key)
|
|
62
|
+
try {
|
|
63
|
+
const provider = createProvider("ollama");
|
|
64
|
+
const program = new Predict(SentimentAnalyzer, provider);
|
|
65
|
+
const start = Date.now();
|
|
66
|
+
const result = await program.run({
|
|
67
|
+
text: "I absolutely love this product!",
|
|
68
|
+
});
|
|
69
|
+
console.log(`\n✅ ollama (local)`);
|
|
70
|
+
console.log(` Sentiment: ${result.result.sentiment}`);
|
|
71
|
+
console.log(` Latency: ${Date.now() - start}ms`);
|
|
72
|
+
} catch {
|
|
73
|
+
console.log(`\n⏭️ Skipping ollama (not running locally)`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Name Extractor Example
|
|
3
|
+
*
|
|
4
|
+
* This example shows how to:
|
|
5
|
+
* 1. Define a schema
|
|
6
|
+
* 2. Create a program
|
|
7
|
+
* 3. Compile with BootstrapFewShot
|
|
8
|
+
* 4. Save and use the compiled program
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { writeFileSync } from "fs";
|
|
12
|
+
import {
|
|
13
|
+
defineSchema,
|
|
14
|
+
ChainOfThought,
|
|
15
|
+
BootstrapFewShot,
|
|
16
|
+
exactMatch,
|
|
17
|
+
createProvider,
|
|
18
|
+
createCompiledProgram,
|
|
19
|
+
z,
|
|
20
|
+
} from "@mzhub/promptc";
|
|
21
|
+
|
|
22
|
+
// 1. Define the schema
|
|
23
|
+
const NameExtractor = defineSchema({
|
|
24
|
+
description: "Extract proper names of people from text",
|
|
25
|
+
inputs: { text: z.string() },
|
|
26
|
+
outputs: { names: z.array(z.string()) },
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// 2. Create a provider (uses OPENAI_API_KEY env var)
|
|
30
|
+
const provider = createProvider("openai", {
|
|
31
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// 3. Create the program
|
|
35
|
+
const program = new ChainOfThought(NameExtractor, provider);
|
|
36
|
+
|
|
37
|
+
// 4. Training data
|
|
38
|
+
const trainset = [
|
|
39
|
+
{
|
|
40
|
+
input: { text: "Bill Gates founded Microsoft with Paul Allen." },
|
|
41
|
+
output: { names: ["Bill Gates", "Paul Allen"] },
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
input: { text: "Elon Musk runs Tesla and SpaceX." },
|
|
45
|
+
output: { names: ["Elon Musk"] },
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
input: { text: "Jeff Bezos started Amazon in his garage." },
|
|
49
|
+
output: { names: ["Jeff Bezos"] },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
input: { text: "Satya Nadella is the CEO of Microsoft." },
|
|
53
|
+
output: { names: ["Satya Nadella"] },
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
input: { text: "Tim Cook leads Apple after Steve Jobs." },
|
|
57
|
+
output: { names: ["Tim Cook", "Steve Jobs"] },
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
input: { text: "Mark Zuckerberg created Facebook." },
|
|
61
|
+
output: { names: ["Mark Zuckerberg"] },
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
input: { text: "Sundar Pichai runs Google and Alphabet." },
|
|
65
|
+
output: { names: ["Sundar Pichai"] },
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
async function main() {
|
|
70
|
+
console.log("Starting compilation...\n");
|
|
71
|
+
|
|
72
|
+
// 5. Create compiler with evaluator
|
|
73
|
+
const compiler = new BootstrapFewShot(exactMatch<{ names: string[] }>());
|
|
74
|
+
|
|
75
|
+
// 6. Compile with progress tracking
|
|
76
|
+
const result = await compiler.compile(program, trainset, {
|
|
77
|
+
candidates: 10,
|
|
78
|
+
concurrency: 3,
|
|
79
|
+
onProgress: ({
|
|
80
|
+
candidatesEvaluated,
|
|
81
|
+
totalCandidates,
|
|
82
|
+
currentBestScore,
|
|
83
|
+
}) => {
|
|
84
|
+
console.log(
|
|
85
|
+
`Progress: ${candidatesEvaluated}/${totalCandidates} | Best: ${(
|
|
86
|
+
currentBestScore * 100
|
|
87
|
+
).toFixed(1)}%`
|
|
88
|
+
);
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
console.log("\nCompilation complete!");
|
|
93
|
+
console.log(`Best score: ${(result.meta.score * 100).toFixed(1)}%`);
|
|
94
|
+
console.log(`Tokens used: ${result.meta.tokenUsage.totalTokens}`);
|
|
95
|
+
console.log(`API calls: ${result.meta.tokenUsage.calls}`);
|
|
96
|
+
|
|
97
|
+
// 7. Save the compiled config
|
|
98
|
+
writeFileSync("name-extractor.json", JSON.stringify(result, null, 2));
|
|
99
|
+
console.log("\nSaved to name-extractor.json");
|
|
100
|
+
|
|
101
|
+
// 8. Create a production-ready compiled program
|
|
102
|
+
const compiled = createCompiledProgram(program, result);
|
|
103
|
+
|
|
104
|
+
// 9. Test it
|
|
105
|
+
console.log("\nTesting compiled program:");
|
|
106
|
+
const testResult = await compiled.run({
|
|
107
|
+
text: "Jensen Huang founded NVIDIA.",
|
|
108
|
+
});
|
|
109
|
+
console.log("Input: 'Jensen Huang founded NVIDIA.'");
|
|
110
|
+
console.log("Output:", testResult.result.names);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA System with Chain of Thought
|
|
3
|
+
*
|
|
4
|
+
* Shows how to build a question-answering system
|
|
5
|
+
* that shows its reasoning before answering
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
defineSchema,
|
|
10
|
+
ChainOfThought,
|
|
11
|
+
BootstrapFewShot,
|
|
12
|
+
partialMatch,
|
|
13
|
+
createProvider,
|
|
14
|
+
z,
|
|
15
|
+
} from "@mzhub/promptc";
|
|
16
|
+
|
|
17
|
+
const QASchema = defineSchema({
|
|
18
|
+
description:
|
|
19
|
+
"Answer questions based on provided context. Think step by step.",
|
|
20
|
+
inputs: {
|
|
21
|
+
context: z.string().describe("The text containing information"),
|
|
22
|
+
question: z.string().describe("The question to answer"),
|
|
23
|
+
},
|
|
24
|
+
outputs: {
|
|
25
|
+
answer: z.string().describe("The answer extracted from context"),
|
|
26
|
+
confidence: z.number().min(0).max(1).describe("Confidence in the answer"),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const provider = createProvider("openai", {
|
|
31
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const qaProgram = new ChainOfThought(QASchema, provider);
|
|
35
|
+
|
|
36
|
+
const trainset = [
|
|
37
|
+
{
|
|
38
|
+
input: {
|
|
39
|
+
context:
|
|
40
|
+
"The Eiffel Tower was completed in 1889. It stands 330 meters tall and is located in Paris, France.",
|
|
41
|
+
question: "When was the Eiffel Tower completed?",
|
|
42
|
+
},
|
|
43
|
+
output: { answer: "1889", confidence: 0.95 },
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
input: {
|
|
47
|
+
context:
|
|
48
|
+
"Apple Inc. was founded by Steve Jobs, Steve Wozniak, and Ronald Wayne in 1976.",
|
|
49
|
+
question: "Who founded Apple?",
|
|
50
|
+
},
|
|
51
|
+
output: {
|
|
52
|
+
answer: "Steve Jobs, Steve Wozniak, and Ronald Wayne",
|
|
53
|
+
confidence: 0.95,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
input: {
|
|
58
|
+
context:
|
|
59
|
+
"The speed of light is approximately 299,792 kilometers per second in a vacuum.",
|
|
60
|
+
question: "What is the speed of light?",
|
|
61
|
+
},
|
|
62
|
+
output: {
|
|
63
|
+
answer: "approximately 299,792 kilometers per second",
|
|
64
|
+
confidence: 0.9,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
async function main() {
|
|
70
|
+
console.log("Building QA System with Chain of Thought...\n");
|
|
71
|
+
|
|
72
|
+
// Single inference to see the reasoning
|
|
73
|
+
const result = await qaProgram.run({
|
|
74
|
+
context:
|
|
75
|
+
"Python was created by Guido van Rossum and first released in 1991. It emphasizes code readability.",
|
|
76
|
+
question: "Who created Python?",
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
console.log("Question: Who created Python?");
|
|
80
|
+
console.log("\nReasoning:", result.trace.reasoning);
|
|
81
|
+
console.log("Answer:", result.result.answer);
|
|
82
|
+
console.log("Confidence:", `${(result.result.confidence * 100).toFixed(0)}%`);
|
|
83
|
+
|
|
84
|
+
// Optional: Compile for better accuracy
|
|
85
|
+
console.log("\n--- Compiling for better accuracy ---\n");
|
|
86
|
+
|
|
87
|
+
const compiler = new BootstrapFewShot(
|
|
88
|
+
partialMatch<{ answer: string; confidence: number }>()
|
|
89
|
+
);
|
|
90
|
+
const compiled = await compiler.compile(qaProgram, trainset, {
|
|
91
|
+
candidates: 5,
|
|
92
|
+
concurrency: 2,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
console.log(`Compilation score: ${(compiled.meta.score * 100).toFixed(1)}%`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
main().catch(console.error);
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mzhub/promptc",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Type-safe LLM program compiler for JavaScript",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"promptc": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"test": "vitest"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"llm",
|
|
24
|
+
"prompt",
|
|
25
|
+
"compiler",
|
|
26
|
+
"dspy",
|
|
27
|
+
"openai",
|
|
28
|
+
"anthropic",
|
|
29
|
+
"ai"
|
|
30
|
+
],
|
|
31
|
+
"author": "Mudia Zuwa <mudiaosazuwa@gmail.com>",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"zod": "^3.24.0",
|
|
35
|
+
"p-limit": "^6.1.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"openai": "^4.0.0",
|
|
39
|
+
"@anthropic-ai/sdk": "^0.30.0",
|
|
40
|
+
"@google/generative-ai": "^0.21.0",
|
|
41
|
+
"ollama": "^0.5.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"openai": {
|
|
45
|
+
"optional": true
|
|
46
|
+
},
|
|
47
|
+
"@anthropic-ai/sdk": {
|
|
48
|
+
"optional": true
|
|
49
|
+
},
|
|
50
|
+
"@google/generative-ai": {
|
|
51
|
+
"optional": true
|
|
52
|
+
},
|
|
53
|
+
"ollama": {
|
|
54
|
+
"optional": true
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"typescript": "^5.7.0",
|
|
59
|
+
"@types/node": "^22.0.0",
|
|
60
|
+
"vitest": "^2.0.0"
|
|
61
|
+
}
|
|
62
|
+
}
|