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