@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,262 @@
1
+ """
2
+ トークン関連のユーティリティ関数
3
+ """
4
+ import sys
5
+ from chat_template_constraints import detect_chat_restrictions
6
+
7
+
8
+ def is_eod_token(response, tokenizer):
9
+ """
10
+ レスポンスがEODトークンかどうかを判定する
11
+
12
+ Args:
13
+ response: stream_generateからのレスポンス
14
+ tokenizer: tokenizerオブジェクト(必須)
15
+
16
+ Returns:
17
+ bool: EODトークンの場合True
18
+ """
19
+ # 1. finish_reasonによる終了判定(MLX-LMの標準的な方法)
20
+ if hasattr(response, 'finish_reason') and response.finish_reason == 'stop':
21
+ return True
22
+
23
+ # 2. response.tokenによる終了トークン判定
24
+ if hasattr(response, 'token'):
25
+ token = response.token
26
+
27
+ # special_tokens_mapとadded_tokens_encoderから終了トークンを取得
28
+ end_token_ids = []
29
+
30
+ # special_tokens_mapから標準的な終了トークンを取得
31
+ if hasattr(tokenizer, 'special_tokens_map') and hasattr(tokenizer, 'added_tokens_encoder'):
32
+ special_map = tokenizer.special_tokens_map
33
+ added_encoder = tokenizer.added_tokens_encoder
34
+
35
+ # EOSトークン
36
+ eos_token_str = special_map.get('eos_token')
37
+ if eos_token_str and eos_token_str in added_encoder:
38
+ end_token_ids.append(added_encoder[eos_token_str])
39
+
40
+ # その他の終了関連トークン
41
+ end_related_keys = ['eoi_token'] # end_of_image
42
+ for key in end_related_keys:
43
+ token_str = special_map.get(key)
44
+ if token_str and token_str in added_encoder:
45
+ end_token_ids.append(added_encoder[token_str])
46
+
47
+ # added_tokens_encoderから直接取得(会話終了トークンなど)
48
+ if hasattr(tokenizer, 'added_tokens_encoder'):
49
+ added_encoder = tokenizer.added_tokens_encoder
50
+ conversation_end_tokens = ['<end_of_turn>']
51
+ for token_str in conversation_end_tokens:
52
+ token_id = added_encoder.get(token_str)
53
+ if token_id is not None:
54
+ end_token_ids.append(token_id)
55
+
56
+ # フォールバック: 直接属性アクセス
57
+ if hasattr(tokenizer, 'eos_token_id'):
58
+ end_token_ids.append(tokenizer.eos_token_id)
59
+
60
+ # 重複を除去してチェック
61
+ if token in set(end_token_ids):
62
+ return True
63
+
64
+ return False
65
+
66
+
67
+ def get_special_tokens(tokenizer):
68
+ """
69
+ tokenizerから特殊トークンを取得する
70
+
71
+ Returns:
72
+ dict: special_tokens情報
73
+ """
74
+ special_tokens = {}
75
+
76
+ # 標準的なspecial tokens(tokenizerに定義されているもの)
77
+ standard_tokens = {
78
+ "eod": tokenizer.eos_token, # End of Document/Sequence
79
+ "bos": tokenizer.bos_token, # Beginning of Sequence
80
+ "unk": tokenizer.unk_token, # Unknown token
81
+ "pad": tokenizer.pad_token, # Padding token
82
+ }
83
+
84
+ for name, token in standard_tokens.items():
85
+ if token is not None:
86
+ token_id = getattr(tokenizer, f"{name}_token_id", None)
87
+ if token_id is not None:
88
+ special_tokens[name] = {"text": token, "id": token_id}
89
+
90
+ # ペアトークン(存在する場合のみ)
91
+ pair_tokens = {
92
+ # ChatML基本形式
93
+ "system": ("<|system|>", "<|/system|>"),
94
+ "user": ("<|user|>", "<|/user|>"),
95
+ "assistant": ("<|assistant|>", "<|/assistant|>"),
96
+
97
+ # フォーマット・構造化
98
+ "code": ("<|code_start|>", "<|code_end|>"),
99
+ "python": ("<|python|>", "<|/python|>"),
100
+ "javascript": ("<|javascript|>", "<|/javascript|>"),
101
+ "bash": ("<|bash|>", "<|/bash|>"),
102
+ "quote": ("<|quote|>", "<|/quote|>"),
103
+ "ref": ("<|ref|>", "<|/ref|>"),
104
+ "citation": ("<|citation|>", "<|/citation|>"),
105
+ "table": ("<|table|>", "<|/table|>"),
106
+ "heading": ("<|heading|>", "<|/heading|>"),
107
+
108
+ # メディア・リッチコンテンツ
109
+ "image": ("<|image|>", "<|/image|>"),
110
+ "audio": ("<|audio|>", "<|/audio|>"),
111
+ "video": ("<|video|>", "<|/video|>"),
112
+
113
+ # 機能・制御
114
+ "tool_call": ("<|tool_call|>", "<|/tool_call|>"),
115
+ "function": ("<|function|>", "<|/function|>"),
116
+ "api": ("<|api|>", "<|/api|>"),
117
+ "search": ("<|search|>", "<|/search|>"),
118
+ "knowledge": ("<|knowledge|>", "<|/knowledge|>"),
119
+ "context": ("<|context|>", "<|/context|>"),
120
+
121
+ # 思考・推論
122
+ "thinking": ("<|thinking|>", "</thinking>"),
123
+ "reasoning": ("<|reasoning|>", "<|/reasoning|>"),
124
+ "scratchpad": ("<|scratchpad|>", "<|/scratchpad|>"),
125
+ "analysis": ("<|analysis|>", "<|/analysis|>"),
126
+ "summary": ("<|summary|>", "<|/summary|>"),
127
+ "explanation": ("<|explanation|>", "<|/explanation|>")
128
+ }
129
+
130
+ # 単体トークン(存在する場合のみ)
131
+ single_tokens = {
132
+ # Fill-in-the-Middle
133
+ "fim_prefix": "<|fim_prefix|>",
134
+ "fim_middle": "<|fim_middle|>",
135
+ "fim_suffix": "<|fim_suffix|>",
136
+
137
+ # リスト・構造
138
+ "list_item": "<|list_item|>",
139
+
140
+ # メディア単体
141
+ "vision": "<|vision|>",
142
+
143
+ # 一般的なマークダウン風
144
+ "code_inline": "`",
145
+ "code_block_start": "```",
146
+ "code_block_end": "```"
147
+ }
148
+
149
+ # ペアトークンの処理
150
+ for name, (start_token, end_token) in pair_tokens.items():
151
+ start_id = tokenizer.convert_tokens_to_ids(start_token)
152
+ end_id = tokenizer.convert_tokens_to_ids(end_token)
153
+
154
+ # unk_tokenでない場合のみ追加
155
+ if start_id != tokenizer.unk_token_id and end_id != tokenizer.unk_token_id:
156
+ special_tokens[name] = {
157
+ "start": {"text": start_token, "id": start_id},
158
+ "end": {"text": end_token, "id": end_id}
159
+ }
160
+
161
+ # 単体トークンの処理
162
+ for name, token_text in single_tokens.items():
163
+ token_id = tokenizer.convert_tokens_to_ids(token_text)
164
+
165
+ # unk_tokenでない場合のみ追加
166
+ if token_id != tokenizer.unk_token_id:
167
+ special_tokens[name] = {"text": token_text, "id": token_id}
168
+
169
+ return special_tokens
170
+
171
+
172
+ def get_chat_template_info(tokenizer):
173
+ """チャットテンプレートの詳細情報を取得"""
174
+ if not hasattr(tokenizer, 'apply_chat_template'):
175
+ return None
176
+
177
+ template_info = {
178
+ "template_string": getattr(tokenizer, 'chat_template', None),
179
+ "supported_roles": [],
180
+ "preview": None,
181
+ "constraints": {}
182
+ }
183
+
184
+ # サポートされるroleを検査
185
+ test_roles = ["system", "user", "assistant", "tool", "function"]
186
+ for role in test_roles:
187
+ test_msg = [{"role": role, "content": "test"}]
188
+ try:
189
+ tokenizer.apply_chat_template(test_msg, tokenize=False, add_generation_prompt=False)
190
+ template_info["supported_roles"].append(role)
191
+ except:
192
+ continue
193
+
194
+ # プレビュー生成
195
+ if template_info["supported_roles"]:
196
+ sample_messages = []
197
+ if "system" in template_info["supported_roles"]:
198
+ sample_messages.append({"role": "system", "content": "You are a helpful assistant."})
199
+ if "user" in template_info["supported_roles"]:
200
+ sample_messages.append({"role": "user", "content": "Hello!"})
201
+ if "assistant" in template_info["supported_roles"]:
202
+ sample_messages.append({"role": "assistant", "content": "Hi there!"})
203
+
204
+ try:
205
+ template_info["preview"] = tokenizer.apply_chat_template(
206
+ sample_messages,
207
+ tokenize=False,
208
+ add_generation_prompt=False
209
+ )
210
+ except Exception as e:
211
+ template_info["preview"] = f"Preview error: {e}"
212
+
213
+ return template_info
214
+
215
+
216
+ def get_tokenizer_features(tokenizer):
217
+ """
218
+ tokenizerの機能情報を取得する
219
+
220
+ Returns:
221
+ dict: features情報
222
+ """
223
+ features = {
224
+ "apply_chat_template": hasattr(tokenizer, 'apply_chat_template'),
225
+ "vocab_size": tokenizer.vocab_size,
226
+ "model_max_length": getattr(tokenizer, 'model_max_length', None)
227
+ }
228
+
229
+ # チャットテンプレート情報を追加
230
+ chat_template_info = get_chat_template_info(tokenizer)
231
+ if chat_template_info:
232
+ features["chat_template"] = chat_template_info
233
+
234
+ return features
235
+
236
+
237
+ def get_capabilities(tokenizer):
238
+ """
239
+ tokenizerの全機能情報を取得する(capabilities API用)
240
+
241
+ Returns:
242
+ dict: capabilities情報
243
+ """
244
+ # 基本メソッド
245
+ methods = ["capabilities", "completion", "format_test"]
246
+
247
+ # apply_chat_templateがある場合はchatメソッドを追加
248
+ if hasattr(tokenizer, 'apply_chat_template'):
249
+ methods.append("chat")
250
+
251
+ capabilities = {
252
+ "methods": methods,
253
+ "special_tokens": get_special_tokens(tokenizer),
254
+ "features": get_tokenizer_features(tokenizer)
255
+ }
256
+
257
+ # チャット制約を検出して追加
258
+ chat_restrictions = detect_chat_restrictions(tokenizer)
259
+ if chat_restrictions:
260
+ capabilities["chat_restrictions"] = chat_restrictions
261
+
262
+ return capabilities