ChindaMT 翻译 API
ChindaMT 在泰语和英语之间互译,并遵循您随文本一起发送的规则:使用哪个术语、采用何种语气、译文可以多长,以及必须保留什么格式。一份译文可能每个词都正确,却仍不适合实际用途:字幕需要贴合角色的口吻,合同需要固定的术语,群聊需要口语化的泰语,品牌需要自己的风格。ChindaMT 经过专门训练,能够在不损失翻译质量的前提下遵循此类指令。相关研究发表于 AACL-IJCNLP 2026(主会),模型权重以 Apache 2.0 许可开放。本 API 提供的是 ChindaMT-4B。
在线演示
选择一个示例或输入您自己的文本,可按需添加规则,然后点击“翻译”。勾选“同时生成不带规则的译文以便对比”后,演示还会在不使用规则的情况下翻译同一段文本,便于您查看规则带来的变化。每次翻译按每 400 个字符 1 IC 计费。
cURL 请求
curl -X POST 'https://api.iapp.co.th/v3/store/text/mt/translate' \
-H 'apikey: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"text":"The meeting has been moved to Friday because the boss is busy.","source_lang":"en","target_lang":"th","rules":["Use a casual, friendly tone"]}'快速开始
需要从 iApp AI Portal 获取 API key。以 JSON 格式发送文本,并带上 apikey 请求头:
curl -X POST https://api.iapp.co.th/v3/store/text/mt/translate \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "The meeting has been moved to Friday because the boss is busy.",
"source_lang": "en",
"target_lang": "th",
"rules": ["Use a casual, friendly tone"]
}'
{
"translation": "ประชุมย้ายไปวันศุกร์แล้วนะ เพราะเจ้านายยุ่งมาก",
"source_lang": "en",
"target_lang": "th",
"warnings": []
}
不加这条规则时,同一句话会以中性的书面泰语返回:“การประชุมถูกเลื่อนไปเป็นวันศุกร์เนื่องจากเจ้านาย ยุ่ง”。Python 和 JavaScript 示例见技术参考。
接口与价格
| 接口 | 说明 | 价格 |
|---|---|---|
POST /v3/store/text/mt/translate | 翻译一段文本,最多 100,000 个字符 | 每 400 个字符 1 IC |
POST /v3/store/text/mt/translate/batch | 在一次请求中翻译一组彼此独立的文本(界面字符串、表格单元格),合计最多 100,000 个字符 | 每 400 个字符 1 IC |
计费按您发送的 text(或全部 texts)的原样字符数统计,每次请求向上取整到 400 的整数倍:
- 文本中的所有内容都计入:空格、换行,以及原样返回的行。
- 规则不计费。
- 字符按 Unicode 码位计算,因此每个泰语元音和声调符号都算作一个字符:
ที่为 3 个字符。 - 仅对成功的
200响应计费。被拒绝和失败的请求免费。
一句 44 个字符的句子费用为 1 IC,一段 401 个字符的段落为 2 IC,一次满额 100,000 个字符的请求为 250 IC。计费字符数通过 iapp-input-chars 响应头返回。处理请求前,网关会检查您的余额是否足以支付其全部费用;若不足,则返回 402,不进行翻译。
规则
规则是用简明英语写成的简短指令,以字符串列表的形式放在 rules 中发送。规则作用于整段文 本(批量请求时作用于每一段文本),合计最多 2,000 个字符。ChindaMT 针对五类规则进行了训练:
| 类别 | 规则示例 |
|---|---|
| 术语 | Translate บาท as THB, Keep product names such as iApp Portal in English |
| 语气与语体 | Use a formal, polite tone suitable for a business email, Use a casual, friendly tone |
| 长度 | Use exactly one sentence, Keep it short enough for a subtitle |
| 格式 | Return only the translation, no quotes, Keep the numbering of the list |
| 语言 | Avoid English contractions, Write numbers as digits |
规则越具体、越能在输出中核验,效果越好。例如,使用规则 Keep product names such as iApp Portal, API Keys and Document OCR in English 时,句子“press Create Key to start using Document OCR”中的“Create Key”会保留英文;不使用该规则时,这个按钮名称会被翻译。对于较长的术语表,请只发送文本中实际出现的术语,而不是整份列表。
准确度
在配套论文中,ChindaMT 与其他同规模的开源翻译模型进行了对比评测,覆盖两个翻译方向(每项测试包含 200 条英译泰和 200 条泰译英样本),并分别在有规则和无规则的条件下进行。表中数字为评审模型更偏好 ChindaMT-4B 译文的对比所占比例,已针对回答长度进行校正(50% 表示持平)。
| ChindaMT-4B 的对比对象 | 普通翻译 | 带规则翻译 |
|---|---|---|
| Typhoon-Translate-1.5-4B | 61.8% | 68.4% |
| TranslateGemma-4B | 87.2% | |
| MiLMMT-46-4B | 89.5% |
在盲测中,三位以泰语为母语的评审在 64% 的普通翻译和 69% 的带规则翻译中更偏好 ChindaMT-4B,而非 Typhoon-Translate-1.5-4B(总体 67%,每项 100 条)。不使用规则时质量并未下降:在公开基准 FLORES-200 上,ChindaMT-4B 在 CometKiwi、GEMBA-DA 和 GEMBA-MQM 三项指标上的平均分为 90.7,是所测 4B 至 9B 模型中最高的;在 WMT24++ 新闻测试集上得分 87.8,仅次于一个得分 89.4 的 7B 模型。完整表格、评测方法和评测集见论文。
已知限制:
- 模型仅支持泰语和英语。
- 它遵循的是一份优质参考译文能够满足的规则。严格的占位符标记和大型强制术语表不在其训练范围内;此类输出请在使用前进行检查。
- 与任何机器翻译一样,它可能生成流畅但错误的文本。用于法律、医疗等高风险场景的译文请经人工审核。
warnings字段会标出可能有误的部分。
性能
2026 年 9 月 29 日经 API 网关测得,单请求串行,取 3 至 9 次运行的中位数,包含从曼谷发起请求的网络时间:
| 请求 | 字符数 | 往返时间 |
|---|---|---|
| 一句,泰译英 | 82 | 0.36 秒 |
| 两句,英译泰 | 183 | 0.38 秒 |
| 同上,附带两条规则 | 183 | 0.40 秒 |
| 一个段落,英译泰 | 653 | 0.60 秒 |
| 约一页,英译泰 | 2,028 | 0.71 秒 |
| 约一页,泰译英 | 2,044 | 0.61 秒 |
| 约五页,英译泰 | 10,071 | 1.72 秒 |
| 限制 | 数值 |
|---|---|
| 每次请求的文本 | 100,000 个字符(text,或全部 texts 合计) |
| 每次请求的规则 | 合计 2,000 个字符 |
| 每次请求的时间 | 90 秒,超时返回 504 |
| 速率限制(每个 API key) | 每秒 5 次,每分钟 120 次,每小时 3,000 次 |
耗时的增长远慢于文本长度:五页文本的耗时约为一句话的四倍。翻译大量短字符串时,一次 /translate/batch 请求比多次单独请求更快。
开放模型
该模型系列及其训练数据和评测集均已公开发布,任何人都可以运行或在此基础上进行开发:
| 发布内容 | 链接 |
|---|---|
| ChindaMT-4B、2B 和 0.8B 权重(Apache 2.0) | huggingface.co/iapp/ChindaMT-4B, 2B, 0.8B |
| 训练数据,197 万条记录 | huggingface.co/datasets/iapp/ChindaMT-Grounded |
| 评测集 | ChindaMT-CoreEval, ChindaMT-BroadEval |
| 数据整理代码 | github.com/iapp-technology/ChindaMT-RGDC |
| 论文 | arxiv.org/abs/2609.34770 |
托管 API 是无需自备 GPU 即可使用 ChindaMT-4B 的最快方式。如需结合自有术语进行本地部署,请联系 sale@iapp.co.th。
数据安全与合规
- 本服务符合 GDPR 和 PDPA。
- 文本在 iApp 运营的泰国服务器上翻译,不会发送给任何第三方服务商。
- 您发送的文本不会被存储。服务日志仅记录翻译方向和字符数,不记录内容。
技术参考
认证
基础 URL:https://api.iapp.co.th/v3/store/text/mt。每个请求都需在 apikey 请求头中携带您的 API key。
POST /translate
翻译一段文本。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
text | string | 是 | 待翻译的文本,最多 100,000 个字符,可包含多行。 |
source_lang | "th" 或 "en" | 是 | text 的语言。 |
target_lang | "th" 或 "en" | 是 | 目标语言,必须与 source_lang 不同。 |
rules | array of strings | 否 | 给模型的指令,例如要使用的术语、语气或输出格式,如 ["Use a formal tone", "Translate บาท as THB"]。合计最多 2,000 个字符。 |
{
"text": "The weather is nice today.\nSee you tomorrow.",
"source_lang": "en",
"target_lang": "th"
}
响应:
{
"translation": "วันนี้สภาพอากาศดีครับ\nพบกันพรุ่งนี้ครับ",
"source_lang": "en",
"target_lang": "th",
"warnings": []
}
| 字段 | 说明 |
|---|---|
translation | 译文。 |
source_lang, target_lang | 实际使用的翻译方向。 |
warnings | 译文中可能有误的部分。见警告。 |
POST /translate/batch
在一次请求中翻译多段彼此独立的文本,例如界面字符串或表格单元格。所有文本均按相同的方向和相同的规则翻译。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
texts | array of strings | 是 | 至少一段文本,合计最多 100,000 个字符。每段文本可包含多行。 |
source_lang, target_lang, rules | 与 /translate 相同,作用于每一段文本。 |
{
"texts": ["The weather is nice today.", "See you\ntomorrow."],
"source_lang": "en",
"target_lang": "th"
}
响应:
{
"translations": [
{"translation": "วันนี้สภาพอากาศดีครับ", "warnings": []},
{"translation": "พบกันใหม่\nพรุ่งนี้", "warnings": []}
],
"source_lang": "en",
"target_lang": "th"
}
translations 中每段文本对应一个条目,顺序与 texts 相同,每个条目携带其自身文本的警告。批量请求整体成功或整体失败:若失败,则不返回任何译文,也不计费,请重新发送整个批次。
文本处理方式
- 行: 每一行单独翻译。换行以及每行首尾的空格都会保留。
- 原样保留的行: 不含源语言字母的行会原样返回,例如空行、纯数字行,或已是目标语言的行。此类行仍计入计费。
警告
警告标出您的文本中译文可能有误的部分。请求仍然成功,translation 中包含该部分的最佳结果。
{"reason": "truncated", "source": "…", "translation": "…"}
reason | 含义 |
|---|---|
truncated | 译文在完成前被截断。 |
too_short | 译文明显短于原文,可能缺失部分内容。 |
wrong_language | 译文不是目标语言。 |
source 为您文本中的对应部分,translation 为该部分返回的译文。
响应头
| 响应头 | 说明 |
|---|---|
iapp-input-chars | 本次请求计费的字符数(仅在 200 时返回)。 |
X-Request-ID | 请求标识。报告问题时请附上。 |
错误
| 状态码 | 原因 | 处理方式 |
|---|---|---|
401 | 缺少或无效的 apikey。 | 在 Portal 的 API Keys 页面检查 key。 |
402 | 余额不足以支付本次请求的字符数。 | 充值,或减少每次请求的文本量。 |
413 | text 超过 100,000 个字符,或 texts 合计超过该上限。 | 将文本拆分为多次请求。 |
422 | 请求体无效:语言不是 th 或 en、源语言与目标语言相同、rules 超过 2,000 个字符、texts 为空,或缺少字段。 | 修正请求。 |
429 | 该 API key 超过速率限制。 | 稍候重试。 |
503 | 翻译模型不可用。 | 稍后重试。 |
504 | 翻译未在 90 秒内完成。 | 稍后重试,或减少每次请求的文本量。 |
对于 413、503 和 504,detail 为一条消息:
{"detail": "text must be at most 100,000 characters"}
对于 422,detail 为请求体问题的列表:
{
"detail": [
{
"type": "literal_error",
"loc": ["body", "target_lang"],
"msg": "Input should be 'th' or 'en'",
"input": "jp",
"ctx": {"expected": "'th' or 'en'"}
}
]
}
错误不计费。
代码示例
- cURL
- Python
- JavaScript
# One text, with rules
curl -X POST https://api.iapp.co.th/v3/store/text/mt/translate \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "ผู้ซื้อต้องชำระเงินจำนวน 5,000 บาท ภายใน 7 วัน", "source_lang": "th", "target_lang": "en", "rules": ["Translate บาท as THB", "Use a formal tone"]}'
# Several texts in one request
curl -X POST https://api.iapp.co.th/v3/store/text/mt/translate/batch \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"texts": ["Save changes", "Delete account", "Are you sure?"], "source_lang": "en", "target_lang": "th", "rules": ["Use short, polite UI wording"]}'
import requests
URL = "https://api.iapp.co.th/v3/store/text/mt"
HEADERS = {"apikey": "YOUR_API_KEY"}
# One text
r = requests.post(f"{URL}/translate", headers=HEADERS, timeout=120, json={
"text": "The meeting has been moved to Friday because the boss is busy.",
"source_lang": "en",
"target_lang": "th",
"rules": ["Use a casual, friendly tone"],
})
r.raise_for_status()
print(r.json()["translation"])
print("charged characters:", r.headers["iapp-input-chars"])
# Many UI strings in one request
r = requests.post(f"{URL}/translate/batch", headers=HEADERS, timeout=120, json={
"texts": ["Save changes", "Delete account", "Are you sure?"],
"source_lang": "en",
"target_lang": "th",
})
r.raise_for_status()
for item in r.json()["translations"]:
print(item["translation"], item["warnings"])
const response = await fetch("https://api.iapp.co.th/v3/store/text/mt/translate", {
method: "POST",
headers: { "apikey": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
text: "ประชุมเลื่อนไปวันศุกร์ เพราะหัวหน้าติดงาน",
source_lang: "th",
target_lang: "en",
rules: ["Use a casual tone"],
}),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result.translation);
console.log("charged characters:", response.headers.get("iapp-input-chars"));
更新日志
| 版本 | 日期 | 变更 |
|---|---|---|
| v0.2.0-20260929 | 2026 年 9 月 29 日 | 首次公开发布:支持带规则的泰英双向翻译,提供 /translate 和 /translate/batch、警告信息,每次请求最多 100,000 个字符。每 400 个字符 1 IC。 |