| 8783 | } |
| 8784 | |
| 8785 | func (p *Server) resolveUserProviderAPIKeys( |
| 8786 | ctx context.Context, |
| 8787 | ownerID uuid.UUID, |
| 8788 | selectedAIProviderID uuid.UUID, |
| 8789 | ) (chatprovider.ProviderAPIKeys, error) { |
| 8790 | if selectedAIProviderID != uuid.Nil { |
| 8791 | provider, err := p.db.GetAIProviderByID(ctx, selectedAIProviderID) |
| 8792 | if err != nil { |
| 8793 | return chatprovider.ProviderAPIKeys{}, xerrors.Errorf("get AI provider: %w", err) |
| 8794 | } |
| 8795 | return p.resolveUserProviderAPIKeysForProvider(ctx, ownerID, provider) |
| 8796 | } |
| 8797 | |
| 8798 | providers, err := p.configCache.EnabledProviders(ctx) |
| 8799 | if err != nil { |
| 8800 | return chatprovider.ProviderAPIKeys{}, xerrors.Errorf( |
| 8801 | "get enabled AI providers: %w", |
| 8802 | err, |
| 8803 | ) |
| 8804 | } |
| 8805 | configuredProviders, err := p.aiProviderConfigs(ctx, providers) |
| 8806 | if err != nil { |
| 8807 | return chatprovider.ProviderAPIKeys{}, err |
| 8808 | } |
| 8809 | if err := ensureUniqueConfiguredProviderTypes(configuredProviders); err != nil { |
| 8810 | return chatprovider.ProviderAPIKeys{}, err |
| 8811 | } |
| 8812 | |
| 8813 | userKeys := []chatprovider.UserProviderKey{} |
| 8814 | if p.allowBYOK { |
| 8815 | userKeyRows, err := p.db.GetUserAIProviderKeysByUserID(ctx, ownerID) |
| 8816 | if err != nil { |
| 8817 | return chatprovider.ProviderAPIKeys{}, xerrors.Errorf( |
| 8818 | "get user AI provider keys: %w", |
| 8819 | err, |
| 8820 | ) |
| 8821 | } |
| 8822 | userKeys = make([]chatprovider.UserProviderKey, 0, len(userKeyRows)) |
| 8823 | for _, userKey := range userKeyRows { |
| 8824 | userKeys = append(userKeys, chatprovider.UserProviderKey{ |
| 8825 | ChatProviderID: userKey.AIProviderID, |
| 8826 | APIKey: userKey.APIKey, |
| 8827 | }) |
| 8828 | } |
| 8829 | } |
| 8830 | |
| 8831 | keys, _ := chatprovider.ResolveUserProviderKeys( |
| 8832 | p.providerAPIKeys, |
| 8833 | configuredProviders, |
| 8834 | userKeys, |
| 8835 | ) |
| 8836 | enabledProviders := make(map[string]struct{}, len(configuredProviders)) |
| 8837 | for _, provider := range configuredProviders { |
| 8838 | normalizedProvider := chatprovider.NormalizeProvider(provider.Provider) |
| 8839 | if normalizedProvider == "" { |
| 8840 | continue |
| 8841 | } |
| 8842 | enabledProviders[normalizedProvider] = struct{}{} |