Files
Cyrene_v2/internal/runtime/agent/request.go
T

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()
}