mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-31 06:42:03 +00:00
- Rename ClaudeApiProfile to ClaudeCompatibleProvider with models[] array - Each ProviderModel has mapsToClaudeModel field for Claude tier mapping - Add providerType field for provider-specific icons (glm, minimax, openrouter) - Add thinking level support for provider models in phase selectors - Show all mapped Claude models per provider model (e.g., "Maps to Haiku, Sonnet, Opus") - Add Bulk Replace feature to switch all phases to a provider at once - Hide Bulk Replace button when no providers are enabled - Fix project-level phaseModelOverrides not persisting after refresh - Fix deleting last provider not persisting (remove empty array guard) - Add getProviderByModelId() helper for all SDK routes - Update all routes to pass provider config for provider models - Update terminology from "profiles" to "providers" throughout UI - Update documentation to reflect new provider system
205 lines
6.0 KiB
TypeScript
205 lines
6.0 KiB
TypeScript
import { useState } from 'react';
|
|
import { Workflow, RotateCcw, Replace } from 'lucide-react';
|
|
import { cn } from '@/lib/utils';
|
|
import { useAppStore } from '@/store/app-store';
|
|
import { Button } from '@/components/ui/button';
|
|
import { PhaseModelSelector } from './phase-model-selector';
|
|
import { BulkReplaceDialog } from './bulk-replace-dialog';
|
|
import type { PhaseModelKey } from '@automaker/types';
|
|
import { DEFAULT_PHASE_MODELS } from '@automaker/types';
|
|
|
|
interface PhaseConfig {
|
|
key: PhaseModelKey;
|
|
label: string;
|
|
description: string;
|
|
}
|
|
|
|
const QUICK_TASKS: PhaseConfig[] = [
|
|
{
|
|
key: 'enhancementModel',
|
|
label: 'Feature Enhancement',
|
|
description: 'Improves feature names and descriptions',
|
|
},
|
|
{
|
|
key: 'fileDescriptionModel',
|
|
label: 'File Descriptions',
|
|
description: 'Generates descriptions for context files',
|
|
},
|
|
{
|
|
key: 'imageDescriptionModel',
|
|
label: 'Image Descriptions',
|
|
description: 'Analyzes and describes context images',
|
|
},
|
|
{
|
|
key: 'commitMessageModel',
|
|
label: 'Commit Messages',
|
|
description: 'Generates git commit messages from diffs',
|
|
},
|
|
];
|
|
|
|
const VALIDATION_TASKS: PhaseConfig[] = [
|
|
{
|
|
key: 'validationModel',
|
|
label: 'GitHub Issue Validation',
|
|
description: 'Validates and improves GitHub issues',
|
|
},
|
|
];
|
|
|
|
const GENERATION_TASKS: PhaseConfig[] = [
|
|
{
|
|
key: 'specGenerationModel',
|
|
label: 'App Specification',
|
|
description: 'Generates full application specifications',
|
|
},
|
|
{
|
|
key: 'featureGenerationModel',
|
|
label: 'Feature Generation',
|
|
description: 'Creates features from specifications',
|
|
},
|
|
{
|
|
key: 'backlogPlanningModel',
|
|
label: 'Backlog Planning',
|
|
description: 'Reorganizes and prioritizes backlog',
|
|
},
|
|
{
|
|
key: 'projectAnalysisModel',
|
|
label: 'Project Analysis',
|
|
description: 'Analyzes project structure for suggestions',
|
|
},
|
|
{
|
|
key: 'suggestionsModel',
|
|
label: 'AI Suggestions',
|
|
description: 'Model for feature, refactoring, security, and performance suggestions',
|
|
},
|
|
];
|
|
|
|
const MEMORY_TASKS: PhaseConfig[] = [
|
|
{
|
|
key: 'memoryExtractionModel',
|
|
label: 'Memory Extraction',
|
|
description: 'Extracts learnings from completed agent sessions',
|
|
},
|
|
];
|
|
|
|
function PhaseGroup({
|
|
title,
|
|
subtitle,
|
|
phases,
|
|
}: {
|
|
title: string;
|
|
subtitle: string;
|
|
phases: PhaseConfig[];
|
|
}) {
|
|
const { phaseModels, setPhaseModel } = useAppStore();
|
|
|
|
return (
|
|
<div className="space-y-4">
|
|
<div>
|
|
<h3 className="text-sm font-medium text-foreground">{title}</h3>
|
|
<p className="text-xs text-muted-foreground">{subtitle}</p>
|
|
</div>
|
|
<div className="space-y-3">
|
|
{phases.map((phase) => (
|
|
<PhaseModelSelector
|
|
key={phase.key}
|
|
label={phase.label}
|
|
description={phase.description}
|
|
value={phaseModels[phase.key] ?? DEFAULT_PHASE_MODELS[phase.key]}
|
|
onChange={(model) => setPhaseModel(phase.key, model)}
|
|
/>
|
|
))}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export function ModelDefaultsSection() {
|
|
const { resetPhaseModels, claudeCompatibleProviders } = useAppStore();
|
|
const [showBulkReplace, setShowBulkReplace] = useState(false);
|
|
|
|
// Check if there are any enabled ClaudeCompatibleProviders
|
|
const hasEnabledProviders =
|
|
claudeCompatibleProviders && claudeCompatibleProviders.some((p) => p.enabled !== false);
|
|
|
|
return (
|
|
<div
|
|
className={cn(
|
|
'rounded-2xl overflow-hidden',
|
|
'border border-border/50',
|
|
'bg-gradient-to-br from-card/90 via-card/70 to-card/80 backdrop-blur-xl',
|
|
'shadow-sm shadow-black/5'
|
|
)}
|
|
>
|
|
{/* Header */}
|
|
<div className="p-6 border-b border-border/50 bg-gradient-to-r from-transparent via-accent/5 to-transparent">
|
|
<div className="flex items-center justify-between">
|
|
<div className="flex items-center gap-3">
|
|
<div className="w-9 h-9 rounded-xl bg-gradient-to-br from-brand-500/20 to-brand-600/10 flex items-center justify-center border border-brand-500/20">
|
|
<Workflow className="w-5 h-5 text-brand-500" />
|
|
</div>
|
|
<div>
|
|
<h2 className="text-lg font-semibold text-foreground tracking-tight">
|
|
Model Defaults
|
|
</h2>
|
|
<p className="text-sm text-muted-foreground/80">
|
|
Configure which AI model to use for each application task
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
{hasEnabledProviders && (
|
|
<Button
|
|
variant="outline"
|
|
size="sm"
|
|
onClick={() => setShowBulkReplace(true)}
|
|
className="gap-2"
|
|
>
|
|
<Replace className="w-3.5 h-3.5" />
|
|
Bulk Replace
|
|
</Button>
|
|
)}
|
|
<Button variant="outline" size="sm" onClick={resetPhaseModels} className="gap-2">
|
|
<RotateCcw className="w-3.5 h-3.5" />
|
|
Reset to Defaults
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Bulk Replace Dialog */}
|
|
<BulkReplaceDialog open={showBulkReplace} onOpenChange={setShowBulkReplace} />
|
|
|
|
{/* Content */}
|
|
<div className="p-6 space-y-8">
|
|
{/* Quick Tasks */}
|
|
<PhaseGroup
|
|
title="Quick Tasks"
|
|
subtitle="Fast models recommended for speed and cost savings"
|
|
phases={QUICK_TASKS}
|
|
/>
|
|
|
|
{/* Validation Tasks */}
|
|
<PhaseGroup
|
|
title="Validation Tasks"
|
|
subtitle="Smart models recommended for accuracy"
|
|
phases={VALIDATION_TASKS}
|
|
/>
|
|
|
|
{/* Generation Tasks */}
|
|
<PhaseGroup
|
|
title="Generation Tasks"
|
|
subtitle="Powerful models recommended for quality output"
|
|
phases={GENERATION_TASKS}
|
|
/>
|
|
|
|
{/* Memory Tasks */}
|
|
<PhaseGroup
|
|
title="Memory Tasks"
|
|
subtitle="Fast models recommended for learning extraction"
|
|
phases={MEMORY_TASKS}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|