feat: add new provider plugin hook for resolving models and sync models from github models endpoint (falls back to models.dev) (#20533)

This commit is contained in:
Aiden Cline
2026-04-01 18:04:14 -05:00
committed by GitHub
parent fa96cb9c6e
commit 1fcfb69bf7
6 changed files with 356 additions and 48 deletions

View File

@@ -0,0 +1,117 @@
import { afterEach, expect, mock, test } from "bun:test"
import { CopilotModels } from "@/plugin/github-copilot/models"
const originalFetch = globalThis.fetch
afterEach(() => {
globalThis.fetch = originalFetch
})
test("preserves temperature support from existing provider models", async () => {
globalThis.fetch = mock(() =>
Promise.resolve(
new Response(
JSON.stringify({
data: [
{
model_picker_enabled: true,
id: "gpt-4o",
name: "GPT-4o",
version: "gpt-4o-2024-05-13",
capabilities: {
family: "gpt",
limits: {
max_context_window_tokens: 64000,
max_output_tokens: 16384,
max_prompt_tokens: 64000,
},
supports: {
streaming: true,
tool_calls: true,
},
},
},
{
model_picker_enabled: true,
id: "brand-new",
name: "Brand New",
version: "brand-new-2026-04-01",
capabilities: {
family: "test",
limits: {
max_context_window_tokens: 32000,
max_output_tokens: 8192,
max_prompt_tokens: 32000,
},
supports: {
streaming: true,
tool_calls: false,
},
},
},
],
}),
{ status: 200 },
),
),
) as unknown as typeof fetch
const models = await CopilotModels.get(
"https://api.githubcopilot.com",
{},
{
"gpt-4o": {
id: "gpt-4o",
providerID: "github-copilot",
api: {
id: "gpt-4o",
url: "https://api.githubcopilot.com",
npm: "@ai-sdk/openai-compatible",
},
name: "GPT-4o",
family: "gpt",
capabilities: {
temperature: true,
reasoning: false,
attachment: true,
toolcall: true,
input: {
text: true,
audio: false,
image: true,
video: false,
pdf: false,
},
output: {
text: true,
audio: false,
image: false,
video: false,
pdf: false,
},
interleaved: false,
},
cost: {
input: 0,
output: 0,
cache: {
read: 0,
write: 0,
},
},
limit: {
context: 64000,
output: 16384,
},
options: {},
headers: {},
release_date: "2024-05-13",
variants: {},
status: "active",
},
},
)
expect(models["gpt-4o"].capabilities.temperature).toBe(true)
expect(models["brand-new"].capabilities.temperature).toBe(true)
})