@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,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
|
+
## [Unreleased]
|
|
13
|
+
|
|
14
|
+
### 추가됨
|
|
15
|
+
|
|
16
|
+
- Claude 모델에 대한 프롬프트 캐싱 지원 (40-50% 비용 절감)
|
|
17
|
+
- 번역 결과에서 캐시 토큰 사용량 추적
|
|
18
|
+
- TranslationAgent의 `enableCaching` 옵션
|
|
19
|
+
- 토큰 사용량 메타데이터의 `cacheRead` 및 `cacheWrite` 필드
|
|
20
|
+
- MQM (Multidimensional Quality Metrics) 기반 품질 평가 시스템
|
|
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
|
+
- 비용 최적화 가이드
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# llm-translate dir
|
|
2
|
+
|
|
3
|
+
::: info 번역
|
|
4
|
+
모든 비영어 문서는 Claude Sonnet 4를 사용하여 자동으로 번역됩니다.
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
디렉토리의 모든 파일을 번역합니다.
|
|
8
|
+
|
|
9
|
+
## 개요
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
llm-translate dir <input> <output> [options]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 인수
|
|
16
|
+
|
|
17
|
+
| 인수 | 설명 |
|
|
18
|
+
|----------|-------------|
|
|
19
|
+
|`<input>`| 입력 디렉토리 경로 (필수) |
|
|
20
|
+
|`<output>`| 출력 디렉토리 경로 (필수) |
|
|
21
|
+
|
|
22
|
+
## 옵션
|
|
23
|
+
|
|
24
|
+
### 언어 옵션
|
|
25
|
+
|
|
26
|
+
| 옵션 | 기본값 | 설명 |
|
|
27
|
+
|--------|---------|-------------|
|
|
28
|
+
|`-s, --source-lang <lang>`| 설정 기본값 | 소스 언어 코드 |
|
|
29
|
+
|`-t, --target-lang <lang>`| 필수 | 대상 언어 코드 |
|
|
30
|
+
|
|
31
|
+
### 번역 옵션
|
|
32
|
+
|
|
33
|
+
| 옵션 | 기본값 | 설명 |
|
|
34
|
+
|--------|---------|-------------|
|
|
35
|
+
|`-g, --glossary <path>`| 없음 | 용어집 파일 경로 |
|
|
36
|
+
|`-p, --provider <name>`|` claude`| LLM 제공자 (claude\|openai\|ollama) |
|
|
37
|
+
|`-m, --model <name>`| 제공자 기본값 | 모델 이름 |
|
|
38
|
+
|`--context <text>`| 없음 | 번역을 위한 추가 컨텍스트 |
|
|
39
|
+
|
|
40
|
+
### 품질 옵션
|
|
41
|
+
|
|
42
|
+
| 옵션 | 기본값 | 설명 |
|
|
43
|
+
|--------|---------|-------------|
|
|
44
|
+
|`--quality <0-100>`| 85 | 품질 임계값 |
|
|
45
|
+
|`--max-iterations <n>`| 4 | 최대 개선 반복 횟수 |
|
|
46
|
+
|
|
47
|
+
### 파일 선택
|
|
48
|
+
|
|
49
|
+
| 옵션 | 기본값 | 설명 |
|
|
50
|
+
|--------|---------|-------------|
|
|
51
|
+
|`--include <patterns>`|`*.md,*.markdown`| 포함할 파일 패턴 (쉼표로 구분) |
|
|
52
|
+
|`--exclude <patterns>`| 없음 | 제외할 파일 패턴 (쉼표로 구분) |
|
|
53
|
+
|
|
54
|
+
### 처리 옵션
|
|
55
|
+
|
|
56
|
+
| 옵션 | 기본값 | 설명 |
|
|
57
|
+
|--------|---------|-------------|
|
|
58
|
+
|`--parallel <n>`| 3 | 병렬 파일 처리 |
|
|
59
|
+
|`--chunk-size <tokens>`| 1024 | 청크당 최대 토큰 수 |
|
|
60
|
+
|`--no-cache`| false | 번역 캐시 비활성화 |
|
|
61
|
+
|
|
62
|
+
### 출력 옵션
|
|
63
|
+
|
|
64
|
+
| 옵션 | 기본값 | 설명 |
|
|
65
|
+
|--------|---------|-------------|
|
|
66
|
+
|`-f, --format <fmt>`| auto | 출력 형식 강제 지정 (md\|html\|txt) |
|
|
67
|
+
|`--dry-run`| false | 번역될 내용 미리보기 |
|
|
68
|
+
|`--json`| false | 결과를 JSON으로 출력 |
|
|
69
|
+
|`-v, --verbose`| false | 상세 로깅 활성화 |
|
|
70
|
+
|`-q, --quiet`| false | 오류가 아닌 출력 억제 |
|
|
71
|
+
|
|
72
|
+
## 예제
|
|
73
|
+
|
|
74
|
+
### 기본 사용법
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Translate all markdown files
|
|
78
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko
|
|
79
|
+
|
|
80
|
+
# With glossary
|
|
81
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko -g glossary.json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 파일 선택
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Custom include pattern
|
|
88
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --include "**/*.md"
|
|
89
|
+
|
|
90
|
+
# Multiple patterns
|
|
91
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --include "*.md,*.markdown,*.mdx"
|
|
92
|
+
|
|
93
|
+
# Exclude certain directories
|
|
94
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko \
|
|
95
|
+
--exclude "node_modules/**,dist/**,drafts/**"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 병렬 처리
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Process 5 files in parallel
|
|
102
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --parallel 5
|
|
103
|
+
|
|
104
|
+
# Sequential processing (for rate-limited APIs)
|
|
105
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --parallel 1
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 품질 설정
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# High quality for important docs
|
|
112
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --quality 95 --max-iterations 6
|
|
113
|
+
|
|
114
|
+
# Faster processing with lower threshold
|
|
115
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --quality 70 --max-iterations 2
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 미리보기 모드
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Show what would be translated
|
|
122
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --dry-run
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
출력:
|
|
126
|
+
```
|
|
127
|
+
Dry run mode - no translation will be performed
|
|
128
|
+
|
|
129
|
+
Files to translate:
|
|
130
|
+
getting-started.md → docs-ko/getting-started.md
|
|
131
|
+
guide/setup.md → docs-ko/guide/setup.md
|
|
132
|
+
api/reference.md → docs-ko/api/reference.md
|
|
133
|
+
|
|
134
|
+
Total: 3 file(s)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## 출력 구조
|
|
138
|
+
|
|
139
|
+
디렉토리 구조는 기본적으로 보존됩니다:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
Input: Output:
|
|
143
|
+
docs/ docs-ko/
|
|
144
|
+
├── getting-started.md ├── getting-started.md
|
|
145
|
+
├── guide/ ├── guide/
|
|
146
|
+
│ ├── setup.md │ ├── setup.md
|
|
147
|
+
│ └── advanced.md │ └── advanced.md
|
|
148
|
+
└── api/ └── api/
|
|
149
|
+
└── reference.md └── reference.md
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 진행 상황 보고
|
|
153
|
+
|
|
154
|
+
### 일반 모드
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
ℹ Found 5 file(s) to translate
|
|
158
|
+
ℹ Input: ./docs
|
|
159
|
+
ℹ Output: ./docs-ko
|
|
160
|
+
ℹ Target language: ko
|
|
161
|
+
ℹ Parallel processing: 3 file(s) at a time
|
|
162
|
+
[1/5] getting-started.md ✓
|
|
163
|
+
[2/5] guide/setup.md ✓
|
|
164
|
+
[3/5] guide/advanced.md ✓
|
|
165
|
+
[4/5] api/reference.md ✓
|
|
166
|
+
[5/5] api/types.md ✓
|
|
167
|
+
|
|
168
|
+
────────────────────────────────────────────────────────
|
|
169
|
+
Translation Summary
|
|
170
|
+
────────────────────────────────────────────────────────
|
|
171
|
+
Files: 5 succeeded, 0 failed
|
|
172
|
+
Duration: 45.2s
|
|
173
|
+
Tokens: 12,450 input / 8,320 output
|
|
174
|
+
Cache: 5,200 read / 2,100 write
|
|
175
|
+
────────────────────────────────────────────────────────
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### JSON 출력
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
llm-translate dir ./docs ./docs-ko -t ko --json
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"success": true,
|
|
187
|
+
"totalFiles": 5,
|
|
188
|
+
"successCount": 5,
|
|
189
|
+
"failCount": 0,
|
|
190
|
+
"totalDuration": 45234,
|
|
191
|
+
"tokensUsed": {
|
|
192
|
+
"input": 12450,
|
|
193
|
+
"output": 8320,
|
|
194
|
+
"cacheRead": 5200,
|
|
195
|
+
"cacheWrite": 2100
|
|
196
|
+
},
|
|
197
|
+
"files": [...]
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## 모범 사례
|
|
202
|
+
|
|
203
|
+
### 1. 먼저 미리보기
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko --dry-run
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 2. 적절한 병렬 처리 사용
|
|
210
|
+
|
|
211
|
+
- 속도 제한이 있는 API:`--parallel 1-2`
|
|
212
|
+
- 높은 제한:`--parallel 5-10`
|
|
213
|
+
- 로컬 (Ollama):`--parallel 1`(모델 제한)
|
|
214
|
+
|
|
215
|
+
### 3. 대규모 프로젝트 처리
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
# Split by subdirectory for better control
|
|
219
|
+
llm-translate dir ./docs/guide ./docs-ko/guide -s en -t ko
|
|
220
|
+
llm-translate dir ./docs/api ./docs-ko/api -s en -t ko
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 4. 캐싱 활용
|
|
224
|
+
|
|
225
|
+
캐시를 사용하면 변경되지 않은 콘텐츠를 건너뛸 수 있습니다:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
# First run: translates all
|
|
229
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko
|
|
230
|
+
|
|
231
|
+
# Second run: uses cache for unchanged content
|
|
232
|
+
llm-translate dir ./docs ./docs-ko -s en -t ko
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 5. 콘텐츠 유형별 품질
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# High quality for user-facing docs
|
|
239
|
+
llm-translate dir ./docs/public ./docs-ko/public -s en -t ko --quality 95
|
|
240
|
+
|
|
241
|
+
# Standard quality for internal docs
|
|
242
|
+
llm-translate dir ./docs/internal ./docs-ko/internal -s en -t ko --quality 80
|
|
243
|
+
```
|