Skip to content
Merged
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
11 changes: 5 additions & 6 deletions apps/server/src/serverRuntimeStartup.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import {
DEFAULT_MODEL,
DEFAULT_MODEL_BY_PROVIDER,
DEFAULT_PROVIDER_DRIVER_KIND,
DEFAULT_PROVIDER_INSTANCE_ID,
ProjectId,
ProviderDriverKind,
ProviderInstanceId,
getDefaultModelForProvider,
ThreadId,
} from "@t3tools/contracts";
import { assert, it } from "@effect/vitest";
Expand Down Expand Up @@ -33,8 +32,8 @@ import {

it("uses the OpenCode default for auto-bootstrapped model selection", () => {
assert.deepStrictEqual(getAutoBootstrapDefaultModelSelection(), {
instanceId: ProviderInstanceId.make("opencode"),
model: DEFAULT_MODEL_BY_PROVIDER[ProviderDriverKind.make("opencode")] ?? DEFAULT_MODEL,
instanceId: DEFAULT_PROVIDER_INSTANCE_ID,
model: getDefaultModelForProvider(DEFAULT_PROVIDER_DRIVER_KIND),
});
});

Expand Down
11 changes: 5 additions & 6 deletions apps/server/src/serverRuntimeStartup.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import {
CommandId,
DEFAULT_MODEL,
DEFAULT_MODEL_BY_PROVIDER,
DEFAULT_PROVIDER_DRIVER_KIND,
DEFAULT_PROVIDER_INSTANCE_ID,
DEFAULT_PROVIDER_INTERACTION_MODE,
getDefaultModelForProvider,
type ModelSelection,
ProviderDriverKind,
ProjectId,
ProviderInstanceId,
ThreadId,
} from "@t3tools/contracts";
import * as Data from "effect/Data";
Expand Down Expand Up @@ -156,8 +155,8 @@ export const launchStartupHeartbeat = recordStartupHeartbeat.pipe(
);

export const getAutoBootstrapDefaultModelSelection = (): ModelSelection => ({
instanceId: ProviderInstanceId.make("opencode"),
model: DEFAULT_MODEL_BY_PROVIDER[ProviderDriverKind.make("opencode")] ?? DEFAULT_MODEL,
instanceId: DEFAULT_PROVIDER_INSTANCE_ID,
model: getDefaultModelForProvider(DEFAULT_PROVIDER_DRIVER_KIND),
});

export const resolveWelcomeBase = Effect.gen(function* () {
Expand Down
7 changes: 2 additions & 5 deletions apps/server/src/serverSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
* @module ServerSettings
*/
import {
DEFAULT_GIT_TEXT_GENERATION_MODEL,
DEFAULT_GIT_TEXT_GENERATION_MODEL_BY_PROVIDER,
DEFAULT_SERVER_SETTINGS,
getDefaultGitTextGenerationModelForProvider,
isProviderDriverKind,
type ModelSelection,
type ProviderInstanceConfig,
Expand Down Expand Up @@ -206,9 +205,7 @@ function fallbackTextGenerationProvider(settings: ServerSettings): ServerSetting
...settings,
textGenerationModelSelection: {
instanceId: ProviderInstanceId.make(fallback),
model:
DEFAULT_GIT_TEXT_GENERATION_MODEL_BY_PROVIDER[fallback] ??
DEFAULT_GIT_TEXT_GENERATION_MODEL,
model: getDefaultGitTextGenerationModelForProvider(fallback),
} satisfies ModelSelection,
};
}
Expand Down
15 changes: 7 additions & 8 deletions apps/web/src/components/ChatView.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import {
type ApprovalRequestId,
DEFAULT_MODEL,
DEFAULT_MODEL_BY_PROVIDER,
DEFAULT_PROVIDER_DRIVER_KIND,
DEFAULT_PROVIDER_INSTANCE_ID,
defaultInstanceIdForDriver,
getDefaultModelForProvider,
type EnvironmentId,
type MessageId,
type ModelSelection,
Expand Down Expand Up @@ -798,9 +799,8 @@ export default function ChatView(props: ChatViewProps) {
threadId,
draftThread,
fallbackDraftProject?.defaultModelSelection ?? {
instanceId: ProviderInstanceId.make("opencode"),
model:
DEFAULT_MODEL_BY_PROVIDER[ProviderDriverKind.make("opencode")] ?? DEFAULT_MODEL,
instanceId: DEFAULT_PROVIDER_INSTANCE_ID,
model: getDefaultModelForProvider(DEFAULT_PROVIDER_DRIVER_KIND),
},
localDraftError,
)
Expand Down Expand Up @@ -1261,7 +1261,7 @@ export default function ChatView(props: ChatViewProps) {
const providerStatuses = serverConfig?.providers ?? EMPTY_PROVIDERS;
const unlockedSelectedProvider = resolveSelectableProvider(
providerStatuses,
selectedProviderByThreadId ?? threadProvider ?? ProviderDriverKind.make("opencode"),
selectedProviderByThreadId ?? threadProvider ?? DEFAULT_PROVIDER_DRIVER_KIND,
);
const selectedProvider: ProviderDriverKind = lockedProvider ?? unlockedSelectedProvider;
const phase = derivePhase(activeThread?.session ?? null);
Expand Down Expand Up @@ -2803,8 +2803,7 @@ export default function ChatView(props: ChatViewProps) {
ctxSelectedModelSelection.instanceId,
ctxSelectedModel ||
activeProject.defaultModelSelection?.model ||
DEFAULT_MODEL_BY_PROVIDER[ctxSelectedProvider] ||
DEFAULT_MODEL,
getDefaultModelForProvider(ctxSelectedProvider),
ctxSelectedModelSelection.options,
);

Expand Down
8 changes: 5 additions & 3 deletions apps/web/src/components/chat/ChatComposer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import type {
ProjectEntry,
ProviderApprovalDecision,
ProviderInteractionMode,
ProviderInstanceId,
ResolvedKeybindingsConfig,
RuntimeMode,
ScopedThreadRef,
Expand All @@ -13,8 +14,9 @@ import type {
TurnId,
} from "@t3tools/contracts";
import {
DEFAULT_PROVIDER_DRIVER_KIND,
DEFAULT_PROVIDER_INSTANCE_ID,
ProviderDriverKind,
ProviderInstanceId,
PROVIDER_SEND_TURN_MAX_ATTACHMENTS,
PROVIDER_SEND_TURN_MAX_IMAGE_BYTES,
} from "@t3tools/contracts";
Expand Down Expand Up @@ -607,7 +609,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)

const unlockedSelectedProvider = resolveSelectableProvider(
providerStatuses,
explicitSelectedInstanceId ?? ProviderDriverKind.make("opencode"),
explicitSelectedInstanceId ?? DEFAULT_PROVIDER_DRIVER_KIND,
);
const selectedProvider: ProviderDriverKind = lockedProvider ?? unlockedSelectedProvider;
const lockedContinuationGroupKey = useMemo((): string | null => {
Expand Down Expand Up @@ -675,7 +677,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)
providerInstanceEntries[0]?.instanceId ??
activeThreadModelSelection?.instanceId ??
activeProjectDefaultModelSelection?.instanceId ??
ProviderInstanceId.make("opencode")
DEFAULT_PROVIDER_INSTANCE_ID
);
}, [
activeProjectDefaultModelSelection?.instanceId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { CheckIcon } from "lucide-react";
import { Radio as RadioPrimitive } from "@base-ui/react/radio";
import { useCallback, useEffect, useMemo, useState } from "react";
import {
DEFAULT_PROVIDER_DRIVER_KIND,
ProviderInstanceId,
ProviderDriverKind,
type ProviderInstanceConfig,
Expand Down Expand Up @@ -61,7 +62,6 @@ function deriveInstanceId(driver: ProviderDriverKind, label: string): string {
}

const INSTANCE_ID_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
const DEFAULT_DRIVER_KIND = ProviderDriverKind.make("opencode");
const DEFAULT_DRIVER_OPTION = DRIVER_OPTIONS[0]!;
const EMPTY_CONFIG_DRAFT: Record<string, unknown> = {};
interface ComingSoonDriverOption {
Expand Down Expand Up @@ -118,7 +118,7 @@ export function AddProviderInstanceDialog({ open, onOpenChange }: AddProviderIns
const { updateSettings } = useUpdateSettings();

const [wizardStep, setWizardStep] = useState(0);
const [driver, setDriver] = useState<ProviderDriverKind>(DEFAULT_DRIVER_KIND);
const [driver, setDriver] = useState<ProviderDriverKind>(DEFAULT_PROVIDER_DRIVER_KIND);
const [label, setLabel] = useState("");
const [accentColor, setAccentColor] = useState<string>("");
const [instanceId, setInstanceId] = useState("");
Expand All @@ -139,7 +139,7 @@ export function AddProviderInstanceDialog({ open, onOpenChange }: AddProviderIns
// from a clean slate.
useEffect(() => {
if (!open) return;
setDriver(DEFAULT_DRIVER_KIND);
setDriver(DEFAULT_PROVIDER_DRIVER_KIND);
setLabel("");
setAccentColor("");
setInstanceId("");
Expand Down
5 changes: 2 additions & 3 deletions apps/web/src/components/settings/SettingsPanels.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useQueryClient } from "@tanstack/react-query";
import { Link } from "@tanstack/react-router";
import { useCallback, useMemo, useRef, useState } from "react";
import {
DEFAULT_PROVIDER_DRIVER_KIND,
defaultInstanceIdForDriver,
type DesktopUpdateChannel,
PROVIDER_DISPLAY_NAMES,
Expand Down Expand Up @@ -99,8 +100,6 @@ const TIMESTAMP_FORMAT_LABELS = {
"24-hour": "24-hour",
} as const;

const DEFAULT_DRIVER_KIND = ProviderDriverKind.make("opencode");

function withoutProviderInstanceKey<V>(
record: Readonly<Record<ProviderInstanceId, V>> | undefined,
key: ProviderInstanceId,
Expand Down Expand Up @@ -502,7 +501,7 @@ export function GeneralSettingsPanel() {
(entry) => entry.instanceId === textGenInstanceId,
);
const textGenProvider: ProviderDriverKind =
textGenInstanceEntry?.driverKind ?? DEFAULT_DRIVER_KIND;
textGenInstanceEntry?.driverKind ?? DEFAULT_PROVIDER_DRIVER_KIND;
const gitModelOptionsByInstance = getCustomModelOptionsByInstance(
settings,
serverProviders,
Expand Down
13 changes: 6 additions & 7 deletions apps/web/src/composerDraftStore.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
DEFAULT_MODEL,
DEFAULT_MODEL_BY_PROVIDER,
DEFAULT_PROVIDER_DRIVER_KIND,
defaultInstanceIdForDriver,
getDefaultModelForProvider,
type EnvironmentId,
ModelSelection,
ProjectId,
Expand Down Expand Up @@ -723,7 +723,7 @@ function normalizeModelSelection(
// into a driver kind here; they get generic default normalization.
const driverKindHint =
normalizeProviderDriverKind(candidate?.provider ?? legacy?.provider) ??
ProviderDriverKind.make("opencode");
DEFAULT_PROVIDER_DRIVER_KIND;
const model = normalizeModelSlug(rawModel, driverKindHint);
if (!model) {
return null;
Expand Down Expand Up @@ -823,7 +823,7 @@ function legacyToModelSelectionByProvider(
instanceKey,
modelSelection?.instanceId === instanceKey
? modelSelection.model
: (DEFAULT_MODEL_BY_PROVIDER[driverKind] ?? DEFAULT_MODEL),
: getDefaultModelForProvider(driverKind),
options,
);
}
Expand Down Expand Up @@ -2424,7 +2424,7 @@ const composerDraftStore = create<ComposerDraftStoreState>()(
if (opts && opts.length > 0) {
nextMap[instanceKey] = createModelSelection(
instanceKey,
current?.model ?? DEFAULT_MODEL_BY_PROVIDER[driverKind] ?? DEFAULT_MODEL,
current?.model ?? getDefaultModelForProvider(driverKind),
opts,
);
} else if (current?.options) {
Expand Down Expand Up @@ -2460,8 +2460,7 @@ const composerDraftStore = create<ComposerDraftStoreState>()(
const instanceKey = options?.instanceId ?? defaultInstanceIdForDriver(normalizedProvider);
const fallbackModel =
normalizeModelSlug(options?.model, normalizedProvider) ??
DEFAULT_MODEL_BY_PROVIDER[normalizedProvider] ??
DEFAULT_MODEL;
getDefaultModelForProvider(normalizedProvider);
const providerOpts =
nextProviderOptions && nextProviderOptions.length > 0 ? nextProviderOptions : undefined;

Expand Down
17 changes: 7 additions & 10 deletions apps/web/src/modelSelection.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import {
DEFAULT_GIT_TEXT_GENERATION_MODEL,
DEFAULT_GIT_TEXT_GENERATION_MODEL_BY_PROVIDER,
DEFAULT_PROVIDER_DRIVER_KIND,
DEFAULT_PROVIDER_INSTANCE_ID,
defaultInstanceIdForDriver,
getDefaultGitTextGenerationModelForProvider,
type ModelSelection,
ProviderDriverKind,
ProviderInstanceId,
Expand All @@ -25,8 +26,6 @@ import { sortModelsForProviderInstance } from "./modelOrdering";

const MAX_CUSTOM_MODEL_COUNT = 32;
export const MAX_CUSTOM_MODEL_LENGTH = 256;
const DEFAULT_TEXT_GENERATION_INSTANCE_ID = ProviderInstanceId.make("opencode");
const DEFAULT_TEXT_GENERATION_DRIVER_KIND = ProviderDriverKind.make("opencode");

/**
* Resolve the custom-model list for a given instance, preferring the
Expand Down Expand Up @@ -116,7 +115,7 @@ function applyInstanceModelPreferences(
export function normalizeCustomModelSlugs(
models: Iterable<string | null | undefined>,
builtInModelSlugs: ReadonlySet<string>,
provider: ProviderDriverKind = ProviderDriverKind.make("opencode"),
provider: ProviderDriverKind = DEFAULT_PROVIDER_DRIVER_KIND,
): string[] {
const normalizedModels: string[] = [];
const seen = new Set<string>();
Expand Down Expand Up @@ -275,10 +274,8 @@ export function resolveAppModelSelectionState(
providers: ReadonlyArray<ServerProvider>,
): ModelSelection {
const selection = settings.textGenerationModelSelection ?? {
instanceId: DEFAULT_TEXT_GENERATION_INSTANCE_ID,
model:
DEFAULT_GIT_TEXT_GENERATION_MODEL_BY_PROVIDER[DEFAULT_TEXT_GENERATION_DRIVER_KIND] ??
DEFAULT_GIT_TEXT_GENERATION_MODEL,
instanceId: DEFAULT_PROVIDER_INSTANCE_ID,
model: getDefaultGitTextGenerationModelForProvider(DEFAULT_PROVIDER_DRIVER_KIND),
};
const entries = deriveProviderInstanceEntries(providers);
const selectedEntry = entries.find(
Expand All @@ -293,7 +290,7 @@ export function resolveAppModelSelectionState(
const model =
resolveAppModelSelectionForInstance(entry.instanceId, settings, providers, selectedModel) ??
entry.models[0]?.slug ??
DEFAULT_GIT_TEXT_GENERATION_MODEL_BY_PROVIDER[entry.driverKind];
getDefaultGitTextGenerationModelForProvider(entry.driverKind);
if (!model) {
return createModelSelection(entry.instanceId, "", []);
}
Expand Down
10 changes: 4 additions & 6 deletions apps/web/src/providerModels.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
DEFAULT_MODEL,
DEFAULT_MODEL_BY_PROVIDER,
DEFAULT_PROVIDER_DRIVER_KIND,
defaultInstanceIdForDriver,
getDefaultModelForProvider,
ProviderDriverKind,
type ModelCapabilities,
type ProviderInstanceId,
Expand All @@ -13,7 +13,6 @@ import { createModelCapabilities, normalizeModelSlug } from "@t3tools/shared/mod
const EMPTY_CAPABILITIES: ModelCapabilities = createModelCapabilities({
optionDescriptors: [],
});
const DEFAULT_DRIVER_KIND = ProviderDriverKind.make("opencode");
export function formatProviderDriverKindLabel(provider: ProviderDriverKind): string {
return provider
.replace(/([a-z])([A-Z])/g, "$1 $2")
Expand Down Expand Up @@ -75,7 +74,7 @@ export function resolveSelectableProvider(
}
return (
providers.find((candidate) => candidate.enabled && candidate.availability !== "unavailable")
?.driver ?? DEFAULT_DRIVER_KIND
?.driver ?? DEFAULT_PROVIDER_DRIVER_KIND
);
}

Expand All @@ -96,7 +95,6 @@ export function getDefaultServerModel(
return (
models.find((model) => !model.isCustom)?.slug ??
models[0]?.slug ??
DEFAULT_MODEL_BY_PROVIDER[provider] ??
DEFAULT_MODEL
getDefaultModelForProvider(provider)
);
}
8 changes: 6 additions & 2 deletions apps/web/src/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ import type {
ScopedProjectRef,
ScopedThreadRef,
} from "@t3tools/contracts";
import { isProviderDriverKind, ProviderDriverKind } from "@t3tools/contracts";
import {
DEFAULT_PROVIDER_DRIVER_KIND,
isProviderDriverKind,
ProviderDriverKind,
} from "@t3tools/contracts";
import type { ThreadId, TurnId } from "@t3tools/contracts";
import * as Schema from "effect/Schema";
import { resolveModelSlugForProvider } from "@t3tools/shared/model";
Expand Down Expand Up @@ -1010,7 +1014,7 @@ function toLegacyProvider(providerName: string | null): ProviderDriverKind {
if (isProviderDriverKindValue(providerName)) {
return providerName;
}
return ProviderDriverKind.make("opencode");
return DEFAULT_PROVIDER_DRIVER_KIND;
}

function attachmentPreviewRoutePath(attachmentId: string): string {
Expand Down
Loading
Loading