release: prepare v0.1.139
This commit is contained in:
@@ -911,6 +911,7 @@
|
||||
<a href="#opencode">OpenCode</a>
|
||||
<a href="#openclaw">OpenClaw</a>
|
||||
<a href="#hermes">Hermes</a>
|
||||
<a href="#codexplusplus">如何开启 Codex 插件</a>
|
||||
<a href="#faq">常见问题</a>
|
||||
</aside>
|
||||
|
||||
@@ -1276,6 +1277,44 @@ requires_openai_auth = true</code></pre>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="codexplusplus">
|
||||
<h2>如何开启 Codex 插件(Codex++)</h2>
|
||||
<p class="section-desc">
|
||||
如果你使用第三方 API 或本站中转,不想只依赖官方 ChatGPT 登录态,可以用 Codex++ 给 Codex App 开启增强插件和中转 Provider。Codex++ 是外部启动器,不改 Codex App 安装文件,而是通过 Chromium DevTools Protocol 注入增强脚本。
|
||||
</p>
|
||||
<div class="grid-2">
|
||||
<div class="card">
|
||||
<h3>它能做什么</h3>
|
||||
<ul class="plain-list">
|
||||
<li>开启 Codex App 的插件入口、特殊插件安装、会话删除、Markdown 导出、项目移动、Timeline 等增强能力。</li>
|
||||
<li>通过“中转注入”写入 <code>CodexPlusPlus</code> Provider,让 Codex App 使用第三方 API Base URL 与 API Key。</li>
|
||||
<li>支持多个中转配置,并可在增强 Provider 与官方 ChatGPT 登录态之间切换。</li>
|
||||
<li>独立管理用户脚本,启动 Codex 时自动注入自定义脚本。</li>
|
||||
</ul>
|
||||
<div class="meta-row">
|
||||
<a class="tiny-btn" href="https://github.com/BigPizzaV3/CodexPlusPlus" target="_blank" rel="noopener noreferrer">打开 Codex++ 仓库</a>
|
||||
<a class="tiny-btn" href="https://github.com/BigPizzaV3/CodexPlusPlus/releases" target="_blank" rel="noopener noreferrer">下载 Releases</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>第三方 API 开启步骤</h3>
|
||||
<ol class="plain-list">
|
||||
<li>先安装官方 Codex App,再从 Codex++ Releases 下载并安装对应系统版本。</li>
|
||||
<li>进入本站 <code>/keys</code> 创建或复制 API Key。</li>
|
||||
<li>打开 <code>Codex++ 管理工具</code>,进入中转注入 / Relay 配置。</li>
|
||||
<li>新增一个配置:Base URL 填 <code><span data-default-host-text>https://re.94xy.cn</span>/v1</code>,API Key 填本站 Key,模型按可用权限填写,例如 <code>gpt-5.4</code>。</li>
|
||||
<li>保存后用 <code>Codex++</code> 或管理工具启动 Codex App,确认当前 Provider 为 <code>CodexPlusPlus</code>。</li>
|
||||
</ol>
|
||||
<div class="note warning" style="margin-top: 12px;">
|
||||
Codex++ README 的中转注入示例使用 OpenAI Responses 兼容地址,通常应填写 <code>HOST/v1</code>。如果你的 Codex++ 版本界面明确提示只填根地址,再按界面提示填写 <code>HOST</code>。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="note" style="margin-top: 16px;">
|
||||
如果启动后没有看到插件或 Provider,先在 Codex++ 管理工具里运行检查 / 修复,再确认 Codex App 版本更新后是否需要等待 Codex++ 适配。
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="opencode">
|
||||
<h2>OpenCode</h2>
|
||||
<p class="section-desc">
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
"OpenCode",
|
||||
"OpenClaw",
|
||||
"Hermes",
|
||||
"如何开启 Codex 插件",
|
||||
"常见问题",
|
||||
],
|
||||
},
|
||||
@@ -225,6 +226,35 @@
|
||||
descHtml:
|
||||
'站内 <code>使用密钥</code> 页面给 Codex CLI 生成的是 <code>~/.codex/config.toml</code> 与 <code>auth.json</code> 两个文件。以下格式与站内模板一致。',
|
||||
},
|
||||
codexplusplus: {
|
||||
title: "如何开启 Codex 插件(Codex++)",
|
||||
descHtml:
|
||||
"如果你使用第三方 API 或本站中转,不想只依赖官方 ChatGPT 登录态,可以用 Codex++ 给 Codex App 开启增强插件和中转 Provider。Codex++ 是外部启动器,不改 Codex App 安装文件,而是通过 Chromium DevTools Protocol 注入增强脚本。",
|
||||
features: {
|
||||
title: "它能做什么",
|
||||
items: [
|
||||
"开启 Codex App 的插件入口、特殊插件安装、会话删除、Markdown 导出、项目移动、Timeline 等增强能力。",
|
||||
"通过“中转注入”写入 <code>CodexPlusPlus</code> Provider,让 Codex App 使用第三方 API Base URL 与 API Key。",
|
||||
"支持多个中转配置,并可在增强 Provider 与官方 ChatGPT 登录态之间切换。",
|
||||
"独立管理用户脚本,启动 Codex 时自动注入自定义脚本。",
|
||||
],
|
||||
actions: ["打开 Codex++ 仓库", "下载 Releases"],
|
||||
},
|
||||
setup: {
|
||||
title: "第三方 API 开启步骤",
|
||||
items: [
|
||||
"先安装官方 Codex App,再从 Codex++ Releases 下载并安装对应系统版本。",
|
||||
"进入本站 <code>/keys</code> 创建或复制 API Key。",
|
||||
"打开 <code>Codex++ 管理工具</code>,进入中转注入 / Relay 配置。",
|
||||
"新增一个配置:Base URL 填 <code><span data-default-host-text>https://re.94xy.cn</span>/v1</code>,API Key 填本站 Key,模型按可用权限填写,例如 <code>gpt-5.4</code>。",
|
||||
"保存后用 <code>Codex++</code> 或管理工具启动 Codex App,确认当前 Provider 为 <code>CodexPlusPlus</code>。",
|
||||
],
|
||||
warningHtml:
|
||||
"Codex++ README 的中转注入示例使用 OpenAI Responses 兼容地址,通常应填写 <code>HOST/v1</code>。如果你的 Codex++ 版本界面明确提示只填根地址,再按界面提示填写 <code>HOST</code>。",
|
||||
},
|
||||
noteHtml:
|
||||
"如果启动后没有看到插件或 Provider,先在 Codex++ 管理工具里运行检查 / 修复,再确认 Codex App 版本更新后是否需要等待 Codex++ 适配。",
|
||||
},
|
||||
opencode: {
|
||||
title: "OpenCode",
|
||||
descHtml:
|
||||
@@ -388,6 +418,7 @@
|
||||
"OpenCode",
|
||||
"OpenClaw",
|
||||
"Hermes",
|
||||
"Enable Codex Plugins",
|
||||
"FAQ",
|
||||
],
|
||||
},
|
||||
@@ -559,6 +590,35 @@
|
||||
descHtml:
|
||||
'The <code>Use Key</code> page on this site generates two files for Codex CLI: <code>~/.codex/config.toml</code> and <code>auth.json</code>. The format below matches that template.',
|
||||
},
|
||||
codexplusplus: {
|
||||
title: "Enable Codex Plugins (Codex++)",
|
||||
descHtml:
|
||||
"If you use a third-party API or this site's relay and do not want to rely only on the official ChatGPT login state, Codex++ can enable enhanced plugins and a relay provider for Codex App. Codex++ is an external launcher: it does not modify the Codex App installation, and injects enhancement scripts through Chromium DevTools Protocol.",
|
||||
features: {
|
||||
title: "What it does",
|
||||
items: [
|
||||
"Enables the Codex App plugin entry, special plugin installation, session deletion, Markdown export, project moving, Timeline, and other enhancements.",
|
||||
"Writes a <code>CodexPlusPlus</code> provider through relay injection, so Codex App can use a third-party API Base URL and API key.",
|
||||
"Supports multiple relay configs and switching between the enhanced provider and the official ChatGPT login mode.",
|
||||
"Manages user scripts independently and injects custom scripts when Codex starts.",
|
||||
],
|
||||
actions: ["Open Codex++ repo", "Download Releases"],
|
||||
},
|
||||
setup: {
|
||||
title: "Third-party API setup",
|
||||
items: [
|
||||
"Install the official Codex App first, then download and install the matching Codex++ build from Releases.",
|
||||
"Open <code>/keys</code> on this site and create or copy an API key.",
|
||||
"Open <code>Codex++ Manager</code>, then go to relay injection / Relay settings.",
|
||||
"Add a config: set Base URL to <code><span data-default-host-text>https://re.94xy.cn</span>/v1</code>, paste this site's API key, and choose a model you can access, such as <code>gpt-5.4</code>.",
|
||||
"Save it, launch Codex App through <code>Codex++</code> or the manager, and confirm the current provider is <code>CodexPlusPlus</code>.",
|
||||
],
|
||||
warningHtml:
|
||||
"The Codex++ README relay injection example uses an OpenAI Responses-compatible endpoint, so <code>HOST/v1</code> is usually the right value. If your Codex++ version explicitly asks for only the root host, follow its UI and use <code>HOST</code>.",
|
||||
},
|
||||
noteHtml:
|
||||
"If plugins or the provider do not appear after launch, run check / repair in Codex++ Manager first, then verify whether a Codex App update needs a matching Codex++ update.",
|
||||
},
|
||||
opencode: {
|
||||
title: "OpenCode",
|
||||
descHtml:
|
||||
|
||||
@@ -235,10 +235,46 @@
|
||||
return value === "home_header" || value === "both" ? value : "sidebar";
|
||||
}
|
||||
|
||||
function normalizeLinkOpenMode(value) {
|
||||
return value === "external" ? "external" : "internal";
|
||||
}
|
||||
|
||||
function isCustomPageMenu(item) {
|
||||
return Boolean(item?.page_slug) || String(item?.url || "").trim().startsWith("md:");
|
||||
}
|
||||
|
||||
function escapeAttr(value) {
|
||||
return String(value || "")
|
||||
.replace(/&/g, "&")
|
||||
.replace(/"/g, """)
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">");
|
||||
}
|
||||
|
||||
function escapeHtml(value) {
|
||||
return String(value || "")
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">");
|
||||
}
|
||||
|
||||
function buildCustomMenuHref(item) {
|
||||
if (!isCustomPageMenu(item)) {
|
||||
const rawUrl = String(item?.url || "").trim();
|
||||
if (rawUrl) {
|
||||
return rawUrl;
|
||||
}
|
||||
}
|
||||
return `/custom/${encodeURIComponent(item.id)}`;
|
||||
}
|
||||
|
||||
function buildCustomMenuTargetAttrs(item) {
|
||||
if (normalizeLinkOpenMode(item?.link_open_mode) === "external") {
|
||||
return ' target="_blank" rel="noopener noreferrer"';
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
function hostCardTemplate(item) {
|
||||
const text = getText();
|
||||
const labels = text.hostCard?.labels || {};
|
||||
@@ -323,7 +359,7 @@
|
||||
const icon = item.icon_svg
|
||||
? `<span style="display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;">${item.icon_svg}</span>`
|
||||
: "";
|
||||
return `<a class="header-link" href="${buildCustomMenuHref(item)}">${icon}<span>${item.label || ""}</span></a>`;
|
||||
return `<a class="header-link" href="${escapeAttr(buildCustomMenuHref(item))}"${buildCustomMenuTargetAttrs(item)}>${icon}<span>${escapeHtml(item.label || "")}</span></a>`;
|
||||
})
|
||||
.join("");
|
||||
}
|
||||
@@ -543,6 +579,37 @@
|
||||
replaceNodeContent("#gemini-cli .section-desc", text.gemini?.descHtml || "", "html");
|
||||
replaceNodeContent("#codex-cli h2", text.codex?.title || "", "text");
|
||||
replaceNodeContent("#codex-cli .section-desc", text.codex?.descHtml || "", "html");
|
||||
replaceNodeContent("#codexplusplus h2", text.codexplusplus?.title || "", "text");
|
||||
replaceNodeContent("#codexplusplus .section-desc", text.codexplusplus?.descHtml || "", "html");
|
||||
replaceAllText(
|
||||
"#codexplusplus .grid-2 .card h3",
|
||||
[
|
||||
text.codexplusplus?.features?.title || "",
|
||||
text.codexplusplus?.setup?.title || "",
|
||||
],
|
||||
);
|
||||
replaceAllHtml(
|
||||
"#codexplusplus .grid-2 .card:nth-child(1) .plain-list li",
|
||||
text.codexplusplus?.features?.items || [],
|
||||
);
|
||||
replaceAllText(
|
||||
"#codexplusplus .grid-2 .card:nth-child(1) .meta-row a",
|
||||
text.codexplusplus?.features?.actions || [],
|
||||
);
|
||||
replaceAllHtml(
|
||||
"#codexplusplus .grid-2 .card:nth-child(2) .plain-list li",
|
||||
text.codexplusplus?.setup?.items || [],
|
||||
);
|
||||
replaceNodeContent(
|
||||
"#codexplusplus .grid-2 .card:nth-child(2) .note",
|
||||
text.codexplusplus?.setup?.warningHtml || "",
|
||||
"html",
|
||||
);
|
||||
replaceNodeContent(
|
||||
"#codexplusplus > .note",
|
||||
text.codexplusplus?.noteHtml || "",
|
||||
"html",
|
||||
);
|
||||
replaceNodeContent("#opencode h2", text.opencode?.title || "", "text");
|
||||
replaceNodeContent("#opencode .section-desc", text.opencode?.descHtml || "", "html");
|
||||
replaceNodeContent("#openclaw h2", text.openclaw?.title || "", "text");
|
||||
|
||||
Reference in New Issue
Block a user