mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-04-29 10:26:23 +02:00
Fix: Display GitHub Copilot Student in UI and add model discovery
- Add 'github-copilot' to LlmProviderFlavor type in settings dialog - Add GitHub Copilot Student to moreProviders array in UI - Add github-copilot to initial providerConfigs state - Add isGitHubCopilot flag to handle Device Flow auth flow - Add GitHub Copilot authentication button in settings UI - Add GitHub Copilot models (6 models) to listOnboardingModels() output - Add eslint-disable comment for mock fetch in tests This fixes the issue where GitHub Copilot Student was not appearing in the Models dropdown in the Settings dialog.
This commit is contained in:
parent
48bf18cb23
commit
4f53f0af48
4 changed files with 2763 additions and 3 deletions
|
|
@ -162,7 +162,7 @@ function AppearanceSettings() {
|
|||
|
||||
// --- Model Settings UI ---
|
||||
|
||||
type LlmProviderFlavor = "openai" | "anthropic" | "google" | "openrouter" | "aigateway" | "ollama" | "openai-compatible"
|
||||
type LlmProviderFlavor = "openai" | "anthropic" | "google" | "openrouter" | "aigateway" | "ollama" | "openai-compatible" | "github-copilot"
|
||||
|
||||
interface LlmModelOption {
|
||||
id: string
|
||||
|
|
@ -181,6 +181,7 @@ const moreProviders: Array<{ id: LlmProviderFlavor; name: string; description: s
|
|||
{ id: "openrouter", name: "OpenRouter", description: "Multiple models, one key" },
|
||||
{ id: "aigateway", name: "AI Gateway (Vercel)", description: "Vercel's AI Gateway" },
|
||||
{ id: "openai-compatible", name: "OpenAI-Compatible", description: "Custom OpenAI-compatible API" },
|
||||
{ id: "github-copilot", name: "GitHub Copilot Student", description: "GitHub Copilot with Device Flow" },
|
||||
]
|
||||
|
||||
const preferredDefaults: Partial<Record<LlmProviderFlavor, string>> = {
|
||||
|
|
@ -204,6 +205,7 @@ function ModelSettings({ dialogOpen }: { dialogOpen: boolean }) {
|
|||
aigateway: { apiKey: "", baseURL: "", models: [""], knowledgeGraphModel: "" },
|
||||
ollama: { apiKey: "", baseURL: "http://localhost:11434", models: [""], knowledgeGraphModel: "" },
|
||||
"openai-compatible": { apiKey: "", baseURL: "http://localhost:1234/v1", models: [""], knowledgeGraphModel: "" },
|
||||
"github-copilot": { apiKey: "", baseURL: "", models: [""], knowledgeGraphModel: "" },
|
||||
})
|
||||
const [modelsCatalog, setModelsCatalog] = useState<Record<string, LlmModelOption[]>>({})
|
||||
const [modelsLoading, setModelsLoading] = useState(false)
|
||||
|
|
@ -218,8 +220,9 @@ function ModelSettings({ dialogOpen }: { dialogOpen: boolean }) {
|
|||
const showBaseURL = provider === "ollama" || provider === "openai-compatible" || provider === "aigateway"
|
||||
const requiresBaseURL = provider === "ollama" || provider === "openai-compatible"
|
||||
const isLocalProvider = provider === "ollama" || provider === "openai-compatible"
|
||||
const isGitHubCopilot = provider === "github-copilot"
|
||||
const modelsForProvider = modelsCatalog[provider] || []
|
||||
const showModelInput = isLocalProvider || modelsForProvider.length === 0
|
||||
const showModelInput = isLocalProvider || modelsForProvider.length === 0 || isGitHubCopilot
|
||||
const isMoreProvider = moreProviders.some(p => p.id === provider)
|
||||
|
||||
const primaryModel = activeConfig.models[0] || ""
|
||||
|
|
@ -684,6 +687,25 @@ function ModelSettings({ dialogOpen }: { dialogOpen: boolean }) {
|
|||
</div>
|
||||
)}
|
||||
|
||||
{/* GitHub Copilot Authentication */}
|
||||
{isGitHubCopilot && (
|
||||
<div className="space-y-2">
|
||||
<span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">Authentication</span>
|
||||
<p className="text-xs text-muted-foreground">GitHub Copilot uses Device Flow OAuth for authentication. Click the button below to authenticate with your GitHub account.</p>
|
||||
<Button
|
||||
onClick={() => {
|
||||
// Authentication will be triggered when the user selects a model
|
||||
// The models will be loaded from the auth service
|
||||
toast.info("Select a GitHub Copilot model to authenticate")
|
||||
}}
|
||||
variant="outline"
|
||||
className="w-full"
|
||||
>
|
||||
Authenticate with GitHub
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Test status */}
|
||||
{testState.status === "error" && (
|
||||
<div className="text-sm text-destructive">
|
||||
|
|
|
|||
2724
apps/x/package-lock.json
generated
Normal file
2724
apps/x/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -13,7 +13,7 @@ const originalFetch = global.fetch;
|
|||
const mockFetch = vi.fn();
|
||||
|
||||
beforeEach(() => {
|
||||
global.fetch = mockFetch as any;
|
||||
global.fetch = mockFetch as any; // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
|
|
|||
|
|
@ -222,5 +222,19 @@ export async function listOnboardingModels(): Promise<{ providers: ProviderSumma
|
|||
});
|
||||
}
|
||||
|
||||
// Add GitHub Copilot models
|
||||
providers.push({
|
||||
id: "github-copilot",
|
||||
name: "GitHub Copilot Student",
|
||||
models: [
|
||||
{ id: "gpt-4o", name: "GPT-4o" },
|
||||
{ id: "gpt-4-turbo", name: "GPT-4 Turbo" },
|
||||
{ id: "gpt-4", name: "GPT-4" },
|
||||
{ id: "gpt-3.5-turbo", name: "GPT-3.5 Turbo" },
|
||||
{ id: "claude-3.5-sonnet", name: "Claude 3.5 Sonnet" },
|
||||
{ id: "claude-3-opus", name: "Claude 3 Opus" },
|
||||
],
|
||||
});
|
||||
|
||||
return { providers, lastUpdated: fetchedAt };
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue