feat(agent): Agent 实体(指令/工具/guardrail/handoff + 单步 RunStep,含多模态路由/调用记录)
This commit is contained in:
1 parent
b798e129c1
commit
be67d74822
6 files changed
+843
No files matched your search
@@ -0,0 +1,68 @@
|
||||
package agent
|
||||
|
||||
import "git.yeij.top/AskaEth/Cyrene_v2/internal/runtime/model"
|
||||
|
||||
// defaultPurpose labels CallRecords when Options.Purpose is empty.
|
||||
const defaultPurpose = "agent"
|
||||
|
||||
// buildRequest assembles a model.Request for one step: the agent's instructions
|
||||
// prepended as a leading system message, plus the conversation messages, the
|
||||
// configured model/temperature/max-tokens/purpose and the registered tool
|
||||
// schemas. When a router is injected it overrides the model from the request
|
||||
// contents, which is how vision requests are routed to the vision model.
|
||||
func (a *Agent) buildRequest(messages []model.Message) model.Request {
|
||||
req := model.Request{
|
||||
Model: a.opts.Model,
|
||||
Messages: a.assembleMessages(messages),
|
||||
Temperature: a.temperature(),
|
||||
MaxTokens: a.opts.MaxTokens,
|
||||
Purpose: a.purpose(),
|
||||
Tools: a.toolSchemas(),
|
||||
}
|
||||
if a.router != nil {
|
||||
if routeModel, _ := a.router.RouteRequest(req); routeModel != "" {
|
||||
req.Model = routeModel
|
||||
}
|
||||
}
|
||||
return req
|
||||
}
|
||||
|
||||
// assembleMessages returns messages with the agent's instructions prepended as a
|
||||
// leading system message when instructions are non-empty, otherwise the input
|
||||
// slice is returned unchanged.
|
||||
func (a *Agent) assembleMessages(messages []model.Message) []model.Message {
|
||||
if a.instructions == "" {
|
||||
return messages
|
||||
}
|
||||
out := make([]model.Message, 0, len(messages)+1)
|
||||
out = append(out, model.TextMessage(model.RoleSystem, a.instructions))
|
||||
out = append(out, messages...)
|
||||
return out
|
||||
}
|
||||
|
||||
// temperature returns the temperature pointer to place in a Request. Zero maps
|
||||
// to nil so the provider default applies.
|
||||
func (a *Agent) temperature() *float64 {
|
||||
if a.opts.Temperature == 0 {
|
||||
return nil
|
||||
}
|
||||
t := a.opts.Temperature
|
||||
return &t
|
||||
}
|
||||
|
||||
// purpose returns the CallRecord purpose label, defaulting to defaultPurpose.
|
||||
func (a *Agent) purpose() string {
|
||||
if a.opts.Purpose == "" {
|
||||
return defaultPurpose
|
||||
}
|
||||
return a.opts.Purpose
|
||||
}
|
||||
|
||||
// toolSchemas returns the registered tool schemas advertised to the model, or
|
||||
// nil when no dispatcher is configured.
|
||||
func (a *Agent) toolSchemas() []model.ToolSpec {
|
||||
if a.tools == nil {
|
||||
return nil
|
||||
}
|
||||
return a.tools.ToolSchemas()
|
||||
}
|
||||
Reference in new issue
Block a user