カスタムメソッドをAPIとして提供する
champollionの**apiメソッド**を使うと、任意の翻訳ペアを外部のHTTPエンドポイントに向けることができます。単一のLLMプロンプトでは対応できない複雑なパイプライン——形態素解析器、有限状態トランスデューサー(FST)、マルチステップLLMチェーン、あるいは独自に構築した研究手法——を統合する際に活用できます。
APIサービスを使う理由
翻訳パイプラインの中には、単純なプロンプト・レスポンスのサイクルでは実行できないものがあります:
| パイプラインのステップ | 例 |
|---|---|
| 形態素分解 | 翻訳前に多合成語を形態素に分割する |
| FST検証 | 音韻規則または形態規則に違反する出力を除外する |
| マルチステップLLMチェーン | 異なるモデルを使った生成→検証→修正のサイクル |
| 辞書参照 | パイプラインの途中でキュレーション済みの対訳辞書を照合する |
| ヒューマン・イン・ザ・ループ | 不確かな翻訳を専門家によるレビューのためにキューに入れる |
apiメソッドはパイプラインをブラックボックスとして扱います——champollionがソース文字列を送信し、サービスが翻訳を返します。内部で何が行われるかは完全にあなた次第です。
アーキテクチャ
サービスのセットアップ
APIサービスは、JSONを受け取って返す単一のエンドポイントを実装する必要があります。
リクエストの形式
champollionは次のJSONボディを送信します(api.jsを参照):
POST /translate
Content-Type: application/json
Authorization: Bearer <CHAMPOLLION_API_KEY>
{
"source_locale": "en",
"target_locale": "crk",
"method": "crk-coached-v1",
"keys": {
"greeting": "Hello, welcome to our app",
"farewell": "Goodbye and thanks"
}
}
| フィールド | 型 | 説明 |
|---|---|---|
source_locale | string | BCP 47のソース言語コード |
target_locale | string | BCP 47のターゲット言語コード |
method | string | プラグイン名または"default" |
keys | object | キー→翻訳対象のソース文字列のマップ |
### Response Format
Your service must return a `translations` object. An optional `meta` object can include cost and diagnostic info:
```json
{
"translations": {
"greeting": "tânisi, pê-kîwêw ôta",
"farewell": "ekosi mâka, kinanâskomitin"
},
"meta": {
"model": "my-custom-pipeline/v1",
"cost_usd": 0.0042,
"method": "decompose-translate-validate"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
translations | object | ✅ | Map of key → translated string |
meta | object | — | Optional metadata |
meta.cost_usd | number | — | If present, displayed in champollion's output |
errors | object | — | For partial success (HTTP 207): map of key → { message } |
Minimal Express Server
import express from 'express';
const app = express();
app.use(express.json());
/**
* champollion API contract:
*
* Request: { source_locale, target_locale, method, keys: { "key": "source" } }
* Response: { translations: { "key": "translated" }, meta: { ... } }
*/
app.post('/translate', async (req, res) => {
const { source_locale, target_locale, method, keys } = req.body;
const translations = {};
for (const [key, source] of Object.entries(keys)) {
// --- Your pipeline goes here ---
// Step 1: Morphological decomposition
const morphemes = await decompose(source, source_locale);
// Step 2: LLM translation with context
const draft = await llmTranslate(morphemes, target_locale);
// Step 3: FST validation
const validated = await fstValidate(draft, target_locale);
// Step 4: Post-processing (orthography normalization, etc.)
translations[key] = await postProcess(validated);
}
res.json({
translations,
meta: {
model: 'my-custom-pipeline/v1',
method: 'decompose-translate-validate',
},
});
});
app.listen(3001, () => {
console.log('Translation API running on http://localhost:3001');
});
Configuring champollion
Point a translation pair at your running service in champollion.config.json:
{
"inputLocale": "en",
"pairs": {
"en:crk": {
"method": "api",
"endpoint": "http://localhost:3001/translate",
"register": "Formal Plains Cree. Use SRO orthography."
}
}
}
Then run sync as usual:
npx champollion sync
champollion will POST your source strings to the endpoint and write the returned translations to crk.json.
Case Study: Plains Cree Pipeline
:::info Under Development The Plains Cree pipeline described below is under active development and is not yet running in production. Details here reflect the current design direction and may change as the project evolves. :::
The arena project demonstrates this pattern. Its Plains Cree pipeline uses:
- Morphological decomposition — Break polysynthetic Cree words into translatable morpheme chains
- LLM translation — Context-enriched GPT-4o translation with coaching data (SRO orthography rules, register instructions)
- FST validation — Finite-state transducer checks that outputs conform to Cree phonological rules
- Confidence scoring — Each translation gets a confidence score based on FST pass rate and dictionary coverage
The entire pipeline runs as a single HTTP endpoint that champollion calls via the api method.
Running Evaluations
After translating, you can evaluate output quality using the harness directly:
# Clone the harness
git clone https://github.com/gamedaysuits/arena.git
cd arena
pip install -e .
# Run the evaluation against your method's output
mt-eval run --corpus data/edtekla-dev-v1.json --submit
This produces structured evaluation records with chrF++, BLEU, and exact match scores that can be used as regression baselines.
Authentication
If your API requires authentication, set the apiKey field or use an environment variable:
{
"pairs": {
"en:crk": {
"method": "api",
"endpoint": "https://my-mt-service.example.com/translate",
"apiKey": "${CRK_API_KEY}"
}
}
}
Data Sovereignty & OCAP Principles
The api method is particularly important for Indigenous language communities. By self-hosting the translation pipeline, a community keeps full control over:
- Proprietary coaching data — register instructions, orthography rules, and domain glossaries never leave community infrastructure.
- Linguistic resources — curated dictionaries, FST grammars, and elder-verified translations remain under community ownership.
- Access policies — the community decides who can call the endpoint and under what terms.
This aligns with OCAP® principles (Ownership, Control, Access, Possession), ensuring that sensitive language data is governed by the community rather than a third-party platform.
Combine the api method with a private deployment (e.g., a community-hosted VM or on-prem server) for the strongest data-sovereignty posture. See Support a Low-Resource Language for a full walkthrough.
Cost Estimation
The api method returns null for cost estimation by default — your service controls pricing. If you want to provide cost transparency, have your API return a cost field in the metadata:
{
"translations": { "...": "..." },
"metadata": {
"cost": {
"estimatedCost": 0.0042,
"currency": "USD",
"source": "my-service-pricing"
}
}
}
ベストプラクティス
- 失敗時は空文字列を返す — ソース文字列をそのまま「翻訳」として返さないでください。
""を返すと、champollionのクオリティゲートが検出します。そのキーはスキップされ、次の同期時に再試行されます。 - 信頼スコアを含める — パイプラインが品質を推定できる場合は、メタデータに含めて返してください。品質の監査に役立ちます。
- ヘルスチェックを実装する —
GET /healthエンドポイントを追加することで、大規模な同期を開始する前にchampollionが接続を確認できます。 - レート制限を適切に処理する — パイプラインにスループットの制限がある場合は、
429ステータスコードを返してください。champollionのバッチシステムがバックオフします。 - すべてをログに記録する — マルチステップのパイプラインはサイレントに失敗することがあります。デバッグのために各ステップの入出力をログに残してください。
ライセンス
apiメソッドのパターンは完全にオープンです——独自の翻訳パイプラインをHTTPサービスとしてラップすることに、ライセンス上の制限はありません。arenaはリファレンス実装としてMITライセンスで公開されています。
関連情報
- 翻訳メソッド — すべての組み込みメソッド(
openai、google、apiなど)の概要 - プラグイン仕様 —
apiメソッドフィールドを含むchampollion.config.jsonの完全なスキーマ - 低リソース言語のサポート — OCAP原則を含む、リソースが限られた言語向けのエンドツーエンドガイド
- アーキテクチャ — champollionの同期ループ、バッチ処理、メソッドディスパッチの仕組み
- MT評価 — 評価方法論、メトリクス、リーダーボードへの提出プロセス
- メソッドリーダーボード — メソッドと言語ペアをまたいだリアルタイムの品質ランキング