applyAgentThinkingLevel resolves the agent's current model, asks pick to choose the target level among the model's supported ones, re-creates the effective provider(s) with that level, and installs them as a runtime override.
(ctx context.Context, agentName string, pick func(supported []effort.Level, current effort.Level) (effort.Level, error))
| 227 | // effective provider(s) with that level, and installs them as a runtime |
| 228 | // override. |
| 229 | func (r *LocalRuntime) applyAgentThinkingLevel(ctx context.Context, agentName string, pick func(supported []effort.Level, current effort.Level) (effort.Level, error)) (effort.Level, error) { |
| 230 | if r.modelSwitcherCfg == nil { |
| 231 | return "", ErrUnsupported |
| 232 | } |
| 233 | |
| 234 | a, err := r.team.Agent(agentName) |
| 235 | if err != nil { |
| 236 | return "", fmt.Errorf("agent not found: %w", err) |
| 237 | } |
| 238 | |
| 239 | models := a.EffectiveModels() |
| 240 | if len(models) == 0 { |
| 241 | return "", errors.New("agent has no model configured") |
| 242 | } |
| 243 | |
| 244 | baseCfg := models[0].BaseConfig().ModelConfig |
| 245 | if !r.modelSupportsThinking(ctx, &baseCfg) { |
| 246 | return "", fmt.Errorf("model %q does not support thinking levels: %w", baseCfg.DisplayOrModel(), ErrUnsupported) |
| 247 | } |
| 248 | |
| 249 | supported := modelinfo.SupportedThinkingLevels(baseCfg.Provider, baseCfg.Model) |
| 250 | next, err := pick(supported, currentThinkingLevel(&baseCfg)) |
| 251 | if err != nil { |
| 252 | return "", err |
| 253 | } |
| 254 | |
| 255 | // Re-create each effective provider (alloy models can have several) with |
| 256 | // the new thinking level so the override preserves the existing pool. |
| 257 | newProviders := make([]provider.Provider, 0, len(models)) |
| 258 | for _, m := range models { |
| 259 | mc := m.BaseConfig().ModelConfig |
| 260 | cfg := mc.Clone() |
| 261 | cfg.ThinkingBudget = &latest.ThinkingBudget{Effort: string(next)} |
| 262 | prov, err := r.createProviderFromConfig(ctx, cfg) |
| 263 | if err != nil { |
| 264 | return "", fmt.Errorf("failed to apply thinking level: %w", err) |
| 265 | } |
| 266 | newProviders = append(newProviders, prov) |
| 267 | } |
| 268 | |
| 269 | a.SetModelOverride(newProviders...) |
| 270 | slog.InfoContext(ctx, "Set agent thinking level", "agent", agentName, "level", next) |
| 271 | return next, nil |
| 272 | } |
| 273 | |
| 274 | // modelSupportsThinking reports whether cfg names a model that accepts a |
| 275 | // user-selectable thinking-effort level. It first trusts an explicit, |
no test coverage detected