mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
refactor: rename Ai* database identifiers to AI* (AIGOV-369) (#26327)
Adds `ai` to sqlc's `gen.go.initialisms` in `coderd/database/sqlc.yaml` so the generated DB code follows Go's initialism convention. Adds the matching `ai` -> `AI` case to the dbgen PascalCase helper (`scripts/dbgen/main.go`) so the corresponding `dbmem` / mock identifiers stay in sync. `make gen` regenerates the rest; hand-written call sites that consume DB-generated identifiers (`enterprise/audit/table.go`, `coderd/database/modelmethods.go`, `enterprise/coderd/aigatewaykeys.go`, `coderd/database/dbauthz/*`, etc.) are updated to match. Scope is deliberately limited to the database layer: - `coderd/rbac/*` (resource and scope generators) is untouched — `ResourceAi*` / `ScopeAi*` constants stay on main's casing. - `codersdk/*` (Go SDK) is untouched — `codersdk.ResourceAi*` / `codersdk.APIKeyScopeAi*` constants stay on main's casing, so external Go SDK consumers see no source-level break. - `Aibridge*` identifiers (one SQL token `aibridge`, not `ai_bridge`) are out of scope. On-the-wire values are unchanged: enum strings, RBAC resource type strings, API key scope strings, and JSON tags all stay the same. The HTTP/JSON surface is unaffected. Refs: [AIGOV-369](https://linear.app/codercom/issue/AIGOV-369/change-ai-references-in-coderddatabasemodelsgo-to-ai) 🤖 Generated with [Coder Agents](https://coder.com)
This commit is contained in:
@@ -294,7 +294,7 @@ func TestResolveAdvisorModelOverride(t *testing.T) {
|
||||
getAIProviders: func(context.Context, database.GetAIProvidersParams) ([]database.AIProvider, error) {
|
||||
return []database.AIProvider{{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
}}, nil
|
||||
},
|
||||
@@ -385,7 +385,7 @@ func TestResolveAdvisorModelOverride(t *testing.T) {
|
||||
getAIProviderByID: func(context.Context, uuid.UUID) (database.AIProvider, error) {
|
||||
return database.AIProvider{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
}, nil
|
||||
},
|
||||
@@ -434,7 +434,7 @@ func TestResolveAdvisorModelOverridePromotesAIBridgeErrors(t *testing.T) {
|
||||
}, nil
|
||||
},
|
||||
getAIProviderByID: func(context.Context, uuid.UUID) (database.AIProvider, error) {
|
||||
return database.AIProvider{ID: providerID, Type: database.AiProviderTypeOpenai, Name: "primary-openai", Enabled: true}, nil
|
||||
return database.AIProvider{ID: providerID, Type: database.AIProviderTypeOpenai, Name: "primary-openai", Enabled: true}, nil
|
||||
},
|
||||
getAIProviderKeysByProviderID: func(context.Context, uuid.UUID) ([]database.AIProviderKey, error) {
|
||||
return []database.AIProviderKey{{ProviderID: providerID, APIKey: "sk-selected"}}, nil
|
||||
|
||||
@@ -321,7 +321,7 @@ func seedAnthropicChatDependencies(t *testing.T, db database.Store, baseURL stri
|
||||
_ = testAPIKeyID(t, db, user.ID)
|
||||
org := dbgen.Organization(t, db, database.Organization{})
|
||||
dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: user.ID, OrganizationID: org.ID})
|
||||
provider := dbgen.AIProvider(t, db, database.AIProvider{Type: database.AiProviderTypeAnthropic}, func(params *database.InsertAIProviderParams) {
|
||||
provider := dbgen.AIProvider(t, db, database.AIProvider{Type: database.AIProviderTypeAnthropic}, func(params *database.InsertAIProviderParams) {
|
||||
params.BaseUrl = baseURL
|
||||
})
|
||||
dbgen.AIProviderKey(t, db, database.AIProviderKey{ProviderID: provider.ID})
|
||||
|
||||
@@ -182,8 +182,8 @@ func TestResolveUserProviderAPIKeysAndProviderForProviderTypeProviderMatch(t *te
|
||||
providerID := uuid.New()
|
||||
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), database.GetAIProvidersParams{}).Return([]database.AIProvider{
|
||||
{ID: uuid.New(), Type: database.AiProviderTypeAnthropic, Enabled: true},
|
||||
{ID: providerID, Type: database.AiProviderTypeOpenai, Enabled: true},
|
||||
{ID: uuid.New(), Type: database.AIProviderTypeAnthropic, Enabled: true},
|
||||
{ID: providerID, Type: database.AIProviderTypeOpenai, Enabled: true},
|
||||
}, nil)
|
||||
db.EXPECT().GetAIProviderKeysByProviderID(gomock.Any(), providerID).Return([]database.AIProviderKey{{
|
||||
ProviderID: providerID,
|
||||
@@ -200,7 +200,7 @@ func TestResolveUserProviderAPIKeysAndProviderForProviderTypeProviderMatch(t *te
|
||||
require.Equal(t, "test-key", keys.APIKey(chattool.ComputerUseProviderOpenAI))
|
||||
require.NotNil(t, aiProvider)
|
||||
require.Equal(t, providerID, aiProvider.ID)
|
||||
require.Equal(t, database.AiProviderTypeOpenai, aiProvider.Type)
|
||||
require.Equal(t, database.AIProviderTypeOpenai, aiProvider.Type)
|
||||
}
|
||||
|
||||
func TestResolveModelRouteForProviderTypeAIGatewayRequiresProvider(t *testing.T) {
|
||||
@@ -864,7 +864,7 @@ func TestRegenerateChatTitle_PersistsAndBroadcasts(t *testing.T) {
|
||||
providerID := uuid.New()
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
BaseUrl: serverURL,
|
||||
}}, nil)
|
||||
@@ -1030,7 +1030,7 @@ func TestRegenerateChatTitle_PersistsAndBroadcasts_IdleChatReleasesManualLock(t
|
||||
providerID := uuid.New()
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
BaseUrl: serverURL,
|
||||
}}, nil)
|
||||
@@ -1181,7 +1181,7 @@ func TestResolveUserProviderAPIKeys_StripsDisabledFallbackKeys(t *testing.T) {
|
||||
providerID := uuid.New()
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeAnthropic,
|
||||
Type: database.AIProviderTypeAnthropic,
|
||||
Enabled: true,
|
||||
}}, nil)
|
||||
db.EXPECT().GetAIProviderKeysByProviderIDs(gomock.Any(), []uuid.UUID{providerID}).Return(nil, nil)
|
||||
@@ -1219,7 +1219,7 @@ func TestResolveUserProviderAPIKeys_SelectedAIProviderDoesNotUseDeploymentFallba
|
||||
|
||||
db.EXPECT().GetAIProviderByID(gomock.Any(), providerID).Return(database.AIProvider{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Name: "agents-openai",
|
||||
Enabled: true,
|
||||
}, nil)
|
||||
@@ -1258,7 +1258,7 @@ func TestResolveUserProviderAPIKeys_SkipsUserKeyLookupWhenNoProviderAllowsUserKe
|
||||
providerID := uuid.New()
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
}}, nil)
|
||||
db.EXPECT().GetAIProviderKeysByProviderIDs(gomock.Any(), []uuid.UUID{providerID}).Return(nil, nil)
|
||||
|
||||
@@ -8698,7 +8698,7 @@ func setOpenAIProviderBaseURL(
|
||||
providers, err := db.GetAIProviders(ctx, database.GetAIProvidersParams{IncludeDisabled: true})
|
||||
require.NoError(t, err)
|
||||
for _, provider := range providers {
|
||||
if provider.Type != database.AiProviderTypeOpenai {
|
||||
if provider.Type != database.AIProviderTypeOpenai {
|
||||
continue
|
||||
}
|
||||
_, err = db.UpdateAIProvider(ctx, database.UpdateAIProviderParams{
|
||||
@@ -9785,12 +9785,12 @@ func seedAIGatewayOpenAITestDependencies(
|
||||
OrganizationID: org.ID,
|
||||
})
|
||||
provider := dbgen.AIProvider(t, db, database.AIProvider{
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Name: "primary-openai-" + uuid.NewString(),
|
||||
BaseUrl: openAIURL,
|
||||
})
|
||||
model := dbgen.ChatModelConfig(t, db, database.ChatModelConfig{
|
||||
Provider: string(database.AiProviderTypeOpenai),
|
||||
Provider: string(database.AIProviderTypeOpenai),
|
||||
Model: "gpt-4o-mini",
|
||||
IsDefault: true,
|
||||
AIProviderID: uuid.NullUUID{UUID: provider.ID, Valid: true},
|
||||
|
||||
@@ -231,7 +231,7 @@ func TestDeriveFinalTurnRunResult(t *testing.T) {
|
||||
})
|
||||
// A disabled AI provider makes resolveChatModel fail, exercising the
|
||||
// degraded path that still returns the re-derived text and IDs.
|
||||
provider := insertInternalAIProvider(t, db, database.AiProviderTypeOpenai, "provider-api-key", false)
|
||||
provider := insertInternalAIProvider(t, db, database.AIProviderTypeOpenai, "provider-api-key", false)
|
||||
modelCfg := dbgen.ChatModelConfig(t, db, database.ChatModelConfig{
|
||||
Provider: "openai",
|
||||
Model: "gpt-4o-mini",
|
||||
|
||||
@@ -91,7 +91,7 @@ func (t *aiGatewayRoundTripper) RoundTrip(req *http.Request) (*http.Response, er
|
||||
// OpenRouter-like providers typed as openai, where the provider type
|
||||
// strips the vendor prefix.
|
||||
func ValidateAIGatewayProviderModel(provider database.AIProvider, model string) error {
|
||||
if provider.Type != database.AiProviderTypeOpenai {
|
||||
if provider.Type != database.AIProviderTypeOpenai {
|
||||
return nil
|
||||
}
|
||||
if !isSlashNamespacedAIGatewayModel(model) || !isOpenRouterLikeAIGatewayProvider(provider) {
|
||||
@@ -188,10 +188,10 @@ func fantasyConfigForAIBridge(providerType database.AIProviderType) aibridgeFant
|
||||
var fantasyProvider string
|
||||
baseURL := aibridgeLocalBaseURL + "/v1"
|
||||
switch providerType {
|
||||
case database.AiProviderTypeAnthropic, database.AiProviderTypeBedrock:
|
||||
case database.AIProviderTypeAnthropic, database.AIProviderTypeBedrock:
|
||||
fantasyProvider = fantasyanthropic.Name
|
||||
baseURL = aibridgeLocalBaseURL
|
||||
case database.AiProviderTypeOpenai:
|
||||
case database.AIProviderTypeOpenai:
|
||||
fantasyProvider = fantasyopenai.Name
|
||||
default:
|
||||
fantasyProvider = fantasyopenaicompat.Name
|
||||
@@ -211,7 +211,7 @@ func fantasyConfigForAIBridge(providerType database.AIProviderType) aibridgeFant
|
||||
|
||||
func aiGatewayRequestFormatForProviderType(providerType database.AIProviderType) aiGatewayRequestFormat {
|
||||
switch providerType {
|
||||
case database.AiProviderTypeAnthropic, database.AiProviderTypeBedrock:
|
||||
case database.AIProviderTypeAnthropic, database.AIProviderTypeBedrock:
|
||||
return aiGatewayRequestFormatAnthropic
|
||||
default:
|
||||
return aiGatewayRequestFormatOpenAI
|
||||
|
||||
@@ -85,10 +85,10 @@ func TestAIBridgeProviderFormatMapping(t *testing.T) {
|
||||
wantProvider string
|
||||
wantBaseURL string
|
||||
}{
|
||||
{name: "OpenAI", providerType: database.AiProviderTypeOpenai, wantProvider: "openai", wantBaseURL: "http://coder-aibridge/v1"},
|
||||
{name: "Anthropic", providerType: database.AiProviderTypeAnthropic, wantProvider: "anthropic", wantBaseURL: "http://coder-aibridge"},
|
||||
{name: "Bedrock", providerType: database.AiProviderTypeBedrock, wantProvider: "anthropic", wantBaseURL: "http://coder-aibridge"},
|
||||
{name: "Google", providerType: database.AiProviderTypeGoogle, wantProvider: "openai-compat", wantBaseURL: "http://coder-aibridge/v1"},
|
||||
{name: "OpenAI", providerType: database.AIProviderTypeOpenai, wantProvider: "openai", wantBaseURL: "http://coder-aibridge/v1"},
|
||||
{name: "Anthropic", providerType: database.AIProviderTypeAnthropic, wantProvider: "anthropic", wantBaseURL: "http://coder-aibridge"},
|
||||
{name: "Bedrock", providerType: database.AIProviderTypeBedrock, wantProvider: "anthropic", wantBaseURL: "http://coder-aibridge"},
|
||||
{name: "Google", providerType: database.AIProviderTypeGoogle, wantProvider: "openai-compat", wantBaseURL: "http://coder-aibridge/v1"},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
@@ -113,7 +113,7 @@ func TestResolveModelRouteForConfigPreservesBaseURL(t *testing.T) {
|
||||
|
||||
db.EXPECT().GetAIProviderByID(gomock.Any(), providerID).Return(database.AIProvider{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Name: "primary-openai",
|
||||
Enabled: true,
|
||||
BaseUrl: baseURL,
|
||||
@@ -141,7 +141,7 @@ func TestAIGatewayProviderAuthForUser(t *testing.T) {
|
||||
ctx := t.Context()
|
||||
ownerID := uuid.New()
|
||||
providerID := uuid.New()
|
||||
provider := database.AIProvider{ID: providerID, Type: database.AiProviderTypeOpenai, Enabled: true}
|
||||
provider := database.AIProvider{ID: providerID, Type: database.AIProviderTypeOpenai, Enabled: true}
|
||||
|
||||
t.Run("OpenAIUserKey", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
@@ -151,7 +151,7 @@ func TestAIGatewayProviderAuthForUser(t *testing.T) {
|
||||
db.EXPECT().GetUserAIProviderKeyByProviderID(gomock.Any(), database.GetUserAIProviderKeyByProviderIDParams{
|
||||
UserID: ownerID,
|
||||
AIProviderID: providerID,
|
||||
}).Return(database.UserAiProviderKey{APIKey: "sk-user"}, nil)
|
||||
}).Return(database.UserAIProviderKey{APIKey: "sk-user"}, nil)
|
||||
|
||||
server := &Server{db: db, allowBYOK: true}
|
||||
auth, err := server.aiGatewayProviderAuthForUser(ctx, ownerID, provider, aiGatewayRequestFormatOpenAI)
|
||||
@@ -168,7 +168,7 @@ func TestAIGatewayProviderAuthForUser(t *testing.T) {
|
||||
db.EXPECT().GetUserAIProviderKeyByProviderID(gomock.Any(), database.GetUserAIProviderKeyByProviderIDParams{
|
||||
UserID: ownerID,
|
||||
AIProviderID: providerID,
|
||||
}).Return(database.UserAiProviderKey{APIKey: "sk-user"}, nil)
|
||||
}).Return(database.UserAIProviderKey{APIKey: "sk-user"}, nil)
|
||||
|
||||
server := &Server{db: db, allowBYOK: true}
|
||||
auth, err := server.aiGatewayProviderAuthForUser(ctx, ownerID, provider, aiGatewayRequestFormatAnthropic)
|
||||
@@ -185,7 +185,7 @@ func TestAIGatewayProviderAuthForUser(t *testing.T) {
|
||||
db.EXPECT().GetUserAIProviderKeyByProviderID(gomock.Any(), database.GetUserAIProviderKeyByProviderIDParams{
|
||||
UserID: ownerID,
|
||||
AIProviderID: providerID,
|
||||
}).Return(database.UserAiProviderKey{}, sql.ErrNoRows)
|
||||
}).Return(database.UserAIProviderKey{}, sql.ErrNoRows)
|
||||
|
||||
server := &Server{db: db, allowBYOK: true}
|
||||
auth, err := server.aiGatewayProviderAuthForUser(ctx, ownerID, provider, aiGatewayRequestFormatOpenAI)
|
||||
@@ -231,7 +231,7 @@ func TestResolveModelRouteForConfigAIGatewayProviderAuth(t *testing.T) {
|
||||
providerID := uuid.New()
|
||||
provider := database.AIProvider{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Name: "primary-openai",
|
||||
Enabled: true,
|
||||
}
|
||||
@@ -251,7 +251,7 @@ func TestResolveModelRouteForConfigAIGatewayProviderAuth(t *testing.T) {
|
||||
db.EXPECT().GetUserAIProviderKeyByProviderID(gomock.Any(), database.GetUserAIProviderKeyByProviderIDParams{
|
||||
UserID: ownerID,
|
||||
AIProviderID: providerID,
|
||||
}).Return(database.UserAiProviderKey{APIKey: "sk-user"}, nil)
|
||||
}).Return(database.UserAIProviderKey{APIKey: "sk-user"}, nil)
|
||||
|
||||
server := &Server{db: db, aiGatewayRoutingEnabled: true, allowBYOK: true}
|
||||
route, err := server.resolveModelRouteForConfig(ctx, ownerID, modelConfig, chatprovider.ProviderAPIKeys{})
|
||||
@@ -296,7 +296,7 @@ func TestAIGatewayModelForwardsProviderAuth(t *testing.T) {
|
||||
path: req.URL.Path,
|
||||
}
|
||||
body := `{"id":"resp_test","object":"response","created_at":0,"status":"completed","model":"gpt-4","output":[{"id":"msg_test","type":"message","role":"assistant","content":[{"type":"output_text","text":"hello"}]}],"usage":{"input_tokens":1,"output_tokens":1,"total_tokens":2}}`
|
||||
if provider.Type == database.AiProviderTypeAnthropic {
|
||||
if provider.Type == database.AIProviderTypeAnthropic {
|
||||
body = `{"id":"msg_test","type":"message","role":"assistant","model":"claude-haiku-4-5","content":[{"type":"text","text":"hello"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":1,"output_tokens":1}}`
|
||||
}
|
||||
return &http.Response{
|
||||
@@ -318,7 +318,7 @@ func TestAIGatewayModelForwardsProviderAuth(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
seen := make(chan seenRequest, 1)
|
||||
provider := aibridgeTestAIProvider(uuid.New(), "primary-openai", database.AiProviderTypeOpenai)
|
||||
provider := aibridgeTestAIProvider(uuid.New(), "primary-openai", database.AIProviderTypeOpenai)
|
||||
server, route := newServer(t, provider, aiGatewayProviderAuth{
|
||||
Headers: map[string]string{"Authorization": "Bearer sk-user"},
|
||||
}, seen)
|
||||
@@ -340,7 +340,7 @@ func TestAIGatewayModelForwardsProviderAuth(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
seen := make(chan seenRequest, 1)
|
||||
provider := aibridgeTestAIProvider(uuid.New(), "primary-anthropic", database.AiProviderTypeAnthropic)
|
||||
provider := aibridgeTestAIProvider(uuid.New(), "primary-anthropic", database.AIProviderTypeAnthropic)
|
||||
server, route := newServer(t, provider, aiGatewayProviderAuth{
|
||||
Headers: map[string]string{"X-Api-Key": "sk-user"},
|
||||
}, seen)
|
||||
@@ -361,7 +361,7 @@ func TestAIGatewayModelForwardsProviderAuth(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
seen := make(chan seenRequest, 1)
|
||||
provider := aibridgeTestAIProvider(uuid.New(), "primary-openai", database.AiProviderTypeOpenai)
|
||||
provider := aibridgeTestAIProvider(uuid.New(), "primary-openai", database.AIProviderTypeOpenai)
|
||||
server, route := newServer(t, provider, aiGatewayProviderAuth{}, seen)
|
||||
apiKeyID := uuid.NewString()
|
||||
model, err := server.newModel(t.Context(), aibridgeTestRequest(database.Chat{ID: uuid.New(), OwnerID: uuid.New()}, "gpt-4"), route, modelBuildOptions{ActiveAPIKeyID: apiKeyID})
|
||||
@@ -595,7 +595,7 @@ func TestAIBridgeRoutingFailClosed(t *testing.T) {
|
||||
|
||||
providerID := uuid.New()
|
||||
chat := database.Chat{ID: uuid.New(), OwnerID: uuid.New()}
|
||||
aiProvider := aibridgeTestAIProvider(providerID, "primary-openai", database.AiProviderTypeOpenai)
|
||||
aiProvider := aibridgeTestAIProvider(providerID, "primary-openai", database.AIProviderTypeOpenai)
|
||||
|
||||
t.Run("NilFactory", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
@@ -618,7 +618,7 @@ func TestAIBridgeRoutingFailClosed(t *testing.T) {
|
||||
t.Run("MissingProviderName", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
server := &Server{aiGatewayRoutingEnabled: true}
|
||||
missingNameProvider := aibridgeTestAIProvider(providerID, "", database.AiProviderTypeOpenai)
|
||||
missingNameProvider := aibridgeTestAIProvider(providerID, "", database.AIProviderTypeOpenai)
|
||||
_, err := server.newModel(t.Context(), aibridgeTestRequest(chat, "gpt-4"), aibridgeTestRoute(missingNameProvider), modelBuildOptions{ActiveAPIKeyID: uuid.NewString()})
|
||||
require.ErrorContains(t, err, "AI provider name")
|
||||
})
|
||||
@@ -652,7 +652,7 @@ func TestAIBridgeRoutingFailClosed(t *testing.T) {
|
||||
aiGatewayRoutingEnabled: true,
|
||||
aibridgeTransportFactory: aibridgeTestFactoryPointer(factory),
|
||||
}
|
||||
provider := aibridgeTestAIProvider(providerID, "openrouter", database.AiProviderTypeOpenai)
|
||||
provider := aibridgeTestAIProvider(providerID, "openrouter", database.AIProviderTypeOpenai)
|
||||
_, err := server.newModel(
|
||||
t.Context(),
|
||||
aibridgeTestRequest(chat, "anthropic/claude-opus-4.6"),
|
||||
@@ -685,12 +685,12 @@ func TestAIBridgeGatewayProviderTypesPreserveSlashModelID(t *testing.T) {
|
||||
{
|
||||
name: "OpenRouter",
|
||||
providerName: "openrouter",
|
||||
providerType: database.AiProviderTypeOpenrouter,
|
||||
providerType: database.AIProviderTypeOpenrouter,
|
||||
},
|
||||
{
|
||||
name: "OpenAICompat",
|
||||
providerName: "openai-compatible-relay",
|
||||
providerType: database.AiProviderTypeOpenaiCompat,
|
||||
providerType: database.AIProviderTypeOpenaiCompat,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -814,7 +814,7 @@ func TestAIBridgeComputerUseModelUsesRoute(t *testing.T) {
|
||||
model, debugEnabled, resolvedProvider, resolvedModel, err := server.resolveComputerUseModel(
|
||||
ctx,
|
||||
chat,
|
||||
aibridgeTestRoute(aibridgeTestAIProvider(providerID, "primary-openai", database.AiProviderTypeOpenai)),
|
||||
aibridgeTestRoute(aibridgeTestAIProvider(providerID, "primary-openai", database.AIProviderTypeOpenai)),
|
||||
provider,
|
||||
modelProvider,
|
||||
modelName,
|
||||
@@ -862,7 +862,7 @@ func TestAIBridgeDelegatedContextPropagation(t *testing.T) {
|
||||
}
|
||||
|
||||
ctx := aibridge.WithDelegatedAPIKeyID(t.Context(), "context-key-must-be-ignored")
|
||||
model, err := server.newModel(ctx, aibridgeTestRequest(chat, "gpt-4"), aibridgeTestRoute(aibridgeTestAIProvider(providerID, "primary-openai", database.AiProviderTypeOpenai)), modelBuildOptions{ActiveAPIKeyID: apiKeyID, RecordHTTP: true})
|
||||
model, err := server.newModel(ctx, aibridgeTestRequest(chat, "gpt-4"), aibridgeTestRoute(aibridgeTestAIProvider(providerID, "primary-openai", database.AIProviderTypeOpenai)), modelBuildOptions{ActiveAPIKeyID: apiKeyID, RecordHTTP: true})
|
||||
require.NoError(t, err)
|
||||
_, err = model.Generate(t.Context(), fantasy.Call{Prompt: []fantasy.Message{{
|
||||
Role: fantasy.MessageRoleUser,
|
||||
|
||||
@@ -476,7 +476,7 @@ func TestResolveUserProviderAPIKeys_AIProvider(t *testing.T) {
|
||||
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
|
||||
ctx := chatdTestContext(t)
|
||||
user, _, _ := seedInternalChatDeps(t, db)
|
||||
provider := insertInternalAIProvider(t, db, database.AiProviderTypeOpenai, "provider-api-key", true)
|
||||
provider := insertInternalAIProvider(t, db, database.AIProviderTypeOpenai, "provider-api-key", true)
|
||||
now := time.Now()
|
||||
_, err := db.UpsertUserAIProviderKey(ctx, database.UpsertUserAIProviderKeyParams{
|
||||
ID: uuid.New(),
|
||||
@@ -502,7 +502,7 @@ func TestResolveUserProviderAPIKeys_AIProvider(t *testing.T) {
|
||||
server.allowBYOK = false
|
||||
ctx := chatdTestContext(t)
|
||||
user, _, _ := seedInternalChatDeps(t, db)
|
||||
provider := insertInternalAIProvider(t, db, database.AiProviderTypeOpenai, "provider-api-key", true)
|
||||
provider := insertInternalAIProvider(t, db, database.AIProviderTypeOpenai, "provider-api-key", true)
|
||||
now := time.Now()
|
||||
_, err := db.UpsertUserAIProviderKey(ctx, database.UpsertUserAIProviderKeyParams{
|
||||
ID: uuid.New(),
|
||||
@@ -526,7 +526,7 @@ func TestResolveUserProviderAPIKeys_AIProvider(t *testing.T) {
|
||||
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
|
||||
ctx := chatdTestContext(t)
|
||||
user, _, _ := seedInternalChatDeps(t, db)
|
||||
insertInternalAIProvider(t, db, database.AiProviderTypeAzure, "provider-api-key", true)
|
||||
insertInternalAIProvider(t, db, database.AIProviderTypeAzure, "provider-api-key", true)
|
||||
|
||||
keys, err := server.resolveUserProviderAPIKeysForProviderType(ctx, user.ID, "azure")
|
||||
require.NoError(t, err)
|
||||
@@ -540,7 +540,7 @@ func TestResolveUserProviderAPIKeys_AIProvider(t *testing.T) {
|
||||
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
|
||||
ctx := chatdTestContext(t)
|
||||
user, _, _ := seedInternalChatDeps(t, db)
|
||||
provider := insertInternalAIProvider(t, db, database.AiProviderTypeBedrock, "", true)
|
||||
provider := insertInternalAIProvider(t, db, database.AIProviderTypeBedrock, "", true)
|
||||
|
||||
keys, err := server.resolveUserProviderAPIKeys(ctx, user.ID, provider.ID)
|
||||
require.NoError(t, err)
|
||||
@@ -555,8 +555,8 @@ func TestResolveUserProviderAPIKeys_AIProvider(t *testing.T) {
|
||||
server := newInternalTestServer(t, db, ps, chatprovider.ProviderAPIKeys{})
|
||||
ctx := chatdTestContext(t)
|
||||
user, _, _ := seedInternalChatDeps(t, db)
|
||||
insertInternalAIProvider(t, db, database.AiProviderTypeOpenai, "first-provider-api-key", true)
|
||||
insertInternalAIProvider(t, db, database.AiProviderTypeOpenai, "second-provider-api-key", true)
|
||||
insertInternalAIProvider(t, db, database.AIProviderTypeOpenai, "first-provider-api-key", true)
|
||||
insertInternalAIProvider(t, db, database.AIProviderTypeOpenai, "second-provider-api-key", true)
|
||||
|
||||
keys, err := server.resolveUserProviderAPIKeys(ctx, user.ID, uuid.Nil)
|
||||
require.ErrorContains(t, err, "multiple enabled AI providers use provider type")
|
||||
@@ -570,7 +570,7 @@ func TestResolveChatModel_AIProviderDisabled(t *testing.T) {
|
||||
ctx := chatdTestContext(t)
|
||||
db, ps := dbtestutil.NewDB(t)
|
||||
user, org, _ := seedInternalChatDeps(t, db)
|
||||
provider := insertInternalAIProvider(t, db, database.AiProviderTypeOpenai, "provider-api-key", false)
|
||||
provider := insertInternalAIProvider(t, db, database.AIProviderTypeOpenai, "provider-api-key", false)
|
||||
modelConfig := dbgen.ChatModelConfig(t, db, database.ChatModelConfig{
|
||||
Provider: "openai",
|
||||
Model: "gpt-4o-mini",
|
||||
|
||||
@@ -253,7 +253,7 @@ func TestMaybeGenerateChatTitle_TitleGenerationOverrideSetUsable(t *testing.T) {
|
||||
})
|
||||
provider := database.AIProvider{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
BaseUrl: serverURL,
|
||||
}
|
||||
@@ -365,7 +365,7 @@ func TestMaybeGenerateChatTitle_TitleGenerationOverrideCallFailureSkipsFallback(
|
||||
|
||||
db.EXPECT().GetChatTitleGenerationModelOverride(gomock.Any()).Return(overrideConfig.ID.String(), nil)
|
||||
db.EXPECT().GetChatModelConfigByID(gomock.Any(), overrideConfig.ID).Return(overrideConfig, nil)
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{Type: database.AiProviderTypeOpenai, Enabled: true}}, nil)
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{Type: database.AIProviderTypeOpenai, Enabled: true}}, nil)
|
||||
db.EXPECT().GetAIProviderKeysByProviderIDs(gomock.Any(), []uuid.UUID{uuid.Nil}).Return(nil, nil)
|
||||
|
||||
generated := &generatedChatTitle{}
|
||||
@@ -446,7 +446,7 @@ func TestResolveManualTitleModel_TitleGenerationOverrideUnsetAIProvider(t *testi
|
||||
})
|
||||
provider := database.AIProvider{
|
||||
ID: providerID,
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
BaseUrl: serverURL,
|
||||
}
|
||||
@@ -521,7 +521,7 @@ func TestResolveManualTitleModel_TitleGenerationOverrideSetUsable(t *testing.T)
|
||||
|
||||
db.EXPECT().GetChatTitleGenerationModelOverride(gomock.Any()).Return(overrideConfig.ID.String(), nil)
|
||||
db.EXPECT().GetChatModelConfigByID(gomock.Any(), overrideConfig.ID).Return(overrideConfig, nil)
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{Type: database.AiProviderTypeOpenai, Enabled: true}}, nil)
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{Type: database.AIProviderTypeOpenai, Enabled: true}}, nil)
|
||||
db.EXPECT().GetAIProviderKeysByProviderIDs(gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes()
|
||||
|
||||
server := titleOverrideTestServer(db, logger)
|
||||
@@ -549,7 +549,7 @@ func TestResolveManualTitleModel_TitleGenerationOverrideMissingCredentials(t *te
|
||||
|
||||
db.EXPECT().GetChatTitleGenerationModelOverride(gomock.Any()).Return(overrideConfig.ID.String(), nil)
|
||||
db.EXPECT().GetChatModelConfigByID(gomock.Any(), overrideConfig.ID).Return(overrideConfig, nil)
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{Type: database.AiProviderTypeOpenai, Enabled: true}}, nil)
|
||||
db.EXPECT().GetAIProviders(gomock.Any(), gomock.Any()).Return([]database.AIProvider{{Type: database.AIProviderTypeOpenai, Enabled: true}}, nil)
|
||||
db.EXPECT().GetAIProviderKeysByProviderIDs(gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes()
|
||||
|
||||
server := titleOverrideTestServer(db, logger)
|
||||
@@ -619,7 +619,7 @@ func TestGenerateManualTitleCandidate_ActiveAPIKeyIDFallback(t *testing.T) {
|
||||
provider := database.AIProvider{
|
||||
ID: providerID,
|
||||
Name: "primary-openai",
|
||||
Type: database.AiProviderTypeOpenai,
|
||||
Type: database.AIProviderTypeOpenai,
|
||||
Enabled: true,
|
||||
}
|
||||
wantTitle := "Context title"
|
||||
|
||||
Reference in New Issue
Block a user