openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
117 lines (116 loc) • 3.73 kB
JavaScript
import { d as normalizeStringEntries, y as uniqueStrings } from "../../string-normalization-DsCfAx8q.js";
import "../../string-coerce-runtime-GQa0ehRA.js";
import { t as definePluginEntry } from "../../plugin-entry-zfBGJaNO.js";
import "../../runtime-api-BLZgqv5H.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-mini",
"claude-opus-4.6",
"claude-opus-4.7",
"claude-sonnet-4.6",
"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) {
const parsed = normalizeStringEntries(input.split(/[\n,]/));
return uniqueStrings(parsed);
}
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 };