69 lines
2.1 KiB
Go
69 lines
2.1 KiB
Go
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()
|
|
}
|