Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: d981de1229ef899957bbe968bc8dcda02a21f477
35 lines
1.5 KiB
TypeScript
35 lines
1.5 KiB
TypeScript
import { anthropicMessagesApi } from "../api/anthropic-messages.lazy.ts";
|
|
import { openAICompletionsApi } from "../api/openai-completions.lazy.ts";
|
|
import { openAIResponsesApi } from "../api/openai-responses.lazy.ts";
|
|
import { envApiKeyAuth, lazyOAuth } from "../auth/helpers.ts";
|
|
import { loadGitHubCopilotOAuth } from "../auth/oauth/load.ts";
|
|
import { createProvider, type Provider } from "../models.ts";
|
|
import { GITHUB_COPILOT_MODELS } from "./github-copilot.models.ts";
|
|
|
|
export function githubCopilotProvider(): Provider<"anthropic-messages" | "openai-completions" | "openai-responses"> {
|
|
return createProvider({
|
|
id: "github-copilot",
|
|
name: "GitHub Copilot",
|
|
baseUrl: "https://api.individual.githubcopilot.com",
|
|
auth: {
|
|
apiKey: envApiKeyAuth("GitHub Copilot token", ["COPILOT_GITHUB_TOKEN"]),
|
|
oauth: lazyOAuth({ name: "GitHub Copilot", isSubscription: true, load: loadGitHubCopilotOAuth }),
|
|
},
|
|
models: Object.values(GITHUB_COPILOT_MODELS),
|
|
filterModels: (models, credential) => {
|
|
if (credential?.type !== "oauth") return models;
|
|
const availableModelIds = credential.availableModelIds;
|
|
if (!Array.isArray(availableModelIds) || !availableModelIds.every((id) => typeof id === "string")) {
|
|
return models;
|
|
}
|
|
const available = new Set(availableModelIds);
|
|
return models.filter((model) => available.has(model.id));
|
|
},
|
|
api: {
|
|
"anthropic-messages": anthropicMessagesApi(),
|
|
"openai-completions": openAICompletionsApi(),
|
|
"openai-responses": openAIResponsesApi(),
|
|
},
|
|
});
|
|
}
|