@modular-prompt/driver 0.4.5
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 +21 -0
- package/README.md +597 -0
- package/dist/anthropic/anthropic-driver.d.ts +47 -0
- package/dist/anthropic/anthropic-driver.d.ts.map +1 -0
- package/dist/anthropic/anthropic-driver.js +217 -0
- package/dist/anthropic/anthropic-driver.js.map +1 -0
- package/dist/driver-registry/ai-service.d.ts +43 -0
- package/dist/driver-registry/ai-service.d.ts.map +1 -0
- package/dist/driver-registry/ai-service.js +77 -0
- package/dist/driver-registry/ai-service.js.map +1 -0
- package/dist/driver-registry/config-based-factory.d.ts +64 -0
- package/dist/driver-registry/config-based-factory.d.ts.map +1 -0
- package/dist/driver-registry/config-based-factory.js +90 -0
- package/dist/driver-registry/config-based-factory.js.map +1 -0
- package/dist/driver-registry/factory-helper.d.ts +49 -0
- package/dist/driver-registry/factory-helper.d.ts.map +1 -0
- package/dist/driver-registry/factory-helper.js +109 -0
- package/dist/driver-registry/factory-helper.js.map +1 -0
- package/dist/driver-registry/index.d.ts +9 -0
- package/dist/driver-registry/index.d.ts.map +1 -0
- package/dist/driver-registry/index.js +8 -0
- package/dist/driver-registry/index.js.map +1 -0
- package/dist/driver-registry/registry.d.ts +50 -0
- package/dist/driver-registry/registry.d.ts.map +1 -0
- package/dist/driver-registry/registry.js +208 -0
- package/dist/driver-registry/registry.js.map +1 -0
- package/dist/driver-registry/types.d.ts +108 -0
- package/dist/driver-registry/types.d.ts.map +1 -0
- package/dist/driver-registry/types.js +6 -0
- package/dist/driver-registry/types.js.map +1 -0
- package/dist/echo-driver.d.ts +88 -0
- package/dist/echo-driver.d.ts.map +1 -0
- package/dist/echo-driver.js +198 -0
- package/dist/echo-driver.js.map +1 -0
- package/dist/formatter/completion-formatter.d.ts +27 -0
- package/dist/formatter/completion-formatter.d.ts.map +1 -0
- package/dist/formatter/completion-formatter.js +84 -0
- package/dist/formatter/completion-formatter.js.map +1 -0
- package/dist/formatter/converter.d.ts +20 -0
- package/dist/formatter/converter.d.ts.map +1 -0
- package/dist/formatter/converter.js +176 -0
- package/dist/formatter/converter.js.map +1 -0
- package/dist/formatter/element-formatters/base.d.ts +34 -0
- package/dist/formatter/element-formatters/base.d.ts.map +1 -0
- package/dist/formatter/element-formatters/base.js +36 -0
- package/dist/formatter/element-formatters/base.js.map +1 -0
- package/dist/formatter/element-formatters/chunk.d.ts +11 -0
- package/dist/formatter/element-formatters/chunk.d.ts.map +1 -0
- package/dist/formatter/element-formatters/chunk.js +12 -0
- package/dist/formatter/element-formatters/chunk.js.map +1 -0
- package/dist/formatter/element-formatters/index.d.ts +14 -0
- package/dist/formatter/element-formatters/index.d.ts.map +1 -0
- package/dist/formatter/element-formatters/index.js +15 -0
- package/dist/formatter/element-formatters/index.js.map +1 -0
- package/dist/formatter/element-formatters/json.d.ts +11 -0
- package/dist/formatter/element-formatters/json.d.ts.map +1 -0
- package/dist/formatter/element-formatters/json.js +27 -0
- package/dist/formatter/element-formatters/json.js.map +1 -0
- package/dist/formatter/element-formatters/material.d.ts +11 -0
- package/dist/formatter/element-formatters/material.d.ts.map +1 -0
- package/dist/formatter/element-formatters/material.js +35 -0
- package/dist/formatter/element-formatters/material.js.map +1 -0
- package/dist/formatter/element-formatters/message.d.ts +13 -0
- package/dist/formatter/element-formatters/message.d.ts.map +1 -0
- package/dist/formatter/element-formatters/message.js +35 -0
- package/dist/formatter/element-formatters/message.js.map +1 -0
- package/dist/formatter/element-formatters/registry.d.ts +29 -0
- package/dist/formatter/element-formatters/registry.d.ts.map +1 -0
- package/dist/formatter/element-formatters/registry.js +82 -0
- package/dist/formatter/element-formatters/registry.js.map +1 -0
- package/dist/formatter/element-formatters/section.d.ts +18 -0
- package/dist/formatter/element-formatters/section.d.ts.map +1 -0
- package/dist/formatter/element-formatters/section.js +46 -0
- package/dist/formatter/element-formatters/section.js.map +1 -0
- package/dist/formatter/element-formatters/string-pattern.d.ts +22 -0
- package/dist/formatter/element-formatters/string-pattern.d.ts.map +1 -0
- package/dist/formatter/element-formatters/string-pattern.js +124 -0
- package/dist/formatter/element-formatters/string-pattern.js.map +1 -0
- package/dist/formatter/element-formatters/text.d.ts +11 -0
- package/dist/formatter/element-formatters/text.d.ts.map +1 -0
- package/dist/formatter/element-formatters/text.js +11 -0
- package/dist/formatter/element-formatters/text.js.map +1 -0
- package/dist/formatter/formatter.d.ts +24 -0
- package/dist/formatter/formatter.d.ts.map +1 -0
- package/dist/formatter/formatter.js +252 -0
- package/dist/formatter/formatter.js.map +1 -0
- package/dist/formatter/types.d.ts +91 -0
- package/dist/formatter/types.d.ts.map +1 -0
- package/dist/formatter/types.js +2 -0
- package/dist/formatter/types.js.map +1 -0
- package/dist/google-genai/google-genai-driver.d.ts +67 -0
- package/dist/google-genai/google-genai-driver.d.ts.map +1 -0
- package/dist/google-genai/google-genai-driver.js +351 -0
- package/dist/google-genai/google-genai-driver.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/mlx-ml/mlx-driver.d.ts +65 -0
- package/dist/mlx-ml/mlx-driver.d.ts.map +1 -0
- package/dist/mlx-ml/mlx-driver.js +235 -0
- package/dist/mlx-ml/mlx-driver.js.map +1 -0
- package/dist/mlx-ml/model-spec/index.d.ts +7 -0
- package/dist/mlx-ml/model-spec/index.d.ts.map +1 -0
- package/dist/mlx-ml/model-spec/index.js +7 -0
- package/dist/mlx-ml/model-spec/index.js.map +1 -0
- package/dist/mlx-ml/model-spec/types.d.ts +30 -0
- package/dist/mlx-ml/model-spec/types.d.ts.map +1 -0
- package/dist/mlx-ml/model-spec/types.js +7 -0
- package/dist/mlx-ml/model-spec/types.js.map +1 -0
- package/dist/mlx-ml/process/index.d.ts +33 -0
- package/dist/mlx-ml/process/index.d.ts.map +1 -0
- package/dist/mlx-ml/process/index.js +65 -0
- package/dist/mlx-ml/process/index.js.map +1 -0
- package/dist/mlx-ml/process/model-handlers.d.ts +58 -0
- package/dist/mlx-ml/process/model-handlers.d.ts.map +1 -0
- package/dist/mlx-ml/process/model-handlers.js +197 -0
- package/dist/mlx-ml/process/model-handlers.js.map +1 -0
- package/dist/mlx-ml/process/model-specific.d.ts +35 -0
- package/dist/mlx-ml/process/model-specific.d.ts.map +1 -0
- package/dist/mlx-ml/process/model-specific.js +35 -0
- package/dist/mlx-ml/process/model-specific.js.map +1 -0
- package/dist/mlx-ml/process/parameter-mapper.d.ts +17 -0
- package/dist/mlx-ml/process/parameter-mapper.d.ts.map +1 -0
- package/dist/mlx-ml/process/parameter-mapper.js +91 -0
- package/dist/mlx-ml/process/parameter-mapper.js.map +1 -0
- package/dist/mlx-ml/process/parameter-validator.d.ts +55 -0
- package/dist/mlx-ml/process/parameter-validator.d.ts.map +1 -0
- package/dist/mlx-ml/process/parameter-validator.js +203 -0
- package/dist/mlx-ml/process/parameter-validator.js.map +1 -0
- package/dist/mlx-ml/process/process-communication.d.ts +25 -0
- package/dist/mlx-ml/process/process-communication.d.ts.map +1 -0
- package/dist/mlx-ml/process/process-communication.js +117 -0
- package/dist/mlx-ml/process/process-communication.js.map +1 -0
- package/dist/mlx-ml/process/queue.d.ts +30 -0
- package/dist/mlx-ml/process/queue.d.ts.map +1 -0
- package/dist/mlx-ml/process/queue.js +147 -0
- package/dist/mlx-ml/process/queue.js.map +1 -0
- package/dist/mlx-ml/process/types.d.ts +97 -0
- package/dist/mlx-ml/process/types.d.ts.map +1 -0
- package/dist/mlx-ml/process/types.js +2 -0
- package/dist/mlx-ml/process/types.js.map +1 -0
- package/dist/mlx-ml/types.d.ts +66 -0
- package/dist/mlx-ml/types.d.ts.map +1 -0
- package/dist/mlx-ml/types.js +7 -0
- package/dist/mlx-ml/types.js.map +1 -0
- package/dist/ollama/ollama-driver.d.ts +15 -0
- package/dist/ollama/ollama-driver.d.ts.map +1 -0
- package/dist/ollama/ollama-driver.js +15 -0
- package/dist/ollama/ollama-driver.js.map +1 -0
- package/dist/openai/openai-driver.d.ts +71 -0
- package/dist/openai/openai-driver.d.ts.map +1 -0
- package/dist/openai/openai-driver.js +230 -0
- package/dist/openai/openai-driver.js.map +1 -0
- package/dist/test-driver.d.ts +78 -0
- package/dist/test-driver.d.ts.map +1 -0
- package/dist/test-driver.js +193 -0
- package/dist/test-driver.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vertexai/vertexai-driver.d.ts +63 -0
- package/dist/vertexai/vertexai-driver.d.ts.map +1 -0
- package/dist/vertexai/vertexai-driver.js +335 -0
- package/dist/vertexai/vertexai-driver.js.map +1 -0
- package/package.json +61 -0
- package/scripts/download-model.js +40 -0
- package/scripts/setup-mlx.js +53 -0
- package/src/mlx-ml/python/.python-version +1 -0
- package/src/mlx-ml/python/__main__.py +312 -0
- package/src/mlx-ml/python/chat_template_constraints.py +164 -0
- package/src/mlx-ml/python/pyproject.toml +19 -0
- package/src/mlx-ml/python/token_utils.py +262 -0
- package/src/mlx-ml/python/uv.lock +1029 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export type { CompiledPrompt } from '@modular-prompt/core';
|
|
2
|
+
/**
|
|
3
|
+
* Chat message role
|
|
4
|
+
*/
|
|
5
|
+
export type Role = 'system' | 'assistant' | 'user';
|
|
6
|
+
/**
|
|
7
|
+
* Chat message
|
|
8
|
+
*/
|
|
9
|
+
export interface ChatMessage {
|
|
10
|
+
role: Role;
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Query result from AI model
|
|
15
|
+
*/
|
|
16
|
+
export interface QueryResult {
|
|
17
|
+
/**
|
|
18
|
+
* Raw text response from the model
|
|
19
|
+
*/
|
|
20
|
+
content: string;
|
|
21
|
+
/**
|
|
22
|
+
* Structured output extracted from the response
|
|
23
|
+
* - undefined: no schema was specified or no valid JSON found
|
|
24
|
+
* - object/array: extracted JSON matching the schema
|
|
25
|
+
*/
|
|
26
|
+
structuredOutput?: unknown;
|
|
27
|
+
usage?: {
|
|
28
|
+
promptTokens: number;
|
|
29
|
+
completionTokens: number;
|
|
30
|
+
totalTokens: number;
|
|
31
|
+
};
|
|
32
|
+
finishReason?: 'stop' | 'length' | 'error';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Options for querying AI model
|
|
36
|
+
*/
|
|
37
|
+
export interface QueryOptions {
|
|
38
|
+
temperature?: number;
|
|
39
|
+
maxTokens?: number;
|
|
40
|
+
topP?: number;
|
|
41
|
+
stream?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* API selection strategy (MLX driver only)
|
|
44
|
+
* - 'auto': Automatically select based on model capabilities
|
|
45
|
+
* - 'force-chat': Force chat API
|
|
46
|
+
* - 'force-completion': Force completion API
|
|
47
|
+
*/
|
|
48
|
+
apiStrategy?: 'auto' | 'force-chat' | 'force-completion';
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Stream result with both stream and final result
|
|
52
|
+
*/
|
|
53
|
+
export interface StreamResult {
|
|
54
|
+
/**
|
|
55
|
+
* Async iterable stream of response chunks
|
|
56
|
+
*/
|
|
57
|
+
stream: AsyncIterable<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Promise that resolves to the final query result
|
|
60
|
+
*/
|
|
61
|
+
result: Promise<QueryResult>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* AI Driver interface for executing prompts
|
|
65
|
+
*/
|
|
66
|
+
export interface AIDriver {
|
|
67
|
+
/**
|
|
68
|
+
* Query the AI model with a compiled prompt
|
|
69
|
+
*/
|
|
70
|
+
query(prompt: import('@modular-prompt/core').CompiledPrompt, options?: QueryOptions): Promise<QueryResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Stream query with both stream and result
|
|
73
|
+
*/
|
|
74
|
+
streamQuery(prompt: import('@modular-prompt/core').CompiledPrompt, options?: QueryOptions): Promise<StreamResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Close the driver connection
|
|
77
|
+
*/
|
|
78
|
+
close(): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Driver configuration
|
|
82
|
+
*/
|
|
83
|
+
export interface DriverConfig {
|
|
84
|
+
provider: 'openai' | 'anthropic' | 'ollama' | 'test';
|
|
85
|
+
model?: string;
|
|
86
|
+
apiKey?: string;
|
|
87
|
+
baseURL?: string;
|
|
88
|
+
defaultOptions?: QueryOptions;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,kBAAkB,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAE9B;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,OAAO,sBAAsB,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE3G;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,OAAO,sBAAsB,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAElH;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,YAAY,CAAC;CAC/B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { CompiledPrompt } from '@modular-prompt/core';
|
|
2
|
+
import type { AIDriver, QueryOptions, QueryResult, StreamResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* VertexAI driver configuration
|
|
5
|
+
*/
|
|
6
|
+
export interface VertexAIDriverConfig {
|
|
7
|
+
project?: string;
|
|
8
|
+
location?: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
temperature?: number;
|
|
11
|
+
defaultOptions?: Partial<VertexAIQueryOptions>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* VertexAI-specific query options
|
|
15
|
+
*/
|
|
16
|
+
export interface VertexAIQueryOptions extends QueryOptions {
|
|
17
|
+
model?: string;
|
|
18
|
+
maxTokens?: number;
|
|
19
|
+
temperature?: number;
|
|
20
|
+
topP?: number;
|
|
21
|
+
topK?: number;
|
|
22
|
+
responseFormat?: 'json' | 'text';
|
|
23
|
+
jsonSchema?: unknown;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* VertexAI (Google Gemini) driver
|
|
27
|
+
*/
|
|
28
|
+
export declare class VertexAIDriver implements AIDriver {
|
|
29
|
+
private vertexAI;
|
|
30
|
+
private defaultModel;
|
|
31
|
+
private defaultTemperature;
|
|
32
|
+
private defaultOptions;
|
|
33
|
+
constructor(config?: VertexAIDriverConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Convert CompiledPrompt to VertexAI's format
|
|
36
|
+
*/
|
|
37
|
+
private compiledPromptToVertexAI;
|
|
38
|
+
/**
|
|
39
|
+
* Convert messages to VertexAI's format
|
|
40
|
+
*/
|
|
41
|
+
private convertMessages;
|
|
42
|
+
/**
|
|
43
|
+
* Convert JSON Schema to VertexAI ResponseSchema
|
|
44
|
+
*/
|
|
45
|
+
private convertJsonSchema;
|
|
46
|
+
/**
|
|
47
|
+
* Create a generative model client
|
|
48
|
+
*/
|
|
49
|
+
private createClient;
|
|
50
|
+
/**
|
|
51
|
+
* Query implementation
|
|
52
|
+
*/
|
|
53
|
+
query(prompt: CompiledPrompt, options?: VertexAIQueryOptions): Promise<QueryResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Stream query implementation
|
|
56
|
+
*/
|
|
57
|
+
streamQuery(prompt: CompiledPrompt, options?: VertexAIQueryOptions): Promise<StreamResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Close the client
|
|
60
|
+
*/
|
|
61
|
+
close(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=vertexai-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexai-driver.d.ts","sourceRoot":"","sources":["../../src/vertexai/vertexai-driver.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAkBD;;GAEG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,cAAc,CAAgC;gBAE1C,MAAM,GAAE,oBAAyB;IAc7C;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmChC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6DvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,WAAW,CAAC;IAkFvB;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAoFxB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { VertexAI, HarmCategory, HarmBlockThreshold, SchemaType } from '@google-cloud/vertexai';
|
|
2
|
+
/**
|
|
3
|
+
* Map finish reasons from VertexAI to our format
|
|
4
|
+
*/
|
|
5
|
+
const finishReasonMap = {
|
|
6
|
+
FINISH_REASON_UNSPECIFIED: 'error',
|
|
7
|
+
STOP: 'stop',
|
|
8
|
+
MAX_TOKENS: 'length',
|
|
9
|
+
SAFETY: 'stop',
|
|
10
|
+
RECITATION: 'stop',
|
|
11
|
+
OTHER: 'error',
|
|
12
|
+
BLOCKLIST: 'error',
|
|
13
|
+
PROHIBITED_CONTENT: 'error',
|
|
14
|
+
SPII: 'error',
|
|
15
|
+
error: 'error'
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* VertexAI (Google Gemini) driver
|
|
19
|
+
*/
|
|
20
|
+
export class VertexAIDriver {
|
|
21
|
+
vertexAI;
|
|
22
|
+
defaultModel;
|
|
23
|
+
defaultTemperature;
|
|
24
|
+
defaultOptions;
|
|
25
|
+
constructor(config = {}) {
|
|
26
|
+
const project = config.project || process.env.GOOGLE_CLOUD_PROJECT || process.env.ANTHROPIC_VERTEX_PROJECT_ID;
|
|
27
|
+
const location = config.location || process.env.GOOGLE_CLOUD_REGION || process.env.CLOUD_ML_REGION || 'us-central1';
|
|
28
|
+
if (!project) {
|
|
29
|
+
throw new Error('VertexAI project ID is required. Set it in config or GOOGLE_CLOUD_PROJECT environment variable.');
|
|
30
|
+
}
|
|
31
|
+
this.vertexAI = new VertexAI({ project, location });
|
|
32
|
+
this.defaultModel = config.model || 'gemini-2.0-flash-001';
|
|
33
|
+
this.defaultTemperature = config.temperature ?? 0.05;
|
|
34
|
+
this.defaultOptions = config.defaultOptions || {};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert CompiledPrompt to VertexAI's format
|
|
38
|
+
*/
|
|
39
|
+
compiledPromptToVertexAI(prompt) {
|
|
40
|
+
const messages = [];
|
|
41
|
+
// Convert Element[] to string using formatter
|
|
42
|
+
const formatElements = (elements) => {
|
|
43
|
+
return elements.map(el => {
|
|
44
|
+
if (typeof el === 'string')
|
|
45
|
+
return el;
|
|
46
|
+
if ('content' in el)
|
|
47
|
+
return el.content;
|
|
48
|
+
return JSON.stringify(el);
|
|
49
|
+
}).join('\n');
|
|
50
|
+
};
|
|
51
|
+
// Add instructions as system message
|
|
52
|
+
if (prompt.instructions && prompt.instructions.length > 0) {
|
|
53
|
+
messages.push({ role: 'system', content: formatElements(prompt.instructions) });
|
|
54
|
+
}
|
|
55
|
+
// Add data as user message if present
|
|
56
|
+
if (prompt.data && prompt.data.length > 0) {
|
|
57
|
+
messages.push({ role: 'user', content: formatElements(prompt.data) });
|
|
58
|
+
}
|
|
59
|
+
// Add output format as user message if present
|
|
60
|
+
if (prompt.output && prompt.output.length > 0) {
|
|
61
|
+
messages.push({ role: 'user', content: formatElements(prompt.output) });
|
|
62
|
+
}
|
|
63
|
+
// If no user messages, add a default one
|
|
64
|
+
if (!prompt.data && !prompt.output) {
|
|
65
|
+
messages.push({ role: 'user', content: 'Please process according to the instructions.' });
|
|
66
|
+
}
|
|
67
|
+
return this.convertMessages(messages);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Convert messages to VertexAI's format
|
|
71
|
+
*/
|
|
72
|
+
convertMessages(messages) {
|
|
73
|
+
// Separate system messages from conversation
|
|
74
|
+
const systemMessages = messages.filter(m => m.role === 'system');
|
|
75
|
+
const conversation = messages.filter(m => m.role !== 'system');
|
|
76
|
+
// Merge all system messages into one
|
|
77
|
+
const systemInstruction = systemMessages.length > 0
|
|
78
|
+
? systemMessages.map(m => m.content).join('\n\n')
|
|
79
|
+
: undefined;
|
|
80
|
+
// Convert conversation messages
|
|
81
|
+
const contents = conversation.map(m => ({
|
|
82
|
+
role: m.role === 'user' ? 'user' : 'model',
|
|
83
|
+
parts: [{ text: m.content }]
|
|
84
|
+
}));
|
|
85
|
+
// Ensure we have at least one user message
|
|
86
|
+
if (contents.length === 0) {
|
|
87
|
+
contents.push({
|
|
88
|
+
role: 'user',
|
|
89
|
+
parts: [{ text: 'Please process according to the instructions.' }]
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// Ensure conversation starts with user
|
|
93
|
+
if (contents.length > 0 && contents[0].role !== 'user') {
|
|
94
|
+
contents.unshift({
|
|
95
|
+
role: 'user',
|
|
96
|
+
parts: [{ text: 'Continue.' }]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Ensure conversation alternates between user and model
|
|
100
|
+
const processedContents = [];
|
|
101
|
+
let lastRole = '';
|
|
102
|
+
for (const content of contents) {
|
|
103
|
+
if (content.role === lastRole) {
|
|
104
|
+
// Same role twice, insert opposite role
|
|
105
|
+
processedContents.push({
|
|
106
|
+
role: lastRole === 'user' ? 'model' : 'user',
|
|
107
|
+
parts: [{ text: lastRole === 'user' ? 'Continue.' : 'Please continue.' }]
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
processedContents.push(content);
|
|
111
|
+
lastRole = content.role;
|
|
112
|
+
}
|
|
113
|
+
// Ensure conversation ends with user
|
|
114
|
+
if (processedContents.length > 0 && processedContents[processedContents.length - 1].role === 'model') {
|
|
115
|
+
processedContents.push({
|
|
116
|
+
role: 'user',
|
|
117
|
+
parts: [{ text: 'Please continue.' }]
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
contents: processedContents,
|
|
122
|
+
systemInstruction
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Convert JSON Schema to VertexAI ResponseSchema
|
|
127
|
+
*/
|
|
128
|
+
convertJsonSchema(schema) {
|
|
129
|
+
if (!schema)
|
|
130
|
+
return undefined;
|
|
131
|
+
const typeMap = {
|
|
132
|
+
string: SchemaType.STRING,
|
|
133
|
+
number: SchemaType.NUMBER,
|
|
134
|
+
integer: SchemaType.INTEGER,
|
|
135
|
+
boolean: SchemaType.BOOLEAN,
|
|
136
|
+
array: SchemaType.ARRAY,
|
|
137
|
+
object: SchemaType.OBJECT
|
|
138
|
+
};
|
|
139
|
+
const convertSchema = (s) => {
|
|
140
|
+
const result = { ...s };
|
|
141
|
+
if (s.type && typeof s.type === 'string') {
|
|
142
|
+
result.type = typeMap[s.type] || SchemaType.STRING;
|
|
143
|
+
}
|
|
144
|
+
if (s.properties) {
|
|
145
|
+
result.properties = Object.fromEntries(Object.entries(s.properties)
|
|
146
|
+
.map(([k, v]) => [k, convertSchema(v)]));
|
|
147
|
+
}
|
|
148
|
+
if (s.items) {
|
|
149
|
+
result.items = convertSchema(s.items);
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
};
|
|
153
|
+
return convertSchema(schema);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create a generative model client
|
|
157
|
+
*/
|
|
158
|
+
createClient(model, config) {
|
|
159
|
+
const options = {
|
|
160
|
+
model,
|
|
161
|
+
safetySettings: [
|
|
162
|
+
{
|
|
163
|
+
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
|
|
164
|
+
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
generationConfig: config
|
|
168
|
+
};
|
|
169
|
+
// Use preview API for preview models
|
|
170
|
+
if (model.includes('-preview-')) {
|
|
171
|
+
return this.vertexAI.preview.getGenerativeModel(options);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
return this.vertexAI.getGenerativeModel(options);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Query implementation
|
|
179
|
+
*/
|
|
180
|
+
async query(prompt, options = {}) {
|
|
181
|
+
try {
|
|
182
|
+
// Merge options with defaults
|
|
183
|
+
const mergedOptions = { ...this.defaultOptions, ...options };
|
|
184
|
+
// Convert prompt to VertexAI format
|
|
185
|
+
const request = this.compiledPromptToVertexAI(prompt);
|
|
186
|
+
// Create generation config
|
|
187
|
+
const generationConfig = {
|
|
188
|
+
maxOutputTokens: mergedOptions.maxTokens || 1000,
|
|
189
|
+
temperature: mergedOptions.temperature ?? this.defaultTemperature,
|
|
190
|
+
topP: mergedOptions.topP,
|
|
191
|
+
topK: mergedOptions.topK,
|
|
192
|
+
responseMimeType: prompt.metadata?.outputSchema ? 'application/json' : 'text/plain',
|
|
193
|
+
responseSchema: this.convertJsonSchema(prompt.metadata?.outputSchema)
|
|
194
|
+
};
|
|
195
|
+
// Remove undefined values
|
|
196
|
+
Object.keys(generationConfig).forEach(key => {
|
|
197
|
+
if (generationConfig[key] === undefined) {
|
|
198
|
+
delete generationConfig[key];
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
// Create client and generate
|
|
202
|
+
const model = mergedOptions.model || this.defaultModel;
|
|
203
|
+
const client = this.createClient(model, generationConfig);
|
|
204
|
+
const result = await client.generateContent(request);
|
|
205
|
+
// Extract response
|
|
206
|
+
const response = result.response;
|
|
207
|
+
const candidate = response.candidates?.[0];
|
|
208
|
+
if (!candidate || !candidate.content) {
|
|
209
|
+
return {
|
|
210
|
+
content: '',
|
|
211
|
+
finishReason: 'error'
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// Extract text content
|
|
215
|
+
const content = candidate.content.parts
|
|
216
|
+
.map(part => part.text || '')
|
|
217
|
+
.join('');
|
|
218
|
+
// Map finish reason
|
|
219
|
+
const finishReason = finishReasonMap[candidate.finishReason || 'error'];
|
|
220
|
+
// Handle structured outputs
|
|
221
|
+
let structuredOutput;
|
|
222
|
+
if (prompt.metadata?.outputSchema && content) {
|
|
223
|
+
try {
|
|
224
|
+
structuredOutput = JSON.parse(content);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Keep as text if not valid JSON
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
content,
|
|
232
|
+
finishReason,
|
|
233
|
+
structuredOutput,
|
|
234
|
+
usage: response.usageMetadata ? {
|
|
235
|
+
promptTokens: response.usageMetadata.promptTokenCount || 0,
|
|
236
|
+
completionTokens: response.usageMetadata.candidatesTokenCount || 0,
|
|
237
|
+
totalTokens: response.usageMetadata.totalTokenCount || 0
|
|
238
|
+
} : undefined
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
console.error('[VertexAIDriver] Query error:', error);
|
|
243
|
+
if (error instanceof Error) {
|
|
244
|
+
console.error('[VertexAIDriver] Error message:', error.message);
|
|
245
|
+
console.error('[VertexAIDriver] Error stack:', error.stack);
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
content: '',
|
|
249
|
+
finishReason: 'error'
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Stream query implementation
|
|
255
|
+
*/
|
|
256
|
+
async streamQuery(prompt, options) {
|
|
257
|
+
const mergedOptions = { ...this.defaultOptions, ...options };
|
|
258
|
+
// Convert prompt to VertexAI format
|
|
259
|
+
const request = this.compiledPromptToVertexAI(prompt);
|
|
260
|
+
// Create generation config
|
|
261
|
+
const generationConfig = {
|
|
262
|
+
maxOutputTokens: mergedOptions.maxTokens || 1000,
|
|
263
|
+
temperature: mergedOptions.temperature ?? this.defaultTemperature,
|
|
264
|
+
responseMimeType: prompt.metadata?.outputSchema ? 'application/json' : 'text/plain',
|
|
265
|
+
responseSchema: this.convertJsonSchema(prompt.metadata?.outputSchema)
|
|
266
|
+
};
|
|
267
|
+
// Remove undefined values
|
|
268
|
+
Object.keys(generationConfig).forEach(key => {
|
|
269
|
+
if (generationConfig[key] === undefined) {
|
|
270
|
+
delete generationConfig[key];
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
// Create client and generate stream
|
|
274
|
+
const model = mergedOptions.model || this.defaultModel;
|
|
275
|
+
const client = this.createClient(model, generationConfig);
|
|
276
|
+
const streamingResult = await client.generateContentStream(request);
|
|
277
|
+
// Create stream generator
|
|
278
|
+
async function* streamGenerator() {
|
|
279
|
+
for await (const chunk of streamingResult.stream) {
|
|
280
|
+
if (chunk?.candidates?.[0]?.content?.parts?.[0]?.text) {
|
|
281
|
+
yield chunk.candidates[0].content.parts[0].text;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Create result promise
|
|
286
|
+
const resultPromise = (async () => {
|
|
287
|
+
// Aggregate the response from streaming
|
|
288
|
+
const response = await streamingResult.response;
|
|
289
|
+
const candidate = response.candidates?.[0];
|
|
290
|
+
if (!candidate || !candidate.content) {
|
|
291
|
+
return {
|
|
292
|
+
content: '',
|
|
293
|
+
finishReason: 'error'
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
// Extract text content
|
|
297
|
+
const content = candidate.content.parts
|
|
298
|
+
.map(part => part.text || '')
|
|
299
|
+
.join('');
|
|
300
|
+
// Map finish reason
|
|
301
|
+
const finishReason = finishReasonMap[candidate.finishReason || 'error'];
|
|
302
|
+
// Handle structured outputs
|
|
303
|
+
let structuredOutput;
|
|
304
|
+
if (prompt.metadata?.outputSchema && content) {
|
|
305
|
+
try {
|
|
306
|
+
structuredOutput = JSON.parse(content);
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
// Keep as text if not valid JSON
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
content,
|
|
314
|
+
finishReason,
|
|
315
|
+
structuredOutput,
|
|
316
|
+
usage: response.usageMetadata ? {
|
|
317
|
+
promptTokens: response.usageMetadata.promptTokenCount || 0,
|
|
318
|
+
completionTokens: response.usageMetadata.candidatesTokenCount || 0,
|
|
319
|
+
totalTokens: response.usageMetadata.totalTokenCount || 0
|
|
320
|
+
} : undefined
|
|
321
|
+
};
|
|
322
|
+
})();
|
|
323
|
+
return {
|
|
324
|
+
stream: streamGenerator(),
|
|
325
|
+
result: resultPromise
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Close the client
|
|
330
|
+
*/
|
|
331
|
+
async close() {
|
|
332
|
+
// VertexAI client doesn't need explicit closing
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=vertexai-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexai-driver.js","sourceRoot":"","sources":["../../src/vertexai/vertexai-driver.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@modular-prompt/driver",
|
|
3
|
+
"version": "0.4.5",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"scripts",
|
|
16
|
+
"src/mlx-ml/python"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@anthropic-ai/sdk": "^0.61.0",
|
|
20
|
+
"@google-cloud/vertexai": "^1.10.0",
|
|
21
|
+
"@google/genai": "^1.34.0",
|
|
22
|
+
"@types/js-yaml": "^4.0.9",
|
|
23
|
+
"google-auth-library": "^9.15.1",
|
|
24
|
+
"js-yaml": "^4.1.0",
|
|
25
|
+
"openai": "^5.19.1",
|
|
26
|
+
"@modular-prompt/core": "0.1.9",
|
|
27
|
+
"@modular-prompt/utils": "0.1.4"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@eslint/js": "^9.35.0",
|
|
31
|
+
"@types/node": "^20.10.5",
|
|
32
|
+
"@typescript-eslint/eslint-plugin": "^8.43.0",
|
|
33
|
+
"@typescript-eslint/parser": "^8.43.0",
|
|
34
|
+
"eslint": "^9.35.0",
|
|
35
|
+
"globals": "^15.0.0",
|
|
36
|
+
"typescript": "^5.3.3",
|
|
37
|
+
"vitest": "^3.0.0"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public",
|
|
41
|
+
"registry": "https://registry.npmjs.org/"
|
|
42
|
+
},
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/otolab/moduler-prompt.git",
|
|
46
|
+
"directory": "packages/driver"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsc -b --force",
|
|
50
|
+
"test": "vitest",
|
|
51
|
+
"test:run": "vitest run",
|
|
52
|
+
"test:system": "vitest run --config vitest.config.system.ts",
|
|
53
|
+
"test:system:mlx": "vitest run --config vitest.config.system.ts test/system/mlx-parameters.system.test.ts",
|
|
54
|
+
"download-model": "node scripts/download-model.js",
|
|
55
|
+
"lint": "eslint src/**/*.ts",
|
|
56
|
+
"typecheck": "tsc --noEmit",
|
|
57
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
58
|
+
"postinstall": "node scripts/setup-mlx.js || true",
|
|
59
|
+
"setup-mlx": "node scripts/setup-mlx.js"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { join, dirname } from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const pythonDir = join(__dirname, '..', 'src', 'mlx-ml', 'python');
|
|
10
|
+
const distPythonDir = join(__dirname, '..', 'dist', 'mlx-ml', 'python');
|
|
11
|
+
|
|
12
|
+
// Check Python directory
|
|
13
|
+
const targetDir = existsSync(distPythonDir) ? distPythonDir : pythonDir;
|
|
14
|
+
|
|
15
|
+
if (!existsSync(targetDir)) {
|
|
16
|
+
console.error('ā MLX Python directory not found.');
|
|
17
|
+
console.error(' Please run "npm run setup-mlx" first.');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
console.log('š¦ Downloading test model...');
|
|
22
|
+
console.log(`š Working directory: ${targetDir}\n`);
|
|
23
|
+
|
|
24
|
+
// Get model name from command line arguments or use default
|
|
25
|
+
const modelName = process.argv[2] || 'mlx-community/gemma-3-270m-it-4bit';
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
execSync(
|
|
29
|
+
`uv run mlx_lm.generate --model ${modelName} --prompt 'test' --max-tokens 1`,
|
|
30
|
+
{
|
|
31
|
+
cwd: targetDir,
|
|
32
|
+
stdio: 'inherit'
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
console.log('\nā
Model downloaded successfully!');
|
|
36
|
+
console.log(` Model: ${modelName}`);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error('\nā Failed to download model:', error.message);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|