Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions apps/server/src/serverSettings.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import {
DEFAULT_SERVER_SETTINGS,
DEFAULT_TEXT_GENERATION_MODEL_BY_PROVIDER,
ModelSelection,
ProjectId,
ProjectScript,
Expand Down Expand Up @@ -688,6 +689,30 @@ it.layer(NodeServices.layer)("server settings", (it) => {
const settings = yield* serverSettings.getSettings;

assert.equal(settings.textGenerationModelSelection.instanceId, "claudeAgent");
assert.equal(
settings.textGenerationModelSelection.model,
DEFAULT_TEXT_GENERATION_MODEL_BY_PROVIDER[ProviderDriverKind.make("claudeAgent")],
);
}).pipe(Effect.provide(makeServerSettingsLayer())),
);

it.effect("keeps the product text-generation model when a custom model is configured", () =>
Effect.gen(function* () {
const serverConfig = yield* ServerConfig.ServerConfig;
const fileSystem = yield* FileSystem.FileSystem;
const serverSettings = yield* ServerSettingsModule.ServerSettingsService;
yield* fileSystem.writeFileString(
serverConfig.settingsPath,
'{"providerInstances":{"codex":{"driver":"codex","enabled":false,"config":{}},"claudeAgent":{"driver":"claudeAgent","config":{"customModels":["z-ai/glm-5.3-flash"]}}},"defaultModelSelection":{"instanceId":"claudeAgent","model":"z-ai/glm-5.3-flash"}}',
);

const settings = yield* serverSettings.getSettings;

assert.equal(settings.textGenerationModelSelection.instanceId, "claudeAgent");
assert.equal(
settings.textGenerationModelSelection.model,
DEFAULT_TEXT_GENERATION_MODEL_BY_PROVIDER[ProviderDriverKind.make("claudeAgent")],
);
}).pipe(Effect.provide(makeServerSettingsLayer())),
);

Expand Down
6 changes: 6 additions & 0 deletions apps/server/src/serverSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,12 @@ function resolveTextGenerationProvider(settings: ServerSettings): ServerSettings
: fallbackTextGenerationProvider(settings);
}

/**
* Pick an enabled provider when the stored text-generation selection cannot
* run. The model stays the product text-generation slug. A configured custom
* model is substituted only after that slug's one-shot attempt reports the
* model itself is unavailable.
*/
function fallbackTextGenerationProvider(settings: ServerSettings): ServerSettings {
// Same precedence as isModelSelectionProviderEnabled: an explicit provider
// instance wins over the legacy providers map, which decodes to defaults
Expand Down
Loading
Loading