resolveTitleGenerationModelOverride resolves the deployment-wide title generation model override. overrideSet is true when an override was configured; in that case any returned error is a hard failure. When overrideSet is false, callers may fall back to the default title model.
( ctx context.Context, chat database.Chat, keys chatprovider.ProviderAPIKeys, modelOpts modelBuildOptions, )
| 35 | // configured; in that case any returned error is a hard failure. When |
| 36 | // overrideSet is false, callers may fall back to the default title model. |
| 37 | func (p *Server) resolveTitleGenerationModelOverride( |
| 38 | ctx context.Context, |
| 39 | chat database.Chat, |
| 40 | keys chatprovider.ProviderAPIKeys, |
| 41 | modelOpts modelBuildOptions, |
| 42 | ) (database.ChatModelConfig, fantasy.LanguageModel, chatprovider.ProviderAPIKeys, resolvedModelRoute, bool, error) { |
| 43 | raw, err := readTitleGenerationModelOverride(ctx, p.db) |
| 44 | if err != nil { |
| 45 | return database.ChatModelConfig{}, nil, chatprovider.ProviderAPIKeys{}, resolvedModelRoute{}, false, xerrors.Errorf( |
| 46 | "read title generation model override: %w", |
| 47 | err, |
| 48 | ) |
| 49 | } |
| 50 | |
| 51 | overrideProviderKeys := keys |
| 52 | modelConfig, overrideSet, err := p.resolveConfiguredModelOverride( |
| 53 | ctx, |
| 54 | titleGenerationOverrideContext, |
| 55 | raw, |
| 56 | chat.OwnerID, |
| 57 | p.resolveModelConfigAndNormalizedProvider, |
| 58 | func(ctx context.Context, ownerID uuid.UUID, aiProviderID uuid.UUID) (chatprovider.ProviderAPIKeys, error) { |
| 59 | if aiProviderID == uuid.Nil { |
| 60 | resolvedProviderKeys, err := p.resolveUserProviderAPIKeys(ctx, ownerID, uuid.Nil) |
| 61 | if err != nil || resolvedProviderKeys.Empty() { |
| 62 | resolvedProviderKeys = keys |
| 63 | } |
| 64 | overrideProviderKeys = resolvedProviderKeys |
| 65 | return resolvedProviderKeys, nil |
| 66 | } |
| 67 | resolvedProviderKeys, err := p.resolveUserProviderAPIKeys(ctx, ownerID, aiProviderID) |
| 68 | if err != nil { |
| 69 | return chatprovider.ProviderAPIKeys{}, err |
| 70 | } |
| 71 | overrideProviderKeys = resolvedProviderKeys |
| 72 | return resolvedProviderKeys, nil |
| 73 | }, |
| 74 | modelOverrideFailureModeHard, |
| 75 | ) |
| 76 | if err != nil { |
| 77 | return database.ChatModelConfig{}, nil, chatprovider.ProviderAPIKeys{}, resolvedModelRoute{}, overrideSet, err |
| 78 | } |
| 79 | if !overrideSet { |
| 80 | return database.ChatModelConfig{}, nil, keys, resolvedModelRoute{}, false, nil |
| 81 | } |
| 82 | |
| 83 | //nolint:gocritic // Title overrides need chatd-scoped provider reads for user-owned chats. |
| 84 | route, err := p.resolveModelRouteForConfig(dbauthz.AsChatd(ctx), chat.OwnerID, modelConfig, overrideProviderKeys) |
| 85 | if err != nil { |
| 86 | return database.ChatModelConfig{}, nil, chatprovider.ProviderAPIKeys{}, resolvedModelRoute{}, true, err |
| 87 | } |
| 88 | model, err := p.newModel(ctx, modelClientRequest{ |
| 89 | Chat: chat, |
| 90 | ModelName: modelConfig.Model, |
| 91 | UserAgent: chatprovider.UserAgent(), |
| 92 | ExtraHeaders: chatprovider.CoderHeaders(chat), |
| 93 | }, route, modelOpts) |
| 94 | if err != nil { |
no test coverage detected