@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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +597 -0
  3. package/dist/anthropic/anthropic-driver.d.ts +47 -0
  4. package/dist/anthropic/anthropic-driver.d.ts.map +1 -0
  5. package/dist/anthropic/anthropic-driver.js +217 -0
  6. package/dist/anthropic/anthropic-driver.js.map +1 -0
  7. package/dist/driver-registry/ai-service.d.ts +43 -0
  8. package/dist/driver-registry/ai-service.d.ts.map +1 -0
  9. package/dist/driver-registry/ai-service.js +77 -0
  10. package/dist/driver-registry/ai-service.js.map +1 -0
  11. package/dist/driver-registry/config-based-factory.d.ts +64 -0
  12. package/dist/driver-registry/config-based-factory.d.ts.map +1 -0
  13. package/dist/driver-registry/config-based-factory.js +90 -0
  14. package/dist/driver-registry/config-based-factory.js.map +1 -0
  15. package/dist/driver-registry/factory-helper.d.ts +49 -0
  16. package/dist/driver-registry/factory-helper.d.ts.map +1 -0
  17. package/dist/driver-registry/factory-helper.js +109 -0
  18. package/dist/driver-registry/factory-helper.js.map +1 -0
  19. package/dist/driver-registry/index.d.ts +9 -0
  20. package/dist/driver-registry/index.d.ts.map +1 -0
  21. package/dist/driver-registry/index.js +8 -0
  22. package/dist/driver-registry/index.js.map +1 -0
  23. package/dist/driver-registry/registry.d.ts +50 -0
  24. package/dist/driver-registry/registry.d.ts.map +1 -0
  25. package/dist/driver-registry/registry.js +208 -0
  26. package/dist/driver-registry/registry.js.map +1 -0
  27. package/dist/driver-registry/types.d.ts +108 -0
  28. package/dist/driver-registry/types.d.ts.map +1 -0
  29. package/dist/driver-registry/types.js +6 -0
  30. package/dist/driver-registry/types.js.map +1 -0
  31. package/dist/echo-driver.d.ts +88 -0
  32. package/dist/echo-driver.d.ts.map +1 -0
  33. package/dist/echo-driver.js +198 -0
  34. package/dist/echo-driver.js.map +1 -0
  35. package/dist/formatter/completion-formatter.d.ts +27 -0
  36. package/dist/formatter/completion-formatter.d.ts.map +1 -0
  37. package/dist/formatter/completion-formatter.js +84 -0
  38. package/dist/formatter/completion-formatter.js.map +1 -0
  39. package/dist/formatter/converter.d.ts +20 -0
  40. package/dist/formatter/converter.d.ts.map +1 -0
  41. package/dist/formatter/converter.js +176 -0
  42. package/dist/formatter/converter.js.map +1 -0
  43. package/dist/formatter/element-formatters/base.d.ts +34 -0
  44. package/dist/formatter/element-formatters/base.d.ts.map +1 -0
  45. package/dist/formatter/element-formatters/base.js +36 -0
  46. package/dist/formatter/element-formatters/base.js.map +1 -0
  47. package/dist/formatter/element-formatters/chunk.d.ts +11 -0
  48. package/dist/formatter/element-formatters/chunk.d.ts.map +1 -0
  49. package/dist/formatter/element-formatters/chunk.js +12 -0
  50. package/dist/formatter/element-formatters/chunk.js.map +1 -0
  51. package/dist/formatter/element-formatters/index.d.ts +14 -0
  52. package/dist/formatter/element-formatters/index.d.ts.map +1 -0
  53. package/dist/formatter/element-formatters/index.js +15 -0
  54. package/dist/formatter/element-formatters/index.js.map +1 -0
  55. package/dist/formatter/element-formatters/json.d.ts +11 -0
  56. package/dist/formatter/element-formatters/json.d.ts.map +1 -0
  57. package/dist/formatter/element-formatters/json.js +27 -0
  58. package/dist/formatter/element-formatters/json.js.map +1 -0
  59. package/dist/formatter/element-formatters/material.d.ts +11 -0
  60. package/dist/formatter/element-formatters/material.d.ts.map +1 -0
  61. package/dist/formatter/element-formatters/material.js +35 -0
  62. package/dist/formatter/element-formatters/material.js.map +1 -0
  63. package/dist/formatter/element-formatters/message.d.ts +13 -0
  64. package/dist/formatter/element-formatters/message.d.ts.map +1 -0
  65. package/dist/formatter/element-formatters/message.js +35 -0
  66. package/dist/formatter/element-formatters/message.js.map +1 -0
  67. package/dist/formatter/element-formatters/registry.d.ts +29 -0
  68. package/dist/formatter/element-formatters/registry.d.ts.map +1 -0
  69. package/dist/formatter/element-formatters/registry.js +82 -0
  70. package/dist/formatter/element-formatters/registry.js.map +1 -0
  71. package/dist/formatter/element-formatters/section.d.ts +18 -0
  72. package/dist/formatter/element-formatters/section.d.ts.map +1 -0
  73. package/dist/formatter/element-formatters/section.js +46 -0
  74. package/dist/formatter/element-formatters/section.js.map +1 -0
  75. package/dist/formatter/element-formatters/string-pattern.d.ts +22 -0
  76. package/dist/formatter/element-formatters/string-pattern.d.ts.map +1 -0
  77. package/dist/formatter/element-formatters/string-pattern.js +124 -0
  78. package/dist/formatter/element-formatters/string-pattern.js.map +1 -0
  79. package/dist/formatter/element-formatters/text.d.ts +11 -0
  80. package/dist/formatter/element-formatters/text.d.ts.map +1 -0
  81. package/dist/formatter/element-formatters/text.js +11 -0
  82. package/dist/formatter/element-formatters/text.js.map +1 -0
  83. package/dist/formatter/formatter.d.ts +24 -0
  84. package/dist/formatter/formatter.d.ts.map +1 -0
  85. package/dist/formatter/formatter.js +252 -0
  86. package/dist/formatter/formatter.js.map +1 -0
  87. package/dist/formatter/types.d.ts +91 -0
  88. package/dist/formatter/types.d.ts.map +1 -0
  89. package/dist/formatter/types.js +2 -0
  90. package/dist/formatter/types.js.map +1 -0
  91. package/dist/google-genai/google-genai-driver.d.ts +67 -0
  92. package/dist/google-genai/google-genai-driver.d.ts.map +1 -0
  93. package/dist/google-genai/google-genai-driver.js +351 -0
  94. package/dist/google-genai/google-genai-driver.js.map +1 -0
  95. package/dist/index.d.ts +17 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +23 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/mlx-ml/mlx-driver.d.ts +65 -0
  100. package/dist/mlx-ml/mlx-driver.d.ts.map +1 -0
  101. package/dist/mlx-ml/mlx-driver.js +235 -0
  102. package/dist/mlx-ml/mlx-driver.js.map +1 -0
  103. package/dist/mlx-ml/model-spec/index.d.ts +7 -0
  104. package/dist/mlx-ml/model-spec/index.d.ts.map +1 -0
  105. package/dist/mlx-ml/model-spec/index.js +7 -0
  106. package/dist/mlx-ml/model-spec/index.js.map +1 -0
  107. package/dist/mlx-ml/model-spec/types.d.ts +30 -0
  108. package/dist/mlx-ml/model-spec/types.d.ts.map +1 -0
  109. package/dist/mlx-ml/model-spec/types.js +7 -0
  110. package/dist/mlx-ml/model-spec/types.js.map +1 -0
  111. package/dist/mlx-ml/process/index.d.ts +33 -0
  112. package/dist/mlx-ml/process/index.d.ts.map +1 -0
  113. package/dist/mlx-ml/process/index.js +65 -0
  114. package/dist/mlx-ml/process/index.js.map +1 -0
  115. package/dist/mlx-ml/process/model-handlers.d.ts +58 -0
  116. package/dist/mlx-ml/process/model-handlers.d.ts.map +1 -0
  117. package/dist/mlx-ml/process/model-handlers.js +197 -0
  118. package/dist/mlx-ml/process/model-handlers.js.map +1 -0
  119. package/dist/mlx-ml/process/model-specific.d.ts +35 -0
  120. package/dist/mlx-ml/process/model-specific.d.ts.map +1 -0
  121. package/dist/mlx-ml/process/model-specific.js +35 -0
  122. package/dist/mlx-ml/process/model-specific.js.map +1 -0
  123. package/dist/mlx-ml/process/parameter-mapper.d.ts +17 -0
  124. package/dist/mlx-ml/process/parameter-mapper.d.ts.map +1 -0
  125. package/dist/mlx-ml/process/parameter-mapper.js +91 -0
  126. package/dist/mlx-ml/process/parameter-mapper.js.map +1 -0
  127. package/dist/mlx-ml/process/parameter-validator.d.ts +55 -0
  128. package/dist/mlx-ml/process/parameter-validator.d.ts.map +1 -0
  129. package/dist/mlx-ml/process/parameter-validator.js +203 -0
  130. package/dist/mlx-ml/process/parameter-validator.js.map +1 -0
  131. package/dist/mlx-ml/process/process-communication.d.ts +25 -0
  132. package/dist/mlx-ml/process/process-communication.d.ts.map +1 -0
  133. package/dist/mlx-ml/process/process-communication.js +117 -0
  134. package/dist/mlx-ml/process/process-communication.js.map +1 -0
  135. package/dist/mlx-ml/process/queue.d.ts +30 -0
  136. package/dist/mlx-ml/process/queue.d.ts.map +1 -0
  137. package/dist/mlx-ml/process/queue.js +147 -0
  138. package/dist/mlx-ml/process/queue.js.map +1 -0
  139. package/dist/mlx-ml/process/types.d.ts +97 -0
  140. package/dist/mlx-ml/process/types.d.ts.map +1 -0
  141. package/dist/mlx-ml/process/types.js +2 -0
  142. package/dist/mlx-ml/process/types.js.map +1 -0
  143. package/dist/mlx-ml/types.d.ts +66 -0
  144. package/dist/mlx-ml/types.d.ts.map +1 -0
  145. package/dist/mlx-ml/types.js +7 -0
  146. package/dist/mlx-ml/types.js.map +1 -0
  147. package/dist/ollama/ollama-driver.d.ts +15 -0
  148. package/dist/ollama/ollama-driver.d.ts.map +1 -0
  149. package/dist/ollama/ollama-driver.js +15 -0
  150. package/dist/ollama/ollama-driver.js.map +1 -0
  151. package/dist/openai/openai-driver.d.ts +71 -0
  152. package/dist/openai/openai-driver.d.ts.map +1 -0
  153. package/dist/openai/openai-driver.js +230 -0
  154. package/dist/openai/openai-driver.js.map +1 -0
  155. package/dist/test-driver.d.ts +78 -0
  156. package/dist/test-driver.d.ts.map +1 -0
  157. package/dist/test-driver.js +193 -0
  158. package/dist/test-driver.js.map +1 -0
  159. package/dist/types.d.ts +90 -0
  160. package/dist/types.d.ts.map +1 -0
  161. package/dist/types.js +2 -0
  162. package/dist/types.js.map +1 -0
  163. package/dist/vertexai/vertexai-driver.d.ts +63 -0
  164. package/dist/vertexai/vertexai-driver.d.ts.map +1 -0
  165. package/dist/vertexai/vertexai-driver.js +335 -0
  166. package/dist/vertexai/vertexai-driver.js.map +1 -0
  167. package/package.json +61 -0
  168. package/scripts/download-model.js +40 -0
  169. package/scripts/setup-mlx.js +53 -0
  170. package/src/mlx-ml/python/.python-version +1 -0
  171. package/src/mlx-ml/python/__main__.py +312 -0
  172. package/src/mlx-ml/python/chat_template_constraints.py +164 -0
  173. package/src/mlx-ml/python/pyproject.toml +19 -0
  174. package/src/mlx-ml/python/token_utils.py +262 -0
  175. package/src/mlx-ml/python/uv.lock +1029 -0
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }