@modular-prompt/driver 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +597 -0
- package/dist/anthropic/anthropic-driver.d.ts +47 -0
- package/dist/anthropic/anthropic-driver.d.ts.map +1 -0
- package/dist/anthropic/anthropic-driver.js +217 -0
- package/dist/anthropic/anthropic-driver.js.map +1 -0
- package/dist/driver-registry/ai-service.d.ts +43 -0
- package/dist/driver-registry/ai-service.d.ts.map +1 -0
- package/dist/driver-registry/ai-service.js +77 -0
- package/dist/driver-registry/ai-service.js.map +1 -0
- package/dist/driver-registry/config-based-factory.d.ts +64 -0
- package/dist/driver-registry/config-based-factory.d.ts.map +1 -0
- package/dist/driver-registry/config-based-factory.js +90 -0
- package/dist/driver-registry/config-based-factory.js.map +1 -0
- package/dist/driver-registry/factory-helper.d.ts +49 -0
- package/dist/driver-registry/factory-helper.d.ts.map +1 -0
- package/dist/driver-registry/factory-helper.js +109 -0
- package/dist/driver-registry/factory-helper.js.map +1 -0
- package/dist/driver-registry/index.d.ts +9 -0
- package/dist/driver-registry/index.d.ts.map +1 -0
- package/dist/driver-registry/index.js +8 -0
- package/dist/driver-registry/index.js.map +1 -0
- package/dist/driver-registry/registry.d.ts +50 -0
- package/dist/driver-registry/registry.d.ts.map +1 -0
- package/dist/driver-registry/registry.js +208 -0
- package/dist/driver-registry/registry.js.map +1 -0
- package/dist/driver-registry/types.d.ts +108 -0
- package/dist/driver-registry/types.d.ts.map +1 -0
- package/dist/driver-registry/types.js +6 -0
- package/dist/driver-registry/types.js.map +1 -0
- package/dist/echo-driver.d.ts +88 -0
- package/dist/echo-driver.d.ts.map +1 -0
- package/dist/echo-driver.js +198 -0
- package/dist/echo-driver.js.map +1 -0
- package/dist/formatter/completion-formatter.d.ts +27 -0
- package/dist/formatter/completion-formatter.d.ts.map +1 -0
- package/dist/formatter/completion-formatter.js +84 -0
- package/dist/formatter/completion-formatter.js.map +1 -0
- package/dist/formatter/converter.d.ts +20 -0
- package/dist/formatter/converter.d.ts.map +1 -0
- package/dist/formatter/converter.js +176 -0
- package/dist/formatter/converter.js.map +1 -0
- package/dist/formatter/element-formatters/base.d.ts +34 -0
- package/dist/formatter/element-formatters/base.d.ts.map +1 -0
- package/dist/formatter/element-formatters/base.js +36 -0
- package/dist/formatter/element-formatters/base.js.map +1 -0
- package/dist/formatter/element-formatters/chunk.d.ts +11 -0
- package/dist/formatter/element-formatters/chunk.d.ts.map +1 -0
- package/dist/formatter/element-formatters/chunk.js +12 -0
- package/dist/formatter/element-formatters/chunk.js.map +1 -0
- package/dist/formatter/element-formatters/index.d.ts +14 -0
- package/dist/formatter/element-formatters/index.d.ts.map +1 -0
- package/dist/formatter/element-formatters/index.js +15 -0
- package/dist/formatter/element-formatters/index.js.map +1 -0
- package/dist/formatter/element-formatters/json.d.ts +11 -0
- package/dist/formatter/element-formatters/json.d.ts.map +1 -0
- package/dist/formatter/element-formatters/json.js +27 -0
- package/dist/formatter/element-formatters/json.js.map +1 -0
- package/dist/formatter/element-formatters/material.d.ts +11 -0
- package/dist/formatter/element-formatters/material.d.ts.map +1 -0
- package/dist/formatter/element-formatters/material.js +35 -0
- package/dist/formatter/element-formatters/material.js.map +1 -0
- package/dist/formatter/element-formatters/message.d.ts +13 -0
- package/dist/formatter/element-formatters/message.d.ts.map +1 -0
- package/dist/formatter/element-formatters/message.js +35 -0
- package/dist/formatter/element-formatters/message.js.map +1 -0
- package/dist/formatter/element-formatters/registry.d.ts +29 -0
- package/dist/formatter/element-formatters/registry.d.ts.map +1 -0
- package/dist/formatter/element-formatters/registry.js +82 -0
- package/dist/formatter/element-formatters/registry.js.map +1 -0
- package/dist/formatter/element-formatters/section.d.ts +18 -0
- package/dist/formatter/element-formatters/section.d.ts.map +1 -0
- package/dist/formatter/element-formatters/section.js +46 -0
- package/dist/formatter/element-formatters/section.js.map +1 -0
- package/dist/formatter/element-formatters/string-pattern.d.ts +22 -0
- package/dist/formatter/element-formatters/string-pattern.d.ts.map +1 -0
- package/dist/formatter/element-formatters/string-pattern.js +124 -0
- package/dist/formatter/element-formatters/string-pattern.js.map +1 -0
- package/dist/formatter/element-formatters/text.d.ts +11 -0
- package/dist/formatter/element-formatters/text.d.ts.map +1 -0
- package/dist/formatter/element-formatters/text.js +11 -0
- package/dist/formatter/element-formatters/text.js.map +1 -0
- package/dist/formatter/formatter.d.ts +24 -0
- package/dist/formatter/formatter.d.ts.map +1 -0
- package/dist/formatter/formatter.js +252 -0
- package/dist/formatter/formatter.js.map +1 -0
- package/dist/formatter/types.d.ts +91 -0
- package/dist/formatter/types.d.ts.map +1 -0
- package/dist/formatter/types.js +2 -0
- package/dist/formatter/types.js.map +1 -0
- package/dist/google-genai/google-genai-driver.d.ts +67 -0
- package/dist/google-genai/google-genai-driver.d.ts.map +1 -0
- package/dist/google-genai/google-genai-driver.js +351 -0
- package/dist/google-genai/google-genai-driver.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/mlx-ml/mlx-driver.d.ts +65 -0
- package/dist/mlx-ml/mlx-driver.d.ts.map +1 -0
- package/dist/mlx-ml/mlx-driver.js +235 -0
- package/dist/mlx-ml/mlx-driver.js.map +1 -0
- package/dist/mlx-ml/model-spec/index.d.ts +7 -0
- package/dist/mlx-ml/model-spec/index.d.ts.map +1 -0
- package/dist/mlx-ml/model-spec/index.js +7 -0
- package/dist/mlx-ml/model-spec/index.js.map +1 -0
- package/dist/mlx-ml/model-spec/types.d.ts +30 -0
- package/dist/mlx-ml/model-spec/types.d.ts.map +1 -0
- package/dist/mlx-ml/model-spec/types.js +7 -0
- package/dist/mlx-ml/model-spec/types.js.map +1 -0
- package/dist/mlx-ml/process/index.d.ts +33 -0
- package/dist/mlx-ml/process/index.d.ts.map +1 -0
- package/dist/mlx-ml/process/index.js +65 -0
- package/dist/mlx-ml/process/index.js.map +1 -0
- package/dist/mlx-ml/process/model-handlers.d.ts +58 -0
- package/dist/mlx-ml/process/model-handlers.d.ts.map +1 -0
- package/dist/mlx-ml/process/model-handlers.js +197 -0
- package/dist/mlx-ml/process/model-handlers.js.map +1 -0
- package/dist/mlx-ml/process/model-specific.d.ts +35 -0
- package/dist/mlx-ml/process/model-specific.d.ts.map +1 -0
- package/dist/mlx-ml/process/model-specific.js +35 -0
- package/dist/mlx-ml/process/model-specific.js.map +1 -0
- package/dist/mlx-ml/process/parameter-mapper.d.ts +17 -0
- package/dist/mlx-ml/process/parameter-mapper.d.ts.map +1 -0
- package/dist/mlx-ml/process/parameter-mapper.js +91 -0
- package/dist/mlx-ml/process/parameter-mapper.js.map +1 -0
- package/dist/mlx-ml/process/parameter-validator.d.ts +55 -0
- package/dist/mlx-ml/process/parameter-validator.d.ts.map +1 -0
- package/dist/mlx-ml/process/parameter-validator.js +203 -0
- package/dist/mlx-ml/process/parameter-validator.js.map +1 -0
- package/dist/mlx-ml/process/process-communication.d.ts +25 -0
- package/dist/mlx-ml/process/process-communication.d.ts.map +1 -0
- package/dist/mlx-ml/process/process-communication.js +117 -0
- package/dist/mlx-ml/process/process-communication.js.map +1 -0
- package/dist/mlx-ml/process/queue.d.ts +30 -0
- package/dist/mlx-ml/process/queue.d.ts.map +1 -0
- package/dist/mlx-ml/process/queue.js +147 -0
- package/dist/mlx-ml/process/queue.js.map +1 -0
- package/dist/mlx-ml/process/types.d.ts +97 -0
- package/dist/mlx-ml/process/types.d.ts.map +1 -0
- package/dist/mlx-ml/process/types.js +2 -0
- package/dist/mlx-ml/process/types.js.map +1 -0
- package/dist/mlx-ml/types.d.ts +66 -0
- package/dist/mlx-ml/types.d.ts.map +1 -0
- package/dist/mlx-ml/types.js +7 -0
- package/dist/mlx-ml/types.js.map +1 -0
- package/dist/ollama/ollama-driver.d.ts +15 -0
- package/dist/ollama/ollama-driver.d.ts.map +1 -0
- package/dist/ollama/ollama-driver.js +15 -0
- package/dist/ollama/ollama-driver.js.map +1 -0
- package/dist/openai/openai-driver.d.ts +71 -0
- package/dist/openai/openai-driver.d.ts.map +1 -0
- package/dist/openai/openai-driver.js +230 -0
- package/dist/openai/openai-driver.js.map +1 -0
- package/dist/test-driver.d.ts +78 -0
- package/dist/test-driver.d.ts.map +1 -0
- package/dist/test-driver.js +193 -0
- package/dist/test-driver.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vertexai/vertexai-driver.d.ts +63 -0
- package/dist/vertexai/vertexai-driver.d.ts.map +1 -0
- package/dist/vertexai/vertexai-driver.js +335 -0
- package/dist/vertexai/vertexai-driver.js.map +1 -0
- package/package.json +61 -0
- package/scripts/download-model.js +40 -0
- package/scripts/setup-mlx.js +53 -0
- package/src/mlx-ml/python/.python-version +1 -0
- package/src/mlx-ml/python/__main__.py +312 -0
- package/src/mlx-ml/python/chat_template_constraints.py +164 -0
- package/src/mlx-ml/python/pyproject.toml +19 -0
- package/src/mlx-ml/python/token_utils.py +262 -0
- package/src/mlx-ml/python/uv.lock +1029 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 otolab
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
# @modular-prompt/driver
|
|
2
|
+
|
|
3
|
+
AIモデルドライバーパッケージ - 様々なAIプロバイダーとの統一されたインターフェースを提供
|
|
4
|
+
|
|
5
|
+
## 概要
|
|
6
|
+
|
|
7
|
+
`@modular-prompt/driver`は、OpenAI、Anthropic、Google Vertex AI、Ollama、MLX MLなど、複数のAIプロバイダーとの統合を提供するドライバーパッケージです。統一されたインターフェースにより、プロバイダーを簡単に切り替えることができます。
|
|
8
|
+
|
|
9
|
+
## インストール
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @modular-prompt/driver
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 基本的な使い方
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { compile } from '@modular-prompt/core';
|
|
19
|
+
import { OpenAIDriver } from '@modular-prompt/driver';
|
|
20
|
+
|
|
21
|
+
// ドライバーの初期化
|
|
22
|
+
const driver = new OpenAIDriver({
|
|
23
|
+
apiKey: 'your-api-key',
|
|
24
|
+
model: 'gpt-4o-mini'
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// プロンプトモジュールをコンパイル
|
|
28
|
+
const prompt = compile(myModule, context);
|
|
29
|
+
|
|
30
|
+
// AIモデルにクエリ
|
|
31
|
+
const result = await driver.query(prompt, {
|
|
32
|
+
temperature: 0.7,
|
|
33
|
+
maxTokens: 1000
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
console.log(result.content);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 利用可能なドライバー
|
|
40
|
+
|
|
41
|
+
### OpenAI
|
|
42
|
+
|
|
43
|
+
OpenAI APIと互換性のあるサービス用のドライバー。
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
import { OpenAIDriver } from '@modular-prompt/driver';
|
|
47
|
+
|
|
48
|
+
const driver = new OpenAIDriver({
|
|
49
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
50
|
+
model: 'gpt-4o-mini', // デフォルト: 'gpt-4o-mini'
|
|
51
|
+
baseURL: 'https://api.openai.com/v1', // カスタムエンドポイント可
|
|
52
|
+
defaultOptions: {
|
|
53
|
+
temperature: 0.7,
|
|
54
|
+
maxTokens: 2000
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**主なオプション:**
|
|
60
|
+
- `temperature`: 生成のランダム性 (0-2)
|
|
61
|
+
- `maxTokens`: 最大トークン数
|
|
62
|
+
- `topP`: トップPサンプリング
|
|
63
|
+
|
|
64
|
+
### Anthropic
|
|
65
|
+
|
|
66
|
+
Claude APIのドライバー。
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { AnthropicDriver } from '@modular-prompt/driver';
|
|
70
|
+
|
|
71
|
+
const driver = new AnthropicDriver({
|
|
72
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
73
|
+
model: 'claude-3-5-sonnet-20241022', // デフォルト
|
|
74
|
+
defaultOptions: {
|
|
75
|
+
maxTokens: 4096,
|
|
76
|
+
temperature: 0.7
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**主なオプション:**
|
|
82
|
+
- `maxTokens`: 最大トークン数(デフォルト: 4096)
|
|
83
|
+
- `temperature`: 生成のランダム性 (0-1)
|
|
84
|
+
- `topP`: トップPサンプリング
|
|
85
|
+
|
|
86
|
+
### Google Vertex AI (Gemini)
|
|
87
|
+
|
|
88
|
+
Google Cloud Vertex AI経由でGeminiモデルを使用。
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { VertexAIDriver } from '@modular-prompt/driver';
|
|
92
|
+
|
|
93
|
+
const driver = new VertexAIDriver({
|
|
94
|
+
project: 'your-gcp-project', // または環境変数 GOOGLE_CLOUD_PROJECT
|
|
95
|
+
location: 'us-central1', // デフォルト: 'us-central1'
|
|
96
|
+
model: 'gemini-2.0-flash-001', // デフォルト
|
|
97
|
+
temperature: 0.05, // デフォルト: 0.05
|
|
98
|
+
defaultOptions: {
|
|
99
|
+
maxTokens: 1000,
|
|
100
|
+
topP: 0.95,
|
|
101
|
+
topK: 40
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**主なオプション:**
|
|
107
|
+
- `maxTokens`: 最大出力トークン数
|
|
108
|
+
- `temperature`: 生成のランダム性
|
|
109
|
+
- `topP`: トップPサンプリング
|
|
110
|
+
|
|
111
|
+
**必要な設定:**
|
|
112
|
+
- Google Cloud プロジェクトID(環境変数: `GOOGLE_CLOUD_PROJECT`)
|
|
113
|
+
- Google Cloud 認証(ADCまたはサービスアカウント)
|
|
114
|
+
|
|
115
|
+
### Google Gen AI (Gemini)
|
|
116
|
+
|
|
117
|
+
GoogleGenAI SDKを使用してGeminiモデルに直接アクセス。APIキーのみで簡単に利用可能。
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
import { GoogleGenAIDriver } from '@modular-prompt/driver';
|
|
121
|
+
|
|
122
|
+
const driver = new GoogleGenAIDriver({
|
|
123
|
+
apiKey: process.env.GOOGLE_GENAI_API_KEY,
|
|
124
|
+
model: 'gemini-2.0-flash-exp', // デフォルト
|
|
125
|
+
temperature: 0.7, // デフォルト
|
|
126
|
+
defaultOptions: {
|
|
127
|
+
maxTokens: 2048,
|
|
128
|
+
topP: 0.95,
|
|
129
|
+
topK: 40
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**主なオプション:**
|
|
135
|
+
- `maxTokens`: 最大出力トークン数
|
|
136
|
+
- `temperature`: 生成のランダム性
|
|
137
|
+
- `topP`: トップPサンプリング
|
|
138
|
+
- `topK`: トップKサンプリング
|
|
139
|
+
- `thinkingConfig`: 思考レベル設定(HIGH/MEDIUM/LOW)
|
|
140
|
+
|
|
141
|
+
**必要な設定:**
|
|
142
|
+
- Google Gen AI APIキー(環境変数: `GOOGLE_GENAI_API_KEY`)
|
|
143
|
+
- APIキーは[Google AI Studio](https://aistudio.google.com/apikey)で取得可能
|
|
144
|
+
|
|
145
|
+
### Ollama
|
|
146
|
+
|
|
147
|
+
ローカルで実行されるOllamaサービス用のドライバー。
|
|
148
|
+
|
|
149
|
+
詳細なセットアップ手順とモデルのダウンロード方法については、[ローカルモデルセットアップガイド](../../docs/LOCAL_MODEL_SETUP.md#ollama)を参照してください。
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { OllamaDriver } from '@modular-prompt/driver';
|
|
153
|
+
|
|
154
|
+
const driver = new OllamaDriver({
|
|
155
|
+
baseURL: 'http://localhost:11434/v1', // デフォルト
|
|
156
|
+
model: 'llama3.2' // デフォルト
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Ollamaドライバーは内部的にOpenAIドライバーを使用します(OllamaがOpenAI互換APIを提供するため)。
|
|
161
|
+
|
|
162
|
+
### MLX ML
|
|
163
|
+
|
|
164
|
+
Appleシリコン最適化モデル用のPythonベースのドライバー。
|
|
165
|
+
|
|
166
|
+
詳細なセットアップ手順とモデルのダウンロード方法については、[ローカルモデルセットアップガイド](../../docs/LOCAL_MODEL_SETUP.md#mlx-apple-silicon)を参照してください。
|
|
167
|
+
|
|
168
|
+
#### セットアップ
|
|
169
|
+
|
|
170
|
+
MLXドライバーは初回インストール時に自動的にPython環境をセットアップします:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
npm install @modular-prompt/driver
|
|
174
|
+
# postinstallスクリプトが自動的にPython環境をセットアップ
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
手動セットアップが必要な場合:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
cd node_modules/@modular-prompt/driver
|
|
181
|
+
npm run setup-mlx
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**前提条件:**
|
|
185
|
+
- Python 3.11以上
|
|
186
|
+
- Apple Silicon Mac (M1/M2/M3)
|
|
187
|
+
- uv(Pythonパッケージマネージャー、自動インストールされます)
|
|
188
|
+
|
|
189
|
+
#### 使用方法
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
import { MlxDriver } from '@modular-prompt/driver';
|
|
193
|
+
|
|
194
|
+
const driver = new MlxDriver({
|
|
195
|
+
model: 'mlx-community/gemma-3-2b',
|
|
196
|
+
defaultOptions: {
|
|
197
|
+
max_tokens: 500,
|
|
198
|
+
temperature: 0.7,
|
|
199
|
+
top_p: 0.95,
|
|
200
|
+
repetition_penalty: 1.1
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// 使用後はプロセスを終了
|
|
205
|
+
await driver.close();
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**主なオプション:**
|
|
209
|
+
- `max_tokens`: 最大トークン数
|
|
210
|
+
- `temperature`: 生成のランダム性
|
|
211
|
+
- `top_p`: トップPサンプリング
|
|
212
|
+
|
|
213
|
+
**モデルのダウンロード:**
|
|
214
|
+
|
|
215
|
+
テスト用モデル(約270MB)を事前にダウンロードできます:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
cd node_modules/@modular-prompt/driver
|
|
219
|
+
npm run download-model
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**注意事項:**
|
|
223
|
+
- Pythonサブプロセスを使用するため、Python環境とMLXのインストールが必要
|
|
224
|
+
- 使用後は必ず`close()`を呼び出してプロセスを終了
|
|
225
|
+
- 初回実行時にモデルのダウンロードが発生する場合があります
|
|
226
|
+
|
|
227
|
+
#### 低レベルAPI(MlxProcess)
|
|
228
|
+
|
|
229
|
+
`MlxDriver`を経由せず、直接MLXプロセスとやり取りする低レベルAPIも公開されています。これは以下のような場合に便利です:
|
|
230
|
+
|
|
231
|
+
- `CompiledPrompt`を経由せずに、生のメッセージやプロンプトを直接送信したい
|
|
232
|
+
- モデル固有の処理を完全にコントロールしたい
|
|
233
|
+
- デバッグや検証のために低レベルAPIを使用したい
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
import { MlxProcess, type MlxMessage } from '@modular-prompt/driver';
|
|
237
|
+
|
|
238
|
+
// 低レベルプロセスを直接使用
|
|
239
|
+
const process = new MlxProcess('mlx-community/gemma-3-27b-it-qat-4bit');
|
|
240
|
+
|
|
241
|
+
// Chat API - 生のメッセージを送信
|
|
242
|
+
const messages: MlxMessage[] = [
|
|
243
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
244
|
+
{ role: 'user', content: 'Hello!' }
|
|
245
|
+
];
|
|
246
|
+
const chatStream = await process.chat(messages);
|
|
247
|
+
|
|
248
|
+
// Completion API - 生のプロンプトを送信
|
|
249
|
+
const completionStream = await process.completion('Write a story about...');
|
|
250
|
+
|
|
251
|
+
// モデル情報取得
|
|
252
|
+
const capabilities = await process.getCapabilities();
|
|
253
|
+
console.log('Available methods:', capabilities.methods);
|
|
254
|
+
console.log('Has chat template:', capabilities.features.apply_chat_template);
|
|
255
|
+
|
|
256
|
+
// フォーマットテスト(チャットテンプレートの動作確認)
|
|
257
|
+
const formatTest = await process.formatTest(messages);
|
|
258
|
+
console.log('Formatted prompt:', formatTest.result);
|
|
259
|
+
|
|
260
|
+
// 終了
|
|
261
|
+
process.exit();
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**公開API:**
|
|
265
|
+
- `MlxProcess` クラス
|
|
266
|
+
- `MlxMessage` 型
|
|
267
|
+
|
|
268
|
+
**MlxProcess メソッド:**
|
|
269
|
+
- `chat(messages, primer?, options?)`: Chat APIを使用してストリーム生成
|
|
270
|
+
- `completion(prompt, options?)`: Completion APIを使用してストリーム生成
|
|
271
|
+
- `getCapabilities()`: モデルの機能情報を取得
|
|
272
|
+
- `formatTest(messages, options?)`: チャットテンプレートのフォーマット結果をテスト
|
|
273
|
+
- `exit()`: プロセスを終了
|
|
274
|
+
|
|
275
|
+
**注意:**
|
|
276
|
+
- `MlxProcess`は`MlxDriver`よりも低レベルなAPIです
|
|
277
|
+
- モデル固有の前処理(メッセージマージ、プロンプトフォーマットなど)は**ユーザーの責任**となります
|
|
278
|
+
- `MlxDriver`は内部的に`MlxProcess`を使用し、適切な前処理を自動的に行います
|
|
279
|
+
- 通常の用途では`MlxDriver`の使用を推奨します
|
|
280
|
+
- その他の型(`MlxMlModelOptions`など)が必要な場合は型推論を利用してください
|
|
281
|
+
|
|
282
|
+
### テストドライバー
|
|
283
|
+
|
|
284
|
+
開発とテスト用のモックドライバー。
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
import { TestDriver } from '@modular-prompt/driver';
|
|
288
|
+
|
|
289
|
+
const driver = new TestDriver({
|
|
290
|
+
responses: [
|
|
291
|
+
'First response',
|
|
292
|
+
'Second response',
|
|
293
|
+
'Third response'
|
|
294
|
+
],
|
|
295
|
+
responseDelay: 100, // ミリ秒
|
|
296
|
+
streamChunkDelay: 10
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// カスタムレスポンスプロバイダー
|
|
300
|
+
const driver2 = new TestDriver({
|
|
301
|
+
responseProvider: async (prompt, options) => {
|
|
302
|
+
// プロンプトに基づいてレスポンスを生成
|
|
303
|
+
return `Response to: ${prompt.instructions[0].content}`;
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## ストリーミング
|
|
309
|
+
|
|
310
|
+
全てのドライバーはストリーミングレスポンスをサポートしています:
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
const prompt = compile(myModule, context);
|
|
314
|
+
|
|
315
|
+
// ストリーミングレスポンス
|
|
316
|
+
const { stream, result } = await driver.streamQuery(prompt);
|
|
317
|
+
for await (const chunk of stream) {
|
|
318
|
+
process.stdout.write(chunk);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// 最終結果を取得
|
|
322
|
+
const finalResult = await result;
|
|
323
|
+
console.log('\nUsage:', finalResult.usage);
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## カスタムドライバーの作成
|
|
327
|
+
|
|
328
|
+
独自のドライバーを作成するには、`AIDriver`インターフェースを実装します:
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
import type { AIDriver, CompiledPrompt, QueryOptions, QueryResult, StreamResult } from '@modular-prompt/driver';
|
|
332
|
+
|
|
333
|
+
export class CustomDriver implements AIDriver {
|
|
334
|
+
private apiKey: string;
|
|
335
|
+
private model: string;
|
|
336
|
+
|
|
337
|
+
constructor(config: CustomConfig) {
|
|
338
|
+
this.apiKey = config.apiKey;
|
|
339
|
+
this.model = config.model;
|
|
340
|
+
// その他の初期化コード
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async query(prompt: CompiledPrompt, options?: QueryOptions): Promise<QueryResult> {
|
|
344
|
+
// プロンプトをAPIリクエストに変換
|
|
345
|
+
const response = await yourAPI.complete({
|
|
346
|
+
prompt: prompt,
|
|
347
|
+
temperature: options?.temperature,
|
|
348
|
+
maxTokens: options?.maxTokens
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
return {
|
|
352
|
+
content: response.text,
|
|
353
|
+
finishReason: 'stop',
|
|
354
|
+
usage: {
|
|
355
|
+
promptTokens: response.inputTokens,
|
|
356
|
+
completionTokens: response.outputTokens,
|
|
357
|
+
totalTokens: response.totalTokens
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
async streamQuery(prompt: CompiledPrompt, options?: QueryOptions): Promise<StreamResult> {
|
|
363
|
+
const stream = await yourAPI.stream(prompt, options);
|
|
364
|
+
|
|
365
|
+
// ストリーミングレスポンスを処理
|
|
366
|
+
const chunks: string[] = [];
|
|
367
|
+
const asyncIterable = {
|
|
368
|
+
async *[Symbol.asyncIterator]() {
|
|
369
|
+
for await (const chunk of stream) {
|
|
370
|
+
chunks.push(chunk.text);
|
|
371
|
+
yield chunk.text;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
return {
|
|
377
|
+
stream: asyncIterable,
|
|
378
|
+
result: Promise.resolve({
|
|
379
|
+
content: chunks.join(''),
|
|
380
|
+
finishReason: 'stop'
|
|
381
|
+
})
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
async close(): Promise<void> {
|
|
386
|
+
// リソースのクリーンアップ
|
|
387
|
+
await yourAPI.disconnect();
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## フォーマッター設定
|
|
393
|
+
|
|
394
|
+
ドライバーはプロンプトのフォーマット方法をカスタマイズできます。FormatterOptionsを使用して、マーカー、プリアンブル、セクション説明などをカスタマイズします:
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
import type { FormatterOptions } from '@modular-prompt/driver';
|
|
398
|
+
|
|
399
|
+
export class CustomDriver implements AIDriver {
|
|
400
|
+
private formatterOptions: FormatterOptions;
|
|
401
|
+
|
|
402
|
+
constructor(config: CustomConfig) {
|
|
403
|
+
// フォーマッターオプションの設定
|
|
404
|
+
this.formatterOptions = {
|
|
405
|
+
preamble: 'Custom instructions for the AI',
|
|
406
|
+
sectionDescriptions: {
|
|
407
|
+
instructions: 'Follow these instructions carefully',
|
|
408
|
+
data: 'Process this data',
|
|
409
|
+
output: 'Generate output here'
|
|
410
|
+
},
|
|
411
|
+
lineBreak: '\n',
|
|
412
|
+
// 必要に応じて他のオプションも設定
|
|
413
|
+
...config.formatterOptions
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
async query(prompt: CompiledPrompt, options?: QueryOptions): Promise<QueryResult> {
|
|
418
|
+
// フォーマッターを使用してプロンプトを変換
|
|
419
|
+
const formattedPrompt = formatCompletionPrompt(prompt, this.formatterOptions);
|
|
420
|
+
// または
|
|
421
|
+
const messages = formatPromptAsMessages(prompt, this.formatterOptions);
|
|
422
|
+
|
|
423
|
+
// APIに送信...
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
## 型定義
|
|
429
|
+
|
|
430
|
+
### AIDriver インターフェース
|
|
431
|
+
|
|
432
|
+
```typescript
|
|
433
|
+
interface AIDriver {
|
|
434
|
+
// プロンプトをクエリ
|
|
435
|
+
query(prompt: CompiledPrompt, options?: QueryOptions): Promise<QueryResult>;
|
|
436
|
+
|
|
437
|
+
// ストリーミングクエリ
|
|
438
|
+
streamQuery(prompt: CompiledPrompt, options?: QueryOptions): Promise<StreamResult>;
|
|
439
|
+
|
|
440
|
+
// リソースのクリーンアップ
|
|
441
|
+
close(): Promise<void>;
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### QueryResult
|
|
446
|
+
|
|
447
|
+
```typescript
|
|
448
|
+
interface QueryResult {
|
|
449
|
+
content: string;
|
|
450
|
+
finishReason?: 'stop' | 'length' | 'error';
|
|
451
|
+
usage?: {
|
|
452
|
+
promptTokens: number;
|
|
453
|
+
completionTokens: number;
|
|
454
|
+
totalTokens: number;
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### QueryOptions
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
interface QueryOptions {
|
|
463
|
+
temperature?: number;
|
|
464
|
+
maxTokens?: number;
|
|
465
|
+
topP?: number;
|
|
466
|
+
stream?: boolean;
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### StreamResult
|
|
471
|
+
|
|
472
|
+
```typescript
|
|
473
|
+
interface StreamResult {
|
|
474
|
+
stream: AsyncIterable<string>; // ストリームチャンク
|
|
475
|
+
result: Promise<QueryResult>; // 最終結果
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
## エラーハンドリング
|
|
480
|
+
|
|
481
|
+
全てのドライバーは統一されたエラーハンドリングを提供します:
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
try {
|
|
485
|
+
const result = await driver.query(prompt);
|
|
486
|
+
|
|
487
|
+
if (result.finishReason === 'error') {
|
|
488
|
+
console.error('Query failed');
|
|
489
|
+
} else if (result.finishReason === 'length') {
|
|
490
|
+
console.warn('Response was truncated due to length limit');
|
|
491
|
+
}
|
|
492
|
+
} catch (error) {
|
|
493
|
+
// ネットワークエラーや初期化エラー
|
|
494
|
+
console.error('Driver error:', error);
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
## 環境変数
|
|
499
|
+
|
|
500
|
+
多くのドライバーは環境変数から設定を読み取ることができます:
|
|
501
|
+
|
|
502
|
+
- `OPENAI_API_KEY`: OpenAI APIキー
|
|
503
|
+
- `ANTHROPIC_API_KEY`: Anthropic APIキー
|
|
504
|
+
- `GOOGLE_CLOUD_PROJECT`: Google Cloud プロジェクトID
|
|
505
|
+
- `GOOGLE_CLOUD_REGION`: Google Cloud リージョン
|
|
506
|
+
- `ANTHROPIC_VERTEX_PROJECT_ID`: Vertex AI経由でClaudeを使用する場合のプロジェクトID
|
|
507
|
+
- `CLOUD_ML_REGION`: Cloud ML リージョン
|
|
508
|
+
|
|
509
|
+
## ベストプラクティス
|
|
510
|
+
|
|
511
|
+
1. **APIキーの管理**: APIキーは環境変数に保存し、コードにハードコーディングしない
|
|
512
|
+
2. **エラーハンドリング**: `finishReason`を確認してエラーを適切に処理
|
|
513
|
+
3. **リソース管理**: MLXドライバーなどリソースを使用するドライバーは使用後に`close()`を呼び出す
|
|
514
|
+
4. **レート制限**: API制限を考慮して適切なリトライロジックを実装
|
|
515
|
+
5. **コスト管理**: `usage`情報を監視してAPIコストを追跡
|
|
516
|
+
|
|
517
|
+
## 例
|
|
518
|
+
|
|
519
|
+
### 複数のプロバイダーを切り替える
|
|
520
|
+
|
|
521
|
+
```typescript
|
|
522
|
+
import { OpenAIDriver, AnthropicDriver, VertexAIDriver } from '@modular-prompt/driver';
|
|
523
|
+
|
|
524
|
+
function createDriver(provider: string) {
|
|
525
|
+
switch (provider) {
|
|
526
|
+
case 'openai':
|
|
527
|
+
return new OpenAIDriver({ model: 'gpt-4o' });
|
|
528
|
+
case 'anthropic':
|
|
529
|
+
return new AnthropicDriver({ model: 'claude-3-5-sonnet-20241022' });
|
|
530
|
+
case 'vertexai':
|
|
531
|
+
return new VertexAIDriver({ model: 'gemini-2.0-flash-001' });
|
|
532
|
+
default:
|
|
533
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
const driver = createDriver(process.env.AI_PROVIDER || 'openai');
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### ストリーミングとプログレス表示
|
|
541
|
+
|
|
542
|
+
```typescript
|
|
543
|
+
async function streamWithProgress(driver: AIDriver, prompt: CompiledPrompt) {
|
|
544
|
+
let totalChars = 0;
|
|
545
|
+
|
|
546
|
+
console.log('Generating response...');
|
|
547
|
+
|
|
548
|
+
const { stream, result } = await driver.streamQuery(prompt);
|
|
549
|
+
for await (const chunk of stream) {
|
|
550
|
+
process.stdout.write(chunk);
|
|
551
|
+
totalChars += chunk.length;
|
|
552
|
+
|
|
553
|
+
// プログレス情報を別の行に表示
|
|
554
|
+
process.stderr.write(`\r[${totalChars} characters generated]`);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
const finalResult = await result;
|
|
558
|
+
console.log(`\nComplete! (${finalResult.usage?.totalTokens} tokens)`);
|
|
559
|
+
}
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### リトライロジック
|
|
563
|
+
|
|
564
|
+
```typescript
|
|
565
|
+
async function queryWithRetry(
|
|
566
|
+
driver: AIDriver,
|
|
567
|
+
prompt: CompiledPrompt,
|
|
568
|
+
maxRetries = 3
|
|
569
|
+
): Promise<QueryResult> {
|
|
570
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
571
|
+
try {
|
|
572
|
+
const result = await driver.query(prompt);
|
|
573
|
+
|
|
574
|
+
if (result.finishReason !== 'error') {
|
|
575
|
+
return result;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
console.warn(`Attempt ${i + 1} failed, retrying...`);
|
|
579
|
+
await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
|
|
580
|
+
} catch (error) {
|
|
581
|
+
if (i === maxRetries - 1) throw error;
|
|
582
|
+
console.warn(`Attempt ${i + 1} threw error, retrying...`);
|
|
583
|
+
await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
throw new Error('Max retries exceeded');
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
## ライセンス
|
|
592
|
+
|
|
593
|
+
MIT
|
|
594
|
+
|
|
595
|
+
## 貢献
|
|
596
|
+
|
|
597
|
+
プルリクエストを歓迎します。大きな変更の場合は、まずissueを開いて変更内容を議論してください。
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { CompiledPrompt } from '@modular-prompt/core';
|
|
2
|
+
import type { AIDriver, QueryOptions, QueryResult, StreamResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Anthropic driver configuration
|
|
5
|
+
*/
|
|
6
|
+
export interface AnthropicDriverConfig {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
defaultOptions?: Partial<AnthropicQueryOptions>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Anthropic-specific query options
|
|
13
|
+
*/
|
|
14
|
+
export interface AnthropicQueryOptions extends QueryOptions {
|
|
15
|
+
model?: string;
|
|
16
|
+
maxTokens?: number;
|
|
17
|
+
temperature?: number;
|
|
18
|
+
topP?: number;
|
|
19
|
+
topK?: number;
|
|
20
|
+
stopSequences?: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Anthropic API driver
|
|
24
|
+
*/
|
|
25
|
+
export declare class AnthropicDriver implements AIDriver {
|
|
26
|
+
private client;
|
|
27
|
+
private defaultModel;
|
|
28
|
+
private defaultOptions;
|
|
29
|
+
constructor(config?: AnthropicDriverConfig);
|
|
30
|
+
/**
|
|
31
|
+
* Convert CompiledPrompt to Anthropic messages
|
|
32
|
+
*/
|
|
33
|
+
private compiledPromptToAnthropic;
|
|
34
|
+
/**
|
|
35
|
+
* Query the AI model
|
|
36
|
+
*/
|
|
37
|
+
query(prompt: CompiledPrompt, options?: QueryOptions): Promise<QueryResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Stream query implementation
|
|
40
|
+
*/
|
|
41
|
+
streamQuery(prompt: CompiledPrompt, options?: QueryOptions): Promise<StreamResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Close the client
|
|
44
|
+
*/
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=anthropic-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-driver.d.ts","sourceRoot":"","sources":["../../src/anthropic/anthropic-driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,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,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAiC;gBAE3C,MAAM,GAAE,qBAA0B;IAS9C;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAuGjC;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAMjF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IA6FxF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|