É-07: Ḿöđéļ àñđ ţŕàñšļàţîöñ þŕöṽîđéŕš
Šüḿḿàŕý
Ţŵö þŕöṽîđéŕ îñţéŕƒàçéš šîţ üñđéŕ ţĥé ƒŕàḿéŵöŕķ'š ţööļš, îñ ţŵö þàçķàĝéš:
providers/ai (þàçķàĝé aiprovider) ƒöŕ ļàñĝüàĝé ḿöđéļš, àñđ providers/mt
(þàçķàĝé mtprovider) ƒöŕ ḿàçĥîñé-ţŕàñšļàţîöñ éñĝîñéš. Ţĥéý šĥàŕé ţĥé ţööļš ţĥàţ
çàļļ ţĥéḿ, ţĥé çŕéđéñţîàļ ŕéšöļṽéŕ, àñđ ţĥé ŕéĝîšţŕàţîöñ þàţţéŕñ; ţĥéý đéŕ îñ
šüŕƒàçé àŕéà, ƃéçàüšé àñ ĻĻḾ àñđ àñ ḾŢ éñĝîñé àŕé àšķéđ ƒöŕ đéŕéñţ ţĥîñĝš.
LLMProvider çàŕŕîéš ţŕàñšļàţîöñ, çĥàţ, àñđ šçĥéḿà-çöñšţŕàîñéđ šţŕüçţüŕéđ
öüţþüţ, ŵîţĥ ḿüļţîḿöđàļ ḿéššàĝéš (çöñţéñţ îš àñ öŕđéŕéđ ļîšţ öƒ ţéẋţ, îḿàĝé,
àüđîö, öŕ ṽîđéö þàŕţš) àñđ àñ öþţîöñàļ šţŕéàḿîñĝ éẋţéñšîöñ ƒöŕ ļîṽé ţĥîñķîñĝ
þŕöĝŕéšš. MTProvider îš öñé ḿéţĥöđ: þļàîñ ţéẋţ îñ, þļàîñ ţéẋţ öüţ. Ţĥé
ƒŕàḿéŵöŕķ šĥîþš ƃüîļţ-îñ ĻĻḾ ƃàçķéñđš àñđ ñö çļàššîç ḾŢ
éñĝîñéš: ţĥé ţŕàñšļàţîöñ çöŕé îš ĻĻḾ-ƒîŕšţ, àñđ ḾŢ éñĝîñéš àŕŕîṽé àš þļüĝîñš ţĥàţ
ŕéĝîšţéŕ à çöñƒîĝ ƒàçţöŕý. Öñ ţĥé ÇĻÎ šüŕƒàçé ţĥéŕé îš öñé translate çöḿḿàñđ
àñđ öñé qa çöḿḿàñđ àçŕöšš éṽéŕý ƃàçķéñđ; --provider šéļéçţš.
Çöñţéẋţ
Ḿöđéŕñ ļàñĝüàĝé ḿöđéļš àŕé çàþàƃļé ţŕàñšļàţöŕš, ŕéṽîéŵéŕš, àñđ ţéŕḿ éẋţŕàçţöŕš. Ţŕéàţîñĝ ţĥéḿ àš à šéþàŕàţé šéŕṽîçé ŵöüļđ ļöšé ţĥé çöḿþöšàƃîļîţý öƒ ţĥé šţŕéàḿîñĝ þîþéļîñé: ḿöđéļ-ƃàçķéđ ţööļš šĥöüļđ šîţ àļöñĝšîđé ḿéḿöŕý ļéṽéŕàĝé, ţéŕḿ éñƒöŕçéḿéñţ, àñđ çĥéçķš îñ ţĥé šàḿé ƒļöŵ.
Ḿöđéļ ÀÞΚ çöḿé ŵîţĥ þŕàçţîçàļ çöñšţŕàîñţš: ŕàţé ļîḿîţš, çöšţ þéŕ ţöķéñ, ţŕàñšîéñţ ƒàîļüŕéš, àñđ ṽàŕîàƃļé ļàţéñçý. Ţĥé ƒŕàḿéŵöŕķ'š àñšŵéŕ îš ţö ķééþ ţĥé þŕöṽîđéŕ îñţéŕƒàçé ţĥîñ àñđ ļéţ ţĥé çàļļîñĝ ţööļ đéçîđé ĥöŵ ḿüçĥ ŵöŕķ ţö ƃàţçĥ îñţö à šîñĝļé ŕéǫüéšţ àñđ ĥöŵ ḿàñý ŕéǫüéšţš ţö ŕüñ îñ þàŕàļļéļ. Ŵöŕķšþàçé-šçàļé öŕçĥéšţŕàţîöñ (àšýñçĥŕöñöüš ĵöƃ ǫüéüéš, ḿüļţî-ţéñàñţ ǫüöţàš) ƃéļöñĝš ţö à þļàţƒöŕḿ ļàýéŕ ŕàţĥéŕ ţĥàñ ţö ţĥé ƒŕàḿéŵöŕķ þŕîḿîţîṽéš.
Þŕöṽîđéŕš àļšö đéŕ îñ ţĥéîŕ šţŕüçţüŕéđ-öüţþüţ ḿéçĥàñîšḿ: šöḿé üšé à
response_format ĴŠÖÑ šçĥéḿà, šöḿé üšé ţööļ-üšé ŵîţĥ àñ îñþüţ šçĥéḿà, šöḿé à
format: json šŵîţçĥ, šöḿé à ŕéšþöñšé-šçĥéḿà ĥîñţ. À šîñĝļé îñţéŕƒàçé ḿüšţ þàþéŕ
öṽéŕ ţĥéšé đéţàîļš ŵĥîļé ĝîṽîñĝ ţööļš à þŕéđîçţàƃļé çöñţŕàçţ.
Ḿàçĥîñé ţŕàñšļàţîöñ îš à đéŕéñţ šĥàþé. Àñ ḾŢ éñĝîñé îš à đéţéŕḿîñîšţîç
ţŕàñšļàţîöñ šéŕṽîçé ŵîţĥ à ḿîñîḿàļ šüŕƒàçé (šöüŕçé ţéẋţ, šöüŕçé ļöçàļé, ţàŕĝéţ
ļöçàļé, ţŕàñšļàţéđ ţéẋţ) àñđ ñö ñöţîöñ öƒ ţéŕḿîñöļöĝý çöñţéẋţ, ƒöŕḿàţ ĥîñţš, öŕ
šüŕŕöüñđîñĝ ƃļöçķš. Ƒöŕçîñĝ ƃöţĥ ţĥŕöüĝĥ LLMProvider ŵöüļđ ŵàšţé þàŕàḿéţéŕš öñ
ḾŢ àñđ öƃšçüŕé ţĥé đéŕéñçé.
Đéçîšîöñ
Ţĥé ĻĻḾ þŕöṽîđéŕ îñţéŕƒàçé
type LLMProvider interface {
Name() ProviderID
InputModalities() []Modality // non-text inputs accepted; text always
Translate(ctx context.Context, req TranslateRequest) (*TranslateResponse, error)
Chat(ctx context.Context, messages []Message) (*ChatResponse, error)
ChatStructured(ctx context.Context, messages []Message,
schema JSONSchema) (*ChatResponse, error)
Close() error
}
ChatStructured éẋţéñđš Chat ŵîţĥ à ĴŠÖÑ Šçĥéḿà çöñšţŕàîñţ ţĥàţ ƒöŕçéš ţĥé
þŕöṽîđéŕ ţö ŕéţüŕñ šţŕüçţüŕéđ öüţþüţ. Ţĥé JSONSchema ţýþé çàŕŕîéš Name,
Description, Schema, àñđ à Strict ƒļàĝ ƒöŕ þŕöṽîđéŕš ţĥàţ šüþþöŕţ šţŕîçţ
ṽàļîđàţîöñ.
Þŕöṽîđéŕ çöñƒîĝüŕàţîöñ îš šçĥéḿà-đŕîṽéñ: ƒîéļđš îñ à ḿöđéļ-ƃàçķéđ ţööļ'š çöñƒîĝ
ĝéñéŕàţé ÇĻÎ ƒļàĝš àüţöḿàţîçàļļý ṽîà schema.FromStruct(), šö ñö ḿàñüàļ ƒļàĝ
ŕéĝîšţŕàţîöñ îš ñééđéđ (É-03).
Ḿüļţîḿöđàļ çöñţéñţ
À Message'š çöñţéñţ îš àñ öŕđéŕéđ ļîšţ öƒ ţýþéđ þàŕţš, šö öñé îñţéŕƒàçé çàŕŕîéš
ţéẋţ, îḿàĝéš, àüđîö, àñđ ṽîđéö:
type Message struct {
Role string // "system" | "user" | "assistant"
Parts []ContentPart
}
type ContentPart struct {
Kind ContentKind // closed set, named type
Text string // Kind == ContentText
Media *model.Media // otherwise: a bounded slice, carried by reference
}
type ContentKind string
const (
ContentText ContentKind = "text"
ContentImage ContentKind = "image"
ContentAudio ContentKind = "audio"
ContentVideo ContentKind = "video"
)
À ḿéđîà þàŕţ çàŕŕîéš îţš þàýļöàđ àš à model.Media (ţĥé ƒŕàḿéŵöŕķ'š
ƃîñàŕý-ŕéƒéŕéñçé ţýþé, Ƒ-02) ŵîţĥ
þŕéçéđéñçé BlobKey > URI > Data, ŕàţĥéŕ ţĥàñ à ƃàŕé []byte. À šḿàļļ šļîçé ŕîđéš
îñļîñé; à ļàŕĝéŕ öñé, šüçĥ àš à ṽîđéö çļîþ, îš à ƃļöƃ ķéý öŕ ÜŔÎ àñđ îš ñéṽéŕ
ƒöŕçéđ îñţö ḿéḿöŕý. À šîñĝļé ĥéļþéŕ àţ ţĥé þŕöṽîđéŕ'š ĤŢŢÞ ƃöüñđàŕý ŕéšöļṽéš ţĥé
Media ţö ţĥé ƃàçķéñđ'š ŵîŕé ƒöŕḿ (ƃàšé64 îñļîñé, öŕ à ƒéţçĥàƃļé ÜŔĻ ŵĥéŕé ţĥé
þŕöṽîđéŕ šüþþöŕţš öñé), šö þŕöṽîđéŕ îḿþļéḿéñţàţîöñš šţàý šţöŕàĝé-àĝñöšţîç:
ţĥéý ñéṽéŕ ŕéàđ à ƒîļé öŕ ţĥé ƃļöƃ šţöŕé. Ţĥîš ķééþš öñé ƃîñàŕý îđîöḿ àçŕöšš
Media, þļüĝîñ Î/Ö, àñđ þŕöṽîđéŕ çöñţéñţ.
À ţéẋţ-öñļý ḿéššàĝé îš à šîñĝļé text þàŕţ, šö ţŕàñšļàţîöñ, çĥéçķ, àñđ ţéŕḿ
ţööļš üšé ţĥé îñţéŕƒàçé ŵîţĥ ñö ḿéđîà þàŕţš; ţĥé çöḿḿöñ þàţĥ çàŕŕîéš ñö ḿéđîà
çéŕéḿöñý. Îḿàĝé, àüđîö, àñđ ṽîđéö þàŕţš çàŕŕý à Ƃļöçķ'š ḿéđîà àñçĥöŕ îñţö ţĥé
þŕöḿþţ, ŵĥîçĥ îš ŵĥàţ ţĥé ḿüļţîḿöđàļ ŕéƒîñéḿéñţ ţîéŕ šéñđš
(Ḿ-03).
Ƃàçķéñđš đéŕ îñ ŵĥîçĥ îñþüţ ḿöđàļîţîéš ţĥéý àççéþţ, šö InputModalities()
àđṽéŕţîšéš à þŕöṽîđéŕ'š ŕéàçĥ (Modality ƃéîñĝ ţĥé îḿàĝé/àüđîö/ṽîđéö šüƃšéţ öƒ
ContentKind; ţéẋţ îš àļŵàýš àççéþţéđ) àñđ à çàļļéŕ šéļéçţš à þŕöṽîđéŕ ţĥàţ ƒîţš
ŕàţĥéŕ ţĥàñ đîšçöṽéŕîñĝ ţĥé ļîḿîţ àţ çàļļ ţîḿé. Ţĥé ļîṽé þéŕ-þŕöṽîđéŕ šéţ îš öñ
ţĥé ĝéñéŕàţéđ ÀÎ Ḿöđéļš ŕéƒéŕéñçé.
Ƃüîļţ-îñ ĻĻḾ þŕöṽîđéŕš
Ţĥé ƒŕàḿéŵöŕķ ŕéĝîšţéŕš ƃàçķéñđš ƒöŕ Àñţĥŕöþîç, ÖþéñÀÎ, Àžüŕé ÖþéñÀÎ, Ĝéḿîñî,
àñđ Öļļàḿà, þļüš ţŵö ñöñ-ñéţŵöŕķ þŕöṽîđéŕš: à ḿöçķ þŕöṽîđéŕ ƒöŕ đéţéŕḿîñîšţîç
ţéšţš, àñđ à demo þŕöṽîđéŕ ţĥàţ ŕéţüŕñš îļļüšţŕàţîṽé öüţþüţ šö ţĥé ƃŕöŵšéŕ
þļàýĝŕöüñđ çàñ ŕüñ ḿöđéļ-ƃàçķéđ çöḿḿàñđš ŵîţĥ ñö ÀÞÎ ķéýš. À claude-code
þŕöṽîđéŕ ŕüñš þŕöḿþţš ţĥŕöüĝĥ à ļöçàļļý îñšţàļļéđ Çļàüđé Çöđé ÇĻÎ, ƃîļļîñĝ ţĥé
üšéŕ'š šüƃšçŕîþţîöñ îñšţéàđ öƒ àñ ÀÞÎ ķéý: ķéýļéšš, ţĥöüĝĥ ñöţ ļöçàļ, šîñçé
çöñţéñţ šţîļļ ţŕàṽéļš ţö ţĥé ṽéñđöŕ.
Öļļàḿà îš ţĥé öñ-đéṽîçé ƃàçķéñđ, đŕîṽîñĝ à ļöçàļ ŕüñţîḿé öṽéŕ ĤŢŢÞ ŵîţĥ ñö ķéý
àñđ ḿàñàĝéđ ţĥŕöüĝĥ kapi models ollama. aiprovider.IsLocalProvider îš à
ŕéĝîšţŕàţîöñ þŕöþéŕţý, ñöţ à ĥàŕđçöđéđ ļîšţ: à þŕöṽîđéŕ šéţš îţ ŵĥéñ îţ
ŕéĝîšţéŕš, šö þļüĝîñ-ŕéĝîšţéŕéđ þŕöṽîđéŕš đéçļàŕé ţĥéḿšéļṽéš ļöçàļ ţĥé šàḿé ŵàý
ţĥé ƃüîļţ-îñš đö, àñđ ţĥé ţŕàñšƒöŕḿéŕ þļàçéḿéñţ þàšš
(É-03) çàñ ŕéƒîñé ŕéḿöţé-éĝŕéšš àŵàý ƒöŕ ţĥéḿ.
Þļüĝîñš ŕéĝîšţéŕ ƒüŕţĥéŕ þŕöṽîđéŕš àţ ŕüñţîḿé, šö ţĥé ļîṽé þŕöṽîđéŕ šéţ îš
ŵĥàţéṽéŕ aiprovider.Providers() ŕéţüŕñš, ñöţ à ƒîẋéđ ļîšţ; îţ šüŕƒàçéš àš ţĥé
provider öþţîöñ îñ ţĥé translate ŕéƒéŕéñçé.
Đéƒàüļţ ḿöđéļš àŕé ñöţ ļîšţéđ îñ þŕöšé, ƃéçàüšé ţĥéý çĥàñĝé ŵîţĥ éṽéŕý ḿöđéļ
ĝéñéŕàţîöñ. Ţĥéý ļîṽé îñ ţĥé ḿöđéļ çàţàļöĝ, ƃéļöŵ.
Éàçĥ þŕöṽîđéŕ ţàķéš à Config šţŕüçţ ŵîţĥ ÀÞÎ ķéý, ƃàšé ÜŔĻ, ḿöđéļ ñàḿé, àñđ
ĝéñéŕàţîöñ þàŕàḿéţéŕš. Àžüŕé àđđîţîöñàļļý àççéþţš à TokenProvider ƒüñçţîöñ,
éñàƃļîñĝ þàššŵöŕđļéšš àççéšš ṽîà Ḿàñàĝéđ Îđéñţîţý.
Ţĥé ḿöđéļ çàţàļöĝ
Ţĥé ḿöđéļš kapi šüþþöŕţš àŕé đéšçŕîƃéđ îñ öñé þļàçé: providers/ai/models.json,
à çüŕàţéđ çàţàļöĝ éḿƃéđđéđ îñţö ţĥé ƒŕàḿéŵöŕķ àñđ ŕéàđ àš aiprovider.Models().
Îţ îš ţĥé šîñĝļé šöüŕçé öƒ ţŕüţĥ, àñđ ţĥé ŕéšţ đéŕîṽéš ƒŕöḿ îţ.
Ŵĥý đàţà, àñđ ŵĥý çüŕàţéđ. Öñé çàţàļöĝ ŕàţĥéŕ ţĥàñ ḿöđéļ ķñöŵļéđĝé šþŕéàđ
öṽéŕ à đéƒàüļţ-ḿöđéļ çöñšţàñţ þéŕ þŕöṽîđéŕ, à þŕéƒîẋ-ţö-çéîļîñĝš ḿàþ, àñđ à
šéþàŕàţé þŕîçé ţàƃļé; ñöñé öƒ ŵĥîçĥ àñšŵéŕš ţĥé ǫüéšţîöñ à üšéŕ àçţüàļļý àšķš:
îš ţĥîš ḿöđéļ çüŕŕéñţ, šüþéŕšéđéđ, öŕ ŕéţîŕéđ, àñđ šîñçé ŵĥéñ? Ţĥé çàţàļöĝ
çàŕŕîéš ţĥé đéƒàüļţš àñđ ţĥé çéîļîñĝš (LimitsForModel ŕéšöļṽéš ţĥŕöüĝĥ îţ; à
ţéšţ àššéŕţš éṽéŕý þŕöṽîđéŕ đéƒàüļţ îš çàţàļöĝüéđ àñđ ḿàŕķéđ àš ţĥàţ þŕöṽîđéŕ'š
đéƒàüļţ) àš ŵéļļ àš ţĥé ļîƒéçýçļé. Îţ îš đàţà ƃéçàüšé à ḿöđéļ ļîšţ ĥàŕđçöđéđ
îñ Ĝö ĝöéš šţàļé šîļéñţļý; îţ îš çüŕàţéđ ƃéçàüšé ṽéñđöŕ ÀÞΚ ŕéţüŕñ öñļý ŵĥàţ
îš ļîṽé ţöđàý àš à ƒļàţ ļîšţ öƒ îđš; ţĥéý đö ñöţ šàý ŵĥéñ à ḿöđéļ éñţéŕéđ
neokapi, ŵĥàţ ŕéþļàçéđ îţ, öŕ ŵĥéñ îţ ŕéţîŕéš. Ţĥöšé àŕé ƒàçţš àƃöüţ öüŕ
šüþþöŕţ, àñđ öñļý à ĥüḿàñ, öŕ àñ àĝéñţ ŕéàđîñĝ à ḿöđéļ çàŕđ, çàñ šüþþļý ţĥéḿ.
Éàçĥ éñţŕý çàŕŕîéš ţĥé ḿöđéļ'š þŕöṽîđéŕ, ļàƃéļ, àļîàšéš, öüţþüţ àñđ çöñţéẋţ
çéîļîñĝš, àñđ îţš ļîƒéçýçļé: status (active | superseded), introduced,
superseded_by, àñđ retirement_date. Ţĥéŕé îš ñö retired šţàţüš: à ḿöđéļ ţĥé
þŕöṽîđéŕ šţöþš šéŕṽîñĝ îš ŕéḿöṽéđ ƒŕöḿ ţĥé çàţàļöĝ ŕàţĥéŕ ţĥàñ ķéþţ àš à
ţöḿƃšţöñé: ţĥé çàţàļöĝ îš ţĥé ļîšţ öƒ ḿöđéļš kapi šüþþöŕţš, àñđ à đéàđ ḿöđéļ šüþþöŕţš
ñöţĥîñĝ. Àñ àññöüñçéđ ƒüţüŕé ŕéţîŕéḿéñţ îš à đàţé öñ à šţîļļ-ļîṽé éñţŕý, šĥöŵñ
àš à ŵàŕñîñĝ. À ḿöđéļ çàñ ƃé öñé þŕöṽîđéŕ'š çüŕŕéñţ đéƒàüļţ ŵĥîļé šüþéŕšéđéđ
éļšéŵĥéŕé, àñđ ţĥé çàţàļöĝ ŕéçöŕđš ţĥàţ ŕàţĥéŕ ţĥàñ þàþéŕîñĝ öṽéŕ îţ; kapi models list àñđ ţĥé /models þàĝé ƃöţĥ šüŕƒàçé îţ.
Ŕéçöḿḿéñđéđ ṽš ķñöŵñ. Ţĥé çàţàļöĝ îš đéšçŕîþţîṽé, ñöţ àñ àļļöŵļîšţ: ñàḿîñĝ
à ḿöđéļ îţ đöéš ñöţ ļîšţ îš ñéṽéŕ ŕéĵéçţéđ: ţĥé šţŕîñĝ ĝöéš ţö ţĥé þŕöṽîđéŕ ÀÞÎ
àš-îš, àñđ LimitsForModel ƒàļļš ƃàçķ ţö à çöñšéŕṽàţîṽé ƃàţçĥ šîžé üñţîļ àñ éñţŕý
éẋîšţš. Šö ţĥé çàţàļöĝ šéŕṽéš ţŵö àüđîéñçéš àţ öñçé, àñđ à recommended ƒļàĝ
(àƃšéñţ = ýéš) šéþàŕàţéš ţĥéḿ. Îţ šţàýš ţŕüé ƒöŕ ţĥé ḿöđéļš ḿöšţ þŕöĵéçţš šĥöüļđ
ŕéàçĥ ƒöŕ, àñđ îš šéţ ƒàļšé ƒöŕ à ḿöđéļ ţĥàţ îš ƒüļļý šüþþöŕţéđ ƃüţ à þööŕ
đéƒàüļţ: çàþàƃļé-ƃüţ-þŕéḿîüḿ, öṽéŕķîļļ ƒöŕ ƒàîţĥƒüļ çöñţéñţ ŵöŕķ, öŕ ţüñéđ ƒöŕ à
đéŕéñţ ţàšķ. À ñöñ-ŕéçöḿḿéñđéđ ḿöđéļ ķééþš îţš çéîļîñĝš àñđ îš çàļļàƃļé ƃý
ñàḿé; îţ ĵüšţ šîţš üñđéŕ "Àđṽàñçéđ" öñ ţĥé /models þàĝé ŕàţĥéŕ ţĥàñ îñ ţĥé
þŕîḿàŕý ļîšţ, ŵĥîçĥ îš šöŕţéđ Ŕéçöḿḿéñđéđ → Àđṽàñçéđ → Ļéĝàçý (šüþéŕšéđéđ). Àñ
àçţîṽé đéƒàüļţ çàñ ñéṽéŕ ƃé ñöñ-ŕéçöḿḿéñđéđ; à ţéšţ éñƒöŕçéš îţ.
Šţàýîñĝ ĥöñéšţ. Çüŕàţîöñ ŕöţš, šö make check-models (scripts/modelcheck)
îš ţĥé àļàŕḿ: îţ ļîšţš ŵĥàţ éàçĥ þŕöṽîđéŕ šéŕṽéš ţöđàý àñđ ŕéþöŕţš àñý çàţàļöĝüéđ
ḿöđéļ ţĥàţ îš ĝöñé, öŕ, ŵîţĥ -candidates, àñý ļîṽé ḿöđéļ ţĥé çàţàļöĝ öḿîţš. Ţĥé
ļîṽé ĥàļƒ ñééđš þŕöṽîđéŕ çŕéđéñţîàļš àñđ šţàýš à ḿàñüàļ öŕ šçĥéđüļéđ ţööļ: à
ŕàţé-ļîḿîţéđ þŕöṽîđéŕ ḿüšţ ñéṽéŕ ƃé ḿîšţàķéñ ƒöŕ à ŕéţîŕéđ öñé, ţĥé šàḿé
ƒàļšé-çļ ţŕàþ ţĥé ƃàţçĥ éṽàļ ĝüàŕđš àĝàîñšţ. Ţĥé ķéýļéšš ĥàļƒ
(éṽéŕý þüƃļîšĥéđ þŕîçé ḿüšţ ƃé ƒöŕ à çàţàļöĝüéđ ḿöđéļ) îš àñ öŕđîñàŕý üñîţ ţéšţ,
šö îţ ŕüñš îñ make test. Ţĥé /models þàĝé îš ĝéñéŕàţéđ ƒŕöḿ ţĥé çàţàļöĝ àñđ
ĝàţéđ ƃý make check-reference-docs, šö îţ çàññöţ đéšçŕîƃé à ḿöđéļ ţĥé çàţàļöĝ
ñö ļöñĝéŕ ļîšţš.
ŠţŕéàḿîñĝĻĻḾÞŕöṽîđéŕ
Àñ öþţîöñàļ éẋţéñšîöñ îñţéŕƒàçé šüŕƒàçéš ļîṽé þŕöĝŕéšš éṽéñţš ƒöŕ þŕöṽîđéŕš ţĥàţ šüþþöŕţ ţĥéḿ:
type StreamingLLMProvider interface {
LLMProvider
ChatStream(ctx context.Context, messages []Message,
onEvent func(ChatStreamEvent)) (*ChatResponse, error)
ChatStructuredStream(ctx context.Context, messages []Message,
schema JSONSchema, onEvent func(ChatStreamEvent)) (*ChatResponse, error)
}
type ChatStreamEvent struct {
Type StreamEventType // thinking | content | done
Content string // text chunk (thinking summary or output content)
Usage TokenUsage // cumulative usage; populated on done
Model string // model name; populated on done
}
Ţĥé šţŕéàḿîñĝ ḿéţĥöđš đéļîṽéŕ þŕöĝŕéšš éṽéñţš ţĥŕöüĝĥ àñ onEvent çàļļƃàçķ àñđ
ŕéţüŕñ ţĥé ƒîñàļ àĝĝŕéĝàţéđ *ChatResponse, ŕàţĥéŕ ţĥàñ éẋþöšîñĝ à çĥàññéļ
đîŕéçţļý. ÜΚ àñđ ÇĻÎ ţööļš đîšþļàý ļîṽé ţĥîñķîñĝ þŕöĝŕéšš ƒŕöḿ þŕöṽîđéŕš ţĥàţ
šüþþöŕţ îţ. À þŕöṽîđéŕ ţĥàţ đöéš ñöţ îḿþļéḿéñţ StreamingLLMProvider çàñ šţîļļ
ƃé üšéđ; çàļļéŕš ţĥàţ ñééđ šţŕéàḿîñĝ çĥéçķ ƒöŕ ţĥé éẋţéñšîöñ ŵîţĥ à ţýþé
àššéŕţîöñ.
Çöñçüŕŕéñçý ḿöđéļ
Ḿöđéļ-ƃàçķéđ ţööļš çàļļ ţĥé þŕöṽîđéŕ đîŕéçţļý: Translate() ƒöŕ à šîñĝļé ƃļöçķ,
ChatStructured() ƒöŕ à ƃàţçĥ. Ţĥéŕé îš ñö îñţéŕṽéñîñĝ ŵöŕķéŕ þööļ, ŕàţé
ļîḿîţéŕ, öŕ çîŕçüîţ ƃŕéàķéŕ îñ ţĥé ƒŕàḿéŵöŕķ. Ţĥŕöüĝĥþüţ îš à þŕöþéŕţý öƒ ţĥé
ţööļ'š öŵñ çöñƒîĝüŕàţîöñ, îļļüšţŕàţéđ ƃý translate (core/ai/tools/translate.go):
- Ƃàţçĥîñĝ îñţéñţ ŕàţĥéŕ ţĥàñ à ḿàĝîç ñüḿƃéŕ. Ţĥé üšéŕ-ƒàçîñĝ ķñöƃ îš
--batchingŵîţĥ ţŵö ṽàļüéš:auto, ţĥé đéƒàüļţ, ĥàñđš šîžîñĝ ţö à þàçķéŕ ţĥàţ ƒîţš ƃļöçķš ţö ţĥé ḿöđéļ'š çöñţéẋţ àñđ öüţþüţ çéîļîñĝš ƒŕöḿ ţĥé çàţàļöĝ;singleþîñš öñé ƃļöçķ þéŕ çàļļ. Àñ éẋþļîçîţbatchSizeîñ à ƒļöŵ šţéþ'š çöñƒîĝ öṽéŕŕîđéš ƃöţĥ. - Ţŵö àüţöḿàţîç đöŵñĝŕàđéš ţö þéŕ-ƃļöçķ. À ļöçàļ þŕöṽîđéŕ îš ƒöŕçéđ ţö
single, ƃéçàüšé à šḿàļļ öñ-đéṽîçé ḿöđéļ ţéñđš ţö îĝñöŕé ţĥé "ŕéţüŕñ ĴŠÖÑ" îñšţŕüçţîöñ àñđ éḿîţ þļàîñ ñüḿƃéŕéđ ţéẋţ, àñđ à ṽéŕý ļàŕĝé þŕöḿþţ îš à šļöŵ ĝéñéŕàţîöñ ŵîţĥ ñö îñţéŕḿéđîàţé ƒééđƃàçķ. Đö-ñöţ-ţŕàñšļàţé éñƒöŕçéḿéñţ àļšö ƒöŕçéšsingle(àñđ đŕöþš ñéîĝĥƃöüŕ çöñţéẋţ), ƃéçàüšé éàçĥ þŕöţéçţéđ šþàñ îš ḿàšķéđ ŵîţĥ à šéñţîñéļ ţĥàţ ḿüšţ šüŕṽîṽé öñé ĝéñéŕàţîöñ îñţàçţ, ŵĥîçĥ ţĥé ƃàţçĥ þàţĥ çàññöţ ţŕàçķ þéŕ šþàñ. - Ƃöüñđéđ þàŕàļļéļîšḿ.
BatchConcurrency(đéƒàüļţ 1) šîžéš à šéḿàþĥöŕé, šö àţ ḿöšţ ţĥàţ ḿàñý çàļļš àŕé îñ ƒļîĝĥţ àţ öñçé.
Ţĥé ƃļöçķ-ƃý-ƃļöçķ þàţĥ đŕîṽéš öñé Translate() çàļļ þéŕ ţŕàñšļàţàƃļé Ƃļöçķ;
üñđéŕ à šéššîöñ îţ üšéš ţĥé šéǫüéñţîàļ šķîþ-àñđ-ĥýđŕàţé þàţĥ, ŕéàđîñĝ àñ éẋîšţîñĝ
öṽéŕļàý ţö šķîþ àļŕéàđý-ţŕàñšļàţéđ Ƃļöçķš àñđ ŵŕîţîñĝ ţĥé ŕéšüļţ ƃàçķ. Ţĥé
ƃàţçĥéđ þàţĥ đŕàîñš ţĥé îñþüţ Þàŕţš, šéļéçţš ţĥé ţŕàñšļàţàƃļé Ƃļöçķš, ĝŕöüþš ţĥéḿ,
àñđ ţŕàñšļàţéš éàçĥ ĝŕöüþ îñ à šîñĝļé ChatStructured() çàļļ, ţĥéñ ŵŕîţéš àļļ
Þàŕţš đöŵñšţŕéàḿ îñ ţĥéîŕ öŕîĝîñàļ öŕđéŕ; éñţŕîéš ḿîššîñĝ ƒŕöḿ ţĥé šţŕüçţüŕéđ
ŕéšþöñšé ƒàļļ ƃàçķ ţö îñđîṽîđüàļ þéŕ-ƃļöçķ çàļļš. Ţĥé ƃàţçĥéđ þàţĥ ĥöñöüŕš ţĥé
šàḿé šéššîöñ öṽéŕļàý çàçĥé, þŕé-ƒîļţéŕîñĝ çàçĥéđ Ƃļöçķš àñđ ŵŕîţîñĝ öṽéŕļàýš öñ
ţĥé ŵàý öüţ.
Šţŕéàḿîñĝ ḿöđé îš öŕţĥöĝöñàļ: ŵĥéñ ţĥé þŕöṽîđéŕ îḿþļéḿéñţš
StreamingLLMProvider àñđ à þŕöĝŕéšš çàļļƃàçķ îš šüþþļîéđ, ţĥé ţööļ ŕöüţéš çàļļš
ţĥŕöüĝĥ ţĥé šţŕéàḿîñĝ ḿéţĥöđš ţö šüŕƒàçé ļîṽé ţĥîñķîñĝ šüḿḿàŕîéš.
Ţŕàñšîéñţ-ƒàîļüŕé ĥàñđļîñĝ (ŕéţŕý, ƃàçķöƒƒ) îš ļéƒţ ţö ţĥé îñđîṽîđüàļ þŕöṽîđéŕ
îḿþļéḿéñţàţîöñš àñđ ţĥé üñđéŕļýîñĝ ŠĐĶ; ţĥé ƒŕàḿéŵöŕķ îḿþöšéš ñö üñîƒöŕḿ ŕéţŕý
þöļîçý.
Ŵĥàţ ţĥé ƒŕàḿéŵöŕķ đöéš àđđ îš öƃšéŕṽàţîöñ. aiprovider.Traced ŵŕàþš à
þŕöṽîđéŕ šö ţĥàţ éàçĥ çàļļ öþéñš öñé šþàñ öñ ţĥé öƃšéŕṽàţîöñ šéàḿ
(É-01) ŵîţĥ ĜéñÀÎ àţţŕîƃüţé ñàḿéš,
ŕéçöŕđîñĝ ţĥé ḿöđéļ, ţöķéñ üšàĝé, çöšţ àñđ ţŕüñçàţîöñ, àñđ ñéṽéŕ þŕöḿþţ çöñţéñţ.
À ĥöšţ ţĥàţ ŵàñţš à çîŕçüîţ ƃŕéàķéŕ öŕ à ƃüđĝéţ ŵŕàþš ţĥé þŕöṽîđéŕ öüţšîđé ţĥé
ƒŕàḿéŵöŕķ, ŵîţĥ ţŕàçîñĝ öüţšîđé ţĥé ƃŕéàķéŕ šö à ŕéƒüšéđ çàļļ îš šţîļļ ḿéàšüŕéđ.
Ţĥîš îñ-ţööļ ƃàţçĥîñĝ îš đîšţîñçţ ƒŕöḿ ţĥé ParallelBlockTool çöñçüŕŕéñçý îñ
É-01, ŵĥîçĥ þàŕàļļéļîžéš Þàŕţ đîšþàţçĥ àçŕöšš ţĥé
þîþéļîñé ŕàţĥéŕ ţĥàñ ĝŕöüþîñĝ Ƃļöçķš îñţö à šîñĝļé ÀÞÎ çàļļ. Þŕöḿþţ çöñšţŕüçţîöñ
àñđ ţĥé šţŕüçţüŕéđ ƃàţçĥ çöñţŕàçţ àŕé
Ḿ-05.
Ţĥé ḾŢ þŕöṽîđéŕ îñţéŕƒàçé
type MTProvider interface {
Name() ProviderID
Translate(ctx context.Context, req TranslateRequest) (*TranslateResponse, error)
Close() error
}
type TranslateRequest struct {
Source string
SourceLocale model.LocaleID
TargetLocale model.LocaleID
}
type TranslateResponse struct {
Translation string
}
Ţĥé îñţéŕƒàçé îš ḿîñîḿàļ. Öñé ḿéţĥöđ, þļàîñ ţéẋţ îñ àñđ öüţ, àĝàîñšţ
LLMProvider'š ţŕàñšļàţé, çĥàţ, šţŕüçţüŕéđ çĥàţ, àñđ ḿöđàļîţý đéçļàŕàţîöñ.
Ţĥé ƒŕàḿéŵöŕķ šĥîþš ñö çļàššîç ḾŢ éñĝîñéš. Ţĥé ţŕàñšļàţîöñ çöŕé îš ĻĻḾ-ƒîŕšţ,
àñđ ţĥé öñļý ƃüîļţ-îñ MTProvider îš ţĥé öƒƒļîñé demo þŕöṽîđéŕ. À ŕéàļ ḾŢ
éñĝîñé îš ĥöšţéđ ƃý à þļüĝîñ, ŵĥîçĥ ŕéĝîšţéŕš à ConfigFactory ŵîţĥ
mtprovider.RegisterConfigFactory(id, factory) (àñđ, ƒöŕ à çŕéđéñţîàļ-ƒŕéé
éñĝîñé, à þŕöṽîđéŕ ƒàçţöŕý). mtprovider.NewProviderWithConfig(id, MTConfig{...})
çöñšţŕüçţš öñé ƒŕöḿ à ĝéñéŕîç, çŕéđéñţîàļ-ƃéàŕîñĝ çöñƒîĝ, šö ţĥé üñîƒîéđ
translate ţööļ çàñ ƃüîļđ àñý ŕéĝîšţéŕéđ éñĝîñé ƒŕöḿ à ƒļöŵ öŕ ÇĻÎ çöñƒîĝ ḿàþ
ŵîţĥöüţ ķñöŵîñĝ àñýţĥîñĝ àƃöüţ îţ. mttools.Providers îš ţĥé çàñöñîçàļ ļîšţ öƒ
éñĝîñéš ŕéàçĥàƃļé ţĥŕöüĝĥ kapi translate --provider <id>; à þļüĝîñ àþþéñđš ţö
îţ, ŵĥîçĥ îš ĥöŵ àñ éñĝîñé ƃéçöḿéš šéļéçţàƃļé àñđ àþþéàŕš îñ ţĥé ţööļ'š þŕöṽîđéŕ
éñüḿ.
Àñ ḾŢ þŕöṽîđéŕ ĥàñđļéš ļöçàļé-ƒöŕḿàţ çöñṽéŕšîöñ ƒŕöḿ ƂÇÞ-47 (ţĥé ƒŕàḿéŵöŕķ'š
çàñöñîçàļ ƒöŕḿ) ţö ŵĥàţéṽéŕ çöđéš îţ éẋþéçţš, àççéþţš à BaseURL ñàḿîñĝ à
šéļƒ-ĥöšţéđ öŕ þŕîṽàţé-çļöüđ éñđþöîñţ, àñđ ŕéţüŕñš šţŕüçţüŕéđ éŕŕöŕš çàŕŕýîñĝ ţĥé
ĤŢŢÞ šţàţüš.
Þîþéļîñé îñţéĝŕàţîöñ
Àñ ḾŢ éñĝîñé ŕéàçĥéš ţĥé þîþéļîñé ţĥŕöüĝĥ MTTranslateTool
(core/mt/tools/translate.go), ŵĥîçĥ éḿƃéđš BaseTool
(É-03) àñđ šéţš Produce:
- Ŕéçéîṽé à
*Partƒŕöḿ ţĥé îñþüţ çĥàññéļ. - Éẋţŕàçţ ţŕàñšļàţàƃļé Ƃļöçķš.
- Šķîþ ñöñ-ţŕàñšļàţàƃļé ƃļöçķš (
Translatable == false) àñđ ƃļöçķš ţĥàţ àļŕéàđý ĥàṽé à ţàŕĝéţ ƒöŕ ţĥé çöñƒîĝüŕéđ ļöçàļé. - Çàļļ
provider.Translate()ŵîţĥ ţĥé ƃļöçķ'š šöüŕçé ţéẋţ. - Šéţ ţĥé ţŕàñšļàţîöñ öñ ţĥé ƃļöçķ'š ţàŕĝéţ ļöçàļé.
- Þàšš ţĥé üþđàţéđ Þàŕţ đöŵñšţŕéàḿ.
Ƃéçàüšé ţĥé ţööļ öñļý éṽéŕ ŵŕîţéš ţĥé ţàŕĝéţ, šöüŕçé šţàýš ŕéàđ-öñļý ƃý çöñšţŕüçţîöñ, éẋàçţļý ļîķé ţĥé ĻĻḾ ţŕàñšļàţé þàţĥ.
Çŕéđéñţîàļ ŕéšöļüţîöñ
Ƃöţĥ þŕöṽîđéŕ ƒàḿîļîéš ŕéšöļṽé çŕéđéñţîàļš ţĥŕöüĝĥ öñé ƒüñçţîöñ,
host/credentials.ResolveCredentials. Ĥîĝĥéšţ þŕéçéđéñçé ƒîŕšţ:
- À ţööļ ţĥàţ đöéš ñöţ đéçļàŕé
credentialsîñRequiresîš ŕéţüŕñéđ üñçĥàñĝéđ. - Àñ îñļîñé
apiKey: ţĥé--api-keyƒļàĝ, öŕ à šţéþ'š öŵñ çöñƒîĝ. - À šàṽéđ çŕéđéñţîàļ ñàḿéđ ŵîţĥ
--credential. - Ñöţĥîñĝ àţ àļļ, ƒöŕ à ķéýļéšš ļöçàļ þŕöṽîđéŕ (Öļļàḿà, đéḿö): à ļöçàļ ŕüñ îš ñéṽéŕ ƒàîļéđ ƒöŕ ŵàñţ öƒ à šàṽéđ çŕéđéñţîàļ.
- Ţĥé þŕöṽîđéŕ'š éñṽîŕöñḿéñţ ṽàŕîàƃļé, îñĵéçţéđ àš ţĥé ÀÞÎ ķéý.
- Àüţö-đéţéçţîöñ ƒŕöḿ ţĥé šţöŕé, ŵĥéñ éẋàçţļý öñé çŕéđéñţîàļ ḿàţçĥéš.
Ķéýš ñéṽéŕ àþþéàŕ îñ ƒļöŵ đéƒîñîţîöñš öŕ þŕöĵéçţ ƒîļéš.
Ţĥé éñđþöîñţ ţŕàṽéļš ŵîţĥ ţĥé ķéý. baseURL îš þàŕţ öƒ ţĥé šàḿé đéçîšîöñ àš
ţĥé šéçŕéţ šéñţ ţö îţ, šö îţ îš šţöŕéđ àļöñĝšîđé ţĥé çŕéđéñţîàļ (kapi credentials add --base-url) àñđ îñĵéçţéđ đüŕîñĝ çŕéđéñţîàļ ŕéšöļüţîöñ. À ƒļöŵ
šţéþ'š config: çàññöţ šéţ îţ: ResolveCredentials çļéàŕš ţĥé ķéý öñ ţĥé ŵàý îñ,
üñçöñđîţîöñàļļý àñđ ƃéƒöŕé éṽéŕý ŕéţüŕñ, àñđ ŕé-šéţš îţ öñļý ƒŕöḿ à ŕéšöļṽéđ
çŕéđéñţîàļ.
Šö à çüšţöḿ éñđþöîñţ àŕŕîṽéš ƃý éẋàçţļý öñé ŕöüţé: ţĥé šàṽéđ çŕéđéñţîàļ. Ţĥé
öţĥéŕ ŵàýš ţö šüþþļý à ķéý ŕéšöļṽé ƃéƒöŕé àñ éñđþöîñţ çöüļđ ƃé îñĵéçţéđ: àñ
îñļîñé ķéý ŕéţüŕñš îḿḿéđîàţéļý, àñđ ţĥé éñṽîŕöñḿéñţ ƒàļļƃàçķ ƃüîļđš à þŕöṽîđéŕ
çöñƒîĝ ţĥàţ ĥàš ñö éñđþöîñţ ţö ĝîṽé. À šéļƒ-ĥöšţéđ éñđþöîñţ çöḿƃîñéđ ŵîţĥ
--api-key, öŕ ŵîţĥ à þŕöṽîđéŕ éñṽîŕöñḿéñţ ṽàŕîàƃļé šéţ, ţĥéŕéƒöŕé çàļļš ţĥé
þüƃļîç ĥöšţ, šàṽéđ çŕéđéñţîàļ öŕ ñöţ. Ţĥîš îš ţĥé îñţéñđéđ šĥàþé ŕàţĥéŕ ţĥàñ à
ĝàþ (ţĥé éñđþöîñţ àñđ ţĥé šéçŕéţ àŕé öñé đéçîšîöñ, àñđ öñļý à šàṽéđ çŕéđéñţîàļ
ĥöļđš ƃöţĥ), ƃüţ îţ îš ţĥé šĥàþé à üšéŕ îš ḿöšţ ļîķéļý ţö ƃé šüŕþŕîšéđ ƃý, šö
kapi credentials add --base-url ñàḿéš îţ àñđ
Çĥööšé à ţŕàñšļàţîöñ þŕöṽîđéŕ
šţàţéš îţ ŵĥéŕé à üšéŕ îš çĥööšîñĝ.
Ţĥîš îš éñƒöŕçéđ îñ ţĥé ŕéšöļṽéŕ ŕàţĥéŕ ţĥàñ ƃý ţĥé ţööļ'š šţŕüçţ ţàĝš, ƃéçàüšé
ţĥé ţŵö ķîñđš öƒ ţàĝ ḿéàñ đéŕéñţ ţĥîñĝš. schema:"-" ķééþš à ƒîéļđ öƒƒ ţĥé
ÇĻÎ àñđ öüţ öƒ ţĥé ĝéñéŕàţéđ ƒöŕḿ, ƃüţ core/schema.ApplyConfig îš à þļàîñ ĴŠÖÑ
ŕöüñđ-ţŕîþ: à šţéþ'š çöñƒîĝ ḿàþ ŕéàçĥéš éṽéŕý ƒîéļđ ŵîţĥ à json ţàĝ, ŵĥàţéṽéŕ
îţš schema ţàĝ šàýš. Ĥîđîñĝ à ƒîéļđ ƒŕöḿ ţĥé ƒöŕḿ îš à þŕéšéñţàţîöñ çĥöîçé;
ķééþîñĝ à ŕéçîþé öüţ öƒ îţ îš à šéþàŕàţé àçţ.
Đéƒàüļţ þŕöṽîđéŕ ŕéšöļüţîöñ
Ŵĥîçĥ þŕöṽîđéŕ à ŕüñ üšéš ŵĥéñ ñöţĥîñĝ ñàḿéš öñé îš à šéþàŕàţé ǫüéšţîöñ ƒŕöḿ
ĥöŵ îţ àüţĥéñţîçàţéš, àñđ îţ ĥàš éẋàçţļý öñé ŕéšöļṽéŕ:
config.ResolveAIDefault. Îţ ŕéţüŕñš ţĥé þŕöṽîđéŕ, ţĥé ḿöđéļ, àñđ ŵĥéŕé ţĥé
ṽàļüé çàḿé ƒŕöḿ (env | config | none), àñđ config.SetAIDefault /
config.ClearAIDefault àŕé ţĥé ḿàţçĥîñĝ šîñĝļé ŵŕîţé þàţĥ.
Þŕéçéđéñçé, ḿàţçĥîñĝ éṽéŕý öţĥéŕ çöñƒîĝ ķéý: àñ éẋþļîçîţ --provider/--model
ƒļàĝ öŕ àñ îñļîñé ŕéçîþé ṽàļüé ƒîŕšţ, ţĥéñ KAPI_AI_PROVIDER / KAPI_AI_MODEL,
ţĥéñ ţĥé šţöŕéđ ai.provider / ai.model.
Öñé ŕéšöļṽéŕ ŕàţĥéŕ ţĥàñ šîẋ ŕéàđ šîţéš, ƃéçàüšé šîẋ ŕéàđ šîţéš ĥàđ ñö šĥàŕéđ àñšŵéŕ ţö "ŵĥàţ îš çöñƒîĝüŕéđ, àñđ ŵĥéŕé đîđ îţ çöḿé ƒŕöḿ", šö à šçöþé ƃüĝ îñ ţĥé ŕéàđéŕ ŵàš îñṽîšîƃļé îñ àļļ öƒ ţĥéḿ àţ öñçé. Ŕéþöŕţîñĝ ţĥé šöüŕçé àļöñĝšîđé ţĥé ṽàļüé îš ŵĥàţ ļéţš à đîàĝñöšţîç ñàḿé ţĥé ƒîļé öŕ ţĥé éñṽîŕöñḿéñţ ṽàŕîàƃļé ţö çĥàñĝé, îñšţéàđ öƒ àššéŕţîñĝ ţĥàţ ñöţĥîñĝ îš çöñƒîĝüŕéđ.
Ţĥé àþþ çöñƒîĝ ƒîļé îš þîññéđ ţö config.GlobalConfigFilePath() (ţĥé šàḿé
ƒüñçţîöñ ţĥé ŵŕîţéŕš üšé), àñđ ñéṽéŕ ŕéšöļṽéđ ţĥŕöüĝĥ à šéàŕçĥ þàţĥ. À ŕéçîþé îš
þŕöĵéçţ çöñƒîĝüŕàţîöñ àñđ àþþ çöñƒîĝ îš þéŕ-ḿàçĥîñé, šö ţĥé ŵöŕķîñĝ đîŕéçţöŕý îš
ñöţ à çöñƒîĝ ļöçàţîöñ: à šéàŕçĥ þàţĥ ŕéàçĥîñĝ îţ ŵöüļđ ļöàđ ţĥé ŕéçîþé àš ţĥé
àþþ çöñƒîĝ îñšîđé àñý þŕöĵéçţ, šîñçé à kapi þŕöĵéçţ'š ŕéçîþé îš àļšö ñàḿéđ
kapi.yaml, àñđ éṽéŕý šţöŕéđ đéƒàüļţ ŵöüļđ ŕéàđ àš éḿþţý.
$HOME/.config/kapi/kapi.yaml àñđ /etc/kapi/kapi.yaml àŕé ŕéàđ àš
ļöŵéŕ-þŕéçéđéñçé ļàýéŕš ƃéñéàţĥ ţĥé þîññéđ ƒîļé, šö à ĥàñđ-ŵŕîţţéñ çöñƒîĝ ŵöŕķš.
Öñ Ļîñüẋ ţĥé ƒîŕšţ öƒ ţĥöšé îš ţĥé þîññéđ þàţĥ, šîñçé os.UserConfigDir
ĥöñöüŕš ẊĐĜ; öñ ḿàçÖŠ îţ ŕéšöļṽéš ţö ~/Library/Application Support, ŵĥîçĥ îš
ŵĥý ţĥé ţŵö đéŕ àţ àļļ.
Ţĥé ţööļš ţĥàţ çàļļ ţĥéḿ
Ƃöţĥ ƒàḿîļîéš ŕéàçĥ ţĥé þîþéļîñé àš öŕđîñàŕý ţööļš
(É-03). Öñ ţĥé ÇĻÎ šüŕƒàçé, ţŕàñšļàţîöñ îš à šîñĝļé
translate çöḿḿàñđ àçŕöšš éṽéŕý ƃàçķéñđ àñđ ǫüàļîţý à šîñĝļé qa çöḿḿàñđ; ţĥé
ƃàçķéñđ îš šéļéçţéđ ŵîţĥ --provider, ŵĥîļé ţĥé ţŵö þŕöṽîđéŕ îñţéŕƒàçéš šţàý
đîšţîñçţ üñđéŕñéàţĥ. review, term-extract, entity-extract, voice-check,
voice-infer, àñđ media-refine àŕé ţĥé öţĥéŕ ḿöđéļ-ƃàçķéđ ţööļš; ţĥé
àüţĥöŕîţàţîṽé ļîšţ îš ţĥé Ţööļ Ŕéƒéŕéñçé.
Ƃéçàüšé ţĥéý àŕé öŕđîñàŕý ţööļš, ţĥéý çöḿþöšé ñàţüŕàļļý:
recycleƒîļļš éẋàçţ àñđ ĝéñéŕàļîžéđ ḿàţçĥéš ƒŕöḿ ţĥé çöñţéñţ ḿéḿöŕý àţ ñéàŕ-žéŕö çöšţ.translateţŕàñšļàţéš ţĥé ŕéḿàîñđéŕ ţĥŕöüĝĥ ŵĥîçĥéṽéŕ ƃàçķéñđ--providerñàḿéđ.reviewàññöţàţéš à ŕéṽîéŵ àššéššḿéñţ üšîñĝ ḿöđéļ ŕéàšöñîñĝ ŵîţĥ ţéŕḿ àñđ ḿéḿöŕý çöñţéẋţ; îţ đöéš ñöţ ŕéŵŕîţé ţĥé ţàŕĝéţ.qaṽàļîđàţéš ţĥé ŕéšüļţ ƃéƒöŕé îţ îš ŵŕîţţéñ.
Šŵîţçĥîñĝ ƃàçķéñđš îš à çöñƒîĝüŕàţîöñ çĥàñĝé (öñé --provider ṽàļüé ƒöŕ
àñöţĥéŕ), àñđ ţĥé ŕéšţ öƒ ţĥé ƒļöŵ îš üñçĥàñĝéđ.
Ḿöđéļ-ƃàçķéđ ţööļš ŕéçéîṽé ţéŕḿîñöļöĝý çöñţéẋţ ƒŕöḿ üþšţŕéàḿ šţàĝéš: ḿàţçĥéđ ţéŕḿš àñđ ţĥéîŕ þŕéƒéŕŕéđ ţŕàñšļàţîöñš, îđéñţîƒîéđ éñţîţîéš ŵîţĥ ţĥéîŕ đö-ñöţ-ţŕàñšļàţé ƒļàĝš àñđ ļöçàļé ƒöŕḿàţţîñĝ ĥîñţš, àñđ à đéđîçàţéđ ţéŕḿ-çöñšţŕàîñţ šéçţîöñ ƒöŕ ţĥé çüŕŕéñţ Ƃļöçķ'š çööŕđîñàţéš. Ţéŕḿîñöļöĝý îš ţĥéŕéƒöŕé ñöţ öñļý à þöšţ-ţŕàñšļàţîöñ çĥéçķ; îţ ĝüîđéš ţĥé ĝéñéŕàţîöñ ƒŕöḿ ţĥé šţàŕţ (Ç-08).
Šçöþé ƃöüñđàŕý
Ţĥé ƒŕàḿéŵöŕķ'š ŕéšþöñšîƃîļîţý éñđš àţ ţĥé þŕöṽîđéŕ îñţéŕƒàçéš àñđ ţĥé þîþéļîñé ţööļš ţĥàţ çàļļ ţĥéḿ. Šéŕṽéŕ-šîđé àšýñçĥŕöñöüš ĵöƃ ǫüéüéš, ḿüļţî-ţéñàñţ ǫüöţà éñƒöŕçéḿéñţ, ŕàţé-ļîḿîţ ƃüđĝéţš, àñđ ŵöŕķšþàçé-šçàļé ţŕàñšļàţîöñ öŕçĥéšţŕàţîöñ àŕé à þļàţƒöŕḿ ļàýéŕ'š çöñçéŕñ, ƃüîļţ öñ ţöþ öƒ ţĥéšé ƒŕàḿéŵöŕķ þŕîḿîţîṽéš.
Çöñšéǫüéñçéš
- Ţŕàñšļàţîöñ îš à þîþéļîñé ţööļ, ñöţ à šéþàŕàţé šýšţéḿ. Îţ çöḿþöšéš ŵîţĥ àļļ öţĥéŕ ţööļš ŵîţĥöüţ šþéçîàļ öŕçĥéšţŕàţîöñ.
- Öŕđéŕîñĝ îš ḿéàñîñĝƒüļ: ḿéḿöŕý ļéṽéŕàĝé ƃéƒöŕé ĝéñéŕàţîöñ àṽöîđš ŕé-ţŕàñšļàţîñĝ éẋàçţ ḿàţçĥéš, ŕéđüçîñĝ çöšţ.
- Ţéŕḿ àñđ éñţîţý çöñţéẋţ ƒļöŵš ţĥŕöüĝĥ ţĥé þîþéļîñé ṽîà öṽéŕļàýš, šö ḿöđéļ-ƃàçķéđ ţööļš þŕöđüçé ţéŕḿîñöļöĝý-çöñšîšţéñţ öüţþüţ ƒŕöḿ ţĥé šţàŕţ.
- Ţĥŕöüĝĥþüţ ţüñîñĝ ļîṽéš öñ ţĥé ţööļ, ñöţ îñ à ĥîđđéñ šüƃšýšţéḿ: à çàļļéŕ çĥööšéš à ƃàţçĥîñĝ îñţéñţ àñđ à ƃàţçĥ çöñçüŕŕéñçý, ŵîţĥ ñö ŵöŕķéŕ þööļ ţö çöñƒîĝüŕé, àñđ ţĥé ţŵö àüţöḿàţîç đöŵñĝŕàđéš ķééþ çöŕŕéçţñéšš àĥéàđ öƒ ţĥé ƃàţçĥ ŵîñ ŵĥéŕé ţĥéý çöñƒļîçţ.
ChatStructuredĝîṽéš ţööļš à ŕéļîàƃļé ĴŠÖÑ çöñţŕàçţ àçŕöšš þŕöṽîđéŕš ŵîţĥ ṽéŕý đéŕéñţ šţŕüçţüŕéđ-öüţþüţ ḿéçĥàñîšḿš.- Ţĥé þŕöṽîđéŕ àƃšţŕàçţîöñ éñàƃļéš çöšţ çĥöîçéš: à ļöçàļ ŕüñţîḿé ƒöŕ đéṽéļöþḿéñţ, à ĥöšţéđ ḿöđéļ ƒöŕ þŕöđüçţîöñ, àñ ḾŢ éñĝîñé ŵĥéŕé ţĥé çöñţéñţ đöéš ñöţ ñééđ ḿöđéļ-ļéṽéļ çöñţéẋţ.
- Ţĥé ḿöçķ àñđ đéḿö þŕöṽîđéŕš ḿàķé đéţéŕḿîñîšţîç ţéšţš àñđ à ķéýļéšš ƃŕöŵšéŕ þļàýĝŕöüñđ þöššîƃļé ŵîţĥöüţ ÀÞÎ çàļļš.
- Àžüŕé Ḿàñàĝéđ Îđéñţîţý éļîḿîñàţéš ÀÞÎ-ķéý ḿàñàĝéḿéñţ ƒöŕ ţĥàţ đéþļöýḿéñţ ŵĥîļé ţĥé šàḿé îñţéŕƒàçé çöñţîñüéš ţö šüþþöŕţ ķéý-ƃàšéđ àüţĥ éļšéŵĥéŕé.
- Ķééþîñĝ ḾŢ éñĝîñéš öüţ öƒ ţĥé ƒŕàḿéŵöŕķ ķééþš ţĥé đéƒàüļţ ƃîñàŕý ƒŕéé öƒ ṽéñđöŕ ÀÞÎ çļîéñţš àñđ ţĥéîŕ çŕéđéñţîàļš, àñđ ḿàķéš àđđîñĝ öñé à þļüĝîñ đéçîšîöñ ŕàţĥéŕ ţĥàñ à ƒŕàḿéŵöŕķ çĥàñĝé.
Ŕéļàţéđ
- Ƒ-02: Ţĥé çöñţéñţ ḿöđéļ: öṽéŕļàýš öñ Ƃļöçķš; ţĥé ḿéđîà àñçĥöŕ à ḿüļţîḿöđàļ ḿéššàĝé çàŕŕîéš
- É-01: Ţĥé þŕöçéššîñĝ éñĝîñé: ƒļöŵ éẋéçüţîöñ àñđ
ParallelBlockTool - É-03: Ţĥé ţööļ šýšţéḿ: ţĥé ţööļ þàţţéŕñ, þŕöṽîđéŕ îñĵéçţîöñ, àñđ ţĥé ŕéḿöţé-éĝŕéšš šîđé 郃éçţ
- É-05: Ţĥé þļüĝîñ šýšţéḿ: ĥöŵ à þļüĝîñ ŕéĝîšţéŕš à þŕöṽîđéŕ
- Ḿ-03: Ḿüļţîḿöđàļ çöñţéñţ: ţĥé ŕéƒîñéḿéñţ ţîéŕ ţĥàţ šéñđš îḿàĝé, àüđîö, àñđ ṽîđéö þàŕţš
- Ḿ-05: Þŕöḿþţš àñđ ƃàţçĥîñĝ: þŕöḿþţ ţéḿþļàţéš àñđ ţĥé šţŕüçţüŕéđ ƃàţçĥ çöñţŕàçţ
- Ç-09: Çöñţéñţ ḿéḿöŕý:
recycleŕüñš ƃéƒöŕé ĝéñéŕàţîöñ àñđ ƒééđš îţ çöñţéẋţ - Ç-08: Ţéŕḿš: ţéŕḿ çöñţéẋţ ƒééđš ţĥé þŕöḿþţ àñđ ţĥé þöšţ-çĥéçķ
- Š-01: Ţĥé kapi ÇĻÎ: ţĥé çŕéđéñţîàļ šţöŕé