mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-31 06:42:03 +00:00
- Refactor model handling to support both Claude and Cursor models across various components. - Introduce `stripProviderPrefix` utility for consistent model ID processing. - Update `CursorProvider` to utilize `isCursorModel` for model validation. - Implement model override functionality in GitHub issue validation and enhancement routes. - Add `useCursorStatusInit` hook to initialize Cursor CLI status on app startup. - Update UI components to reflect changes in model selection and validation processes. This update improves the flexibility of AI model usage and enhances user experience by allowing quick model overrides.
83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
import { useState, useCallback, useMemo } from 'react';
|
|
import { useAppStore } from '@/store/app-store';
|
|
import type { ModelAlias, CursorModelId, PhaseModelKey } from '@automaker/types';
|
|
|
|
export interface UseModelOverrideOptions {
|
|
/** Which phase this override is for */
|
|
phase: PhaseModelKey;
|
|
/** Initial override value (optional) */
|
|
initialOverride?: ModelAlias | CursorModelId | null;
|
|
}
|
|
|
|
export interface UseModelOverrideResult {
|
|
/** The effective model (override or global default) */
|
|
effectiveModel: ModelAlias | CursorModelId;
|
|
/** Whether the model is currently overridden */
|
|
isOverridden: boolean;
|
|
/** Set a model override */
|
|
setOverride: (model: ModelAlias | CursorModelId | null) => void;
|
|
/** Clear the override and use global default */
|
|
clearOverride: () => void;
|
|
/** The global default for this phase */
|
|
globalDefault: ModelAlias | CursorModelId;
|
|
/** The current override value (null if not overridden) */
|
|
override: ModelAlias | CursorModelId | null;
|
|
}
|
|
|
|
/**
|
|
* Hook for managing model overrides per phase
|
|
*
|
|
* Provides a simple way to allow users to override the global phase model
|
|
* for a specific run or context.
|
|
*
|
|
* @example
|
|
* ```tsx
|
|
* function EnhanceDialog() {
|
|
* const { effectiveModel, isOverridden, setOverride, clearOverride } = useModelOverride({
|
|
* phase: 'enhancementModel',
|
|
* });
|
|
*
|
|
* return (
|
|
* <ModelOverrideTrigger
|
|
* currentModel={effectiveModel}
|
|
* onModelChange={setOverride}
|
|
* phase="enhancementModel"
|
|
* isOverridden={isOverridden}
|
|
* />
|
|
* );
|
|
* }
|
|
* ```
|
|
*/
|
|
export function useModelOverride({
|
|
phase,
|
|
initialOverride = null,
|
|
}: UseModelOverrideOptions): UseModelOverrideResult {
|
|
const { phaseModels } = useAppStore();
|
|
const [override, setOverrideState] = useState<ModelAlias | CursorModelId | null>(initialOverride);
|
|
|
|
const globalDefault = phaseModels[phase];
|
|
|
|
const effectiveModel = useMemo(() => {
|
|
return override ?? globalDefault;
|
|
}, [override, globalDefault]);
|
|
|
|
const isOverridden = override !== null;
|
|
|
|
const setOverride = useCallback((model: ModelAlias | CursorModelId | null) => {
|
|
setOverrideState(model);
|
|
}, []);
|
|
|
|
const clearOverride = useCallback(() => {
|
|
setOverrideState(null);
|
|
}, []);
|
|
|
|
return {
|
|
effectiveModel,
|
|
isOverridden,
|
|
setOverride,
|
|
clearOverride,
|
|
globalDefault,
|
|
override,
|
|
};
|
|
}
|