( ctx context.Context, chat database.Chat, generatedTitle *generatedChatTitle, logger slog.Logger, )
| 7097 | } |
| 7098 | |
| 7099 | func (p *Server) runChat( |
| 7100 | ctx context.Context, |
| 7101 | chat database.Chat, |
| 7102 | generatedTitle *generatedChatTitle, |
| 7103 | logger slog.Logger, |
| 7104 | ) (runChatResult, error) { |
| 7105 | result := runChatResult{} |
| 7106 | var ( |
| 7107 | model fantasy.LanguageModel |
| 7108 | modelConfig database.ChatModelConfig |
| 7109 | providerKeys chatprovider.ProviderAPIKeys |
| 7110 | callConfig codersdk.ChatModelCallConfig |
| 7111 | messages []database.ChatMessage |
| 7112 | err error |
| 7113 | debugEnabled bool |
| 7114 | debugProvider string |
| 7115 | modelRoute resolvedModelRoute |
| 7116 | debugModel string |
| 7117 | ) |
| 7118 | |
| 7119 | messages, err = p.db.GetChatMessagesForPromptByChatID(ctx, chat.ID) |
| 7120 | if err != nil { |
| 7121 | return result, xerrors.Errorf("get chat messages: %w", err) |
| 7122 | } |
| 7123 | modelOpts := modelBuildOptionsFromMessages(messages) |
| 7124 | if modelOpts.ActiveAPIKeyID != "" { |
| 7125 | ctx = aibridge.WithDelegatedAPIKeyID(ctx, modelOpts.ActiveAPIKeyID) |
| 7126 | } |
| 7127 | |
| 7128 | // Load MCP server configs and user tokens in parallel with model |
| 7129 | // resolution. These queries have no dependencies on each other and all |
| 7130 | // hit different tables. |
| 7131 | var ( |
| 7132 | mcpConfigs []database.MCPServerConfig |
| 7133 | mcpTokens []database.MCPServerUserToken |
| 7134 | ) |
| 7135 | var g errgroup.Group |
| 7136 | g.Go(func() error { |
| 7137 | var err error |
| 7138 | model, modelConfig, providerKeys, modelRoute, debugEnabled, debugProvider, debugModel, err = p.resolveChatModel(ctx, chat, modelOpts) |
| 7139 | if err != nil { |
| 7140 | return err |
| 7141 | } |
| 7142 | if len(modelConfig.Options) > 0 { |
| 7143 | if err := json.Unmarshal(modelConfig.Options, &callConfig); err != nil { |
| 7144 | return xerrors.Errorf("parse model call config: %w", err) |
| 7145 | } |
| 7146 | } |
| 7147 | return nil |
| 7148 | }) |
| 7149 | if len(chat.MCPServerIDs) > 0 { |
| 7150 | g.Go(func() error { |
| 7151 | var err error |
| 7152 | mcpConfigs, err = p.db.GetMCPServerConfigsByIDs( |
| 7153 | ctx, chat.MCPServerIDs, |
| 7154 | ) |
| 7155 | if err != nil { |
| 7156 | logger.Warn(ctx, |
no test coverage detected