@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,197 @@
1
+ /**
2
+ * モデル固有の処理ハンドラー
3
+ *
4
+ * 各モデル特有のメッセージ変換やプロンプト生成処理を管理
5
+ */
6
+ /**
7
+ * システムメッセージをマージ(末尾の改行をtrim)
8
+ */
9
+ export function mergeSystemMessages(msgs) {
10
+ let systemContent = '';
11
+ const conversation = [];
12
+ for (const msg of msgs) {
13
+ if (msg.role === 'system') {
14
+ systemContent += msg.content + '\n\n';
15
+ }
16
+ else {
17
+ conversation.push(msg);
18
+ }
19
+ }
20
+ if (systemContent) {
21
+ const systemMessage = { role: 'system', content: systemContent.trim() };
22
+ return [systemMessage, ...conversation];
23
+ }
24
+ return conversation;
25
+ }
26
+ /**
27
+ * システムメッセージをマージ(末尾の改行を保持)
28
+ */
29
+ function mergeSystemMessagesRaw(msgs) {
30
+ const systemMessages = [];
31
+ const conversation = [];
32
+ for (const msg of msgs) {
33
+ if (msg.role === 'system') {
34
+ systemMessages.push(msg.content);
35
+ }
36
+ else {
37
+ conversation.push(msg);
38
+ }
39
+ }
40
+ if (systemMessages.length > 0) {
41
+ const systemMessage = {
42
+ role: 'system',
43
+ content: systemMessages.join('\n\n')
44
+ };
45
+ return [systemMessage, ...conversation];
46
+ }
47
+ return conversation;
48
+ }
49
+ /**
50
+ * Tanuki-8B-dpo-v1用のChat処理
51
+ */
52
+ export function processTanukiChat(messages) {
53
+ // まずsystemメッセージをマージ(改行を保持)
54
+ const mergedMessages = mergeSystemMessagesRaw(messages);
55
+ const result = [];
56
+ // systemメッセージにプレフィックスを追加
57
+ if (mergedMessages.length > 0 && mergedMessages[0].role === 'system') {
58
+ result.push({
59
+ role: 'system',
60
+ content: '以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n\n' + mergedMessages[0].content
61
+ });
62
+ result.push(...mergedMessages.slice(1));
63
+ }
64
+ else {
65
+ // systemメッセージがない場合
66
+ result.push({
67
+ role: 'system',
68
+ content: '以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n'
69
+ });
70
+ result.push(...mergedMessages);
71
+ }
72
+ // 最後にuserメッセージを追加
73
+ result.push({
74
+ role: 'user',
75
+ content: 'systemプロンプトで説明されたタスクを正確に実行し、Output Sectionに書かれるべき内容を出力してください。\n'
76
+ });
77
+ return result;
78
+ }
79
+ /**
80
+ * CodeLlama用のChat処理
81
+ */
82
+ export function processCodeLlamaChat(messages) {
83
+ const processedMessages = mergeSystemMessages(messages);
84
+ // userがない場合は必要
85
+ if (processedMessages[processedMessages.length - 1].role !== 'user') {
86
+ processedMessages.push({
87
+ role: 'user',
88
+ content: 'Read the system prompt and output the appropriate content.',
89
+ });
90
+ }
91
+ return processedMessages;
92
+ }
93
+ /**
94
+ * Gemma-3用のChat処理
95
+ */
96
+ export function processGemmaChat(messages) {
97
+ const processedMessages = mergeSystemMessages(messages);
98
+ // (system) => user => assistant => user => ... と、きれいに並んでいないとエラーになる。
99
+ if (processedMessages[processedMessages.length - 1].role !== 'user') {
100
+ processedMessages.push({
101
+ role: 'user',
102
+ content: 'Read the system prompt and output the appropriate content.',
103
+ });
104
+ }
105
+ return processedMessages;
106
+ }
107
+ /**
108
+ * llm-jp-3.1用のCompletion処理
109
+ * chat_templateに厳密に準拠した形式
110
+ * Note: llm-jp-3.1はforce-completion設定のため、chat APIは使用されない
111
+ */
112
+ export function processLlmJpCompletion(prompt) {
113
+ // llm-jpは複数言語の混ぜ書きに弱い傾向があるため、特定の言語を優先しないよう明示的に指示
114
+ const llmJpSpecificInstruction = '指示は英語・日本語の混ぜ書きになっているが、どちらの言語も同等の指示として十分に理解すること。\n出力は与えられたタスクに対してふさわしい言語を選択する。\n\n';
115
+ // chat_templateのsystemメッセージと同じ固定文字列(良好な回答を得るために必要な固定プロンプト)
116
+ return '<s>以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。' +
117
+ '\n\n### 指示:\n' +
118
+ llmJpSpecificInstruction +
119
+ prompt +
120
+ '\n\n### 応答:';
121
+ }
122
+ /**
123
+ * Tanuki-8B用のCompletion処理
124
+ */
125
+ export function processTanukiCompletion(prompt) {
126
+ // completion APIではブロック化トークンを使用可能
127
+ return `### システム:\n${prompt}\n\n### 応答:\n`;
128
+ }
129
+ /**
130
+ * Gemma-3用のCompletion処理
131
+ */
132
+ export function processGemmaCompletion(prompt) {
133
+ // Gemma-3はchat形式に依存しないcompletion処理が可能
134
+ return `<start_of_turn>user\n${prompt}<end_of_turn>\n<start_of_turn>model\n`;
135
+ }
136
+ /**
137
+ * ELYZA (Llama 2ベース) 用のCompletion処理
138
+ *
139
+ * ELYZAはLlama 2のinstruction formatを使用:
140
+ * <s>[INST] <<SYS>>
141
+ * システムプロンプト
142
+ * <</SYS>>
143
+ *
144
+ * ユーザープロンプト [/INST]
145
+ *
146
+ * Note: <<SYS>>, [INST]などはspecial tokensではなく、複数トークンに分割される
147
+ */
148
+ export function processElyzaCompletion(prompt) {
149
+ const B_INST = '[INST]';
150
+ const E_INST = '[/INST]';
151
+ const B_SYS = '<<SYS>>\n';
152
+ const E_SYS = '\n<</SYS>>\n\n';
153
+ const DEFAULT_SYSTEM = 'あなたは誠実で優秀な日本人のアシスタントです。';
154
+ // Llama 2 instruction format
155
+ // <s>は自動的に追加されるため含めない(add_bos_token: true)
156
+ return `${B_INST} ${B_SYS}${DEFAULT_SYSTEM}${E_SYS}${prompt} ${E_INST} `;
157
+ }
158
+ /**
159
+ * モデル名に基づいてChat処理を選択
160
+ */
161
+ export function selectChatProcessor(modelName) {
162
+ // Note: llm-jp-3.1はforce-completion設定のため、ここには含めない
163
+ if (modelName.includes('Tanuki-8B-dpo-v1')) {
164
+ return processTanukiChat;
165
+ }
166
+ if (modelName.includes('mlx-community/CodeLlama')) {
167
+ return processCodeLlamaChat;
168
+ }
169
+ if (modelName.includes('mlx-community/gemma-3')) {
170
+ return processGemmaChat;
171
+ }
172
+ return null;
173
+ }
174
+ /**
175
+ * モデル名に基づいてCompletion処理を選択
176
+ */
177
+ export function selectCompletionProcessor(modelName) {
178
+ if (modelName.includes('llm-jp-3.1')) {
179
+ return processLlmJpCompletion;
180
+ }
181
+ if (modelName.includes('Tanuki-8B')) {
182
+ return processTanukiCompletion;
183
+ }
184
+ if (modelName.includes('CodeLlama')) {
185
+ // CodeLlamaはそのまま返す
186
+ return (prompt) => prompt;
187
+ }
188
+ if (modelName.includes('gemma-3')) {
189
+ return processGemmaCompletion;
190
+ }
191
+ // ELYZA models (elyza/ELYZA-japanese-Llama-2-*)
192
+ if (modelName.toLowerCase().includes('elyza')) {
193
+ return processElyzaCompletion;
194
+ }
195
+ return null;
196
+ }
197
+ //# sourceMappingURL=model-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-handlers.js","sourceRoot":"","sources":["../../../src/mlx-ml/process/model-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MLX Driver モデル固有処理
3
+ *
4
+ * モデルごとの特殊なフォーマット処理、メッセージ変換、プロンプト生成を管理
5
+ * Python側のapply_model_specific_processingをTypeScript側に移行
6
+ */
7
+ import type { MlxMessage } from './types.js';
8
+ export interface ModelSpecificProcessor {
9
+ /**
10
+ * Chat API用のモデル固有処理
11
+ * メッセージ配列を受け取り、モデルに最適化されたメッセージ配列を返す
12
+ */
13
+ applyChatSpecificProcessing(messages: MlxMessage[]): MlxMessage[];
14
+ /**
15
+ * Completion API用のモデル固有処理(文字列ベース)
16
+ * プロンプト文字列を受け取り、モデルに最適化されたプロンプトを返す
17
+ */
18
+ applyCompletionSpecificProcessing(prompt: string): string;
19
+ }
20
+ export declare class DefaultModelSpecificProcessor implements ModelSpecificProcessor {
21
+ private modelName;
22
+ constructor(modelName: string);
23
+ /**
24
+ * Chat API用のモデル固有処理
25
+ * モデルごとのチャットフォーマットに合わせるための処理
26
+ */
27
+ applyChatSpecificProcessing(messages: MlxMessage[]): MlxMessage[];
28
+ /**
29
+ * Completion API用のモデル固有処理
30
+ * モデルごとにブロック化トークンやプロンプトフォーマットを適用
31
+ */
32
+ applyCompletionSpecificProcessing(prompt: string): string;
33
+ }
34
+ export declare function createModelSpecificProcessor(modelName: string): ModelSpecificProcessor;
35
+ //# sourceMappingURL=model-specific.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-specific.d.ts","sourceRoot":"","sources":["../../../src/mlx-ml/process/model-specific.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,2BAA2B,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC;IAElE;;;OAGG;IACH,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3D;AAGD,qBAAa,6BAA8B,YAAW,sBAAsB;IAC9D,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAGrC;;;OAGG;IACH,2BAA2B,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE;IAKjE;;;OAGG;IACH,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAI1D;AAGD,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,GAChB,sBAAsB,CAGxB"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MLX Driver モデル固有処理
3
+ *
4
+ * モデルごとの特殊なフォーマット処理、メッセージ変換、プロンプト生成を管理
5
+ * Python側のapply_model_specific_processingをTypeScript側に移行
6
+ */
7
+ import { selectChatProcessor, selectCompletionProcessor } from './model-handlers.js';
8
+ export class DefaultModelSpecificProcessor {
9
+ modelName;
10
+ constructor(modelName) {
11
+ this.modelName = modelName;
12
+ }
13
+ /**
14
+ * Chat API用のモデル固有処理
15
+ * モデルごとのチャットフォーマットに合わせるための処理
16
+ */
17
+ applyChatSpecificProcessing(messages) {
18
+ const processor = selectChatProcessor(this.modelName);
19
+ return processor ? processor(messages) : messages;
20
+ }
21
+ /**
22
+ * Completion API用のモデル固有処理
23
+ * モデルごとにブロック化トークンやプロンプトフォーマットを適用
24
+ */
25
+ applyCompletionSpecificProcessing(prompt) {
26
+ const processor = selectCompletionProcessor(this.modelName);
27
+ return processor ? processor(prompt) : prompt;
28
+ }
29
+ }
30
+ // ファクトリー関数
31
+ export function createModelSpecificProcessor(modelName) {
32
+ // 将来的に異なるプロセッサーを返すことも可能
33
+ return new DefaultModelSpecificProcessor(modelName);
34
+ }
35
+ //# sourceMappingURL=model-specific.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-specific.js","sourceRoot":"","sources":["../../../src/mlx-ml/process/model-specific.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAiBrF,MAAM,OAAO,6BAA6B;IACpB;IAApB,YAAoB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IACrC,CAAC;IAED;;;OAGG;IACH,2BAA2B,CAAC,QAAsB;QAChD,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,iCAAiC,CAAC,MAAc;QAC9C,MAAM,SAAS,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChD,CAAC;CACF;AAED,WAAW;AACX,MAAM,UAAU,4BAA4B,CAC1C,SAAiB;IAEjB,wBAAwB;IACxB,OAAO,IAAI,6BAA6B,CAAC,SAAS,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MLX Driver パラメータマッピング
3
+ *
4
+ * TypeScript側のパラメータ名をPython側のパラメータ名に変換し、
5
+ * サポートされているパラメータのみをフィルタリングする
6
+ */
7
+ import type { MlxMlModelOptions } from './types.js';
8
+ /**
9
+ * TypeScript側のオプションをPython側のオプションに変換
10
+ *
11
+ * @param options TypeScript側のオプション(キャメルケース)
12
+ * @param strict 厳密モード(不明なパラメータをエラーとして扱う)
13
+ * @returns Python側で使用可能なオプション(スネークケース)
14
+ * @throws {Error} バリデーションエラーが発生した場合
15
+ */
16
+ export declare function mapOptionsToPython(options?: MlxMlModelOptions, strict?: boolean): MlxMlModelOptions | undefined;
17
+ //# sourceMappingURL=parameter-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-mapper.d.ts","sourceRoot":"","sources":["../../../src/mlx-ml/process/parameter-mapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAsCpD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE,iBAAiB,EAC3B,MAAM,GAAE,OAAc,GACrB,iBAAiB,GAAG,SAAS,CAiD/B"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * MLX Driver パラメータマッピング
3
+ *
4
+ * TypeScript側のパラメータ名をPython側のパラメータ名に変換し、
5
+ * サポートされているパラメータのみをフィルタリングする
6
+ */
7
+ import { validateOptions, formatValidationResult } from './parameter-validator.js';
8
+ /**
9
+ * キャメルケースをスネークケースに変換
10
+ *
11
+ * @param str キャメルケースの文字列
12
+ * @returns スネークケースの文字列
13
+ */
14
+ function camelToSnakeCase(str) {
15
+ return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
16
+ }
17
+ /**
18
+ * MLX stream_generateでサポートされているパラメータ
19
+ * TypeScript側 (キャメルケース) -> Python側 (スネークケース) のマッピング
20
+ *
21
+ * 注: MLXは内部でmake_samplerを使用しており、
22
+ * stream_generateは**kwargsで受け取ったパラメータを処理する
23
+ */
24
+ const SPECIAL_MAPPINGS = {
25
+ // 現在は特殊なマッピングなし
26
+ // temperatureはそのままtemperatureとして送る
27
+ };
28
+ /**
29
+ * MLXでサポートされているパラメータのリスト
30
+ * キャメルケースで定義(TypeScript側の名前)
31
+ */
32
+ const SUPPORTED_PARAMS = new Set([
33
+ 'maxTokens', // -> max_tokens
34
+ 'temperature', // -> temp (特殊ケース)
35
+ 'topP', // -> top_p
36
+ 'topK', // -> top_k
37
+ 'repetitionPenalty', // -> repetition_penalty
38
+ 'repetitionContextSize', // -> repetition_context_size
39
+ ]);
40
+ /**
41
+ * TypeScript側のオプションをPython側のオプションに変換
42
+ *
43
+ * @param options TypeScript側のオプション(キャメルケース)
44
+ * @param strict 厳密モード(不明なパラメータをエラーとして扱う)
45
+ * @returns Python側で使用可能なオプション(スネークケース)
46
+ * @throws {Error} バリデーションエラーが発生した場合
47
+ */
48
+ export function mapOptionsToPython(options, strict = true) {
49
+ if (!options) {
50
+ return undefined;
51
+ }
52
+ // まずバリデーションを実行
53
+ const validationResult = validateOptions(options, strict);
54
+ // バリデーションエラーがある場合
55
+ if (!validationResult.valid) {
56
+ const errorMessage = formatValidationResult(validationResult);
57
+ console.error(`[MLX Driver] ${errorMessage}`);
58
+ if (strict) {
59
+ // 厳密モードではエラーをスロー
60
+ throw new Error(`MLX Driver parameter validation failed:\n${errorMessage}`);
61
+ }
62
+ // 非厳密モードでは処理を続行(エラーのあったパラメータはスキップ)
63
+ }
64
+ // 警告がある場合は出力
65
+ if (validationResult.warnings.length > 0) {
66
+ const warningMessage = formatValidationResult({
67
+ valid: true,
68
+ errors: [],
69
+ warnings: validationResult.warnings,
70
+ validatedOptions: validationResult.validatedOptions
71
+ });
72
+ console.warn(`[MLX Driver] ${warningMessage}`);
73
+ }
74
+ // バリデーション済みのオプションを使用
75
+ const validatedOptions = validationResult.validatedOptions || {};
76
+ const mappedOptions = {};
77
+ for (const [key, value] of Object.entries(validatedOptions)) {
78
+ // 特殊なマッピングがある場合はそれを使用
79
+ let pythonKey;
80
+ if (key in SPECIAL_MAPPINGS) {
81
+ pythonKey = SPECIAL_MAPPINGS[key];
82
+ }
83
+ else {
84
+ // 通常のキャメルケース -> スネークケース変換
85
+ pythonKey = camelToSnakeCase(key);
86
+ }
87
+ mappedOptions[pythonKey] = value;
88
+ }
89
+ return Object.keys(mappedOptions).length > 0 ? mappedOptions : undefined;
90
+ }
91
+ //# sourceMappingURL=parameter-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-mapper.js","sourceRoot":"","sources":["../../../src/mlx-ml/process/parameter-mapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEnF;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,gBAAgB,GAA2B;AAC/C,gBAAgB;AAChB,mCAAmC;CACpC,CAAC;AAEF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,WAAW,EAAS,gBAAgB;IACpC,aAAa,EAAO,kBAAkB;IACtC,MAAM,EAAa,WAAW;IAC9B,MAAM,EAAa,WAAW;IAC9B,mBAAmB,EAAM,wBAAwB;IACjD,uBAAuB,EAAE,6BAA6B;CACvD,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA2B,EAC3B,SAAkB,IAAI;IAEtB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe;IACf,MAAM,gBAAgB,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE1D,kBAAkB;IAClB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC;QAE9C,IAAI,MAAM,EAAE,CAAC;YACX,iBAAiB;YACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,mCAAmC;IACrC,CAAC;IAED,aAAa;IACb,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,cAAc,GAAG,sBAAsB,CAAC;YAC5C,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;YACnC,gBAAgB,EAAE,gBAAgB,CAAC,gBAAgB;SACpD,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,gBAAgB,cAAc,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,qBAAqB;IACrB,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACjE,MAAM,aAAa,GAAsB,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5D,sBAAsB;QACtB,IAAI,SAAiB,CAAC;QACtB,IAAI,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAC5B,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,0BAA0B;YAC1B,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,aAAa,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * MLX Driver パラメータバリデーター
3
+ *
4
+ * オプションパラメータの存在チェックと値の妥当性検証を行う
5
+ */
6
+ import type { MlxMlModelOptions } from './types.js';
7
+ /**
8
+ * バリデーション結果
9
+ */
10
+ export interface ValidationResult {
11
+ valid: boolean;
12
+ errors: ValidationError[];
13
+ warnings: ValidationWarning[];
14
+ validatedOptions?: MlxMlModelOptions;
15
+ }
16
+ /**
17
+ * バリデーションエラー
18
+ */
19
+ export interface ValidationError {
20
+ field: string;
21
+ value: any;
22
+ message: string;
23
+ type: 'unknown_parameter' | 'invalid_type' | 'out_of_range';
24
+ }
25
+ /**
26
+ * バリデーション警告
27
+ */
28
+ export interface ValidationWarning {
29
+ field: string;
30
+ value: any;
31
+ message: string;
32
+ correctedValue?: any;
33
+ }
34
+ /**
35
+ * オプションパラメータのバリデーション
36
+ *
37
+ * @param options 検証するオプション
38
+ * @param strict 厳密モード(不明なパラメータをエラーとして扱う)
39
+ * @returns バリデーション結果
40
+ */
41
+ export declare function validateOptions(options: Record<string, any> | undefined, strict?: boolean): ValidationResult;
42
+ /**
43
+ * バリデーション結果をフォーマットして出力
44
+ *
45
+ * @param result バリデーション結果
46
+ * @returns フォーマットされたエラーメッセージ
47
+ */
48
+ export declare function formatValidationResult(result: ValidationResult): string;
49
+ /**
50
+ * 利用可能なパラメータのヘルプテキストを生成
51
+ *
52
+ * @returns パラメータのヘルプテキスト
53
+ */
54
+ export declare function getParameterHelp(): string;
55
+ //# sourceMappingURL=parameter-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter-validator.d.ts","sourceRoot":"","sources":["../../../src/mlx-ml/process/parameter-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,mBAAmB,GAAG,cAAc,GAAG,cAAc,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,GAAG,CAAC;CACtB;AA8DD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EACxC,MAAM,GAAE,OAAc,GACrB,gBAAgB,CAuGlB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAsBvE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAkBzC"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * MLX Driver パラメータバリデーター
3
+ *
4
+ * オプションパラメータの存在チェックと値の妥当性検証を行う
5
+ */
6
+ /**
7
+ * MLXパラメータの制約定義
8
+ * キャメルケース形式のみで定義(APIインターフェース用)
9
+ */
10
+ const PARAMETER_CONSTRAINTS = {
11
+ maxTokens: {
12
+ type: 'number',
13
+ min: 1,
14
+ max: 100000,
15
+ default: 1000,
16
+ description: '生成する最大トークン数'
17
+ },
18
+ temperature: {
19
+ type: 'number',
20
+ min: 0.0,
21
+ max: 2.0,
22
+ default: 1.0,
23
+ description: '生成のランダム性を制御する温度パラメータ'
24
+ },
25
+ topP: {
26
+ type: 'number',
27
+ min: 0.0,
28
+ max: 1.0,
29
+ default: 1.0,
30
+ description: 'Top-pサンプリングのしきい値'
31
+ },
32
+ topK: {
33
+ type: 'number',
34
+ min: 1,
35
+ max: 1000,
36
+ default: 40,
37
+ description: 'Top-kサンプリングのk値'
38
+ },
39
+ repetitionPenalty: {
40
+ type: 'number',
41
+ min: 0.0,
42
+ max: 2.0,
43
+ default: 1.0,
44
+ description: '繰り返しペナルティの強度'
45
+ },
46
+ repetitionContextSize: {
47
+ type: 'number',
48
+ min: 1,
49
+ max: 10000,
50
+ default: 20,
51
+ description: '繰り返し検出のコンテキストサイズ'
52
+ }
53
+ };
54
+ /**
55
+ * オプションパラメータのバリデーション
56
+ *
57
+ * @param options 検証するオプション
58
+ * @param strict 厳密モード(不明なパラメータをエラーとして扱う)
59
+ * @returns バリデーション結果
60
+ */
61
+ export function validateOptions(options, strict = true) {
62
+ const errors = [];
63
+ const warnings = [];
64
+ const validatedOptions = {};
65
+ if (!options) {
66
+ return { valid: true, errors: [], warnings: [], validatedOptions: undefined };
67
+ }
68
+ // 各パラメータをチェック
69
+ for (const [key, value] of Object.entries(options)) {
70
+ const constraint = PARAMETER_CONSTRAINTS[key];
71
+ // 不明なパラメータ
72
+ if (!constraint) {
73
+ // 利用可能なパラメータから重複を除く(camelCaseのみ表示)
74
+ const availableParams = ['maxTokens', 'temperature', 'topP', 'topK', 'repetitionPenalty', 'repetitionContextSize'];
75
+ if (strict) {
76
+ errors.push({
77
+ field: key,
78
+ value,
79
+ message: `Unknown parameter '${key}'. Available parameters: ${availableParams.join(', ')}`,
80
+ type: 'unknown_parameter'
81
+ });
82
+ }
83
+ else {
84
+ warnings.push({
85
+ field: key,
86
+ value,
87
+ message: `Unknown parameter '${key}' will be ignored`
88
+ });
89
+ }
90
+ continue;
91
+ }
92
+ // 型チェック
93
+ const actualType = typeof value;
94
+ if (actualType !== constraint.type) {
95
+ // 数値への変換を試みる
96
+ if (constraint.type === 'number' && actualType === 'string') {
97
+ const numValue = parseFloat(value);
98
+ if (!isNaN(numValue)) {
99
+ warnings.push({
100
+ field: key,
101
+ value,
102
+ message: `Parameter '${key}' was converted from string to number`,
103
+ correctedValue: numValue
104
+ });
105
+ validatedOptions[key] = numValue;
106
+ continue;
107
+ }
108
+ }
109
+ errors.push({
110
+ field: key,
111
+ value,
112
+ message: `Parameter '${key}' must be of type ${constraint.type}, got ${actualType}`,
113
+ type: 'invalid_type'
114
+ });
115
+ continue;
116
+ }
117
+ // 範囲チェック(数値型の場合)
118
+ if (constraint.type === 'number') {
119
+ let finalValue = value;
120
+ // 最小値チェック
121
+ if (constraint.min !== undefined && value < constraint.min) {
122
+ warnings.push({
123
+ field: key,
124
+ value,
125
+ message: `Parameter '${key}' value ${value} is below minimum ${constraint.min}, using minimum value`,
126
+ correctedValue: constraint.min
127
+ });
128
+ finalValue = constraint.min;
129
+ }
130
+ // 最大値チェック
131
+ if (constraint.max !== undefined && value > constraint.max) {
132
+ warnings.push({
133
+ field: key,
134
+ value,
135
+ message: `Parameter '${key}' value ${value} exceeds maximum ${constraint.max}, using maximum value`,
136
+ correctedValue: constraint.max
137
+ });
138
+ finalValue = constraint.max;
139
+ }
140
+ validatedOptions[key] = finalValue;
141
+ }
142
+ else {
143
+ // その他の型はそのまま設定
144
+ validatedOptions[key] = value;
145
+ }
146
+ }
147
+ const valid = errors.length === 0;
148
+ return {
149
+ valid,
150
+ errors,
151
+ warnings,
152
+ validatedOptions: valid ? validatedOptions : undefined
153
+ };
154
+ }
155
+ /**
156
+ * バリデーション結果をフォーマットして出力
157
+ *
158
+ * @param result バリデーション結果
159
+ * @returns フォーマットされたエラーメッセージ
160
+ */
161
+ export function formatValidationResult(result) {
162
+ const messages = [];
163
+ if (!result.valid) {
164
+ messages.push('❌ Validation failed:');
165
+ for (const error of result.errors) {
166
+ messages.push(` - ${error.message}`);
167
+ }
168
+ }
169
+ if (result.warnings.length > 0) {
170
+ messages.push('⚠️ Warnings:');
171
+ for (const warning of result.warnings) {
172
+ let msg = ` - ${warning.message}`;
173
+ if (warning.correctedValue !== undefined) {
174
+ msg += ` (corrected to: ${warning.correctedValue})`;
175
+ }
176
+ messages.push(msg);
177
+ }
178
+ }
179
+ return messages.join('\n');
180
+ }
181
+ /**
182
+ * 利用可能なパラメータのヘルプテキストを生成
183
+ *
184
+ * @returns パラメータのヘルプテキスト
185
+ */
186
+ export function getParameterHelp() {
187
+ const lines = ['Available MLX parameters (use camelCase format):'];
188
+ for (const [key, constraint] of Object.entries(PARAMETER_CONSTRAINTS)) {
189
+ let line = ` - ${key} (${constraint.type}): ${constraint.description}`;
190
+ if (constraint.type === 'number' && (constraint.min !== undefined || constraint.max !== undefined)) {
191
+ const range = [];
192
+ if (constraint.min !== undefined)
193
+ range.push(`min: ${constraint.min}`);
194
+ if (constraint.max !== undefined)
195
+ range.push(`max: ${constraint.max}`);
196
+ line += ` [${range.join(', ')}]`;
197
+ }
198
+ line += ` (default: ${constraint.default})`;
199
+ lines.push(line);
200
+ }
201
+ return lines.join('\n');
202
+ }
203
+ //# sourceMappingURL=parameter-validator.js.map