@llm-translate/cli 1.0.0-next.1
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/.dockerignore +51 -0
- package/.env.example +33 -0
- package/.github/workflows/docs-pages.yml +57 -0
- package/.github/workflows/release.yml +49 -0
- package/.translaterc.json +44 -0
- package/CLAUDE.md +243 -0
- package/Dockerfile +55 -0
- package/README.md +371 -0
- package/RFC.md +1595 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +4494 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +1152 -0
- package/dist/index.js +3841 -0
- package/dist/index.js.map +1 -0
- package/docker-compose.yml +56 -0
- package/docs/.vitepress/config.ts +161 -0
- package/docs/api/agent.md +262 -0
- package/docs/api/engine.md +274 -0
- package/docs/api/index.md +171 -0
- package/docs/api/providers.md +304 -0
- package/docs/changelog.md +64 -0
- package/docs/cli/dir.md +243 -0
- package/docs/cli/file.md +213 -0
- package/docs/cli/glossary.md +273 -0
- package/docs/cli/index.md +129 -0
- package/docs/cli/init.md +158 -0
- package/docs/cli/serve.md +211 -0
- package/docs/glossary.json +235 -0
- package/docs/guide/chunking.md +272 -0
- package/docs/guide/configuration.md +139 -0
- package/docs/guide/cost-optimization.md +237 -0
- package/docs/guide/docker.md +371 -0
- package/docs/guide/getting-started.md +150 -0
- package/docs/guide/glossary.md +241 -0
- package/docs/guide/index.md +86 -0
- package/docs/guide/ollama.md +515 -0
- package/docs/guide/prompt-caching.md +221 -0
- package/docs/guide/providers.md +232 -0
- package/docs/guide/quality-control.md +206 -0
- package/docs/guide/vitepress-integration.md +265 -0
- package/docs/index.md +63 -0
- package/docs/ja/api/agent.md +262 -0
- package/docs/ja/api/engine.md +274 -0
- package/docs/ja/api/index.md +171 -0
- package/docs/ja/api/providers.md +304 -0
- package/docs/ja/changelog.md +64 -0
- package/docs/ja/cli/dir.md +243 -0
- package/docs/ja/cli/file.md +213 -0
- package/docs/ja/cli/glossary.md +273 -0
- package/docs/ja/cli/index.md +111 -0
- package/docs/ja/cli/init.md +158 -0
- package/docs/ja/guide/chunking.md +271 -0
- package/docs/ja/guide/configuration.md +139 -0
- package/docs/ja/guide/cost-optimization.md +30 -0
- package/docs/ja/guide/getting-started.md +150 -0
- package/docs/ja/guide/glossary.md +214 -0
- package/docs/ja/guide/index.md +32 -0
- package/docs/ja/guide/ollama.md +410 -0
- package/docs/ja/guide/prompt-caching.md +221 -0
- package/docs/ja/guide/providers.md +232 -0
- package/docs/ja/guide/quality-control.md +137 -0
- package/docs/ja/guide/vitepress-integration.md +265 -0
- package/docs/ja/index.md +58 -0
- package/docs/ko/api/agent.md +262 -0
- package/docs/ko/api/engine.md +274 -0
- package/docs/ko/api/index.md +171 -0
- package/docs/ko/api/providers.md +304 -0
- package/docs/ko/changelog.md +64 -0
- package/docs/ko/cli/dir.md +243 -0
- package/docs/ko/cli/file.md +213 -0
- package/docs/ko/cli/glossary.md +273 -0
- package/docs/ko/cli/index.md +111 -0
- package/docs/ko/cli/init.md +158 -0
- package/docs/ko/guide/chunking.md +271 -0
- package/docs/ko/guide/configuration.md +139 -0
- package/docs/ko/guide/cost-optimization.md +30 -0
- package/docs/ko/guide/getting-started.md +150 -0
- package/docs/ko/guide/glossary.md +214 -0
- package/docs/ko/guide/index.md +32 -0
- package/docs/ko/guide/ollama.md +410 -0
- package/docs/ko/guide/prompt-caching.md +221 -0
- package/docs/ko/guide/providers.md +232 -0
- package/docs/ko/guide/quality-control.md +137 -0
- package/docs/ko/guide/vitepress-integration.md +265 -0
- package/docs/ko/index.md +58 -0
- package/docs/zh/api/agent.md +262 -0
- package/docs/zh/api/engine.md +274 -0
- package/docs/zh/api/index.md +171 -0
- package/docs/zh/api/providers.md +304 -0
- package/docs/zh/changelog.md +64 -0
- package/docs/zh/cli/dir.md +243 -0
- package/docs/zh/cli/file.md +213 -0
- package/docs/zh/cli/glossary.md +273 -0
- package/docs/zh/cli/index.md +111 -0
- package/docs/zh/cli/init.md +158 -0
- package/docs/zh/guide/chunking.md +271 -0
- package/docs/zh/guide/configuration.md +139 -0
- package/docs/zh/guide/cost-optimization.md +30 -0
- package/docs/zh/guide/getting-started.md +150 -0
- package/docs/zh/guide/glossary.md +214 -0
- package/docs/zh/guide/index.md +32 -0
- package/docs/zh/guide/ollama.md +410 -0
- package/docs/zh/guide/prompt-caching.md +221 -0
- package/docs/zh/guide/providers.md +232 -0
- package/docs/zh/guide/quality-control.md +137 -0
- package/docs/zh/guide/vitepress-integration.md +265 -0
- package/docs/zh/index.md +58 -0
- package/package.json +91 -0
- package/release.config.mjs +15 -0
- package/schemas/glossary.schema.json +110 -0
- package/src/cli/commands/dir.ts +469 -0
- package/src/cli/commands/file.ts +291 -0
- package/src/cli/commands/glossary.ts +221 -0
- package/src/cli/commands/init.ts +68 -0
- package/src/cli/commands/serve.ts +60 -0
- package/src/cli/index.ts +64 -0
- package/src/cli/options.ts +59 -0
- package/src/core/agent.ts +1119 -0
- package/src/core/chunker.ts +391 -0
- package/src/core/engine.ts +634 -0
- package/src/errors.ts +188 -0
- package/src/index.ts +147 -0
- package/src/integrations/vitepress.ts +549 -0
- package/src/parsers/markdown.ts +383 -0
- package/src/providers/claude.ts +259 -0
- package/src/providers/interface.ts +109 -0
- package/src/providers/ollama.ts +379 -0
- package/src/providers/openai.ts +308 -0
- package/src/providers/registry.ts +153 -0
- package/src/server/index.ts +152 -0
- package/src/server/middleware/auth.ts +93 -0
- package/src/server/middleware/logger.ts +90 -0
- package/src/server/routes/health.ts +84 -0
- package/src/server/routes/translate.ts +210 -0
- package/src/server/types.ts +138 -0
- package/src/services/cache.ts +899 -0
- package/src/services/config.ts +217 -0
- package/src/services/glossary.ts +247 -0
- package/src/types/analysis.ts +164 -0
- package/src/types/index.ts +265 -0
- package/src/types/modes.ts +121 -0
- package/src/types/mqm.ts +157 -0
- package/src/utils/logger.ts +141 -0
- package/src/utils/tokens.ts +116 -0
- package/tests/fixtures/glossaries/ml-glossary.json +53 -0
- package/tests/fixtures/input/lynq-installation.ko.md +350 -0
- package/tests/fixtures/input/lynq-installation.md +350 -0
- package/tests/fixtures/input/simple.ko.md +27 -0
- package/tests/fixtures/input/simple.md +27 -0
- package/tests/unit/chunker.test.ts +229 -0
- package/tests/unit/glossary.test.ts +146 -0
- package/tests/unit/markdown.test.ts +205 -0
- package/tests/unit/tokens.test.ts +81 -0
- package/tsconfig.json +28 -0
- package/tsup.config.ts +34 -0
- package/vitest.config.ts +16 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# API リファレンス
|
|
2
|
+
|
|
3
|
+
::: info 翻訳について
|
|
4
|
+
英語以外のドキュメントはすべてClaude Sonnet 4を使用して自動翻訳されています。
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translateはNode.jsアプリケーションでプログラム的に使用できます。
|
|
8
|
+
|
|
9
|
+
## インストール
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @llm-translate/cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## クイックスタート
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { TranslationEngine, createClaudeProvider } from '@llm-translate/cli';
|
|
19
|
+
|
|
20
|
+
// Create provider
|
|
21
|
+
const provider = createClaudeProvider({
|
|
22
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Create engine
|
|
26
|
+
const engine = new TranslationEngine({
|
|
27
|
+
provider,
|
|
28
|
+
qualityThreshold: 85,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Translate
|
|
32
|
+
const result = await engine.translateFile({
|
|
33
|
+
input: 'README.md',
|
|
34
|
+
output: 'README.ko.md',
|
|
35
|
+
sourceLang: 'en',
|
|
36
|
+
targetLang: 'ko',
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
console.log(result.metadata);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## コアクラス
|
|
43
|
+
|
|
44
|
+
### [TranslationEngine](./engine)
|
|
45
|
+
|
|
46
|
+
翻訳操作のメインエントリーポイントです。
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
const engine = new TranslationEngine(options);
|
|
50
|
+
await engine.translateFile({ input, output, targetLang });
|
|
51
|
+
await engine.translateContent(content, options);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### [TranslationAgent](./agent)
|
|
55
|
+
|
|
56
|
+
Self-Refineループを持つ低レベル翻訳エージェントです。
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
const agent = new TranslationAgent({ provider, qualityThreshold });
|
|
60
|
+
const result = await agent.translate(request);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### [Providers](./providers)
|
|
64
|
+
|
|
65
|
+
LLMプロバイダーの実装です。
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import {
|
|
69
|
+
createClaudeProvider,
|
|
70
|
+
createOpenAIProvider,
|
|
71
|
+
createOllamaProvider,
|
|
72
|
+
} from '@llm-translate/cli';
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 型エクスポート
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import type {
|
|
79
|
+
// Configuration
|
|
80
|
+
TranslationConfig,
|
|
81
|
+
ProviderConfig,
|
|
82
|
+
|
|
83
|
+
// Requests/Results
|
|
84
|
+
TranslationRequest,
|
|
85
|
+
TranslationResult,
|
|
86
|
+
|
|
87
|
+
// Glossary
|
|
88
|
+
Glossary,
|
|
89
|
+
GlossaryTerm,
|
|
90
|
+
ResolvedGlossary,
|
|
91
|
+
|
|
92
|
+
// Quality
|
|
93
|
+
QualityEvaluation,
|
|
94
|
+
|
|
95
|
+
// Provider
|
|
96
|
+
LLMProvider,
|
|
97
|
+
ChatMessage,
|
|
98
|
+
ChatResponse,
|
|
99
|
+
} from '@llm-translate/cli';
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## ユーティリティ関数
|
|
103
|
+
|
|
104
|
+
### Chunking
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
import { chunkContent, chunkMarkdown } from '@llm-translate/cli';
|
|
108
|
+
|
|
109
|
+
const chunks = chunkContent(text, { maxTokens: 1024 });
|
|
110
|
+
const mdChunks = chunkMarkdown(markdown, { maxTokens: 1024 });
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 用語集
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { loadGlossary, resolveGlossary, createGlossaryLookup } from '@llm-translate/cli';
|
|
117
|
+
|
|
118
|
+
const glossary = await loadGlossary('./glossary.json');
|
|
119
|
+
const resolved = resolveGlossary(glossary, 'ko');
|
|
120
|
+
const lookup = createGlossaryLookup(resolved);
|
|
121
|
+
|
|
122
|
+
const terms = lookup.findAll(sourceText);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### トークン推定
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import { estimateTokens, calculateTokenBudget } from '@llm-translate/cli';
|
|
129
|
+
|
|
130
|
+
const tokens = estimateTokens(text);
|
|
131
|
+
const budget = calculateTokenBudget(text, { glossaryTokens: 500 });
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## エラーハンドリング
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import { TranslationError, ErrorCode } from '@llm-translate/cli';
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
await engine.translateFile(options);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
if (error instanceof TranslationError) {
|
|
143
|
+
switch (error.code) {
|
|
144
|
+
case ErrorCode.FILE_NOT_FOUND:
|
|
145
|
+
// Handle missing file
|
|
146
|
+
break;
|
|
147
|
+
case ErrorCode.QUALITY_THRESHOLD_NOT_MET:
|
|
148
|
+
// Handle quality issue
|
|
149
|
+
console.log('Score:', error.details.score);
|
|
150
|
+
break;
|
|
151
|
+
case ErrorCode.PROVIDER_RATE_LIMITED:
|
|
152
|
+
// Handle rate limit
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## エラーコード
|
|
160
|
+
|
|
161
|
+
| コード | 説明 |
|
|
162
|
+
|------|-------------|
|
|
163
|
+
|`FILE_NOT_FOUND`| 入力ファイルが存在しません |
|
|
164
|
+
|`INVALID_CONFIG`| 設定の検証に失敗しました |
|
|
165
|
+
|`GLOSSARY_NOT_FOUND`| 用語集ファイルが見つかりません |
|
|
166
|
+
|`GLOSSARY_INVALID`| 用語集の検証に失敗しました |
|
|
167
|
+
|`PROVIDER_AUTH_FAILED`| APIキーが無効です |
|
|
168
|
+
|`PROVIDER_RATE_LIMITED`| レート制限を超過しました |
|
|
169
|
+
|`PROVIDER_ERROR`| 一般的なプロバイダーエラーです |
|
|
170
|
+
|`QUALITY_THRESHOLD_NOT_MET`| 翻訳品質が品質しきい値を下回りました |
|
|
171
|
+
|`PARSE_ERROR`| ドキュメントの解析に失敗しました |
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# プロバイダー
|
|
2
|
+
|
|
3
|
+
::: info 翻訳について
|
|
4
|
+
英語以外のドキュメントはすべてClaude Sonnet 4を使用して自動翻訳されています。
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
異なるAIサービス向けのLLMプロバイダー実装です。
|
|
8
|
+
|
|
9
|
+
## 概要
|
|
10
|
+
|
|
11
|
+
すべてのプロバイダーは `LLMProvider` インターフェースを実装しています:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
interface LLMProvider {
|
|
15
|
+
readonly name: ProviderName;
|
|
16
|
+
readonly defaultModel: string;
|
|
17
|
+
|
|
18
|
+
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
19
|
+
stream(request: ChatRequest): AsyncIterable<string>;
|
|
20
|
+
countTokens(text: string): number;
|
|
21
|
+
getModelInfo(model?: string): ModelInfo;
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Claudeプロバイダー
|
|
26
|
+
|
|
27
|
+
推奨プロバイダーで、プロンプトキャッシングを完全にサポートしています。
|
|
28
|
+
|
|
29
|
+
### セットアップ
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { createClaudeProvider } from '@llm-translate/cli';
|
|
33
|
+
|
|
34
|
+
const provider = createClaudeProvider({
|
|
35
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
36
|
+
defaultModel: 'claude-haiku-4-5-20251001',
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 設定
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
interface ClaudeProviderConfig {
|
|
44
|
+
apiKey?: string; // Defaults to ANTHROPIC_API_KEY env
|
|
45
|
+
baseUrl?: string; // Custom API endpoint
|
|
46
|
+
defaultModel?: string; // Default: claude-haiku-4-5-20251001
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 利用可能なモデル
|
|
51
|
+
|
|
52
|
+
| モデル | コンテキスト | 入力コスト | 出力コスト |
|
|
53
|
+
|-------|---------|------------|-------------|
|
|
54
|
+
|`claude-haiku-4-5-20251001`| 200K | $0.001/1K | $0.005/1K |
|
|
55
|
+
|`claude-sonnet-4-5-20250929`| 200K | $0.003/1K | $0.015/1K |
|
|
56
|
+
|`claude-opus-4-5-20251101`| 200K | $0.015/1K | $0.075/1K |
|
|
57
|
+
|
|
58
|
+
### プロンプトキャッシング
|
|
59
|
+
|
|
60
|
+
Claudeプロバイダーはプロンプトキャッシングを自動的にサポートします:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
const response = await provider.chat({
|
|
64
|
+
messages: [
|
|
65
|
+
{
|
|
66
|
+
role: 'user',
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: 'System instructions...',
|
|
71
|
+
cacheControl: { type: 'ephemeral' }, // Cache this
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: 'User content...', // Don't cache
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
console.log(response.usage);
|
|
83
|
+
// {
|
|
84
|
+
// inputTokens: 100,
|
|
85
|
+
// outputTokens: 200,
|
|
86
|
+
// cacheReadTokens: 500, // Tokens read from cache
|
|
87
|
+
// cacheWriteTokens: 0, // Tokens written to cache
|
|
88
|
+
// }
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## OpenAIプロバイダー
|
|
92
|
+
|
|
93
|
+
### セットアップ
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { createOpenAIProvider } from '@llm-translate/cli';
|
|
97
|
+
|
|
98
|
+
const provider = createOpenAIProvider({
|
|
99
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
100
|
+
defaultModel: 'gpt-4o-mini',
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 設定
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
interface OpenAIProviderConfig {
|
|
108
|
+
apiKey?: string; // Defaults to OPENAI_API_KEY env
|
|
109
|
+
baseUrl?: string; // Custom API endpoint
|
|
110
|
+
defaultModel?: string; // Default: gpt-4o-mini
|
|
111
|
+
organization?: string; // OpenAI organization ID
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 利用可能なモデル
|
|
116
|
+
|
|
117
|
+
| モデル | コンテキスト | 入力コスト | 出力コスト |
|
|
118
|
+
|-------|---------|------------|-------------|
|
|
119
|
+
|`gpt-4o-mini`| 128K | $0.00015/1K | $0.0006/1K |
|
|
120
|
+
|`gpt-4o`| 128K | $0.0025/1K | $0.01/1K |
|
|
121
|
+
|`gpt-4-turbo`| 128K | $0.01/1K | $0.03/1K |
|
|
122
|
+
|
|
123
|
+
### 自動キャッシング
|
|
124
|
+
|
|
125
|
+
OpenAIは1024トークンを超えるプロンプトに対して自動的にキャッシングを処理します。
|
|
126
|
+
|
|
127
|
+
## Ollamaプロバイダー
|
|
128
|
+
|
|
129
|
+
ローカルでセルフホストされたモデル用です。
|
|
130
|
+
|
|
131
|
+
### セットアップ
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import { createOllamaProvider } from '@llm-translate/cli';
|
|
135
|
+
|
|
136
|
+
const provider = createOllamaProvider({
|
|
137
|
+
baseUrl: 'http://localhost:11434',
|
|
138
|
+
defaultModel: 'llama3.1',
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 設定
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
interface OllamaProviderConfig {
|
|
146
|
+
baseUrl?: string; // Default: http://localhost:11434
|
|
147
|
+
defaultModel?: string; // Default: llama3.1
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 利用可能なモデル
|
|
152
|
+
|
|
153
|
+
Ollamaインストールで利用可能な任意のモデル:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# List available models
|
|
157
|
+
ollama list
|
|
158
|
+
|
|
159
|
+
# Pull a model
|
|
160
|
+
ollama pull llama3.1
|
|
161
|
+
ollama pull mistral
|
|
162
|
+
ollama pull codellama
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 制限事項
|
|
166
|
+
|
|
167
|
+
- プロンプトキャッシングサポートなし
|
|
168
|
+
- モデルによって品質が異なる
|
|
169
|
+
- 限定的なコンテキストウィンドウ(モデル依存)
|
|
170
|
+
|
|
171
|
+
## プロバイダーインターフェース
|
|
172
|
+
|
|
173
|
+
### ChatRequest
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
interface ChatRequest {
|
|
177
|
+
messages: ChatMessage[];
|
|
178
|
+
model?: string;
|
|
179
|
+
temperature?: number; // Default: 0.3
|
|
180
|
+
maxTokens?: number; // Default: 4096
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
interface ChatMessage {
|
|
184
|
+
role: 'system' | 'user' | 'assistant';
|
|
185
|
+
content: string | CacheableTextPart[];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
interface CacheableTextPart {
|
|
189
|
+
type: 'text';
|
|
190
|
+
text: string;
|
|
191
|
+
cacheControl?: { type: 'ephemeral' };
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### ChatResponse
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
interface ChatResponse {
|
|
199
|
+
content: string;
|
|
200
|
+
usage: {
|
|
201
|
+
inputTokens: number;
|
|
202
|
+
outputTokens: number;
|
|
203
|
+
cacheReadTokens?: number;
|
|
204
|
+
cacheWriteTokens?: number;
|
|
205
|
+
};
|
|
206
|
+
model: string;
|
|
207
|
+
finishReason: 'stop' | 'length' | 'error';
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### ModelInfo
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
interface ModelInfo {
|
|
215
|
+
maxContextTokens: number;
|
|
216
|
+
supportsStreaming: boolean;
|
|
217
|
+
costPer1kInput?: number;
|
|
218
|
+
costPer1kOutput?: number;
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## カスタムプロバイダー
|
|
223
|
+
|
|
224
|
+
独自のプロバイダーを実装します:
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
import type { LLMProvider, ChatRequest, ChatResponse } from '@llm-translate/cli';
|
|
228
|
+
|
|
229
|
+
class CustomProvider implements LLMProvider {
|
|
230
|
+
readonly name = 'custom' as const;
|
|
231
|
+
readonly defaultModel = 'custom-model';
|
|
232
|
+
|
|
233
|
+
async chat(request: ChatRequest): Promise<ChatResponse> {
|
|
234
|
+
// Your implementation
|
|
235
|
+
const response = await callYourAPI(request);
|
|
236
|
+
|
|
237
|
+
return {
|
|
238
|
+
content: response.text,
|
|
239
|
+
usage: {
|
|
240
|
+
inputTokens: response.promptTokens,
|
|
241
|
+
outputTokens: response.completionTokens,
|
|
242
|
+
},
|
|
243
|
+
model: request.model ?? this.defaultModel,
|
|
244
|
+
finishReason: 'stop',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async *stream(request: ChatRequest): AsyncIterable<string> {
|
|
249
|
+
// Streaming implementation
|
|
250
|
+
for await (const chunk of streamYourAPI(request)) {
|
|
251
|
+
yield chunk.text;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
countTokens(text: string): number {
|
|
256
|
+
// Token estimation
|
|
257
|
+
return Math.ceil(text.length / 4);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
getModelInfo(model?: string): ModelInfo {
|
|
261
|
+
return {
|
|
262
|
+
maxContextTokens: 100000,
|
|
263
|
+
supportsStreaming: true,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## プロバイダー選択ガイド
|
|
270
|
+
|
|
271
|
+
| 用途 | 推奨プロバイダー | モデル |
|
|
272
|
+
|----------|---------------------|-------|
|
|
273
|
+
| コスト効率 | Claude | Haiku 4.5 |
|
|
274
|
+
| 高品質 | Claude | Sonnet 4.5 |
|
|
275
|
+
| OpenAIエコシステム | OpenAI | GPT-4o |
|
|
276
|
+
| 予算制約 | OpenAI | GPT-4o-mini |
|
|
277
|
+
| プライバシー/オフライン | Ollama | Llama 3.1 |
|
|
278
|
+
| エンタープライズ | Claude/OpenAI | 様々 |
|
|
279
|
+
|
|
280
|
+
## エラーハンドリング
|
|
281
|
+
|
|
282
|
+
すべてのプロバイダーは `TranslationError` をスローします:
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
import { TranslationError, ErrorCode } from '@llm-translate/cli';
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
await provider.chat(request);
|
|
289
|
+
} catch (error) {
|
|
290
|
+
if (error instanceof TranslationError) {
|
|
291
|
+
switch (error.code) {
|
|
292
|
+
case ErrorCode.PROVIDER_AUTH_FAILED:
|
|
293
|
+
console.error('Invalid API key');
|
|
294
|
+
break;
|
|
295
|
+
case ErrorCode.PROVIDER_RATE_LIMITED:
|
|
296
|
+
console.error('Rate limited, retry later');
|
|
297
|
+
break;
|
|
298
|
+
case ErrorCode.PROVIDER_ERROR:
|
|
299
|
+
console.error('Provider error:', error.message);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 変更履歴
|
|
2
|
+
|
|
3
|
+
::: info 翻訳について
|
|
4
|
+
英語以外のすべてのドキュメントは、Claude Sonnet 4を使用して自動翻訳されています。
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translateのすべての重要な変更は、このファイルに記録されます。
|
|
8
|
+
|
|
9
|
+
形式は[Keep a Changelog](https://keepachangelog.com/en/1.0.0/)に基づいており、
|
|
10
|
+
このプロジェクトは[Semantic Versioning](https://semver.org/spec/v2.0.0.html)に準拠しています。
|
|
11
|
+
|
|
12
|
+
## [未リリース]
|
|
13
|
+
|
|
14
|
+
### 追加
|
|
15
|
+
|
|
16
|
+
- Claudeモデルのプロンプトキャッシングサポート(40-50%のコスト削減)
|
|
17
|
+
- 翻訳結果でのキャッシュトークン使用量追跡
|
|
18
|
+
- TranslationAgentの `enableCaching` オプション
|
|
19
|
+
- トークン使用量メタデータの `cacheRead` および `cacheWrite` フィールド
|
|
20
|
+
- MQM(多次元品質メトリクス)ベースの品質評価システム
|
|
21
|
+
- MAPSスタイルの翻訳前分析ステップ
|
|
22
|
+
- 翻訳モードサポート(`--mode fast|balanced|quality`)
|
|
23
|
+
|
|
24
|
+
### 変更
|
|
25
|
+
|
|
26
|
+
-`ChatMessage.content` がキャッシュ可能なテキスト部分をサポート
|
|
27
|
+
-`ChatResponse.usage` にキャッシュトークンメトリクスを含む
|
|
28
|
+
- デフォルトモデルを `claude-haiku-4-5-20251001` に更新
|
|
29
|
+
|
|
30
|
+
### ドキュメント
|
|
31
|
+
|
|
32
|
+
- Ollamaの品質警告を追加:信頼性の高い翻訳には14B+モデルが必要
|
|
33
|
+
|
|
34
|
+
## [0.1.0] - 2025-12-12
|
|
35
|
+
|
|
36
|
+
### 追加
|
|
37
|
+
|
|
38
|
+
- 初回リリース
|
|
39
|
+
- 単一ファイル翻訳(`llm-translate file`)
|
|
40
|
+
- ディレクトリ一括翻訳(`llm-translate dir`)
|
|
41
|
+
- 設定初期化(`llm-translate init`)
|
|
42
|
+
- 用語集管理(`llm-translate glossary`)
|
|
43
|
+
- Claude、OpenAI、Ollamaプロバイダーサポート
|
|
44
|
+
- Self-Refine品質制御ループ
|
|
45
|
+
- Markdown ASTベースのChunking
|
|
46
|
+
- 用語集の強制適用
|
|
47
|
+
- 品質しきい値設定
|
|
48
|
+
- 詳細出力モード
|
|
49
|
+
|
|
50
|
+
### プロバイダー
|
|
51
|
+
|
|
52
|
+
- Claude(claude-haiku-4-5、claude-sonnet-4-5、claude-opus-4-5)
|
|
53
|
+
- OpenAI(gpt-4o-mini、gpt-4o、gpt-4-turbo)
|
|
54
|
+
- Ollama(任意のローカルモデル)
|
|
55
|
+
|
|
56
|
+
### ドキュメント
|
|
57
|
+
|
|
58
|
+
- CLIリファレンスドキュメント
|
|
59
|
+
- APIリファレンスドキュメント
|
|
60
|
+
- 入門ガイド
|
|
61
|
+
- 設定ガイド
|
|
62
|
+
- 用語集ガイド
|
|
63
|
+
- 品質制御ガイド
|
|
64
|
+
- コスト最適化ガイド
|