refactoring: switched to gpt-5-nano for commit message generation
Remove commitMessageModel from persisted settings and defaults Eliminate UI controls and state for commitMessageModel in GitSettings and config store Update backend and persistence layers to stop reading or writing commitMessageModel
This commit is contained in:
@@ -1,64 +1,23 @@
|
||||
import React from 'react';
|
||||
import { RiInformationLine } from '@remixicon/react';
|
||||
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
||||
import { ModelSelector } from '@/components/sections/agents/ModelSelector';
|
||||
import { updateDesktopSettings } from '@/lib/persistence';
|
||||
import { isDesktopRuntime, getDesktopSettings } from '@/lib/desktop';
|
||||
import { useConfigStore } from '@/stores/useConfigStore';
|
||||
import { getRegisteredRuntimeAPIs } from '@/contexts/runtimeAPIRegistry';
|
||||
|
||||
const FALLBACK_PROVIDER_ID = 'opencode';
|
||||
const FALLBACK_MODEL_ID = 'big-pickle';
|
||||
|
||||
const getDisplayModel = (
|
||||
storedModel: string | undefined,
|
||||
providers: Array<{ id: string; models: Array<{ id: string }> }>
|
||||
): { providerId: string; modelId: string } => {
|
||||
if (storedModel) {
|
||||
const parts = storedModel.split('/');
|
||||
if (parts.length === 2 && parts[0] && parts[1]) {
|
||||
return { providerId: parts[0], modelId: parts[1] };
|
||||
}
|
||||
}
|
||||
|
||||
const fallbackProvider = providers.find(p => p.id === FALLBACK_PROVIDER_ID);
|
||||
if (fallbackProvider?.models.some(m => m.id === FALLBACK_MODEL_ID)) {
|
||||
return { providerId: FALLBACK_PROVIDER_ID, modelId: FALLBACK_MODEL_ID };
|
||||
}
|
||||
|
||||
const firstProvider = providers[0];
|
||||
if (firstProvider?.models[0]) {
|
||||
return { providerId: firstProvider.id, modelId: firstProvider.models[0].id };
|
||||
}
|
||||
|
||||
return { providerId: '', modelId: '' };
|
||||
};
|
||||
|
||||
export const GitSettings: React.FC = () => {
|
||||
const settingsCommitMessageModel = useConfigStore((state) => state.settingsCommitMessageModel);
|
||||
const setSettingsCommitMessageModel = useConfigStore((state) => state.setSettingsCommitMessageModel);
|
||||
const settingsGitmojiEnabled = useConfigStore((state) => state.settingsGitmojiEnabled);
|
||||
const setSettingsGitmojiEnabled = useConfigStore((state) => state.setSettingsGitmojiEnabled);
|
||||
const providers = useConfigStore((state) => state.providers);
|
||||
|
||||
const [isLoading, setIsLoading] = React.useState(true);
|
||||
|
||||
const opencodeProviders = React.useMemo(() => {
|
||||
return providers.filter((provider) => provider.id === FALLBACK_PROVIDER_ID);
|
||||
}, [providers]);
|
||||
|
||||
const parsedModel = React.useMemo(() => {
|
||||
const effectiveStoredModel = settingsCommitMessageModel?.startsWith(`${FALLBACK_PROVIDER_ID}/`)
|
||||
? settingsCommitMessageModel
|
||||
: undefined;
|
||||
return getDisplayModel(effectiveStoredModel, opencodeProviders);
|
||||
}, [settingsCommitMessageModel, opencodeProviders]);
|
||||
|
||||
// Load current settings
|
||||
React.useEffect(() => {
|
||||
const loadSettings = async () => {
|
||||
try {
|
||||
let data: { commitMessageModel?: string; gitmojiEnabled?: boolean } | null = null;
|
||||
let data: { gitmojiEnabled?: boolean } | null = null;
|
||||
|
||||
// 1. Desktop runtime (Tauri)
|
||||
if (isDesktopRuntime()) {
|
||||
@@ -72,7 +31,6 @@ export const GitSettings: React.FC = () => {
|
||||
const settings = result?.settings;
|
||||
if (settings) {
|
||||
data = {
|
||||
commitMessageModel: typeof settings.commitMessageModel === 'string' ? settings.commitMessageModel : undefined,
|
||||
gitmojiEnabled: typeof (settings as Record<string, unknown>).gitmojiEnabled === 'boolean'
|
||||
? ((settings as Record<string, unknown>).gitmojiEnabled as boolean)
|
||||
: undefined,
|
||||
@@ -96,10 +54,6 @@ export const GitSettings: React.FC = () => {
|
||||
}
|
||||
|
||||
if (data) {
|
||||
const model = typeof data.commitMessageModel === 'string' && data.commitMessageModel.trim().length > 0
|
||||
? data.commitMessageModel.trim()
|
||||
: undefined;
|
||||
setSettingsCommitMessageModel(model);
|
||||
if (typeof data.gitmojiEnabled === 'boolean') {
|
||||
setSettingsGitmojiEnabled(data.gitmojiEnabled);
|
||||
}
|
||||
@@ -112,20 +66,7 @@ export const GitSettings: React.FC = () => {
|
||||
}
|
||||
};
|
||||
loadSettings();
|
||||
}, [setSettingsCommitMessageModel, setSettingsGitmojiEnabled]);
|
||||
|
||||
const handleModelChange = React.useCallback(async (providerId: string, modelId: string) => {
|
||||
const newValue = providerId && modelId ? `${providerId}/${modelId}` : undefined;
|
||||
setSettingsCommitMessageModel(newValue);
|
||||
|
||||
try {
|
||||
await updateDesktopSettings({
|
||||
commitMessageModel: newValue ?? '',
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn('Failed to save commit message model:', error);
|
||||
}
|
||||
}, [setSettingsCommitMessageModel]);
|
||||
}, [setSettingsGitmojiEnabled]);
|
||||
|
||||
const handleGitmojiChange = React.useCallback(async (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const enabled = event.target.checked;
|
||||
@@ -160,20 +101,6 @@ export const GitSettings: React.FC = () => {
|
||||
</div>
|
||||
|
||||
<div className="space-y-3">
|
||||
<fieldset className="flex flex-col gap-1.5">
|
||||
<legend className="typography-ui-label text-muted-foreground">Model for generation</legend>
|
||||
<ModelSelector
|
||||
providerId={parsedModel.providerId}
|
||||
modelId={parsedModel.modelId}
|
||||
onChange={handleModelChange}
|
||||
allowedProviderIds={[FALLBACK_PROVIDER_ID]}
|
||||
/>
|
||||
<p className="typography-meta text-muted-foreground mt-1">
|
||||
This model will be used to analyze diffs and suggest commit messages.
|
||||
{!settingsCommitMessageModel && <> Default: <span className="text-foreground">opencode/big-pickle</span></>}
|
||||
</p>
|
||||
</fieldset>
|
||||
|
||||
<div className="flex flex-col gap-2">
|
||||
<label className="flex items-center gap-2 cursor-pointer">
|
||||
<input
|
||||
|
||||
Reference in New Issue
Block a user