openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
154 lines (153 loc) • 5.69 kB
JavaScript
import { c as normalizeOptionalString, p as readStringValue } from "../../string-coerce-mnp54Vah.js";
import { v as resolveOAuthApiKeyMarker } from "../../model-auth-markers-Sq8HdQFX.js";
import "../../string-coerce-runtime-CEGJWkQ_.js";
import { t as definePluginEntry } from "../../plugin-entry-C7DUzV0e.js";
import { t as createProviderApiKeyAuthMethod } from "../../provider-api-key-auth-VMMQYUA9.js";
import { t as buildOauthProviderAuthResult } from "../../provider-auth-result-D8WOW34t.js";
import "../../provider-auth-DAOC_qI9.js";
import "../../provider-auth-api-key-nSdfYNnB.js";
import { t as loginChutes } from "../../oauth-3LXchHRb.js";
import { r as CHUTES_DEFAULT_MODEL_REF } from "../../models-B8NUMKiS.js";
import { r as applyChutesProviderConfig, t as applyChutesApiKeyConfig } from "../../onboard-H8sbo_qe.js";
import { n as buildStaticChutesProvider, t as buildChutesProvider } from "../../provider-catalog-BueJFzpe.js";
//#region extensions/chutes/index.ts
/**
* Chutes provider plugin entrypoint with OAuth and API-key auth methods.
*/
const PROVIDER_ID = "chutes";
async function runChutesOAuth(ctx) {
const isRemote = ctx.isRemote;
const redirectUri = process.env.CHUTES_OAUTH_REDIRECT_URI?.trim() || "http://127.0.0.1:1456/oauth-callback";
const scopes = process.env.CHUTES_OAUTH_SCOPES?.trim() || "openid profile chutes:invoke";
const clientId = process.env.CHUTES_CLIENT_ID?.trim() || (await ctx.prompter.text({
message: "Enter Chutes OAuth client id",
placeholder: "cid_xxx",
validate: (value) => value?.trim() ? void 0 : "Required"
})).trim();
const clientSecret = normalizeOptionalString(process.env.CHUTES_CLIENT_SECRET);
await ctx.prompter.note(isRemote ? [
"You are running in a remote/VPS environment.",
"A URL will be shown for you to open in your LOCAL browser.",
"After signing in, paste the redirect URL back here.",
"",
`Redirect URI: ${redirectUri}`
].join("\n") : [
"Browser will open for Chutes authentication.",
"If the callback doesn't auto-complete, paste the redirect URL.",
"",
`Redirect URI: ${redirectUri}`
].join("\n"), "Chutes OAuth");
const progress = ctx.prompter.progress("Starting Chutes OAuth…");
try {
const { onAuth, onPrompt } = ctx.oauth.createVpsAwareHandlers({
isRemote,
prompter: ctx.prompter,
runtime: ctx.runtime,
spin: progress,
openUrl: ctx.openUrl,
localBrowserMessage: "Complete sign-in in browser…"
});
const creds = await loginChutes({
app: {
clientId,
clientSecret,
redirectUri,
scopes: scopes.split(/\s+/).filter(Boolean)
},
manual: isRemote,
onAuth,
onPrompt,
onProgress: (message) => progress.update(message)
});
progress.stop("Chutes OAuth complete");
return buildOauthProviderAuthResult({
providerId: PROVIDER_ID,
defaultModel: CHUTES_DEFAULT_MODEL_REF,
access: creds.access,
refresh: creds.refresh,
expires: creds.expires,
email: readStringValue(creds.email),
credentialExtra: {
clientId,
..."accountId" in creds && typeof creds.accountId === "string" ? { accountId: creds.accountId } : {}
},
configPatch: applyChutesProviderConfig({}),
notes: ["Chutes OAuth tokens auto-refresh. Re-run login if refresh fails or access is revoked.", `Redirect URI: ${redirectUri}`]
});
} catch (err) {
progress.stop("Chutes OAuth failed");
await ctx.prompter.note([
"Trouble with OAuth?",
"Verify CHUTES_CLIENT_ID (and CHUTES_CLIENT_SECRET if required).",
`Verify the OAuth app redirect URI includes: ${redirectUri}`,
"Chutes docs: https://chutes.ai/docs/sign-in-with-chutes/overview"
].join("\n"), "OAuth help");
throw err;
}
}
var chutes_default = definePluginEntry({
id: PROVIDER_ID,
name: "Chutes Provider",
description: "Bundled Chutes.ai provider plugin",
register(api) {
api.registerProvider({
id: PROVIDER_ID,
label: "Chutes",
docsPath: "/providers/chutes",
envVars: ["CHUTES_API_KEY", "CHUTES_OAUTH_TOKEN"],
auth: [{
id: "oauth",
label: "Chutes OAuth",
hint: "Browser sign-in",
kind: "oauth",
wizard: {
choiceId: "chutes",
choiceLabel: "Chutes (OAuth)",
choiceHint: "Browser sign-in",
groupId: "chutes",
groupLabel: "Chutes",
groupHint: "OAuth + API key"
},
run: async (ctx) => await runChutesOAuth(ctx)
}, createProviderApiKeyAuthMethod({
providerId: PROVIDER_ID,
methodId: "api-key",
label: "Chutes API key",
hint: "Open-source models including Llama, DeepSeek, and more",
optionKey: "chutesApiKey",
flagName: "--chutes-api-key",
envVar: "CHUTES_API_KEY",
promptMessage: "Enter Chutes API key",
noteTitle: "Chutes",
noteMessage: ["Chutes provides access to leading open-source models including Llama, DeepSeek, and more.", "Get your API key at: https://chutes.ai/settings/api-keys"].join("\n"),
defaultModel: CHUTES_DEFAULT_MODEL_REF,
expectedProviders: ["chutes"],
applyConfig: (cfg) => applyChutesApiKeyConfig(cfg),
wizard: {
choiceId: "chutes-api-key",
choiceLabel: "Chutes API key",
groupId: "chutes",
groupLabel: "Chutes",
groupHint: "OAuth + API key"
}
})],
catalog: {
order: "profile",
run: async (ctx) => {
const { apiKey, discoveryApiKey } = ctx.resolveProviderAuth(PROVIDER_ID, { oauthMarker: resolveOAuthApiKeyMarker(PROVIDER_ID) });
if (!apiKey) return null;
return { provider: {
...await buildChutesProvider(discoveryApiKey),
apiKey
} };
}
},
staticCatalog: {
order: "profile",
run: async () => ({ provider: buildStaticChutesProvider() })
}
});
}
});
//#endregion
export { chutes_default as default };