Ƒļöŵš
À ƒļöŵ îš à ñàḿéđ, öŕđéŕéđ çöḿþöšîţîöñ öƒ ţööļš: à þļàñ ţĥàţ šàýš "ŕéàđ ţĥé đöçüḿéñţ, ŕüñ ţĥéšé šţéþš îñ ţĥîš öŕđéŕ, ŵŕîţé ţĥé ŕéšüļţ." À ţööļ đöéš öñé ţĥîñĝ. À ƒļöŵ àššéḿƃļéš šéṽéŕàļ îñţö àñ éñđ-ţö-éñđ ŵöŕķƒļöŵ (ļéṽéŕàĝé ƒŕöḿ ḿéḿöŕý, ļööķ üþ ţéŕḿîñöļöĝý, ţŕàñšļàţé ţĥé ŕéḿàîñđéŕ, çĥéçķ ǫüàļîţý) àñđ ĝîṽéš îţ à ñàḿé, šö ýöü çàñ ŕüñ îţ àĝàîñ àñđ šĥàŕé îţ.
À ƒļöŵ đéšçŕîƃéš ţĥé çĥàîñ, àñđ ţĥé þîþéļîñé éẋéçüţöŕ
ŕüñš îţ çöñçüŕŕéñţļý. kapi flows àñđ ţĥé Çöḿḿàñđ Ŕéƒéŕéñçé ļîšţ
ţĥé ƒļöŵš ţĥàţ šĥîþ îñ à ĝîṽéñ ƃüîļđ.
Îñ ţĥé ÇĻÎ, à ƒļöŵ îš ţĥé àƃšţŕàçţîöñ ƃéĥîñđ kapi run <flow>: öñé ñàḿéđ
ƒļöŵ, öñé þàšš. kapi up ļööþš ţĥé þŕöĵéçţ'š đéƒàüļţ ƒļöŵ (defaults.flow,
öŕ ţĥé ƃüîļţ-îñ đéƒàüļţ ŵĥéñ ñöñé îš šéţ) üñţîļ ţĥé þŕöĵéçţ'š ĝàţéš àŕé ḿéţ.
Üñđéŕšţàñđîñĝ ţĥé ÇĻÎ ļàýéŕš éẋþļàîñš ĥöŵ ţĥé
ţŵö ṽéŕƃš ŕéļàţé àñđ ŵĥéŕé ţĥé ŕàŵ ţööļ ļàýéŕ šîţš.
À ƒļöŵ îš à šéǫüéñçé öƒ ţööļš
Àţ îţš šîḿþļéšţ, à ƒļöŵ îš à ļîšţ öƒ ţööļš ţĥàţ Þàŕţš šţŕéàḿ ţĥŕöüĝĥ îñ öŕđéŕ. Ţĥé ƒŕàḿéŵöŕķ ḿöđéļš ţĥîš đîŕéçţļý:
type Flow struct {
Name string
Tools []tool.Tool // for single-document / sequential execution
ToolFactories []ToolFactory // for parallel: a fresh tool chain per document
}
Ţĥé Builder þŕöṽîđéš à ƒļüéñţ ÀÞÎ ƒöŕ àššéḿƃļîñĝ öñé îñ Ĝö:
f, err := flow.NewFlow("translate").
AddTool(tools.NewMemoryLeverageTool(memoryCfg)).
AddTool(terms.NewTermLookupTool(tb, termCfg)).
AddTool(aitools.NewAITranslateTool(provider, translateCfg)).
AddTool(tools.NewRuleCheckTool(checkCfg)).
Build()
À ƒļöŵ ƃüîļţ ţĥîš ŵàý ĥöļđš çöñçŕéţé ţööļ îñšţàñçéš. Ƒöŕ ŕüññîñĝ ţĥé šàḿé ƒļöŵ öṽéŕ ḿàñý đöçüḿéñţš àţ öñçé, à ƒļöŵ çàñ îñšţéàđ ĥöļđ ţööļ ƒàçţöŕîéš: éàçĥ đöçüḿéñţ ţĥéñ ĝéţš îţš öŵñ ƒŕéšĥ ţööļ çĥàîñ, šö þéŕ-đöçüḿéñţ šţàţé ñéṽéŕ ļéàķš ƃéţŵééñ çöñçüŕŕéñţ ŕüñš.
Ţĥé ţŵö àüţĥöŕéđ ŕéþŕéšéñţàţîöñš
À ƒļöŵ çàñ ƃé àüţĥöŕéđ îñ ţŵö éǫüîṽàļéñţ ƒöŕḿš, àñđ ƃöţĥ çöḿþîļé ţö ţĥé šàḿé éẋéçüţàƃļé ĝŕàþĥ.
Šţéþš: ţĥé ĥüḿàñ-àüţĥöŕéđ ƒöŕḿ
Ţĥé šţéþš ƒöŕḿàţ îš à ÝÀḾĻ ļîšţ öƒ ţööļš. Îţ îš ţĥé ƒöŕḿ þéöþļé ŵŕîţé ƃý ĥàñđ:
steps:
- tool: recycle
label: Apply memory matches
config:
fuzzyThreshold: 70
- tool: translate
label: Translate the rest
config:
provider: anthropic
- tool: qa
label: Quality checks
Éàçĥ šţéþ ñàḿéš à ţööļ àñđ öþţîöñàļļý çöñƒîĝüŕéš îţ. Šţéþš ŕüñ šéǫüéñţîàļļý: éàçĥ ţööļ'š öüţþüţ çĥàññéļ ƒééđš ţĥé ñéẋţ ţööļ'š îñþüţ çĥàññéļ. Àţ ŕüñ ţîḿé ţĥé ƒļöŵ àƃöṽé ƃéçöḿéš ţĥîš çĥàîñ, ŵîţĥ ţĥé éñđš ƃöüñđ ŵĥéñ ýöü ŕüñ îţ:
À ƒļöŵ çàŕŕîéš öñļý îţš šţéþš. Ŵĥéŕé çöñţéñţ çöḿéš ƒŕöḿ àñđ ĝöéš ţö îš à ƃîñđîñĝ ýöü çĥööšé ŵĥéñ ýöü ŕüñ îţ (šéé Šöüŕçé àñđ šîñķ).
À þŕöĵéçţ đéçļàŕéš îţš ƒļöŵš îñ kapi.yaml, îñļîñé üñđéŕ flows:, öŕ àš öñé
šţéþš ƒîļé þéŕ ƒļöŵ îñ ţĥé đîŕéçţöŕý ţĥé ŕéçîþé ñàḿéš ŵîţĥ flows_dir: (šéé
Ƒļöŵ ƒîļéš). kapi flows ļîšţš ƃöţĥ
ķîñđš ƃéšîđé ţĥé ƃüîļţ-îñ ƒļöŵš, àñđ kapi run <name> ŕüñš éîţĥéŕ öṽéŕ ţĥé
þŕöĵéçţ'š çöļļéçţîöñš.
À çĥéçķ šüçĥ àš qa îš à ŕéàđ-öñļý šţéþ. Îţ àţţàçĥéš
ƒîñđîñĝš ţö éàçĥ ƃļöçķ àš àññöţàţîöñš àñđ ļéàṽéš ţĥé çöñţéñţ àš îţ îš, šö îţ
üšüàļļý šîţš ļàšţ, ŵĥéŕé à ÇÎ ĝàţé ŕéàđš îţš ŕéšüļţ.
Ţö ŕüñ šéṽéŕàļ çĥéçķš, ļîšţ ţĥéḿ îñ öŕđéŕ:
steps:
- tool: create-target
config: { copySource: true }
- tool: qa
- tool: term-check
- tool: xml-validation
Ţŕàñšƒöŕḿéŕš
Šöḿé ţööļš ŕéŵŕîţé ţĥé šöüŕçé îţšéļƒ: ŕéđàçţîöñ ŕéþļàçîñĝ šéñšîţîṽé šþàñš ŵîţĥ þļàçéĥöļđéŕš, à šîḿþļîƒîéŕ ŕéþĥŕàšîñĝ ƒöŕ çļàŕîţý, à ñöŕḿàļîžéŕ. Ţĥéšé ţŕàñšƒöŕḿéŕš àŕé öŕđîñàŕý šţéþš îñ ţĥé šàḿé öŕđéŕéđ ļîšţ àš éṽéŕýţĥîñĝ éļšé:
steps:
- tool: redact # rewrites the source in place
- tool: translate # translates the redacted source
- tool: qa
À ţŕàñšƒöŕḿéŕ îš à ŕéàđ-öñļý éđîţ þŕöđüçéŕ. Îţ ŕéţüŕñš àñ éđîţ þļàñ, àñđ à šîñĝļé ƒŕàḿéŵöŕķ-öŵñéđ àþþļîéŕ þéŕƒöŕḿš ţĥé ŕéŵŕîţé àţöḿîçàļļý: îţ àþþļîéš ţĥé éđîţš, ŕéƃàšéš šüŕṽîṽîñĝ ŕüñ-àñçĥöŕéđ öṽéŕļàýš (šéĝḿéñţš, ţéŕḿ àñđ éñţîţý šþàñš) öñţö ţĥé ñéŵ ŕüñš, ṽàüļţš àñý šéçŕéţš ƒàîļ-çļöšéđ, àñđ ƃöüñđš-çĥéçķš ţĥé ŕéšüļţ. Ƃéçàüšé ţĥé àþþļîéŕ ḿüţàţéš îñļîñé àñđ îñ öŕđéŕ, éàçĥ ţŕàñšƒöŕḿéŕ šéţţļéš ţĥé šöüŕçé ƃéƒöŕé ļàţéŕ šţéþš öƃšéŕṽé îţ.
À þļàçéḿéñţ þàšš çĥéçķš ţĥé šţéþ öŕđéŕ öƒ éṽéŕý ƒļöŵ àţ ƃüîļđ àñđ ļöàđ
ţîḿé. Îţ ŕéĵéçţš à ţŕàñšƒöŕḿéŕ þļàçéđ àƒţéŕ à šţéþ ţĥàţ þŕöđüçéš à
çöḿḿîţţéđ ţàŕĝéţ (ŕéŵŕîţîñĝ šöüŕçé ŵöüļđ öŕþĥàñ ţĥé ţàŕĝéţš; unredact îš
éẋéḿþţ ƃéçàüšé îţ ŕéŵŕîţéš ƃöţĥ šîđéš), ŕéĵéçţš à ŕéçöṽéŕàƃļé ţŕàñšƒöŕḿéŕ šüçĥ
àš redact þļàçéđ àƒţéŕ à šţéþ ţĥàţ šéñđš šöüŕçé ţö à ŕéḿöţé šéŕṽîçé (éẋçéþţ
à šţéþ þŕöđüçîñĝ àñ îñþüţ ţĥé ţŕàñšƒöŕḿéŕ'š çöñƒîĝüŕàţîöñ ŕéǫüîŕéš), àñđ ŵàŕñš
ŵĥéñ à ţŕàñšƒöŕḿéŕ šîţš ļàţéŕ ţĥàñ îţš éàŕļîéšţ ṽàļîđ šļöţ, šîñçé éṽéŕý
öṽéŕļàý þŕéšéñţ àţ àþþļý ţîḿé ḿüšţ ƃé ŕéƃàšéđ. Šéé
ţĥé ţööļ šýšţéḿ ÀĐ ƒöŕ ţĥé ḿöđéļ.
À ƒļöŵ ţĥàţ đéçļàŕéš ţĥé ŕéḿöṽéđ source_transforms: ƒîéļđ îš ŕéĵéçţéđ àţ
ļöàđ ŵîţĥ à ḿîĝŕàţîöñ éŕŕöŕ: ļîšţ ţĥé ţŕàñšƒöŕḿéŕš àš öŕđéŕéđ šţéþš îñšţéàđ.
Ĝŕàþĥ: ţĥé çàñöñîçàļ ƒöŕḿ
Îñţéŕñàļļý à ƒļöŵ îš à đîŕéçţéđ ĝŕàþĥ öƒ ţööļ ñöđéš çöññéçţéđ ƃý éđĝéš:
type FlowDefinition struct {
ID string
Name string
Nodes []FlowNode // tool nodes
Edges []FlowEdge // directed connections
}
Ţĥé ĝŕàþĥ îš ŵĥàţ ţĥé ṽîšüàļ ƒļöŵ éđîţöŕ ŕéàđš àñđ ŵŕîţéš. Çöḿþîļàţîöñ ƒŕöḿ
šţéþš ţö ĝŕàþĥ îš ḿéçĥàñîçàļ: StepsToGraph çŕéàţéš à ţööļ ñöđé ƒöŕ éàçĥ šţéþ,
çĥàîñéđ ƃý éđĝéš. Çýçļéš àŕé ŕéĵéçţéđ, àñđ ķàþî ŕüñš ţĥé ţööļ ñöđéš àš öñé
öŕđéŕéđ çĥàîñ, éàçĥ ţööļ'š öüţþüţ ƒééđîñĝ ţĥé ñéẋţ. Ţĥé ƒļöŵ'š éñđš (ŵĥéŕé
çöñţéñţ éñţéŕš àñđ ļéàṽéš) àŕé ƃîñđîñĝš, çöṽéŕéđ ñéẋţ.
Ƃéçàüšé ƃöţĥ ƒöŕḿš çöḿþîļé ţö ţĥé šàḿé ĝŕàþĥ, ţĥé šţéþš ýöü ŵŕîţé ƃý ĥàñđ àñđ ţĥé ĝŕàþĥ ýöü ƃüîļđ îñ ţĥé éđîţöŕ àŕé îñţéŕçĥàñĝéàƃļé: à ĥàñđ-ŵŕîţţéñ ƒļöŵ öþéñš îñ ţĥé éđîţöŕ, àñđ àñ éđîţöŕ-ƃüîļţ ƒļöŵ ŕüñš ƒŕöḿ ţĥé ÇĻÎ.
:::ţîþ Ƃüîļđ à ƒļöŵ, ţĥéñ ŕüñ îţ
Àššéḿƃļé à ƒļöŵ îñ ţĥé šàḿé ñöđé éđîţöŕ ţĥé đéšķţöþ àþþ üšéš (àđđ, ŕéḿöṽé, àñđ
ŕéöŕđéŕ ţööļ ñöđéš), ţĥéñ þŕéšš Ŕüñ ƒļöŵ ţö éẋéçüţé îţ öñ à ƒîļé àñđ šţéþ
ţĥŕöüĝĥ ţĥé ŕéšüļţ. Ţĥé ĝŕàþĥ îš šéŕîàļîžéđ ţö à kapi.yaml ŕéçîþé àñđ ŕüñ ŵîţĥ ţĥé
ŕéàļ kapi éñĝîñé îñ ýöüŕ ƃŕöŵšéŕ ṽîà ŴéƃÀššéḿƃļý.
:::
Šöüŕçé àñđ šîñķ: ţĥé ƒļöŵ'š éñđš
À ƒļöŵ þŕöçéššéš à šţŕéàḿ öƒ ƃļöçķš; ŵĥéŕé ţĥàţ šţŕéàḿ çöḿéš ƒŕöḿ àñđ ŵĥéŕé ţĥé
ŕéšüļţ ĝöéš àŕé îţš šöüŕçé àñđ šîñķ ƃîñđîñĝš. Ţĥé šàḿé ƒļöŵ ŕüñš öṽéŕ à
ļööšé ƒîļé, ţĥé ƃļöçķš àļŕéàđý îñ à þŕöĵéçţ, à .kpz ŵöŕķšþàçé, öŕ çöñţéñţ
îḿþöŕţéđ ƒŕöḿ àñ îñţéŕçĥàñĝé ƒîļé; öñļý ţĥé ƃîñđîñĝ çĥàñĝéš:
| Ƃîñđîñĝ | Àš šöüŕçé | Àš šîñķ |
|---|---|---|
file (đéƒàüļţ) | ŕéàđ + þàŕšé à ƒîļé | ŵŕîţé à ƒîļé (ŕöüñđ-ţŕîþ ṽîà šķéļéţöñ) |
store / kpz | éẋîšţîñĝ ƃļöçķš + öṽéŕļàýš | çöḿḿîţ öṽéŕļàýš; ñö ƒîļé |
| îñţéŕçĥàñĝé | îḿþöŕţ ƒŕöḿ ẊĻÎƑƑ / ÞÖ / à ƃîļîñĝüàļ .kpz | éḿîţ îñţéŕçĥàñĝé ƒöŕ à ţŕàñšļàţöŕ |
none | (ñöñé) | đîšçàŕđ (àñàļýšîš / çĥéçķš öñļý) |
Ƃîñđîñĝš àŕé ŕéšöļṽéđ ŵĥéñ ýöü ŕüñ ţĥé ƒļöŵ, ƃý þŕéçéđéñçé: àñ éẋþļîçîţ -i / -o
ƒļàĝ, ţĥéñ ţĥé þŕöĵéçţ öŕ .kpz ýöü'ŕé îñ, ţĥéñ ţĥé ƒļöŵ'š öŵñ îñţéñţ, ţĥéñ
àüţö-đéţéçţîöñ ƒŕöḿ ţĥé þàţĥ. À þļàîñ þàţĥ îš đéţéçţéđ (.kpz → ŵöŕķšþàçé,
.xliff → îñţéŕçĥàñĝé, à đöçüḿéñţ → file); à scheme: îš éẋþļîçîţ
(-o store:, -o xliff:hand.xliff). kapi run <flow> --explain þŕîñţš ţĥé
ŕéšöļṽéđ source → sink ŵîţĥöüţ ŕüññîñĝ àñýţĥîñĝ.
À ƒļöŵ đéçļàŕéš öñļý îñţŕîñšîç îñţéñţ (à çĥéçķ ƒļöŵ ţĥàţ þŕöđüçéš ñö đöçüḿéñţ
šéţš sink: none), ñéṽéŕ à þàţĥ. Îñšîđé à þŕöĵéçţ, à ŕüñ ŵîţĥ ñö -o
ļàñđš îţš ŵöŕķ îñ ţĥé šţöŕé (þŕöçéšš-öñļý); kapi merge ḿàţéŕîàļîžéš ƒîļéš ŵĥéñ
ýöü'ŕé ŕéàđý. Šéé É-04 ƒöŕ ţĥé
ƒüļļ ḿöđéļ.
Ŕüññîñĝ à ƒļöŵ
À ƒļöŵ îš ŕüñ àĝàîñšţ à šöüŕçé. Ţĥé ŕüññéŕ ŕéšöļṽéš ţĥé šöüŕçé àñđ šîñķ ƃîñđîñĝš,
îñšţàñţîàţéš ţĥé ţööļ çĥàîñ, àñđ ĥàñđš îţ ţö ţĥé éẋéçüţöŕ. Çöḿþöšéđ (ḿüļţî-ţööļ)
ƒļöŵš ŕüñ ŵîţĥ kapi run; šîñĝļé-ţööļ ƒļöŵš àŕé éẋþöšéđ đîŕéçţļý àš ţĥéîŕ ţööļ'š
çöḿḿàñđ:
# Run a composed flow (two or more tools) on a file
kapi run translate-qa -i app.xliff --target-lang fr
# List the composed flows available in this build
kapi flows
Ţĥé đéḿö ƃéļöŵ ŕüñš ţĥé pseudo-translate ƒļöŵ: source → pseudo-translate → sink. Ƃéçàüšé îţ îš à šîñĝļé-ţööļ ƒļöŵ, îţ îš îñṽöķéđ đîŕéçţļý àš kapi pseudo-translate. Ţĥé ļéƒţ þàñé îš ţĥé ÇĻÎ îñṽöçàţîöñ; ţĥé ŕîĝĥţ þàñé îš ţĥé
ƒŕàḿéŵöŕķ'š ŕéšüļţ, ţĥé šàḿé ƒîļé ŵîţĥ îţš šöüŕçé šţŕîñĝš ŕéþļàçéđ ƃý àççéñţéđ
ļööķ-àļîķéš:
Ƃüîļţ-îñ ƒļöŵš
Ţĥé ƒŕàḿéŵöŕķ šĥîþš à šéţ öƒ ƃüîļţ-îñ ƒļöŵš çöṽéŕîñĝ çöḿḿöñ ŵöŕķƒļöŵš:
ÀÎ ţŕàñšļàţîöñ, ÀÎ ţŕàñšļàţîöñ ŵîţĥ à ǫüàļîţý þàšš, þšéüđö-ţŕàñšļàţîöñ ƒöŕ
ļàýöüţ ţéšţîñĝ, ḿéḿöŕý ļéṽéŕàĝé, ŕüļé-ƃàšéđ çĥéçķš, à ŕéđàçţ-ţŕàñšļàţé-ŕéšţöŕé ƒļöŵ
ƒöŕ šéñšîţîṽé çöñţéñţ, àñđ ḿéđîà-ţö-šüƃţîţļéš ƒļöŵš ţĥàţ
ţüŕñ àüđîö àñđ ṽîđéö îñţö ţŕàñšļàţéđ šüƃţîţļé ţŕàçķš (šéé
Ţŕàñšļàţé àüđîö & ṽîđéö). Ƒöŕ ţĥé ƒüļļ ļîšţ,
ŕüñ kapi flows öŕ šéé ţĥé Çöḿḿàñđ Ŕéƒéŕéñçé; ƃöţĥ àŕé ĝéñéŕàţéđ
ƒŕöḿ ţĥé ļîṽé ƒļöŵ šéţ.
Ŕéļàţéđ ŕéàđîñĝ
- Ţööļš: ţĥé üñîţš à ƒļöŵ çöḿþöšéš.
- Þîþéļîñé: ĥöŵ ţĥé éẋéçüţöŕ ŕüñš à ƒļöŵ'š ĝŕàþĥ çöñçüŕŕéñţļý.
- Ƒļöŵ Àüţĥöŕîñĝ: ţĥé ƒüļļ šţéþš-ƒöŕḿàţ ŕéƒéŕéñçé àñđ ḿöŕé éẋàḿþļéš.