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

Ƒļöŵš

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

Ƒļöŵš šéþàŕàţé ŵĥàţ ţö đö ƒŕöḿ ĥöŵ îţ ŕüñš. À ƒļöŵ đéšçŕîƃéš ţĥé çĥàîñ; ţĥé þîþéļîñé éẋéçüţöŕ đéçîđéš ĥöŵ ţö ŕüñ îţ çöñçüŕŕéñţļý. Ţĥé ĝéñéŕàţéđ ļîšţ öƒ ƒļöŵš ţĥàţ šĥîþ îñ à ĝîṽéñ ƃüîļđ îš ţĥé 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

Éàçĥ šţéþ ñàḿéš à ţööļ àñđ öþţîöñàļļý çöñƒîĝüŕéš îţ. Šţéþš ŕüñ šéǫüéñţîàļļý: éàçĥ ţööļ'š öüţþüţ çĥàññéļ ƒééđš ţĥé ñéẋţ ţööļ'š îñþüţ çĥàññéļ. À ƒļöŵ çàŕŕîéš öñļý îţš šţéþš; ŵĥéŕé çöñţéñţ çöḿéš ƒŕöḿ àñđ ĝöéš ţö îš à ƃîñđîñĝ đéçîđéđ ŵĥéñ ýöü ŕüñ îţ ŕàţĥéŕ ţĥàñ þàŕţ öƒ ţĥé ƒļöŵ (šéé Šöüŕçé àñđ šîñķ).

À çĥéçķ šüçĥ àš qa îš ĵüšţ à ŕéàđ-öñļý šţéþ: îţ àţţàçĥéš ƒîñđîñĝš ţö éàçĥ ƃļöçķ àš àññöţàţîöñš ŕàţĥéŕ ţĥàñ ŕéŵŕîţîñĝ çöñţéñţ, šö îţ ţýþîçàļļý šîţš ļàšţ àñđ à ÇÎ ĝàţé ŕéàđš îţš ŕéšüļţ.

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

steps:
- tool: create-target
config: { copySource: true }
- parallel:
- 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 çŕéàţéš à ţööļ ñöđé ƒöŕ éàçĥ šţéþ (çĥàîñéđ ƃý éđĝéš) àñđ à ƒàñ-öüţ ƒöŕ éàçĥ parallel: ƃļöçķ. À parallel: ƃļöçķ ƃéçöḿéš šéṽéŕàļ ţööļ ñöđéš àļļ çöññéçţéđ ƒŕöḿ ţĥé þŕéṽîöüš ñöđé; ţĥé šţéþ àƒţéŕ îţ çöññéçţš ƒŕöḿ éṽéŕý ƃŕàñçĥ éñđþöîñţ (ƒàñ-îñ). Çýçļéš àŕé ŕéĵéçţéđ; ţĥé éẋéçüţöŕ ŕüñš ñöđéš îñ ţöþöļöĝîçàļ öŕđéŕ. Ţĥé ƒļöŵ'š éñđš (ŵĥéŕé çöñţéñţ éñţéŕš àñđ ļéàṽéš) àŕé ƃîñđîñĝš ŕàţĥéŕ ţĥàñ ñöđéš, çöṽéŕéđ ñéẋţ.

Ƃéçàüšé ƃöţĥ ƒöŕḿš çöḿþîļé ţö ţĥé šàḿé ĝŕàþĥ, ţĥé šţéþš ýöü ŵŕîţé ƃý ĥàñđ àñđ ţĥé ĝŕàþĥ ýöü ƃüîļđ îñ ţĥé éđîţöŕ àŕé îñţéŕçĥàñĝéàƃļé: à ĥàñđ-ŵŕîţţéñ ƒļöŵ öþéñš îñ ţĥé éđîţöŕ, àñđ àñ éđîţöŕ-ƃüîļţ ƒļöŵ ŕüñš ƒŕöḿ ţĥé ÇĻÎ.

:::ţîþ Ƃüîļđ à ƒļöŵ, ţĥéñ ŕüñ îţ Àššéḿƃļé à ƒļöŵ îñ ţĥé šàḿé ñöđé éđîţöŕ ţĥé đéšķţöþ àþþ üšéš (àđđ, ŕéḿöṽé, àñđ ŕéöŕđéŕ ţööļ ñöđéš), ţĥéñ þŕéšš Ŕüñ ƒļöŵ ţö éẋéçüţé îţ öñ à ƒîļé àñđ šţéþ ţĥŕöüĝĥ ţĥé ŕéšüļţ. Ţĥé ĝŕàþĥ îš šéŕîàļîžéđ ţö à 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 öŕ šéé ţĥé Çöḿḿàñđ Ŕéƒéŕéñçé, ƃöţĥ ĝéñéŕàţéđ ƒŕöḿ ţĥé ļîṽé ƒļöŵ šéţ.

Ŕéļàţéđ ŕéàđîñĝ

  • Ţööļš: ţĥé üñîţš à ƒļöŵ çöḿþöšéš.
  • Þîþéļîñé: ĥöŵ ţĥé éẋéçüţöŕ ŕüñš à ƒļöŵ'š ĝŕàþĥ çöñçüŕŕéñţļý.
  • Ƒļöŵ Àüţĥöŕîñĝ: ţĥé ƒüļļ šţéþš-ƒöŕḿàţ ŕéƒéŕéñçé àñđ ḿöŕé éẋàḿþļéš.