@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
|
@@ -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
|