mirror of
https://wget.la/https://github.com/leookun/cursor-byok
synced 2026-10-06 13:44:21 +08:00
Console — provider presets inside the model editor: - Preset chips for five coding-plan providers (Zhipu GLM / Kimi / DeepSeek / Volcengine Ark / MiniMax) rendered at the top of the add/edit model dialog - All five providers expose both an Anthropic-protocol and an OpenAI-protocol endpoint; a click fills the endpoint matching the current model type, and switching the type automatically swaps to the same provider's other endpoint (no stale URL/protocol mismatches) - Switching to a different provider clears the API key; switching protocols within the same provider keeps it - Fills base URL (full-request-URL form for irregular paths), request protocol, claude-cli custom headers for Anthropic endpoints, token limits, remark, and the default model id + display name; known preset model ids merge into the model-name combobox Server — model discovery for sub-path endpoints: - model_discovery_url previously replaced the whole path with /v1/models, which strips the /api/anthropic, /coding, /api/paas/v4 style prefixes every coding-plan provider uses, so discovery always 404'd for them. It now appends to the existing path and normalizes endpoint/version suffixes (/chat/completions, /responses, /messages, /v1, /v3, /v4) - Verified live against Zhipu (10 models) and Kimi (4 models) coding plans; existing tests updated to the append semantics plus new URL cases Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26 lines
1.1 KiB
TypeScript
26 lines
1.1 KiB
TypeScript
import type { ModelType } from "../../api";
|
|
import { modelPresets, presetEndpoint, trimTrailingSlash, type ModelPreset } from "../../utils/modelPresets";
|
|
import styles from "./CursorPresetChips.module.scss";
|
|
|
|
/** 常用服务商预设:点击按当前协议类型自动填充对应端点与默认模型 */
|
|
export function CursorPresetChips({ type, baseUrl, onPick }: { type: ModelType; baseUrl: string; onPick: (preset: ModelPreset) => void }) {
|
|
return <div className={styles.wrap}>
|
|
<span className={styles.label}>{t("常用预设")}</span>
|
|
<div className={styles.chips}>
|
|
{modelPresets.map((preset) => {
|
|
const active = trimTrailingSlash(baseUrl) === trimTrailingSlash(presetEndpoint(preset, type).baseUrl);
|
|
return <button
|
|
type="button"
|
|
key={preset.key}
|
|
className={active ? `${styles.chip} ${styles.active}` : styles.chip}
|
|
title={preset.keyHint}
|
|
onClick={() => onPick(preset)}
|
|
>
|
|
<img className={styles.icon} src={preset.icon} alt="" />
|
|
{preset.name}
|
|
</button>;
|
|
})}
|
|
</div>
|
|
</div>;
|
|
}
|