@@ -45,7 +45,7 @@ type Coordinator interface {
45 ClearQueue(sessionID string)
45 ClearQueue(sessionID string)
46 Summarize(context.Context, string) error
46 Summarize(context.Context, string) error
47 Model() Model
47 Model() Model
48− UpdateModels() error
48+ UpdateModels(ctx context.Context) error
51type coordinator struct {
51type coordinator struct {
@@ -61,6 +61,7 @@ type coordinator struct {
63func NewCoordinator(
63func NewCoordinator(
64 cfg *config.Config,
65 cfg *config.Config,
65 sessions session.Service,
66 sessions session.Service,
66 messages message.Service,
67 messages message.Service,
@@ -89,7 +90,7 @@ func NewCoordinator(
89 return nil, err
90 return nil, err
92− agent, err := c.buildAgent(prompt, agentCfg)
93+ agent, err := c.buildAgent(ctx, prompt, agentCfg)
93 if err != nil {
94 if err != nil {
94 return nil, err
95 return nil, err
@@ -255,8 +256,8 @@ func mergeCallOptions(model Model, tp catwalk.Type) (fantasy.ProviderOptions, *f
255 return modelOptions, temp, topP, topK, freqPenalty, presPenalty
256 return modelOptions, temp, topP, topK, freqPenalty, presPenalty
258−func (c *coordinator) buildAgent(prompt *prompt.Prompt, agent config.Agent) (SessionAgent, error) {
259+func (c *coordinator) buildAgent(ctx context.Context, prompt *prompt.Prompt, agent config.Agent) (SessionAgent, error) {
259− large, small, err := c.buildAgentModels()
260+ large, small, err := c.buildAgentModels(ctx)
260 if err != nil {
261 if err != nil {
261 return nil, err
262 return nil, err
@@ -266,17 +267,17 @@ func (c *coordinator) buildAgent(prompt *prompt.Prompt, agent config.Agent) (Ses
266 return nil, err
267 return nil, err
269− tools, err := c.buildTools(agent)
270+ tools, err := c.buildTools(ctx, agent)
270 if err != nil {
271 if err != nil {
271 return nil, err
272 return nil, err
273 return NewSessionAgent(SessionAgentOptions{large, small, systemPrompt, c.cfg.Options.DisableAutoSummarize, c.sessions, c.messages, tools}), nil
274 return NewSessionAgent(SessionAgentOptions{large, small, systemPrompt, c.cfg.Options.DisableAutoSummarize, c.sessions, c.messages, tools}), nil
276−func (c *coordinator) buildTools(agent config.Agent) ([]fantasy.AgentTool, error) {
277+func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fantasy.AgentTool, error) {
277 var allTools []fantasy.AgentTool
278 var allTools []fantasy.AgentTool
278 if slices.Contains(agent.AllowedTools, AgentToolName) {
279 if slices.Contains(agent.AllowedTools, AgentToolName) {
279− agentTool, err := c.agentTool()
280+ agentTool, err := c.agentTool(ctx)
280 if err != nil {
281 if err != nil {
281 return nil, err
282 return nil, err
@@ -334,7 +335,7 @@ func (c *coordinator) buildTools(agent config.Agent) ([]fantasy.AgentTool, error
336// TODO: when we support multiple agents we need to change this so that we pass in the agent specific model config
337// TODO: when we support multiple agents we need to change this so that we pass in the agent specific model config
337−func (c *coordinator) buildAgentModels() (Model, Model, error) {
338+func (c *coordinator) buildAgentModels(ctx context.Context) (Model, Model, error) {
338 largeModelCfg, ok := c.cfg.Models[config.SelectedModelTypeLarge]
339 largeModelCfg, ok := c.cfg.Models[config.SelectedModelTypeLarge]
340 return Model{}, Model{}, errors.New("large model not selected")
341 return Model{}, Model{}, errors.New("large model not selected")
@@ -386,11 +387,11 @@ func (c *coordinator) buildAgentModels() (Model, Model, error) {
386 return Model{}, Model{}, errors.New("snall model not found in provider config")
387 return Model{}, Model{}, errors.New("snall model not found in provider config")
389− largeModel, err := largeProvider.LanguageModel(largeModelCfg.Model)
390+ largeModel, err := largeProvider.LanguageModel(ctx, largeModelCfg.Model)
390 if err != nil {
391 if err != nil {
391 return Model{}, Model{}, err
392 return Model{}, Model{}, err
393− smallModel, err := smallProvider.LanguageModel(smallModelCfg.Model)
394+ smallModel, err := smallProvider.LanguageModel(ctx, smallModelCfg.Model)
394 if err != nil {
395 if err != nil {
395 return Model{}, Model{}, err
396 return Model{}, Model{}, err
@@ -406,7 +407,7 @@ func (c *coordinator) buildAgentModels() (Model, Model, error) {
409−func (c *coordinator) buildAnthropicProvider(baseURL, apiKey string, headers map[string]string) fantasy.Provider {
410+func (c *coordinator) buildAnthropicProvider(baseURL, apiKey string, headers map[string]string) (fantasy.Provider, error) {
410 hasBearerAuth := false
411 hasBearerAuth := false
411 for key := range headers {
412 for key := range headers {
412 if strings.ToLower(key) == "authorization" {
413 if strings.ToLower(key) == "authorization" {
@@ -441,7 +442,7 @@ func (c *coordinator) buildAnthropicProvider(baseURL, apiKey string, headers map
441 return anthropic.New(opts...)
442 return anthropic.New(opts...)
444−func (c *coordinator) buildOpenaiProvider(baseURL, apiKey string, headers map[string]string) fantasy.Provider {
445+func (c *coordinator) buildOpenaiProvider(baseURL, apiKey string, headers map[string]string) (fantasy.Provider, error) {
445 opts := []openai.Option{
446 opts := []openai.Option{
446 openai.WithAPIKey(apiKey),
447 openai.WithAPIKey(apiKey),
447 openai.WithUseResponsesAPI(),
448 openai.WithUseResponsesAPI(),
@@ -459,7 +460,7 @@ func (c *coordinator) buildOpenaiProvider(baseURL, apiKey string, headers map[st
459 return openai.New(opts...)
460 return openai.New(opts...)
462−func (c *coordinator) buildOpenrouterProvider(_, apiKey string, headers map[string]string) fantasy.Provider {
463+func (c *coordinator) buildOpenrouterProvider(_, apiKey string, headers map[string]string) (fantasy.Provider, error) {
463 opts := []openrouter.Option{
464 opts := []openrouter.Option{
464 openrouter.WithAPIKey(apiKey),
465 openrouter.WithAPIKey(apiKey),
@@ -473,7 +474,7 @@ func (c *coordinator) buildOpenrouterProvider(_, apiKey string, headers map[stri
473 return openrouter.New(opts...)
474 return openrouter.New(opts...)
476−func (c *coordinator) buildOpenaiCompatProvider(baseURL, apiKey string, headers map[string]string) fantasy.Provider {
477+func (c *coordinator) buildOpenaiCompatProvider(baseURL, apiKey string, headers map[string]string) (fantasy.Provider, error) {
477 opts := []openaicompat.Option{
478 opts := []openaicompat.Option{
478 openaicompat.WithBaseURL(baseURL),
479 openaicompat.WithBaseURL(baseURL),
479 openaicompat.WithAPIKey(apiKey),
480 openaicompat.WithAPIKey(apiKey),
@@ -489,7 +490,7 @@ func (c *coordinator) buildOpenaiCompatProvider(baseURL, apiKey string, headers
489 return openaicompat.New(opts...)
490 return openaicompat.New(opts...)
492−func (c *coordinator) buildAzureProvider(baseURL, apiKey string, headers map[string]string, options map[string]string) fantasy.Provider {
493+func (c *coordinator) buildAzureProvider(baseURL, apiKey string, headers map[string]string, options map[string]string) (fantasy.Provider, error) {
493 opts := []azure.Option{
494 opts := []azure.Option{
494 azure.WithBaseURL(baseURL),
495 azure.WithBaseURL(baseURL),
495 azure.WithAPIKey(apiKey),
496 azure.WithAPIKey(apiKey),
@@ -511,7 +512,7 @@ func (c *coordinator) buildAzureProvider(baseURL, apiKey string, headers map[str
511 return azure.New(opts...)
512 return azure.New(opts...)
514−func (c *coordinator) buildGoogleProvider(baseURL, apiKey string, headers map[string]string) fantasy.Provider {
515+func (c *coordinator) buildGoogleProvider(baseURL, apiKey string, headers map[string]string) (fantasy.Provider, error) {
515 opts := []google.Option{
516 opts := []google.Option{
516 google.WithBaseURL(baseURL),
517 google.WithBaseURL(baseURL),
517 google.WithGeminiAPIKey(apiKey),
518 google.WithGeminiAPIKey(apiKey),
@@ -526,7 +527,7 @@ func (c *coordinator) buildGoogleProvider(baseURL, apiKey string, headers map[st
526 return google.New(opts...)
527 return google.New(opts...)
529−func (c *coordinator) buildGoogleVertexProvider(headers map[string]string, options map[string]string) fantasy.Provider {
530+func (c *coordinator) buildGoogleVertexProvider(headers map[string]string, options map[string]string) (fantasy.Provider, error) {
530 opts := []google.Option{}
531 opts := []google.Option{}
531 if c.cfg.Options.Debug {
532 if c.cfg.Options.Debug {
532 httpClient := log.NewHTTPClient()
533 httpClient := log.NewHTTPClient()
@@ -574,27 +575,25 @@ func (c *coordinator) buildProvider(providerCfg config.ProviderConfig, model con
574 // TODO: make sure we have
575 // TODO: make sure we have
575 apiKey, _ := c.cfg.Resolve(providerCfg.APIKey)
576 apiKey, _ := c.cfg.Resolve(providerCfg.APIKey)
576 baseURL, _ := c.cfg.Resolve(providerCfg.BaseURL)
577 baseURL, _ := c.cfg.Resolve(providerCfg.BaseURL)
577− var provider fantasy.Provider
578+
578 switch providerCfg.Type {
579 switch providerCfg.Type {
579 case openai.Name:
580 case openai.Name:
580− provider = c.buildOpenaiProvider(baseURL, apiKey, headers)
581+ return c.buildOpenaiProvider(baseURL, apiKey, headers)
581 case anthropic.Name:
582 case anthropic.Name:
582− provider = c.buildAnthropicProvider(baseURL, apiKey, headers)
583+ return c.buildAnthropicProvider(baseURL, apiKey, headers)
583 case openrouter.Name:
584 case openrouter.Name:
584− provider = c.buildOpenrouterProvider(baseURL, apiKey, headers)
585+ return c.buildOpenrouterProvider(baseURL, apiKey, headers)
585 case azure.Name:
586 case azure.Name:
586− provider = c.buildAzureProvider(baseURL, apiKey, headers, providerCfg.ExtraParams)
587+ return c.buildAzureProvider(baseURL, apiKey, headers, providerCfg.ExtraParams)
587 case google.Name:
588 case google.Name:
588− provider = c.buildGoogleProvider(baseURL, apiKey, headers)
589+ return c.buildGoogleProvider(baseURL, apiKey, headers)
589− // this is not in fantasy since its just the google provider with extra stuff
590 case "vertexai":
590 case "vertexai":
591− provider = c.buildGoogleVertexProvider(headers, providerCfg.ExtraParams)
591+ return c.buildGoogleVertexProvider(headers, providerCfg.ExtraParams)
592 case openaicompat.Name:
592 case openaicompat.Name:
593− provider = c.buildOpenaiCompatProvider(baseURL, apiKey, headers)
593+ return c.buildOpenaiCompatProvider(baseURL, apiKey, headers)
595 return nil, errors.New("provider type not supported")
595 return nil, errors.New("provider type not supported")
597− return provider, nil
600func (c *coordinator) Cancel(sessionID string) {
599func (c *coordinator) Cancel(sessionID string) {
@@ -621,9 +620,9 @@ func (c *coordinator) Model() Model {
621 return c.currentAgent.Model()
620 return c.currentAgent.Model()
624−func (c *coordinator) UpdateModels() error {
623+func (c *coordinator) UpdateModels(ctx context.Context) error {
625 // build the models again so we make sure we get the latest config
624 // build the models again so we make sure we get the latest config
626− large, small, err := c.buildAgentModels()
625+ large, small, err := c.buildAgentModels(ctx)
627 if err != nil {
626 if err != nil {
628 return err
627 return err
@@ -634,7 +633,7 @@ func (c *coordinator) UpdateModels() error {
634 return errors.New("coder agent not configured")
633 return errors.New("coder agent not configured")
637− tools, err := c.buildTools(agentCfg)
636+ tools, err := c.buildTools(ctx, agentCfg)
638 if err != nil {
637 if err != nil {
639 return err
638 return err