UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

122 lines (121 loc) 3.81 kB
import { _ as uniqueStrings, l as normalizeStringEntries } from "../../string-normalization-WNUDCpXX.js"; import "../../string-coerce-runtime-CEGJWkQ_.js"; import { t as definePluginEntry } from "../../plugin-entry-C7DUzV0e.js"; import "../../runtime-api-DNvqgngr.js"; //#region extensions/copilot-proxy/index.ts const DEFAULT_BASE_URL = "http://localhost:3000/v1"; const DEFAULT_API_KEY = "n/a"; const DEFAULT_CONTEXT_WINDOW = 128e3; const DEFAULT_MAX_TOKENS = 8192; const DEFAULT_MODEL_IDS = [ "gpt-5.2", "gpt-5.2-codex", "gpt-5.1", "gpt-5.1-codex", "gpt-5.1-codex-max", "gpt-5-mini", "claude-opus-4.6", "claude-opus-4.7", "claude-sonnet-4.6", "gemini-3-pro", "gemini-3-flash" ]; function normalizeBaseUrl(value) { const trimmed = value.trim(); if (!trimmed) return DEFAULT_BASE_URL; let normalized = trimmed; while (normalized.endsWith("/")) normalized = normalized.slice(0, -1); if (!normalized.endsWith("/v1")) normalized = `${normalized}/v1`; return normalized; } function validateBaseUrl(value) { const normalized = normalizeBaseUrl(value); return URL.canParse(normalized) ? void 0 : "Enter a valid URL"; } function parseModelIds(input) { return uniqueStrings(normalizeStringEntries(input.split(/[\n,]/))); } function buildModelDefinition(modelId) { return { id: modelId, name: modelId, api: "openai-completions", reasoning: false, input: ["text", "image"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: DEFAULT_CONTEXT_WINDOW, maxTokens: DEFAULT_MAX_TOKENS }; } var copilot_proxy_default = definePluginEntry({ id: "copilot-proxy", name: "Copilot Proxy", description: "Local Copilot Proxy (VS Code LM) provider plugin", register(api) { api.registerProvider({ id: "copilot-proxy", label: "Copilot Proxy", docsPath: "/providers/models", auth: [{ id: "local", label: "Local proxy", hint: "Configure base URL + models for the Copilot Proxy server", kind: "custom", run: async (ctx) => { const baseUrlInput = await ctx.prompter.text({ message: "Copilot Proxy base URL", initialValue: DEFAULT_BASE_URL, validate: validateBaseUrl }); const modelInput = await ctx.prompter.text({ message: "Model IDs (comma-separated)", initialValue: DEFAULT_MODEL_IDS.join(", "), validate: (value) => parseModelIds(value).length > 0 ? void 0 : "Enter at least one model id" }); const baseUrl = normalizeBaseUrl(baseUrlInput); const modelIds = parseModelIds(modelInput); const defaultModelRef = `copilot-proxy/${modelIds[0] ?? DEFAULT_MODEL_IDS[0]}`; return { profiles: [{ profileId: "copilot-proxy:local", credential: { type: "token", provider: "copilot-proxy", token: DEFAULT_API_KEY } }], configPatch: { models: { providers: { "copilot-proxy": { baseUrl, apiKey: DEFAULT_API_KEY, api: "openai-completions", authHeader: false, models: modelIds.map((modelId) => buildModelDefinition(modelId)) } } }, agents: { defaults: { models: Object.fromEntries(modelIds.map((modelId) => [`copilot-proxy/${modelId}`, {}])) } } }, defaultModel: defaultModelRef, notes: [ "Start the Copilot Proxy VS Code extension before using these models.", "Copilot Proxy serves /v1/chat/completions; base URL must include /v1.", "Model availability depends on your Copilot plan; edit models.providers.copilot-proxy if needed." ] }; } }], wizard: { setup: { choiceId: "copilot-proxy", choiceLabel: "Copilot Proxy", choiceHint: "Configure base URL + model ids", methodId: "local" } } }); } }); //#endregion export { copilot_proxy_default as default };