Šķîþ ţö ḿàîñ çöñţéñţ

Þŕöĵéçţ ƒîļé

À kapi þŕöĵéçţ îš à þöŕţàƃļé kapi.yaml ŕéçîþé àţ à þŕöĵéçţ'š ŕööţ ţĥàţ çàþţüŕéš à çöñţéñţ ŵöŕķƒļöŵ: ŵĥîçĥ ƒîļéš çöüñţ àš çöñţéñţ, ţĥé ṽöîçé þŕöƒîļé, ţéŕḿš àñđ çööŕđîñàţéš ţĥàţ ĝöṽéŕñ ţĥéḿ, šöüŕçé àñđ ţàŕĝéţ ļàñĝüàĝéš, ţööļ þîþéļîñéš (ƒļöŵš), þļüĝîñ ŕéǫüîŕéḿéñţš, àñđ þŕöçéššîñĝ đéƒàüļţš. Îţ çàŕŕîéš ñö çŕéđéñţîàļš öŕ šţàţé, šö îţ îš àļŵàýš šàƒé ţö çöḿḿîţ. Ƒöŕ ŵĥéñ ţö üšé à þŕöĵéçţ ṽéŕšüš àñ àđ-ĥöç ŕüñ, šéé Þŕöĵéçţš.

Đîšçöṽéŕý

Ļîķé ĝîţ, kapi ŵàļķš üþ ţĥé đîŕéçţöŕý ţŕéé ƒŕöḿ ŵĥéŕé ýöü ŕüñ îţ àñđ üšéš ţĥé ñéàŕéšţ kapi.yaml ŕéçîþé, ŕüññîñĝ îñ þŕöĵéçţ ḿöđé ŵîţĥ ţĥàţ þŕöĵéçţ'š ļàñĝüàĝéš, đéƒàüļţš, àñđ ƒļöŵš. À đîŕéçţöŕý ĥöļđš àţ ḿöšţ öñé kapi.yaml, šö đîšçöṽéŕý îš üñàḿƃîĝüöüš. Àñ éẋþļîçîţ -p <path> öṽéŕŕîđéš đîšçöṽéŕý, àñđ KAPI_NO_PROJECT=1 đîšàƃļéš îţ šö ţĥé ÇĻÎ ŕüñš àđ-ĥöç.

Ƒöŕḿàţ

version: v1
id: prj_k3m7xq2vw9ta5r8ybn4dcp
name: My App

collections:
- path: "src/locales/en/*.json"
target: "src/locales/{lang}" # mirror each matched file under the per-language dir

preset: nextjs
plugins:
okapi: "^1.47.0"

flows:
translate:
steps:
- tool: translate
config:
provider: anthropic
model: <provider-model-id>

translate-and-qa:
steps:
- tool: translate
config:
provider: anthropic
- tool: qa

pseudo:
steps:
- tool: pseudo-translate
config:
expansionPercent: 30

defaults:
source_language: en
target_languages:
- fr
- de
- ja
concurrency: 4
parallel_blocks: 3
encoding: utf-8
exclude:
- "**/*.generated.json"
merge:
conflict_policy: translator-wins
memory:
fuzzy_threshold: 75
segmentation:
source: true
terms_source: .kapi/terms.json
memory_source: .kapi/memory/memory.json

Ƒîéļđš

Ŕéǫüîŕéđ

ƑîéļđŢýþéĐéšçŕîþţîöñ
versionšţŕîñĝŠçĥéḿà ṽéŕšîöñ, ḿüšţ ƃé "v1"
namešţŕîñĝÞŕöĵéçţ đîšþļàý ñàḿé

Öþţîöñàļ

ƑîéļđŢýþéĐéšçŕîþţîöñ
idšţŕîñĝŢĥé þŕöĵéçţ'š šţàƃļé îđéñţîţý (šéé Þŕöĵéçţ îđéñţîţý)
collectionsÇöļļéçţîöñ[]Ţĥé çöñţéñţ ţĥîš þŕöĵéçţ ĝöṽéŕñš (šéé Çöļļéçţîöñš)
profilesḿàþĜöṽéŕñàñçé ƃöüñđ þéŕ þŕöđüçţ, ķéýéđ ƃý þŕöƒîļé ñàḿé (šéé Þŕöƒîļéš àñđ çĥàññéļš)
presetšţŕîñĝÀ ƒŕàḿéŵöŕķ þŕéšéţ ñàḿé (šéé kapi init --list-presets) (é.ĝ., nextjs, react-intl) àþþļîéđ ţö ƒöŕḿàţš
pluginsḿàþÞļüĝîñ ŕéǫüîŕéḿéñţš ķéýéđ ƃý ñàḿé (é.ĝ., okapi: "^1.47.0")
requiresḿàþÞļüĝîñ ñàḿé → šéḿṽéŕ çöñšţŕàîñţ ţĥàţ ĝàţéš ļöàđîñĝ; ţĥé ŕéçîþé ŕéƒüšéš ţö ļöàđ ŵîţĥöüţ à ŕéĝîšţéŕéđ þļüĝîñ
flowsḿàþÑàḿéđ ƒļöŵ đéƒîñîţîöñš (šéé Ƒļöŵ Šţéþš)
defaultsĐéƒàüļţšÞŕöçéššîñĝ đéƒàüļţš (šéé Đéƒàüļţš; šöüŕçé/ţàŕĝéţ ļàñĝüàĝéš ļîṽé ĥéŕé)
ship_gateĜàţéÀ šîñĝļé çàţçĥ-àļļ šĥîþ ĝàţé (šéé Šĥîþ ĝàţéš)
ship_gatesŠĥîþĜàţéŔüļé[]Šçöþéđ šĥîþ-ĝàţé ŕüļéš; ţĥé ḿöšţ šþéçîƒîç ḿàţçĥîñĝ ŕüļé ŵîñš (šéé Šĥîþ ĝàţéš)
gatesḿàþÑàḿéđ ĝàţé ŕéĝîšţŕý à ship_gates ŕüļé çàñ ŕéƒéŕéñçé ƃý ñàḿé (šéé Šĥîþ ĝàţéš)
source_gateĜàţéÇöṽéŕàĝé ĝàţé öṽéŕ ţĥé šöüŕçé àüţĥöŕîñĝ ļàđđéŕ (šéé šöüŕçé_ĝàţé)
verified_gateĜàţéÀ šîñĝļé çàţçĥ-àļļ ṽéŕîƒîéđ ĝàţé: ţĥé ƃàŕ à ļöçàļé ḿüšţ çļéàŕ ţö ŕéàđ àš ṽéŕîƒîéđ, îñđéþéñđéñţ öƒ šĥîþþîñĝ (šéé Šĥîþ ĝàţéš)
verified_gatesŠĥîþĜàţéŔüļé[]Šçöþéđ ṽéŕîƒîéđ-ĝàţé ŕüļéš, îñ ţĥé šàḿé when/gate ƒöŕḿ àš ship_gates; ţĥé ḿöšţ šþéçîƒîç ŕüļé ŵîñš. Ŵîţĥ ñéîţĥéŕ ķéý šéţ, ñö ļöçàļé îš ṽéŕîƒîéđ

Þŕöĵéçţ îđéñţîţý

kapi init ŵŕîţéš àñ id: îñţö éṽéŕý ŕéçîþé îţ šçàƒƒöļđš:

version: v1
id: prj_k3m7xq2vw9ta5r8ybn4dcp
name: My App

Ţĥé îđ îš ŕàñđöḿ, ḿîñţéđ öñçé, àñđ đéŕîṽéđ ƒŕöḿ ñöţĥîñĝ éļšé îñ ţĥé þŕöĵéçţ. Éṽéŕýţĥîñĝ kapi ŕéçöŕđš àƃöüţ ţĥé þŕöĵéçţ ļöçàļļý îš ķéýéđ öñ îţ, šö ýöü çàñ ŕéñàḿé ţĥé þŕöĵéçţ, ḿöṽé ţĥé ƒöļđéŕ, öŕ çļöñé ţĥé ŕéþöšîţöŕý öñţö àñöţĥéŕ ḿàçĥîñé àñđ ţĥé ŕéçöŕđéđ çöñţéẋţ šţîļļ ƃéļöñĝš ţö ţĥé šàḿé þŕöĵéçţ. Ţŵö çĥéçķöüţš öƒ öñé ŕéþöšîţöŕý àŕé öñé þŕöĵéçţ ƃéçàüšé ţĥéý šĥàŕé öñé ŕéçîþé.

name: îš ţĥé ļàƃéļ ýöü ŕéàđ îñ kapi status àñđ îñ Kapi Đéšķţöþ. Çĥàñĝé îţ ŵĥéñéṽéŕ ýöü ļîķé.

Ķééþ ţĥé id: ļîñé ŵĥéñ ýöü çöḿḿîţ ţĥé ŕéçîþé, àñđ ķééþ îţ ŵĥéñ ýöü çöþý à ŕéçîþé àš à šţàŕţîñĝ þöîñţ ƒöŕ à ĝéñüîñéļý đéŕéñţ þŕöĵéçţ: đéļéţé ţĥé ļîñé ţĥéŕé àñđ ŕüñ kapi init --mint-id îñ ţĥé ñéŵ þŕöĵéçţ, ŵĥîçĥ ŵŕîţéš à ƒŕéšĥ îđ àñđ ļéàṽéš ţĥé ŕéšţ öƒ ţĥé ƒîļé üñţöüçĥéđ.

À ŕéçîþé ŵîţĥ ñö id: ķééþš ŵöŕķîñĝ. kapi îđéñţîƒîéš šüçĥ à þŕöĵéçţ ƃý îţš name:, àñđ kapi init --mint-id ĝîṽéš îţ àñ îđ ŵĥéñéṽéŕ ýöü ŵàñţ öñé.

Öļđéŕ kapi ŕéļéàšéš ŕéàđ à ŕéçîþé çàŕŕýîñĝ àñ id: ŵîţĥöüţ çöḿþļàîñţ: àñ üñŕéçöĝñîžéđ ţöþ-ļéṽéļ ķéý ŕöüñđ-ţŕîþš àš àñ éẋţéñšîöñ. Šüçĥ à ŕéļéàšé šţîļļ îđéñţîƒîéš ţĥé þŕöĵéçţ ƃý îţš ñàḿé, šö à þŕöĵéçţ šĥàŕéđ ƃéţŵééñ ţŵö kapi ṽéŕšîöñš îš ķéýéđ đéŕéñţļý ƃý éàçĥ üñţîļ ƃöţĥ çàŕŕý ţĥîš ŕéļéàšé.

Çöļļéçţîöñš

collections îš à ļîšţ. Éàçĥ éñţŕý îš éîţĥéŕ à ƃàŕé éñţŕý (öñé ĝļöƃ àñđ îţš ţàŕĝéţ, ŵŕîţţéñ îñļîñé) öŕ à ñàḿéđ çöļļéçţîöñ, ŵĥîçĥ ĝŕöüþš çöñţéñţ îţéḿš üñđéŕ à ñàḿé àñđ çàñ ƃîñđ ţĥéḿ ţö à þöîñţ îñ ţĥé þŕöĵéçţ'š çöñţéẋţ šþàçé.

collections:
# Bare entry: a pattern and where it lands.
- path: "src/locales/en/*.json"
target: "src/locales/{lang}"

# Named collection: a name, the directory it lives in, its items.
- name: docs
channel: sdk/docs
base: web
content:
- path: "docs/**/*.mdx"
target: "i18n/{lang}/{path}.mdx"
ƑîéļđŢýþéĐéšçŕîþţîöñ
namešţŕîñĝÇöļļéçţîöñ ñàḿé. Ŕéǫüîŕéđ ţö ƃîñđ à channel:, àñđ ŵĥàţ à šĥîþ-ĝàţé ŕüļé'š collections: šéļéçţöŕ ḿàţçĥéš
basešţŕîñĝŢĥé đîŕéçţöŕý ţĥîš çöļļéçţîöñ ļîṽéš îñ; éṽéŕý path, target àñđ îţéḿ base ƃéļöŵ îš ŵŕîţţéñ ŕéļàţîṽé ţö îţ
channelšţŕîñĝŢĥé þöîñţ îñ ţĥé çöñţéẋţ šþàçé ţĥîš çöļļéçţîöñ'š çöñţéñţ šîţš àţ, àļŵàýš profile/channel (šéé Þŕöƒîļéš àñđ çĥàññéļš)
coordinatesḿàþĐéçļàŕéđ àẋéš (brand, mode) ţĥé çöļļéçţîöñ šîţš àţ, öṽéŕļàîđ þéŕ àẋîš öñ defaults.coordinates; þŕöđüçţ àñđ çĥàññéļ çöḿé ƒŕöḿ channel: àñđ àŕé ŕéĵéçţéđ ĥéŕé (šéé Đéçļàŕéđ àẋéš)
contentÇöñţéñţÎţéḿ[]Ţĥé çöļļéçţîöñ'š çöñţéñţ îţéḿš
source_languagešţŕîñĝÖṽéŕŕîđéš defaults.source_language ƒöŕ ţĥîš çöļļéçţîöñ
target_languagesšţŕîñĝ[]Öṽéŕŕîđéš defaults.target_languages ƒöŕ ţĥîš çöļļéçţîöñ
source_onlyƃööļŢĥé çöļļéçţîöñ ĥàš ñö ţàŕĝéţ ļàñĝüàĝé: kapi up šķîþš îţ àñđ ţàŕĝéţ-çöṽéŕàĝé ĝàţéš éẋçļüđé îţ. Ŕéĵéçţéđ îƒ ţĥé çöļļéçţîöñ öŕ àñý îţéḿ àļšö çàŕŕîéš à ţàŕĝéţ
pathšţŕîñĝƂàŕé éñţŕîéš öñļý: ţĥé ĝļöƃ, ŵŕîţţéñ îñšţéàđ öƒ content:
formatšţŕîñĝ öŕ ḿàþƂàŕé éñţŕîéš öñļý
targetšţŕîñĝƂàŕé éñţŕîéš öñļý

À ñàḿéđ çöļļéçţîöñ ñééđš àţ ļéàšţ öñé îţéḿ üñđéŕ content: àñđ çàññöţ àļšö çàŕŕý à path:; à ƃàŕé éñţŕý ñééđš à path:.

Šéţ source_only: true öñ çöñţéñţ kapi ŕéàđš ƃüţ ñéṽéŕ ŵŕîţéš, šüçĥ àš þàçķàĝé đéšçŕîþţîöñš àñđ îñšţàļļéŕ šţŕîñĝš. Ţĥé ƒļàĝ çĥàñĝéš ñö ƃéĥàṽîöüŕ öñ îţš öŵñ, šîñçé à çöļļéçţîöñ ŵîţĥ ñö ţàŕĝéţ ŵàš àļŕéàđý šöüŕçé-öñļý. Îţ ŕéçöŕđš ţĥé îñţéñţ, àñđ ļöàđîñĝ ƒàîļš îƒ ţĥé çöļļéçţîöñ çöñţŕàđîçţš îţ. Šéé Çĥéçķ-öñļý çöñţéñţ îñ öţĥéŕ àššéţš.

ÇöñţéñţÎţéḿ

ƑîéļđŢýþéĐéšçŕîþţîöñ
pathšţŕîñĝĜļöƃ þàţţéŕñ ƒöŕ šöüŕçé ƒîļéš, ŕéļàţîṽé ţö ţĥé çöļļéçţîöñ'š base (ŕéǫüîŕéđ)
basešţŕîñĝĐîŕéçţöŕý à ḿàţçĥéđ ƒîļé'š þàţĥ îš ḿàđé ŕéļàţîṽé ţö; đéƒàüļţš ţö ţĥé ĝļöƃ'š ƒîẋéđ þŕéƒîẋ
formatšţŕîñĝ öŕ ḿàþƑöŕḿàţ ÎĐ; àüţö-đéţéçţéđ þéŕ ƒîļé îƒ öḿîţţéđ
targetšţŕîñĝÖüţþüţ þàţĥ ţéḿþļàţé (šéé Šöüŕçé àñđ ţàŕĝéţ þàţĥš)
source_languagešţŕîñĝÖṽéŕŕîđéš ţĥé çöļļéçţîöñ'š àñđ ţĥé þŕöĵéçţ'š šöüŕçé ļàñĝüàĝé
target_languagesšţŕîñĝ[]Öṽéŕŕîđéš ţĥé çöļļéçţîöñ'š àñđ ţĥé þŕöĵéçţ'š ţàŕĝéţ ļàñĝüàĝéš
channelšţŕîñĝÖṽéŕŕîđéš ţĥé çöļļéçţîöñ'š channel: ƒöŕ ţĥé ƒîļéš ţĥîš îţéḿ ḿàţçĥéš (šéé Þŕöƒîļéš àñđ çĥàññéļš)
redactionŔéđàçţîöñŠþéçÖṽéŕŕîđéš defaults.redaction ƒöŕ ţĥîš îţéḿ
commentsƃööļ öŕ ḿàþĐéçļàŕéš ţĥé çöḿḿéñţš îñ ţĥé ḿàţçĥéđ ƒîļéš àš çöñţéñţ ţö çĥéçķ: Ĝö šöüŕçé, ŕéàđ ƒöŕ îţš çöḿḿéñţš àļöñé, àñđ ÝÀḾĻ, ẊḾĻ-ƃàšéđ, ĤŢḾĻ, Ḿàŕķđöŵñ, ḾĐẊ, ÞÖ àñđ þŕöþéŕţîéš ƒöŕḿàţš, ŵĥöšé çöḿḿéñţš àŕé çĥéçķéđ ƃéšîđé ţĥé ṽàļüéš ţĥéîŕ ŕéàđéŕš éẋţŕàçţ. Ţĥé ḿàþ ƒöŕḿ đéçļàŕéš ţĥéḿ ţöö, àñđ îţš directives ļîšţ ñàḿéš ḿàŕķéŕš ýöüŕ öŵñ ţööļš ŕéàđ àţ ţĥé šţàŕţ öƒ à çöḿḿéñţ ļîñé, ŵĥîçĥ àŕé šéţ àšîđé ƃéšîđé ţĥöšé üñđéŕ defaults.comments.directives. Îţš channel þļàçéš ţĥé çöḿḿéñţš àţ à þöîñţ öƒ ţĥéîŕ öŵñ, à ǫüàļîƒîéđ profile/channel: éàçĥ çöḿḿéñţ îš çĥéçķéđ üñđéŕ ţĥàţ þöîñţ'š ṽöîçé àñđ ţéŕḿš, àñđ ţĥé ŕéšţ öƒ ţĥé ƒîļé šţàýš àţ ţĥé îţéḿ'š þöîñţ. Îţš only: true đéçļàŕéš ţĥé ƒîļéš ƒöŕ ţĥéîŕ çöḿḿéñţš àļöñé: kapi çĥéçķš ţĥé çöḿḿéñţš àñđ ŕéàđš ñöñé öƒ ţĥé ṽàļüéš, šö kapi up, ƒļöŵ ŕüñš, kapi merge, kapi extract, kapi stats, kapi status çöṽéŕàĝé àñđ ţĥé --ship ĝàţéš ļéàṽé ţĥé ṽàļüéš àļöñé, àñđ ţĥé îţéḿ çàññöţ àļšö šéţ target, target_languages, redaction, format.config öŕ format.preset. Ĝö šöüŕçé îš ŕéàđ ƒöŕ îţš çöḿḿéñţš àļöñé ŵîţĥ öŕ ŵîţĥöüţ only. À ƒöŕḿàţ ţĥàţ šüþþļîéš ñö çöḿḿéñţš ḿàķéš ţĥé çĥéçķ ŕéþöŕţ ţĥàţ îţ đîđ ñöţ ŕüñ (šéé Çöḿḿéñţš îñ šöüŕçé çöđé)

ƃàšé

À çöļļéçţîöñ'š base îš ŵĥéŕé ţĥé çöļļéçţîöñ ļîṽéš. Éṽéŕý path, target àñđ îţéḿ base ƃéñéàţĥ îţ îš ŵŕîţţéñ ŕéļàţîṽé ţö ţĥàţ đîŕéçţöŕý àñđ ĵöîñéđ öñţö îţ, šö à çöļļéçţîöñ ŕéàđš àš ţĥé ţŕéé îţ ĝöṽéŕñš ŕàţĥéŕ ţĥàñ àš à þŕéƒîẋ ŕéþéàţéđ öñ éṽéŕý ļîñé:

collections:
- name: docs
base: web
content:
- path: "docs/**/*.mdx" # → web/docs/**/*.mdx
target: "i18n/{lang}/{path}.mdx" # → web/i18n/{lang}/{path}.mdx

Àñ îţéḿ'š öŵñ base îš ţĥé šéþàŕàţé, ñàŕŕöŵéŕ ţĥîñĝ: ţĥé đîŕéçţöŕý à ḿàţçĥéđ ƒîļé'š þàţĥ îš ḿàđé ŕéļàţîṽé ţö, ŵĥîçĥ đŕîṽéš ţĥé {relpath} / {path} / {dir} ţöķéñš. Àñ îţéḿ ţĥàţ đéçļàŕéš ñöñé ķééþš ñöñé, àñđ ţĥé ţöķéñš ţĥéñ ŕéļàţîṽîžé àĝàîñšţ ţĥé ĵöîñéđ þàţţéŕñ'š öŵñ ƒîẋéđ þŕéƒîẋ.

Šöüŕçé àñđ ţàŕĝéţ þàţĥš

path îš à đöüƃļéšţàŕ ĝļöƃ: ** ḿàţçĥéš àçŕöšš đîŕéçţöŕîéš (é.ĝ. src/**/*.json) àñđ {a,b,c} ḿàţçĥéš àñý öƒ ţĥé ļîšţéđ àļţéŕñàţîṽéš (é.ĝ. input/store/*.{json,yaml,html}). Öñé ĝļöƃ çàñ ţĥéŕéƒöŕé çöṽéŕ à ŵĥöļé đîŕéçţöŕý öƒ ḿîẋéđ çöñţéñţ; ţĥé ƒöŕḿàţ îš àüţö-đéţéçţéđ þéŕ ƒîļé üñļéšš ýöü þîñ format. Þàţţéŕñš ŕéšöļṽé ŕéļàţîṽé ţö ţĥé þŕöĵéçţ ŕööţ. ** đöéš ñöţ ƒöļļöŵ à šýḿƃöļîç ļîñķ îñţö àñöţĥéŕ đîŕéçţöŕý, šö ţĥé ļîñķéđ þàçķàĝéš à þàçķàĝé ḿàñàĝéŕ ķééþš üñđéŕ node_modules šţàý öüţ öƒ à ḿàţçĥ. À ļîñķ ţö à ƒîļé ţĥàţ ţĥé þàţţéŕñ ḿàţçĥéš îš ŕéàđ, àñđ šö îš à ļîñķéđ đîŕéçţöŕý ţĥàţ ţĥé þàţţéŕñ ñàḿéš ƃéƒöŕé îţš ƒîŕšţ ŵîļđçàŕđ.

À ƒîļé ƃéļöñĝš ţö éẋàçţļý öñé îţéḿ. Îţéḿš àŕé ḿàţçĥéđ îñ ţĥé öŕđéŕ ţĥéý àŕé ŵŕîţţéñ, àçŕöšš àļļ çöļļéçţîöñš, àñđ ţĥé ƒîŕšţ îţéḿ ŵĥöšé path ḿàţçĥéš à ƒîļé çļàîḿš îţ; ļàţéŕ îţéḿš ñéṽéŕ šéé ţĥàţ ƒîļé, ĥöŵéṽéŕ šþéçîƒîç ţĥéîŕ þàţţéŕñ. Àñ îţéḿ đéçļàŕéđ comments: {only: true} çļàîḿš öñļý çöḿḿéñţš, ŵĥéŕéṽéŕ îţ îš ŵŕîţţéñ: ţĥé ƒîŕšţ öţĥéŕ îţéḿ ţĥàţ ḿàţçĥéš à ƒîļé çļàîḿš îţš ṽàļüéš, àñđ ţĥé çöḿḿéñţš šţàý ŵîţĥ ţĥé çöḿḿéñţš-öñļý îţéḿ üñļéšš ţĥàţ öţĥéŕ îţéḿ çöḿéš ƒîŕšţ àñđ đéçļàŕéš ţĥéḿ îţšéļƒ. Ţö þļàçé öñé ƒîļé àţ îţš öŵñ þöîñţ, öŕ üñđéŕ îţš öŵñ ƒöŕḿàţ öŕ ţàŕĝéţ, ļîšţ îţš îţéḿ ƃéƒöŕé ţĥé ĝļöƃ ţĥàţ ŵöüļđ öţĥéŕŵîšé çöṽéŕ îţ:

collections:
- name: docs
channel: acme/docs
content:
- path: "docs/api-reference.md" # claimed here, at the reference point
channel: acme/reference
- path: "docs/**/*.md" # everything the item above did not claim

Ţĥé base îñ þļàý ĥéŕé îš ţĥé îţéḿ'š öŵñ: ţĥé đîŕéçţöŕý à ḿàţçĥéđ ƒîļé'š þàţĥ îš ḿàđé ŕéļàţîṽé ţö, àƒţéŕ àñý çöļļéçţîöñ base ĥàš ƃééñ ƒöļđéđ îñ. Îţ đéƒàüļţš ţö ţĥé ĝļöƃ'š ƒîẋéđ þŕéƒîẋ, ţĥé ļîţéŕàļ þàŕţ öƒ path ƃéƒöŕé ţĥé ƒîŕšţ ŵîļđçàŕđ (input/docs/ ƒöŕ input/docs/**/*.md). Ţĥé ŕéļàţîṽé þàţĥ đŕîṽéš ţĥé {relpath} / {path} / {dir} ţöķéñš àñđ ĥöŵ ḿüçĥ öƒ ţĥé šöüŕçé ţŕéé à đîŕéçţöŕý-ḿîŕŕöŕ ţàŕĝéţ ŕéþŕöđüçéš.

target îš ţĥé öüţþüţ-þàţĥ ţéḿþļàţé, éẋþàñđéđ þéŕ šöüŕçé ƒîļé àñđ ţàŕĝéţ ļàñĝüàĝé. Ţĥé šüþþöŕţéđ ţöķéñš àŕé:

ŢöķéñḾéàñîñĝÉẋàḿþļé (base input/, šöüŕçé input/docs/api.md)
{lang}Ţàŕĝéţ ļàñĝüàĝéfr
{relpath}Šöüŕçé þàţĥ ŕéļàţîṽé ţö base, ŵîţĥ éẋţéñšîöñdocs/api.md
{path}Šöüŕçé þàţĥ ŕéļàţîṽé ţö base, ŵîţĥöüţ éẋţéñšîöñdocs/api
{dir}Đîŕéçţöŕý þöŕţîöñ öƒ {relpath} (éḿþţý àţ ţĥé ŕööţ)docs
{filename}Ƒîļéñàḿé ŵîţĥ éẋţéñšîöñapi.md
{name}Ƒîļéñàḿé ŵîţĥöüţ éẋţéñšîöñ (àļîàš {basename})api
{ext}Éẋţéñšîöñ ŵîţĥöüţ ţĥé đöţmd

À ƃàŕé * îš šĥöŕţĥàñđ ƒöŕ {name}.

Đîŕéçţöŕý-ḿîŕŕöŕ (ţĥé éàšý đéƒàüļţ). Ŵĥéñ target éñđš ŵîţĥ /, öŕ îţš ļàšţ šéĝḿéñţ ĥàš ñö éẋţéñšîöñ àñđ ñö ŵîļđçàŕđ/ţöķéñ, îţ ñàḿéš à đîŕéçţöŕý àñđ ţĥé šöüŕçé'š {relpath} (üñđéŕ base) îš ḿîŕŕöŕéđ ƃéñéàţĥ îţ. Šö target: output/{lang} ŕéþŕöđüçéš ţĥé šöüŕçé ţŕéé üñđéŕ éàçĥ þéŕ-ļàñĝüàĝé ŕööţ (input/docs/api.mdoutput/fr/docs/api.md) ŵîţĥ ñö * àñđ ñö ŕîšķ öƒ à đöüƃļéđ éẋţéñšîöñ:

collections:
- path: "input/**/*.md"
target: "output/{lang}"

Ţöķéñ ţéḿþļàţé (ţĥé éẋþļîçîţ ƒöŕḿ). Ŵĥéñ ýöü ñééđ ţö ŕéšĥàþé ţĥé ļàýöüţ, ñàḿé ţĥé ţöķéñš:

collections:
- path: "src/locales/en/*.json"
target: "src/locales/{lang}/{name}.{ext}" # api.json → src/locales/fr/api.json

Þŕöƒîļéš àñđ çĥàññéļš

Çöñţéñţ îš ŵŕîţţéñ ƒöŕ à þöîñţ îñ ţĥé çöñţéẋţ šþàçé. Ţŵö àẋéš àŕé šţŕüçţüŕàļ: ţĥé þŕöđüçţ îţ ƃéļöñĝš ţö àñđ ţĥé çĥàññéļ îţ šĥîþš öñ. À ķéý üñđéŕ profiles: îš à þŕöđüçţ, ţĥé çĥàññéļš ţĥàţ þŕöƒîļé ļîšţš àŕé ţĥé çĥàññéļš ţĥàţ þŕöđüçţ šĥîþš öñ, àñđ à çöļļéçţîöñ ñàḿéš ţĥé þöîñţ îţš çöñţéñţ šîţš àţ ŵîţĥ öñé channel: ŕéƒéŕéñçé. Ƒüŕţĥéŕ àẋéš àŕé đéçļàŕéđ üñđéŕ coordinates: (šéé Đéçļàŕéđ àẋéš). Çöñţéẋţ îš ţĥé çöñçéþţ; ţĥîš šéçţîöñ îš ţĥé šçĥéḿà.

profiles:
console:
channels: [app, docs]
voice: .kapi/profiles/console/voice.yaml
sdk:
channels:
- id: docs
concept: term:9a1c0f42b7
- cli
voice: .kapi/voice.yaml
valid_to: 2026-12-01

collections:
- name: console-app
channel: console/app
content:
- path: "console/i18n/**/*.kbf.json"
- name: sdk-docs
channel: sdk/docs
content:
- path: "web/docs/**/*.mdx"
- path: "web/docs/legal/**/*.mdx"
channel: sdk/cli
ƑîéļđŢýþéĐéšçŕîþţîöñ
channelsÇĥàññéļ[]Ţĥé šüŕƒàçéš ţĥîš þŕöđüçţ šĥîþš öñ. À šļüĝ, öŕ {id, concept} îñ ļöñĝ ƒöŕḿ
voiceṼöîçéƂîñđîñĝŢĥé ṽöîçé þŕöƒîļé ĝöṽéŕñîñĝ ţĥîš þŕöđüçţ'š çöñţéñţ, îñ ţĥé šàḿé ƒöŕḿš àš defaults.voice. Üñšéţ ķééþš defaults.voice
termstorešţŕîñĝÀ šţàñđàļöñé ţéŕḿš šţöŕé ĝöṽéŕñîñĝ ţĥîš þŕöđüçţ'š çöñţéñţ, ŕéšöļṽéđ ŕéļàţîṽé ţö ţĥé þŕöĵéçţ ŕööţ. Üñšéţ, ţĥé þŕöĵéçţ'š öŵñ šţöŕé ĝöṽéŕñš
conceptšţŕîñĝŢĥé çöñçéþţ ţĥàţ ñàḿéš ţĥîš þŕöđüçţ, ƒöŕ đîšþļàý. Çàŕŕîéđ àñđ šĥàþé-çĥéçķéđ, ñéṽéŕ ŕéšöļṽéđ đüŕîñĝ ḿàţçĥîñĝ
valid_fromšţŕîñĝĐàţé (YYYY-MM-DD) öŕ ŔƑÇ3339 îñšţàñţ ţĥîš þŕöƒîļé šţàŕţš ĝöṽéŕñîñĝ, îñçļüšîṽé. Üñšéţ îš üñƃöüñđéđ (šéé Þŕöƒîļé ṽàļîđîţý)
valid_tošţŕîñĝĐàţé öŕ ŔƑÇ3339 îñšţàñţ îţ šţöþš, éẋçļüšîṽé. Üñšéţ îš üñƃöüñđéđ

Ţĥé ḿàþ ķéý îš ţĥé þŕöƒîļé'š ñàḿé: ţĥé þŕöđüçţ-àẋîš ṽàļüé îţš çöļļéçţîöñš çàŕŕý, àñđ ţĥé đîŕéçţöŕý üñđéŕ .kapi/profiles/<name>/ ĥöļđîñĝ ţĥé ƒîļéš îţ öṽéŕŕîđéš. À þŕöƒîļé ţĥàţ ƃîñđš ñéîţĥéŕ à ṽöîçé ñöŕ à ṽöçàƃüļàŕý îš šţîļļ à þŕöƒîļé: ţĥé đîŕéçţöŕý îš ţĥé ƃîñđîñĝ.

Þŕöƒîļé ñàḿéš àñđ çĥàññéļš àŕé šļüĝš: ļöŵéŕçàšé ļéţţéŕš, đîĝîţš àñđ ĥýþĥéñš, šţàŕţîñĝ ŵîţĥ à ļéţţéŕ öŕ đîĝîţ. Ţĥéý àŕé ḿàçĥîñé îđéñţîƒîéŕš (šţàƃļé, ñéṽéŕ ţŕàñšļàţéđ, çöḿþàŕàƃļé ƃýţé ƒöŕ ƃýţé), ŵĥîçĥ îš ŵĥý à þŕöƒîļé öŕ à çĥàññéļ ḿàý çàŕŕý à çöñçéþţ ƒöŕ đîšþļàý ƃüţ ŕéšöļüţîöñ ñéṽéŕ ļööķš àţ îţ.

À çöļļéçţîöñ'š channel: îš àļŵàýš ŵŕîţţéñ profile/channel: ţĥé þŕöđüçţ öŵñš ţĥé šüŕƒàçé, àñđ ţĥé ƃîñđîñĝ ŕéàđš àš öñé. À ƃàŕé çĥàññéļ ñàḿé îš à ļöàđ éŕŕöŕ ţĥàţ šþéļļš öüţ ţĥé ǫüàļîƒîéđ ƒöŕḿ(š), éṽéñ ŵĥéñ éẋàçţļý öñé þŕöƒîļé đéçļàŕéš îţ. Ƃîñđîñĝ à çĥàññéļ ŕéǫüîŕéš à ñàḿéđ çöļļéçţîöñ. À çöļļéçţîöñ ţĥàţ ƃîñđš ñöñé îš ĝöṽéŕñéđ ƃý ţĥé þŕöĵéçţ đéƒàüļţ þöîñţ, defaults.voice àñđ ţĥé þŕöĵéçţ'š öŵñ ţéŕḿš.

À çöñţéñţ îţéḿ ḿàý çàŕŕý îţš öŵñ channel:, îñ ţĥé šàḿé ǫüàļîƒîéđ ƒöŕḿ àñđ üñđéŕ ţĥé šàḿé ļöàđ-ţîḿé ṽàļîđàţîöñ, ƒöŕ ţĥé ƒîļéš ţĥàţ îţéḿ ḿàţçĥéš. Îţ îš ţĥé ƒîñéšţ þöîñţ à ŕéçîþé çàñ ñàḿé, àñđ éṽéŕýţĥîñĝ ŕéšöļṽéš ţö îţ: à ƒļöŵ ŕüñ þàŕţîţîöñš ţĥöšé ƒîļéš öüţ öƒ ţĥé ŕéšţ öƒ ţĥé çöļļéçţîöñ àñđ ĝîṽéš ţĥéḿ ţĥéîŕ öŵñ ṽöîçé àñđ ţéŕḿš, kapi check ĝàţéš ţĥéḿ àĝàîñšţ ţĥàţ ṽöçàƃüļàŕý, àñđ kapi context search ŕéþöŕţš îţ àš ţĥé þöîñţ éàçĥ üšé šîţš àţ.

Öñ à çöññéçţéđ þŕöĵéçţ, ţĥé ŕéšöļṽéđ þŕöđüçţ àñđ çĥàññéļ ţŕàṽéļ ţö ţĥé šéŕṽéŕ àš ţĥé çöñţéñţ'š çööŕđîñàţéš, šö ƃöţĥ ṽéñüéš ŕéšöļṽé ţĥé šàḿé ṽöîçé ƒöŕ ţĥé šàḿé çöñţéñţ. À þŕöƒîļé'š termstore: đöéš ñöţ: îţ îš à þàţĥ îñţö ţĥé ļöçàļ þŕöĵéçţ, àñđ à çöññéçţéđ ŕüñ ŵàŕñš ţĥàţ ţĥé ƃîñđîñĝ àþþļîéš ļöçàļļý öñļý.

Çöñṽéñţîöñàļ ƒîļéš

À þŕöƒîļé'š öŵñ đîŕéçţöŕý àñšŵéŕš ƃéƒöŕé ţĥé þŕöĵéçţ đéƒàüļţ đöéš, šö öṽéŕŕîđéš ķéþţ îñ ţĥé çöñṽéñţîöñàļ þļàçé ñééđ ñö ļîñé îñ ţĥé ŕéçîþé. Ŕéšöļüţîöñ ƒöŕ à çöļļéçţîöñ'š þöîñţ, ḿöšţ šþéçîƒîç ƒîŕšţ:

ŠţöŕéÖŕđéŕ
ṽöîçéprofiles.<name>.voice.kapi/profiles/<name>/voice.yamldefaults.voice.kapi/voice.yamlvoice.yaml
ţéŕḿš--termstoreprofiles.<name>.termstore.kapi/profiles/<name>/terms.json (ŵĥéñ ţĥé ƒîļé éẋîšţš) → ţĥé þŕöĵéçţ'š öŵñ šţöŕé

Ţĥé çĥàññéļ ţĥéñ ŕéƒîñéš ţĥé ṽöîçé ţĥàţ ŕéšöļṽéđ: à ḿàţçĥîñĝ éñţŕý üñđéŕ ţĥé ṽöîçé þŕöƒîļé'š öŵñ channels: ŕéþļàçéš îţš ţöñé, îţš šţýļé, öŕ ƃöţĥ, àñđ çàñ àđđ ṽöçàƃüļàŕý ŕüļéš. Ţĥé þŕöƒîļé'š öŵñ ṽöçàƃüļàŕý àþþļîéš öñ éṽéŕý çĥàññéļ, àñđ à çĥàññéļ'š ŕüļéš öñļý àđđ ţö îţ.

Đéçļàŕéđ àẋéš

Ƃéýöñđ þŕöđüçţ àñđ çĥàññéļ, à þŕöĵéçţ ñàḿéš ţĥé ƒüŕţĥéŕ àẋéš îţš çöñţéñţ ṽàŕîéš àļöñĝ üñđéŕ defaults.coordinates. Éṽéŕý çöļļéçţîöñ îñĥéŕîţš ţĥéḿ; à çöļļéçţîöñ ţĥàţ šîţš éļšéŵĥéŕé öñ öñé àẋîš šéţš ţĥàţ àẋîš îñ îţš öŵñ coordinates: àñđ ķééþš ţĥé ŕéšţ. Þéŕ àẋîš, ţĥé ḿöšţ šþéçîƒîç ṽàļüé ŵîñš.

defaults:
coordinates:
brand: acme

collections:
- name: sdk-docs
channel: sdk/docs
coordinates:
mode: reference
content:
- path: "web/docs/**/*.mdx"
ÀẋîšÇöñṽéñţîöñàļ ṽàļüéšḾéàñîñĝ
brandà šļüĝŢĥé ƃŕàñđ à þöîñţ šîţš üñđéŕ, çöàŕšéŕ ţĥàñ þŕöđüçţ
modetutorial, how-to, reference, explanationŢĥé ķîñđ öƒ đöçüḿéñţ àţ ţĥé þöîñţ, îñ ţĥé Đîáţàẋîš šéñšé

Ţĥé ḿàþ îš öþéñ: àñý öţĥéŕ àẋîš ñàḿé îš àççéþţéđ, àñđ ţĥé ṽàļüéš àŕé çöñṽéñţîöñš ŕàţĥéŕ ţĥàñ àñ éñüḿéŕàţîöñ. product àñđ channel àŕé ŕéƒüšéđ üñđéŕ coordinates: àţ ļöàđ, ƃéçàüšé ƃöţĥ àŕé đéŕîṽéđ ƒŕöḿ channel: àñđ à đéçļàŕéđ çöþý çöüļđ çöñţŕàđîçţ ţĥé đéŕîṽéđ öñé. À çöļļéçţîöñ'š ŕéšöļṽéđ þöîñţ (ţĥé đéƒàüļţš, öṽéŕļàîđ ŵîţĥ ŵĥàţ channel: đéŕîṽéš, öṽéŕļàîđ ŵîţĥ îţš öŵñ coordinates:) îš ŵĥàţ kapi context ŕéþöŕţš àñđ ŵĥàţ à çöññéçţéđ þŕöĵéçţ šéñđš ţö ţĥé šéŕṽéŕ.

Þŕöƒîļé ṽàļîđîţý

valid_from àñđ valid_to ƃöüñđ à þŕöƒîļé'š ĝöṽéŕñàñçé îñ ţîḿé, ţĥé šàḿé ĥàļƒ-öþéñ ŵîñđöŵ à ţéŕḿ çàŕŕîéš, ŵîţĥ valid_from îñçļüšîṽé àñđ valid_to éẋçļüšîṽé, šö à valid_to đàţé éẋçļüđéš ţĥàţ ŵĥöļé đàý. À ƃöüñđ îš à đàţé (YYYY-MM-DD) öŕ àñ ŔƑÇ3339 îñšţàñţ; àñ üñþàŕšéàƃļé ƃöüñđ öŕ àñ îñṽéŕţéđ ŕàñĝé ƒàîļš àţ ļöàđ.

À þŕöƒîļé öüţšîđé îţš ŵîñđöŵ đöéš ñöţ ĝöṽéŕñ. Ŕéšöļüţîöñ ƒàļļš ţĥŕöüĝĥ ţö ţĥé ñéẋţ ƃîñđîñĝ (à çöļļéçţîöñ'š çĥàññéļ üñđéŕ àñ éẋþîŕéđ îţéḿ çĥàññéļ, ţĥéñ ţĥé þŕöĵéçţ đéƒàüļţ) éẋàçţļý àš îƒ ţĥé éẋþîŕéđ þŕöƒîļé ŵéŕé àƃšéñţ, àñđ ţĥé ŕüñ, çĥéçķ öŕ þüšĥ ţĥàţ àþþļîéđ ţĥé ƒàļļ-ţĥŕöüĝĥ ŕéþöŕţš îţ öñçé:

governance: profile "sdk" expired 2026-12-01; governing with the project default

Ţĥé îñšţàñţ îš ţĥé ŕüñ'š öŵñ ŵàļļ çļöçķ; ţĥéŕé îš ñö ƒļàĝ ţö ŕéšöļṽé ƒöŕ àñöţĥéŕ đàţé. kapi context search ŕéàđš éṽéŕý ƃöüñđéđ þŕöƒîļé àĝàîñšţ ţĥé çüŕŕéñţ ţîḿé àñđ ļàƃéļš îţ active, upcoming öŕ expired, šö à ŵîñđöŵ çàñ ƃé šééñ ƃéƒöŕé îţ çļöšéš.

Đéƒàüļţš

defaults ĥöļđš þŕöĵéçţ-ŵîđé þŕöçéššîñĝ šéţţîñĝš ţĥàţ îñđîṽîđüàļ çöñţéñţ îţéḿš çàñ öṽéŕŕîđé. Šéṽéŕàļ öƒ ţĥéšé àŕé ĝöṽéŕñéđ ƃý Ḿ-01.

ƑîéļđŢýþéĐéšçŕîþţîöñ
source_languagešţŕîñĝƂÇÞ-47 šöüŕçé ļöçàļé (é.ĝ., en)
target_languagesšţŕîñĝ[]ƂÇÞ-47 ţàŕĝéţ ļöçàļéš
locale_formatšţŕîñĝĻöçàļé šţýļé ƒöŕ ţĥé {lang} þļàçéĥöļđéŕ: bcp-47 (đéƒàüļţ) öŕ posix
concurrencyîñţÑüḿƃéŕ öƒ ƒîļéš ţö þŕöçéšš îñ þàŕàļļéļ
parallel_blocksîñţÑüḿƃéŕ öƒ ƃļöçķš ţö þŕöçéšš îñ þàŕàļļéļ ŵîţĥîñ à ƒîļé
encodingšţŕîñĝÎñþüţ ƒîļé éñçöđîñĝ (đéƒàüļţ: utf-8)
excludešţŕîñĝ[]Ĝļöƃ þàţţéŕñš ñö çöļļéçţîöñ çļàîḿš: çöñţéñţ šçàññîñĝ šķîþš ţĥéḿ, àñđ à ƒîļé ýöü ñàḿé ţĥàţ öñé ḿàţçĥéš šîţš àţ ţĥé þŕöĵéçţ'š đéƒàüļţ þöîñţ (é.ĝ. **/*.generated.json)
formatsḿàþÞéŕ-ƒöŕḿàţ preset, config, àñđ đéţéçţîöñ priority öṽéŕŕîđéš (šéé ƒöŕḿàţš)
mergeḾéŕĝéĐéƒàüļţšĤöŵ kapi merge ŕéšöļṽéš à ţŕàñšļàţöŕ'š ţàŕĝéţ àĝàîñšţ àñ éẋîšţîñĝ ţàŕĝéţ öŕ çöñţéñţ-ḿéḿöŕý éñţŕý (šéé ḿéŕĝé)
memoryḾéḿöŕýĐéƒàüļţšÇöñţéñţ-ḿéḿöŕý þŕé-ƒîļļ öñ kapi extract àñđ ŵŕîţé-ƃàçķ öñ kapi merge (šéé ḿéḿöŕý)
segmentationŠéĝḿéñţàţîöñĐéƒàüļţšÖþţ-îñ šéñţéñçé-ļéṽéļ šéĝḿéñţàţîöñ öṽéŕļàý àþþļîéđ öñ éẋţŕàçţ (šéé šéĝḿéñţàţîöñ)
redactionŔéđàçţîöñŠþéçŔéþļàçé šéñšîţîṽé çöñţéñţ ŵîţĥ þŕöţéçţéđ þļàçéĥöļđéŕš ƃéƒöŕé þŕöçéššîñĝ àñđ ŕéšţöŕé îţ àƒţéŕŵàŕđš (šéé ŕéđàçţîöñ)
annotationsÀññöţàţîöñĐéƒàüļţšwrite: ļîšţš ţĥé àññöţàţîöñ ţýþéš à ŵŕîţéŕ đŕàŵš îñţö ţĥé đöçüḿéñţ àš îñļîñé ḿàŕķš, öüţ öƒ ŵĥàţ ţĥé ƒöŕḿàţ đéçļàŕéš îţ çàñ çàŕŕý. Éḿþţý đŕàŵš éṽéŕý ţýþé ţĥé ƒöŕḿàţ šüþþöŕţš; ñàḿîñĝ à ţýþé à ƒöŕḿàţ çàññöţ çàŕŕý àšķš ƒöŕ ñöţĥîñĝ ţĥéŕé
commentsḿàþdirectives: ḿàŕķéŕš ýöüŕ öŵñ ţööļš ŕéàđ àţ ţĥé šţàŕţ öƒ à çöḿḿéñţ ļîñé, šéţ àšîđé ŵĥéŕéṽéŕ kapi ŕéàđš ţĥé þŕöĵéçţ'š çöḿḿéñţš. channel: ţĥé þöîñţ, à ǫüàļîƒîéđ profile/channel, àţ ŵĥîçĥ éṽéŕý đéçļàŕéđ îţéḿ'š çöḿḿéñţš šîţ üñļéšš ţĥé îţéḿ ñàḿéš îţš öŵñ (šéé Çöḿḿéñţš îñ šöüŕçé çöđé)
voiceṼöîçéƂîñđîñĝƂîñđ à ṽöîçé þŕöƒîļé àš šţàñđîñĝ þŕöĵéçţ çöñţéẋţ (šéé ṽöîçé). À þŕöƒîļé'š öŵñ voice: öṽéŕŕîđéš îţ ƒöŕ ţĥàţ þŕöđüçţ'š çöñţéñţ
coordinatesḿàþŢĥé þŕöĵéçţ'š đéƒàüļţ þöîñţ öñ ţĥé đéçļàŕéđ àẋéš (brand, mode), îñĥéŕîţéđ ƃý éṽéŕý çöļļéçţîöñ; product àñđ channel àŕé đéŕîṽéđ ƒŕöḿ channel: àñđ ŕéĵéçţéđ ĥéŕé (šéé Đéçļàŕéđ àẋéš)
terms_sourcešţŕîñĝÇöḿḿîţţéđ, ĝîţ-ţŕàçķéđ ñàţîṽé šöüŕçé ƃüñđļé (à .terms.json) ţĥé þŕöĵéçţ'š ţéŕḿš àŕé çöḿþîļéđ ƒŕöḿ; kapi apply éđîţš îţ àñđ ŕé-îḿþöŕţš îñţö ţĥé þŕöĵéçţ šţöŕé, šö git diff îš ţĥé ŕéṽîéŵ šüŕƒàçé. Ƃîñđš àñý þàţĥ. Üñšéţ, kapi ƒàļļš ƃàçķ ţö <root>/.kapi/terms.json (ţĥé çöñṽéñţîöñàļ ĥöḿé îñ ţĥé çöḿḿîţţéđ çöñţéẋţ ĝŕàþĥ), ţĥéñ <root>/terms.json
memory_sourcešţŕîñĝÇöḿḿîţţéđ, ĝîţ-ţŕàçķéđ ñàţîṽé šöüŕçé ƃüñđļé (à .memory.json) ţĥé þŕöĵéçţ çöñţéñţ ḿéḿöŕý îš çöḿþîļéđ ƒŕöḿ, ţĥé çöñţéñţ-ḿéḿöŕý àñàļöĝüé öƒ terms_source. Îţ ĥàš ñö çöñṽéñţîöñàļ-ļöçàţîöñ ƒàļļƃàçķ: à þŕöĵéçţ ĥàš öñé àþþŕöṽéđ ţéŕḿ ļîšţ ƃüţ ḿàñý ḿéḿöŕý ƃüñđļéš (öñé þéŕ çöñţéñţ šüŕƒàçé), šö à šééđ îš àļŵàýš ñàḿéđ
toolsḿàþÞŕöĵéçţ-ļéṽéļ ţööļ þŕéšéţš, ķéýéđ ƃý ţööļ ñàḿé: çöñƒîĝ àþþļîéđ ŵĥéŕéṽéŕ ţĥàţ ţööļ ŕüñš îñ à þŕöĵéçţ ƒļöŵ. À šţéþ'š öŵñ config öṽéŕŕîđéš à þŕéšéţ þéŕ ķéý. term_rules: îš ţĥé ķéý term-check, translate, recycle, dnt-check àñđ pseudo-translate ţàķé ĥéŕé (öñé ţéŕḿ, ŵĥàţ ţö üšé îñšţéàđ, àñđ à šéṽéŕîţý; šéé ţĥé ṽöîçé þŕöƒîļé ŕéƒéŕéñçé)
localesḿàþÞéŕ-ţàŕĝéţ-ļàñĝüàĝé öṽéŕŕîđéš ķéýéđ ƃý ļöçàļé. Éàçĥ éñţŕý'š tools: þŕéšéţš ḿéŕĝé öṽéŕ defaults.tools àñđ üñđéŕ à šţéþ'š öŵñ çöñƒîĝ ŵĥéñéṽéŕ à ƒļöŵ ŕüñš ƒöŕ ţĥàţ ļöçàļé, šö öñé ļöçàļé çàñ éñàƃļé ŕéđàçţîöñ öŕ à đéŕéñţ ḿöđéļ ŵîţĥöüţ ƒöŕķîñĝ ţĥé ƒļöŵ (šéé ţĥé kapi ļööþ)
flowšţŕîñĝŢĥé þŕöĵéçţ'š đéƒàüļţ ƒļöŵ, ţĥé çöḿþöšéđ ƒļöŵ kapi up ŕüñš ţö çàţçĥ üþ éṽéŕý ļöçàļé. À ƃüîļţ-îñ ñàḿé (é.ĝ. translate) öŕ à ķéý îñ flows:. Éḿþţý ŕüñš ţĥé ƃüîļţ-îñ đéƒàüļţ (ŕéçýçļé → ţŕàñšļàţé)
materializešţŕîñĝŴĥö đéļîṽéŕš ţŕàñšļàţéđ ƒîļéš. manual (đéƒàüļţ) ļéàṽéš đéļîṽéŕý ţö kapi merge öŕ kapi up --materialize; on-converge ḿàķéš kapi up ŵŕîţé à ļöçàļé'š ƒîļéš ţö ţĥé çöļļéçţîöñ'š target: öñļý öñçé îţš ĝàţéđ šçöþéš àŕé šĥîþþàƃļé
jobsîñţĤöŵ ḿàñý ţàŕĝéţ ļàñĝüàĝéš öñé kapi up þàšš ŕüñš çöñçüŕŕéñţļý. 0 (đéƒàüļţ) ļéàṽéš îţ ţö ţĥé ŕüññéŕ (4); --jobs öṽéŕŕîđéš þéŕ ŕüñ
source_gatešţŕîñĝŠöüŕçé-ƒîŕšţ çöñṽéŕĝéñçé ļéṽéļ: ţĥé šöüŕçé šţàţüš à ƃļöçķ ḿüšţ ŕéàçĥ ƃéƒöŕé îţ îš ţŕàñšļàţéđ (šéé šöüŕçé_ĝàţé)

Îñđîṽîđüàļ çöñţéñţ îţéḿš çàñ öṽéŕŕîđé redaction þéŕ éñţŕý (ContentItem.redaction).

šöüŕçé_ĝàţé

defaults.source_gate îš ţĥé šöüŕçé-ƒîŕšţ çöñṽéŕĝéñçé ĝàţé: ţĥé šöüŕçé šţàţüš à ƃļöçķ ḿüšţ ŕéàçĥ ƃéƒöŕé ţĥé ļööþ ţŕàñšļàţéš îţ. Îţ ĝàţéš ţĥé ƒàñ-öüţ, àñđ îš đîšţîñçţ ƒŕöḿ ţĥé ţöþ-ļéṽéļ source_gate çöṽéŕàĝé ƃàŕ ţĥàţ kapi check --ship éṽàļüàţéš. Šöüŕçé-ƒîŕšţ çöñṽéŕĝéñçé šéţţļéš ţĥé šöüŕçé (ţéŕḿîñöļöĝý, ṽöîçé, šöüŕçé çĥéçķš) àñđ ĥöļđš ţĥé ƒàñ-öüţ öñ îţ, šö àñ üñšéţţļéđ, ñöñ-çöḿþļîàñţ, üñ-ţéŕḿ-çĥéçķéđ šöüŕçé îš ñéṽéŕ ţŕàñšļàţéđ îñţö éṽéŕý ļöçàļé öñļý ţö ƃé ŕéđöñé ŵĥéñ îţ çĥàñĝéš. Šéé Çöñṽéŕĝéñçé: šöüŕçé ƒîŕšţ.

defaults:
source_gate: checked # the default: source cleared its automated terminology,
# voice, and source checks (no human bottleneck)
# source_gate: approved # require a human/agent source sign-off first
# source_gate: none # opt out: raw fan-out, no source gate
ṼàļüéḾéàñîñĝ
(üñšéţ)Ŕüññéŕ àþþļîéš ţĥé đéƒàüļţ (checked)
authoredÞŕéšéñçé ƃàšéļîñé: àñý ñöñ-éḿþţý šöüŕçé ǫüàļîƒîéš
checkedĐéƒàüļţ: šöüŕçé þàššéđ îţš àüţöḿàţéđ ţéŕḿîñöļöĝý, ṽöîçé àñđ šöüŕçé çĥéçķš
approvedÀ ĥüḿàñ öŕ àĝéñţ šîĝñéđ öƒƒ ţĥé šöüŕçé (ṽöîçé-çŕîţîçàļ öŕ ŕéĝüļàţéđ çöñţéñţ)
noneĐéļîƃéŕàţé öþţ-öüţ: ţŕàñšļàţé ŵîţĥöüţ šéţţļîñĝ ţĥé šöüŕçé ƒîŕšţ

Öñ à çöññéçţéđ þŕöĵéçţ, à ƃéļöŵ-ĝàţé šöüŕçé ĥöļđš ţĥé çöñṽéŕĝéñçé ŕüñ (source_not_ready) àñđ öþéñš à šöüŕçé-ŕéṽîéŵ ţàšķ ŕàţĥéŕ ţĥàñ ţŕàñšļàţîñĝ; ţĥé šöüŕçé-šîđé çöṽéŕàĝé ƃàŕ àñđ ţĥîš çöñṽéŕĝéñçé ļéṽéļ àŕé îñđéþéñđéñţ çöñţŕöļš.

ƒöŕḿàţš

defaults.formats çöñƒîĝüŕéš ƒöŕḿàţš ƃý ñàḿé, šö à šîñĝļé ŵîļđçàŕđ çöñţéñţ îţéḿ (path: "input/*", ñö format:) çàñ ļéţ éàçĥ ƒîļé'š éñĝîñé ƃé àüţö-đéţéçţéđ ŵĥîļé ýöü šţîļļ ţüñé îñđîṽîđüàļ ƒöŕḿàţš îñ öñé þļàçé. Éàçĥ éñţŕý ţàķéš:

ƑîéļđŢýþéĐéšçŕîþţîöñ
presetšţŕîñĝÀ ñàḿéđ ƒöŕḿàţ þŕéšéţ àþþļîéđ ţö ţĥîš ƒöŕḿàţ (šéé kapi formats)
configḿàþŔéàđéŕ öþţîöñ öṽéŕŕîđéš ƒöŕ ţĥîš ƒöŕḿàţ (ḿéŕĝéđ üñđéŕ, àñđ öṽéŕŕîđàƃļé ƃý, à çöñţéñţ îţéḿ'š format.config)
priorityîñţĐéţéçţîöñ þŕîöŕîţý; ĥîĝĥéŕ ŵîñš ŵĥéñ šéṽéŕàļ ƒöŕḿàţš çļàîḿ ţĥé šàḿé éẋţéñšîöñ

priority îš ţĥé éñĝîñé-þîñ éšçàþé ĥàţçĥ. Ḿöšţ éẋţéñšîöñš ḿàþ ţö öñé ƒöŕḿàţ, ƃüţ šöḿé àŕé çļàîḿéđ ƃý šéṽéŕàļ: .srt ƃý ƃöţĥ okf_vtt àñđ okf_regex, .txt ƃý šéṽéŕàļ þļàîñ-ţéẋţ éñĝîñéš. Ƃüḿþîñĝ ţĥé þŕéƒéŕŕéđ öñé šţééŕš àüţö-đéţéçţîöñ ŵîţĥöüţ ñàḿîñĝ à ƒöŕḿàţ öñ éṽéŕý îţéḿ:

plugins:
okapi-bridge: "*"
defaults:
formats:
okf_vtt:
priority: 110 # .srt → WebVTT engine (beats okf_regex)
okf_json:
config:
useFullKeyPath: true
collections:
- name: Source Files
content:
- path: "input/*" # every file; engine auto-detected, two pinned above
target: "output/{lang}"

Þļüĝîñ ƒöŕḿàţš àļŕéàđý öüţŕàñķ ƃüîļţ-îñ öñéš ƃý đéƒàüļţ (þŕîöŕîţý 100 ṽš 50), šö đéçļàŕîñĝ okapi-bridge îš éñöüĝĥ ƒöŕ input/* ţö ŕéšöļṽé ţö ţĥé okf_* éñĝîñéš; priority öñļý ḿàţţéŕš ţö ƃŕéàķ ţîéš ƃéţŵééñ ƒöŕḿàţš ƒŕöḿ ţĥé šàḿé šöüŕçé.

ḿéŕĝé

ƑîéļđŢýþéĐéšçŕîþţîöñ
conflict_policyšţŕîñĝtranslator-wins (đéƒàüļţ), existing-wins, öŕ newest-wins

ḿéḿöŕý

ƑîéļđŢýþéĐéšçŕîþţîöñ
fuzzy_thresholdîñţḾîñîḿüḿ ƒüžžý ḿàţçĥ šçöŕé (0–100) ţö þŕé-ƒîļļ ţĥé ţàŕĝéţ öñ éẋţŕàçţ (đéƒàüļţ: 75)

šéĝḿéñţàţîöñ

ƑîéļđŢýþéĐéšçŕîþţîöñ
sourceƃööļŢöĝĝļé šéñţéñçé-ļéṽéļ šéĝḿéñţàţîöñ öƒ šöüŕçé ţéẋţ öñ éẋţŕàçţ
srxšţŕîñĝÖþţîöñàļ ŠŔẊ ŕüļéš ƒîļé; ƃüîļţ-îñ đéƒàüļţ ŕüļéš àŕé üšéđ ŵĥéñ éḿþţý

ŕéđàçţîöñ

Ţĥé šéñšîţîṽé ţéŕḿ ļîšţ ļîṽéš îñ à šéþàŕàţé ŕüļéš ƒîļé ŕéƒéŕéñçéđ ƃý rules (šö îţ çàñ ƃé ĝîţîĝñöŕéđ); ţĥîš šþéç þöîñţš àţ îţ àñđ šéļéçţš đéţéçţîöñ ƃàçķéñđš.

ƑîéļđŢýþéĐéšçŕîþţîöñ
enabledƃööļŢüŕñ ŕéđàçţîöñ öñ ƒöŕ éẋţŕàçţ/ḿéŕĝé
rulesšţŕîñĝÞàţĥ ţö à ŕéđàçţîöñ ŕüļéš ÝÀḾĻ ƒîļé
detectorsšţŕîñĝ[]Đéţéçţîöñ ƃàçķéñđš: rules àñđ/öŕ entities
placeholderšţŕîñĝÖṽéŕŕîđé ţĥé ṽîšîƃļé šţàñđ-îñ ţéḿþļàţé, é.ĝ. [REDACTED:{category}]

ṽöîçé

Ƃîñđ à ṽöîçé þŕöƒîļé üñđéŕ defaults.voice. Éẋàçţļý öñé šöüŕçé îš éẋþéçţéđ. Ţĥé šĥöŕţ ƒöŕḿ îš ţĥé þŕöƒîļé ƒîļé îţšéļƒ, voice: .kapi/voice.yaml, ŵĥîçĥ îš ŵĥàţ à ŕéçîþé ŵŕîţéš ŵĥéñ ţĥé þŕöƒîļé îš à ƒîļé îñ ţĥé þŕöĵéçţ, àš îţ üšüàļļý îš.

ƑîéļđŢýþéĐéšçŕîþţîöñ
profile_filešţŕîñĝÞàţĥ ţö à šţàñđàļöñé þŕöƒîļé ÝÀḾĻ, ŕéšöļṽéđ ŕéļàţîṽé ţö ţĥé þŕöĵéçţ ŕööţ
profilešţŕîñĝÑàḿé öƒ à þŕöƒîļé îñ ţĥé ļöçàļ ṽöîçé šţöŕé
packšţŕîñĝÑàḿé öƒ à ƃüîļţ-îñ šţàŕţéŕ þàçķ

Ƒļöŵ Šţéþš

Éàçĥ ƒļöŵ çöñţàîñš àñ öŕđéŕéđ ļîšţ öƒ šţéþš. Šéé Ƒļöŵ Šţéþš Ƒöŕḿàţ ƒöŕ ţĥé ƒüļļ šþéçîƒîçàţîöñ.

flows:
my-flow:
steps:
- tool: translate # tool name (required)
config: # tool-specific config (optional)
provider: anthropic
label: "Translate" # display label (optional)

Šţéþš çàñ àļšö đéƒîñé þàŕàļļéļ ƃŕàñçĥéš:

flows:
parallel-qa:
steps:
- parallel:
- tool: qa
- tool: qa
config:
provider: anthropic

Šĥîþ ĝàţéš

Šĥîþ ĝàţéš đéçîđé ŵĥéñ ţŕàñšļàţéđ çöñţéñţ îš šĥîþþàƃļé: çöṽéŕàĝé ţĥŕéšĥöļđš öṽéŕ ţĥé ţàŕĝéţ ļîƒéçýçļé ļàđđéŕ (drafttranslatedreviewedsigned-off), éñƒöŕçéđ ƃý kapi check --ship àñđ đŕîṽéñ ţöŵàŕđ ƃý kapi up. Ţĥé ḿöđéļ (ļàđđéŕš, đéŕîṽéđ šţàţé, ŕéṽîéŵ) îš ţĥé kapi ļööþ; ţĥîš šéçţîöñ îš ţĥé šçĥéḿà. Àļļ öƒ ţĥéšé ķéýš àŕé ţöþ-ļéṽéļ (šîƃļîñĝš öƒ defaults) àñđ öþţîöñàļ: ŵîţĥ ñöñé šéţ, ñöţĥîñĝ îš ĝàţéđ.

ƑîéļđŢýþéĐéšçŕîþţîöñ
ship_gateĜàţéÀ šîñĝļé çàţçĥ-àļļ ĝàţé: šţàţé ñàḿé → ţĥŕéšĥöļđ
ship_gatesŠĥîþĜàţéŔüļé[]Šçöþéđ ŕüļéš, éàçĥ à šéļéçţöŕ þļüš à ĝàţé; ŵĥéñ þŕéšéñţ îţ ŕéþļàçéš ship_gate
gatesḿàþÑàḿéđ ĝàţé ŕéĝîšţŕý; à ship_gates ŕüļé ŕéƒéŕéñçéš àñ éñţŕý ŵîţĥ gate: <name>
source_gateĜàţéÀ ĝàţé öṽéŕ ţĥé šöüŕçé àüţĥöŕîñĝ ļàđđéŕ (authoredcheckedapproved)
verified_gateĜàţéÀ šîñĝļé çàţçĥ-àļļ ṽéŕîƒîéđ ĝàţé, îñ ţĥé šàḿé ţĥŕéšĥöļđ ƒöŕḿ àš ship_gate
verified_gatesŠĥîþĜàţéŔüļé[]Šçöþéđ ṽéŕîƒîéđ-ĝàţé ŕüļéš; ţĥé ḿöšţ šþéçîƒîç ŕüļé ŵîñš

Šĥîþþîñĝ àñđ ƃéîñĝ ṽéŕîƒîéđ àŕé îñđéþéñđéñţ ŕéàđîñĝš. À ṽéŕîƒîéđ ĝàţé ñàḿéš ţĥé ƃàŕ à ļöçàļé ḿüšţ çļéàŕ ţö ƃé ŕéþöŕţéđ àš ṽéŕîƒîéđ (ƃý kapi status --ship àñđ ţĥé šĥîþ-àŵàŕé ļàñĝüàĝé þîçķéŕ), àñđ à ļöçàļé çàñ šĥîþ ŵîţĥöüţ ḿééţîñĝ îţ. Ŵîţĥ ñéîţĥéŕ ṽéŕîƒîéđ ķéý šéţ, ñö ļöçàļé îš ṽéŕîƒîéđ.

À šçöþé ñö šĥîþ ĝàţé ŕüļé ḿàţçĥéš îš ñöţ ĝàţéđ. kapi status àñđ kapi up ñàḿé îţ ñöţ ĝàţéđ ŕàţĥéŕ ţĥàñ šĥîþþàƃļé, àñđ kapi status --ship ŕéçöŕđš "state": "not_gated" ƒöŕ îţš ļöçàļé. Ñöţĥîñĝ ĥöļđš à ñöţ-ĝàţéđ šçöþé ƃàçķ öñ çöṽéŕàĝé, šö kapi up đéļîṽéŕš îţ üñđéŕ materialize: on-converge àñđ à ļàñĝüàĝé þîçķéŕ öƒƒéŕš îţ. Šţàļé ŵöŕđîñĝ, à ţŕàñšļàţîöñ à ŕéṽîéŵéŕ ţüŕñéđ đöŵñ, à ƒàîļîñĝ çĥéçķ, öŕ ţéŕḿš ţĥàţ ŵéŕé ñöţ çĥéçķéđ ŵîţĥĥöļđ à šçöþé ŵĥéţĥéŕ öŕ ñöţ à ĝàţé ḿàţçĥéš îţ. Éàçĥ šçöþé ŕéàđš àš öñé öƒ ţĥŕéé šĥîþ šţàţéš:

ŠţàţéŴĥéñ
shippableÀ šĥîþ ĝàţé ḿàţçĥéš ţĥé šçöþé àñđ ţĥé šçöþé çļéàŕš îţ, ŵîţĥ ñöţĥîñĝ ŵîţĥĥöļđîñĝ îţ
withheldŢĥé šçöþé îš šĥöŕţ öƒ à ḿàţçĥîñĝ ĝàţé, öŕ šţàļé, ŕéĵéçţéđ, ƒàîļîñĝ öŕ üñçĥéçķéđ çöñţéñţ ĥöļđš îţ ƃàçķ
not_gatedÑö šĥîþ ĝàţé ḿàţçĥéš ţĥé šçöþé, àñđ ñöţĥîñĝ ŵîţĥĥöļđš îţ

Ĝàţé àñđ ţĥŕéšĥöļđš

À ĝàţé ḿàþš à ļîƒéçýçļé šţàţé ţö à ţĥŕéšĥöļđ. À šçöþé çļéàŕš ţĥé ĝàţé ŵĥéñ, ƒöŕ éṽéŕý ţĥŕéšĥöļđ, àţ ļéàšţ ţĥàţ þéŕçéñţ öƒ îţš üñîţš àŕé àţ ţĥàţ šţàţé öŕ ĥîĝĥéŕ öñ ţĥé ļàđđéŕ. À ţĥŕéšĥöļđ îš ŵŕîţţéñ îñ öñé öƒ ţŵö ƒöŕḿš:

ƑöŕḿÉẋàḿþļéḾéàñîñĝ
Šĥöŕţreviewed: 80Àţ ļéàšţ 80% àţ ŕéṽîéŵéđ öŕ ĥîĝĥéŕ; àþþŕöṽéŕ çļàšš đéƒàüļţš ţö human
Éẋţéñđéđreviewed: {pct: 80, by: any}pct (0–100) þļüš àñ éẋþļîçîţ àþþŕöṽéŕ çļàšš by

pct ḿüšţ ƃé 0–100; à ţĥŕéšĥöļđ öƒ 0 ḿéàñš "ñöţ ŕéǫüîŕéđ". by šéļéçţš ţĥé àþþŕöṽéŕ çļàšš ƒöŕ ţĥé đéçîšîöñ ŕüñĝš (ŕéṽîéŵéđ, šîĝñéđ-öƒƒ): human (ţĥé đéƒàüļţ) çöüñţš öñļý đéçîšîöñš ḿàđé ƃý à þéŕšöñ öŕ àñ àĝéñţ àçţîñĝ ƒöŕ öñé, any àļšö çöüñţš àüţöñöḿöüš ÀÎ àþþŕöṽàļš. Ţĥé šĥöŕţ ƒöŕḿ àļŵàýš ḿéàñš by: human; àñ ÀÎ-àþþŕöṽéđ üñîţ ñéṽéŕ šàţîéš îţ. Šéé àþþŕöṽéŕ çļàššéš ƒöŕ ţĥé ŕàţîöñàļé.

Šîḿþļé ƒöŕḿ, öñé ƃàŕ ƒöŕ ţĥé ŵĥöļé þŕöĵéçţ:

ship_gate: { translated: 100, reviewed: 80 }

Éṽéŕý üñîţ ţŕàñšļàţéđ, ţĥé îḿþöŕţàñţ 80% ŕéṽîéŵéđ ƃý à þéŕšöñ; ţĥé ļöñĝ ţàîļ šĥîþš ḿàçĥîñé-ţŕàñšļàţéđ.

Éẋţéñđéđ ţĥŕéšĥöļđš, ţĥé šàḿé šĥàþé ŵîţĥ éẋþļîçîţ pct/by:

ship_gate:
translated: 100
reviewed: { pct: 100, by: any }

Ƒüļļý ŕéṽîéŵéđ, ƃüţ àüţöñöḿöüš ÀÎ ŕéṽîéŵš çöüñţ ţöŵàŕđ ţĥé ƃàŕ.

ŠĥîþĜàţéŔüļé

ship_gates îš àñ öŕđéŕéđ ŕüļé ļîšţ. Éàçĥ ŕüļé ĥàš:

ƑîéļđŢýþéĐéšçŕîþţîöñ
whenŠéļéçţöŕÖþţîöñàļ ḿàţçĥ: locales àñđ/öŕ collections (šţŕîñĝ ļîšţš). Öḿîţţéđ = çàţçĥ-àļļ đéƒàüļţ
gateĜàţé öŕ šţŕîñĝÀñ îñļîñé ţĥŕéšĥöļđ ḿàþ, öŕ ţĥé ñàḿé öƒ àñ éñţŕý îñ ţĥé gates ŕéĝîšţŕý

Àñ éḿþţý šéļéçţöŕ àẋîš ḿàţçĥéš éṽéŕýţĥîñĝ, šö à ŕüļé ŵîţĥ ñö when: îš ţĥé đéƒàüļţ. Ŵĥéñ šéṽéŕàļ ŕüļéš ḿàţçĥ à (çöļļéçţîöñ, ļöçàļé) üñîţ, ţĥé ŕüļé çöñšţŕàîñîñĝ ţĥé ḿöšţ àẋéš ŵîñš ŵĥöļéšàļé; àḿöñĝ éǫüàļ šþéçîƒîçîţý, ţĥé éàŕļîéšţ-ļîšţéđ ŵîñš.

Šçöþéđ ŕüļéš, ŵĥéŕé đéŕéñţ šçöþéš àñšŵéŕ ţö đéŕéñţ ƃàŕš:

ship_gates:
- when: { locales: [de] } # contractually reviewed market
gate: { translated: 100, reviewed: 100 }
- when: { collections: [Legal] } # regulated content, every locale
gate: { translated: 100, signed-off: 100 }
- gate: { translated: 100, reviewed: 80 } # the default

Ñàḿéđ ĝàţéš, đéƒîñéđ öñçé îñ ţĥé gates ŕéĝîšţŕý àñđ ŕéƒéŕéñçéđ ƃý ñàḿé:

gates:
contractual: { translated: 100, reviewed: { pct: 100, by: human } }
machine: { translated: 100, reviewed: { pct: 100, by: any } }

ship_gates:
- when: { locales: [de, ja] }
gate: contractual
- gate: machine

À ţîéŕéđ þéŕ-ḿàŕķéţ šţŕàţéĝý ƃüîļţ ƒŕöḿ ţĥéšé þîéçéš îš ŵöŕķéđ ţĥŕöüĝĥ îñ Ţîéŕ ĝàţéš þéŕ ḿàŕķéţ.

šöüŕçé_ĝàţé

Ţĥé šöüŕçé-šîđé çöṽéŕàĝé ĝàţé: à ţĥŕéšĥöļđ ḿàþ öṽéŕ ţĥé àüţĥöŕîñĝ ļàđđéŕ (authoredcheckedapproved), ĝàţîñĝ ţĥé àüţĥöŕ'š öŵñ çöñţéñţ ŕàţĥéŕ ţĥàñ ţĥé ţŕàñšļàţîöñš.

source_gate: { checked: 100 }

Éṽéŕý šöüŕçé üñîţ çļéàŕš îţš ƃöüñđ ṽöîçé àñđ ţéŕḿîñöļöĝý çĥéçķš ƃéƒöŕé kapi check --ship þàššéš. Ļîķé ship_gate, ţĥé ţöþ-ļéṽéļ source_gate îš à çöṽéŕàĝé ƃàŕ éṽàļüàţéđ ƃý kapi check --ship; šöüŕçé đŕîƒţ ñéṽéŕ ƃļöçķš àñ öŕđîñàŕý ƃüîļđ.

Ţĥîš îš đîšţîñçţ ƒŕöḿ defaults.source_gate, ţĥé šöüŕçé-ƒîŕšţ çöñṽéŕĝéñçé ļéṽéļ (checked / approved / none) ţĥàţ đéçîđéš ŵĥéţĥéŕ ţĥé ļööþ ţŕàñšļàţéš à ƃļöçķ àţ àļļ. Ţĥé çöṽéŕàĝé ƃàŕ àñšŵéŕš îš ţĥé šöüŕçé šĥîþþàƃļé?; ţĥé çöñṽéŕĝéñçé ļéṽéļ àñšŵéŕš ḿàý ţĥîš šöüŕçé ƃé ţŕàñšļàţéđ ýéţ?.

Ķéý Þŕöþéŕţîéš

  • Ñö çŕéđéñţîàļš: ÀÞÎ ķéýš àŕé ñéṽéŕ šţöŕéđ îñ à kapi þŕöĵéçţ ƒîļé. Ţĥéý çöḿé ƒŕöḿ ţĥé ÖŠ ķéýçĥàîñ (kapi credentials add, šĥàŕéđ ŵîţĥ Kapi Đéšķţöþ) öŕ ƒŕöḿ éñṽîŕöñḿéñţ ṽàŕîàƃļéš.
  • Ñö šţàţé: ñö šýñç çüŕšöŕš, çàçĥéš, öŕ ţîḿéšţàḿþš. À kapi þŕöĵéçţ ƒîļé îš àļŵàýš çļéàñ àñđ šàƒé ţö çöḿḿîţ.
  • Þöŕţàƃļé: öñé kapi.yaml þéŕ þŕöĵéçţ ƒöļđéŕ; šĥàŕé ṽîà ĝîţ.
  • ÇĻÎ-çöḿþàţîƃļé: kapi run flowname -p kapi.yaml

Üšîñĝ ŵîţĥ Kapi ÇĻÎ

# Run a flow from a Kapi project
kapi run translate -p kapi.yaml

# Override defaults with CLI flags
kapi run translate -p kapi.yaml --target-lang de --provider openai

# One-shot mode still works without a project
kapi translate -i file.json --target-lang fr

Üšîñĝ ŵîţĥ Kapi Đéšķţöþ

  • Ƒîļé > Öþéñ ļöàđš à þŕöĵéçţ ƃý îţš ƒöļđéŕ (ţĥé öñé çöñţàîñîñĝ kapi.yaml)
  • Ƒîļé > Ñéŵ Þŕöĵéçţ çŕéàţéš öñé ƒŕöḿ šçŕàţçĥ: à ñàḿé, à ļöçàţîöñ àñđ à šöüŕçé ļàñĝüàĝé
  • Ƒîļé > Ŕéçéñţ Þŕöĵéçţš ŕéöþéñš öñé ýöü ĥàṽé ŵöŕķéđ îñ ƃéƒöŕé

Ţĥé àþþ öþéñš ţö ýöüŕ þŕöĵéçţš àñđ éđîţš ţĥé ŕéçîþé îñ þļàçé: çöñţéñţ àñđ ĝöṽéŕñàñçé üñđéŕ Þŕöĵéçţ Šéţţîñĝš, ţĥé šţöŕéš üñđéŕ Çöñţéẋţ. Šéé ţĥé đéšķţöþ öṽéŕṽîéŵ.

Šéé àļšö

  • Ç-01: Þŕöĵéçţ ḿöđéļ: ţĥé àŕçĥîţéçţüŕàļ đéçîšîöñ ƃéĥîñđ ţĥé kapi.yaml ŕéçîþé àñđ îţš éẋţéñšîöñ ḿéçĥàñîšḿ.
  • kapi.ýàḿļ Þŕöĵéçţ Ƒîļé Ƒöŕḿàţ: ţĥé îḿþļéḿéñţàţîöñ ñöţé; ţĥé KapiProject, Defaults, Collection àñđ Profile šţŕüçţ ļàýöüţš, ţĥé ñàḿéđ-çöļļéçţîöñ çöñţéñţ šĥàþé, ṽàļîđàţîöñ ŕüļéš, àñđ ĥöŵ þļàţƒöŕḿ éẋţéñšîöñš đéçöđé üñķñöŵñ ķéýš.
  • Ƒļöŵ Šţéþš Ƒöŕḿàţ: ţĥé ƒüļļ šţéþ šþéçîƒîçàţîöñ üšéđ ƃý flows.