<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>OpenAI on 我的博客</title><link>https://blog.5616760.com/tags/openai/</link><description>Recent content in OpenAI on 我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Thu, 01 Oct 2026 21:30:00 +0800</lastBuildDate><atom:link href="https://blog.5616760.com/tags/openai/index.xml" rel="self" type="application/rss+xml"/><item><title>prism2api 部署到 VPS：把 Prism 网页会话变成 OpenAI 兼容 API</title><link>https://blog.5616760.com/0027.html</link><pubDate>Thu, 01 Oct 2026 21:30:00 +0800</pubDate><guid>https://blog.5616760.com/0027.html</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文整理自 GitHub 项目 &lt;a class="link" href="https://github.com/Robinfxa/prism2api" target="_blank" rel="noopener"&#10; &gt;Robinfxa/prism2api&lt;/a&gt;（v1.0.0 Direct HTTP release，MIT 许可）的 README、使用手册与源码，命令与限制忠于原文，章节组织、安全加固与评述为本文编辑归纳。所有步骤均对照仓库 CLI 与源码核对。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;先说清楚它是什么：把你浏览器里已登录好的 prism.openai.com 会话&lt;strong&gt;复制&lt;/strong&gt;出来，在服务器上重放，包装成一个 OpenAI 格式的本地 HTTP 接口。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; B["本地浏览器&lt;br/&gt;（已登录 Prism）"] --&gt;|"DevTools&lt;br/&gt;Copy as cURL"| F["curl.txt"]&#10; F --&gt;|"scp 传输"| V["VPS"]&#10; V --&gt;|"import-curl&lt;br/&gt;纯文本解析"| S["bootstrap.json&lt;br/&gt;（0600）"]&#10; S --&gt; G["serve-http&lt;br/&gt;127.0.0.1:8765"]&#10; G --&gt;|"POST /v1/chat/completions"| U["prism.openai.com&lt;br/&gt;response_with_tools_start&lt;br/&gt;response_with_tools_status"]&#10; C["你的客户端"] --&gt;|"SSH 隧道"| G&#10; style U fill:#8a6d3b,stroke:#5f4a25,color:#fff&#10; style S fill:#a33,stroke:#711,color:#fff&#10; style G fill:#2d6cdf,stroke:#1c4a9e,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;它不是什么&lt;/strong&gt;：不是官方 API，不做自动登录与凭据刷新，不支持流式（SSE）、tools、多轮消息、多模态、模型选择，不返回 token 用量，&lt;code&gt;model&lt;/code&gt; 永远是本地别名 &lt;code&gt;prism-default&lt;/code&gt;（项目明确声明这不是已证实的上游模型身份）。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ &lt;strong&gt;合规提示&lt;/strong&gt;：这是逆向工程项目，需要你上传&lt;strong&gt;本人登录会话 Cookie&lt;/strong&gt; 并绕过网页前端直接调内部接口，&lt;strong&gt;极可能违反 OpenAI / Prism 服务条款&lt;/strong&gt;，存在限流或封号风险。本文仅作技术记录，不构成使用建议。若你只是想要能调 GPT 类模型的 API，直接用官方 API——自建这套的运维成本远高于那点费用。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一-先读完这节否则会白忙两小时"&gt;一、⚠️ 先读完这节，否则会白忙两小时&#10;&lt;/h2&gt;&lt;p&gt;有个问题普通教程不会写，但它直接决定这件事在 VPS 上成不成。&lt;/p&gt;&#10;&lt;h3 id="11-cookie-里含-cloudflare-令牌且与-ip-绑定"&gt;1.1 Cookie 里含 Cloudflare 令牌，且与 IP 绑定&#10;&lt;/h3&gt;&lt;p&gt;从 DevTools 复制的请求头里，Cookie 包含这四个关键项：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Cookie&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;prism_session_token&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Prism 会话 JWT&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;prism_oai_access_token&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;auth.openai.com 签发的 OAuth token&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;__cf_bm&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Cloudflare Bot Management&lt;/strong&gt; 令牌&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cf_clearance&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Cloudflare 挑战通过&lt;/strong&gt;凭证&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;后两个是 Cloudflare 用来标识&amp;quot;这是通过人机验证的真实浏览器&amp;quot;的令牌，&lt;strong&gt;通常与来源 IP、User-Agent、TLS 指纹绑定&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;结论很直接：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;你在家里浏览器抓到的 Cookie，搬到 VPS 的机房 IP 上去用，大概率直接 403。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;表现为心跳失败，或提交时返回 &lt;code&gt;upstream_forbidden&lt;/code&gt; / &lt;code&gt;upstream_unauthorized&lt;/code&gt;。此外项目还要求一个 &lt;code&gt;x-crixet-sandbox-token&lt;/code&gt; 用于 heartbeat（&lt;code&gt;/s/sandboxes/proxy/heartbeat&lt;/code&gt;），这个沙箱是网页端拉起的运行时，&lt;strong&gt;能否从异地 IP 维持心跳，项目方自己也没验证过&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="12-作者自己承认真实请求从未跑过"&gt;1.2 作者自己承认：真实请求从未跑过&#10;&lt;/h3&gt;&lt;p&gt;项目 &lt;code&gt;docs/validation/direct-http-0.2.0rc1.md&lt;/code&gt; 原文：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Live Prism: NOT_RUN; fresh local credential capture still required.&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;那些&amp;quot;91 passed / 103 passed&amp;quot;全是&lt;strong&gt;离线合同测试 + mock 测试 + 本机回环测试&lt;/strong&gt;。主 transport &lt;code&gt;PrismWebTransport&lt;/code&gt; 的 &lt;code&gt;submit_task&lt;/code&gt; 直接 &lt;code&gt;raise RuntimeError&lt;/code&gt;，整个模块标注为 &lt;code&gt;unverified scaffold&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="13-可行性速查"&gt;1.3 可行性速查&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;可行性&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;在抓包那台机器本机上跑&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;相对最可行，仍需自行验证&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;抓包后几分钟内、同网络出口&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;有可能&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;跨网络搬到 VPS 长期跑&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;很低，且不保证稳定&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;做生产级 API&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不可能&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;下面每一步都标了验证点，让你尽早知道成不成，而不是装完两小时才发现白搭。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二环境准备"&gt;二、环境准备&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;要求&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Linux&lt;/strong&gt;。源码硬编码 &lt;code&gt;os.name != 'posix'&lt;/code&gt; 直接抛 &lt;code&gt;platform_unsupported&lt;/code&gt;，Windows 不支持运行目录锁&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Python&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;≥ 3.12&lt;/strong&gt;（&lt;code&gt;pyproject.toml&lt;/code&gt; 写 &lt;code&gt;&amp;gt;=3.11&lt;/code&gt;，但 standalone wheel 要 3.12+，建议直接上 3.12）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;内存&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512 MB 足够&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;网络&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;能直连 &lt;code&gt;prism.openai.com&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;推荐 Ubuntu 24.04 LTS&lt;/strong&gt;（自带 Python 3.12）。若是 22.04（自带 3.10），需加 deadsnakes：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install -y software-properties-common&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository -y ppa:deadsnakes/ppa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y python3.12 python3.12-venv python3.12-dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装其余依赖：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y git python3-pip ufw&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="创建专用低权限用户"&gt;创建专用低权限用户&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;别用 root 跑&lt;/strong&gt;——这程序持有你的账号凭据。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo useradd -r -m -s /bin/bash prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo passwd -l prism &lt;span style="color:#75715e"&gt;# 锁密码，防止直接登录&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="三安装"&gt;三、安装&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -iu prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/Robinfxa/prism2api.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;供应链提示&lt;/strong&gt;：该仓库创建仅数天、单作者、无 release、无 CI。建议&lt;strong&gt;锁定到具体 commit&lt;/strong&gt; 而不是跟 main：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline -5 &lt;span style="color:#75715e"&gt;# 先审一遍历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout &amp;lt;你审阅过的 SHA&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;建虚拟环境并安装：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python3.12 -m venv .venv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m pip install --upgrade pip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m pip install -e &lt;span style="color:#e6db74"&gt;&amp;#39;.[dev]&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;依赖只有四个主流包：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;pydantic&amp;gt;=2.10,&amp;lt;3&#10;fastapi&amp;gt;=0.115,&amp;lt;1&#10;httpx&amp;gt;=0.27,&amp;lt;1&#10;uvicorn&amp;gt;=0.30,&amp;lt;1&#10;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;走 Direct HTTP 路径&lt;strong&gt;不需要&lt;/strong&gt; &lt;code&gt;[browser]&lt;/code&gt; 里的 playwright，那是已废弃的浏览器实验路径。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;自检：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m pytest -q&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;应看到子命令：&lt;code&gt;import-curl&lt;/code&gt; / &lt;code&gt;serve-http&lt;/code&gt; / &lt;code&gt;probe-http&lt;/code&gt; / &lt;code&gt;doctor-http&lt;/code&gt; / &lt;code&gt;smoke-http&lt;/code&gt; / &lt;code&gt;reconcile-http&lt;/code&gt; / &lt;code&gt;run-status&lt;/code&gt; / &lt;code&gt;acknowledge-run&lt;/code&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四获取并导入凭据最关键也最危险"&gt;四、获取并导入凭据（最关键、也最危险）&#10;&lt;/h2&gt;&lt;h3 id="41-本地浏览器操作"&gt;4.1 本地浏览器操作&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;用&lt;strong&gt;本人账号&lt;/strong&gt;登录 prism.openai.com&lt;/li&gt;&#10;&lt;li&gt;打开一个能正常工作的项目，&lt;strong&gt;先让它完整回答一条简单问题&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;DevTools → Network，找到那条 &lt;code&gt;response_with_tools_start&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;右键 → &lt;strong&gt;Copy as cURL (bash)&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ 必须选 &lt;strong&gt;bash&lt;/strong&gt; 格式。程序只解析 bash 的 &lt;code&gt;$'...'&lt;/code&gt; 引号语法，zsh / cmd 会解析失败。&lt;/p&gt;&#10;&lt;p&gt;⚠️ &lt;strong&gt;不要把这段内容贴进任何聊天窗口、GitHub issue 或命令行参数&lt;/strong&gt;——它等价于账号密码。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="42-传到-vps"&gt;4.2 传到 VPS&#10;&lt;/h3&gt;&lt;p&gt;在&lt;strong&gt;本地机器&lt;/strong&gt;上（不要经过网盘 / 聊天工具 / 任何中转）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; /tmp/prism.curl &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;lt;粘贴你复制的 cURL&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ae81ff"&gt;600&lt;/span&gt; /tmp/prism.curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scp -p /tmp/prism.curl prism@&amp;lt;你的VPS IP&amp;gt;:/home/prism/prism.curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到 VPS 上确认权限：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -iu prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod &lt;span style="color:#ae81ff"&gt;600&lt;/span&gt; ~/prism.curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -l ~/prism.curl &lt;span style="color:#75715e"&gt;# 必须是 -rw------- 且属主 prism&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;程序会强制校验：文件必须属当前用户、权限 &lt;code&gt;0600&lt;/code&gt;，不符直接拒绝。&lt;strong&gt;别想着绕过&lt;/strong&gt;，这是它的安全设计。&lt;/p&gt;&#10;&lt;h3 id="43-导入并立即销毁明文"&gt;4.3 导入并立即销毁明文&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct import-curl --file ~/prism.curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shred -u ~/prism.curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;导入成功写出：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;~/.prism2api/direct/bootstrap.json # 0600&#10;&lt;/code&gt;&lt;/pre&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;⚠️ &lt;strong&gt;这个文件不只是 Cookie。&lt;/strong&gt; 它保存完整 &lt;code&gt;metadata&lt;/code&gt;、&lt;code&gt;codex_listen_snapshot&lt;/code&gt;，以及&lt;strong&gt;原始请求的 system prompt 和历史上下文&lt;/strong&gt;。也就是说它同时是&lt;strong&gt;凭据&lt;/strong&gt;和&lt;strong&gt;你的私有项目内容&lt;/strong&gt;。&lt;strong&gt;绝不上传、不备份到网盘、不提交进 git。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;项目 &lt;code&gt;.gitignore&lt;/code&gt; 已排除 &lt;code&gt;bootstrap*.json&lt;/code&gt;、&lt;code&gt;gateway.key&lt;/code&gt;、&lt;code&gt;*.curl&lt;/code&gt;、&lt;code&gt;*.har&lt;/code&gt;——别手贱改它。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="44-导入失败的常见原因"&gt;4.4 导入失败的常见原因&#10;&lt;/h3&gt;&lt;p&gt;程序要求这一次请求&lt;strong&gt;同时&lt;/strong&gt;包含：Cookie、User-Agent、&lt;code&gt;project_id&lt;/code&gt; / &lt;code&gt;user_id&lt;/code&gt; / &lt;code&gt;conversation_id&lt;/code&gt;、sandbox URL 与 token、&lt;code&gt;codex_listen_snapshot&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;缺任一项报 &lt;code&gt;incomplete&lt;/code&gt;，&lt;strong&gt;程序不会用旧值补齐&lt;/strong&gt;（设计原则：宁可拒绝，不猜字段）。解决方式是回网页重新发一条请求、重新 Copy as cURL。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="五分级验证决定你要不要继续"&gt;五、分级验证（决定你要不要继续）&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;按顺序做，任何一步失败就停下来排查。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="51-纯本地格式检查不联网"&gt;5.1 纯本地格式检查（不联网）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct doctor-http --offline&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只验 &lt;code&gt;bootstrap.json&lt;/code&gt; 格式完整性。通过&lt;strong&gt;只代表文件格式对&lt;/strong&gt;，不代表能连通。&lt;/p&gt;&#10;&lt;h3 id="52-心跳第一次真正联网"&gt;5.2 心跳（第一次真正联网）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct doctor-http&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;code&gt;heartbeat: ok&lt;/code&gt; → 凭据至少还活着，继续&lt;/li&gt;&#10;&lt;li&gt;❌ &lt;code&gt;heartbeat_unavailable&lt;/code&gt; / &lt;code&gt;upstream_forbidden&lt;/code&gt; → &lt;strong&gt;大概率就是 §1.1 的 Cloudflare IP 绑定问题&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;即便心跳成功也不等于生成能成功。项目原文：&amp;ldquo;成功也不等于 generation 已验证&amp;rdquo;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="53-真实生成探针唯一可信判据"&gt;5.3 真实生成探针（唯一可信判据）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct probe-http &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --prompt &lt;span style="color:#e6db74"&gt;&amp;#39;Reply exactly: PRISM_HTTP_CHECK&amp;#39;&lt;/span&gt; --timeout &lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;判据非常明确：返回的 &lt;code&gt;result.text&lt;/code&gt; &lt;strong&gt;逐字等于&lt;/strong&gt; &lt;code&gt;PRISM_HTTP_CHECK&lt;/code&gt; 才算成功。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ 一致 → 你的环境确实能跑，继续部署&lt;/li&gt;&#10;&lt;li&gt;❌ 其他任何结果 → &lt;strong&gt;停&lt;/strong&gt;，&lt;strong&gt;不要循环发十条重试&lt;/strong&gt;，按 §8 排查&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;想再压一轮可以跑 &lt;code&gt;smoke-http --count 3&lt;/code&gt;，它会在首个失败就停止，未执行的项标记 &lt;code&gt;not_run&lt;/code&gt;，&lt;strong&gt;不会把单元测试或错误请求算成真实成功&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="六systemd-守护"&gt;六、systemd 守护&#10;&lt;/h2&gt;&lt;p&gt;确认 §5.3 真的通过后再配常驻。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tee /etc/systemd/system/prism2api.service &amp;gt;/dev/null &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Unit]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Description=prism2api direct-http gateway&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;After=network.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Service]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Type=simple&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;User=prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Group=prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;WorkingDirectory=/home/prism/prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Environment=HOME=/home/prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ExecStart=/home/prism/prism2api/.venv/bin/python -m prism2api.direct serve-http --port 8765 --timeout 180&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Restart=on-failure&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;RestartSec=5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;# --- 安全加固 ---&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;NoNewPrivileges=true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;PrivateTmp=true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ProtectSystem=strict&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ProtectHome=false&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ReadWritePaths=/home/prism/.prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ProtectKernelTunables=true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;ProtectControlGroups=true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;RestrictSUIDSGID=true&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[Install]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;WantedBy=multi-user.target&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl status prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;journalctl -u prism2api -f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;ProtectSystem=strict&lt;/code&gt; 把整个文件系统挂成只读，只通过 &lt;code&gt;ReadWritePaths&lt;/code&gt; 放开 journal 数据库目录。代码目录运行时只读即可。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="单进程锁"&gt;单进程锁&#10;&lt;/h3&gt;&lt;p&gt;程序用 &lt;code&gt;flock&lt;/code&gt; 保证&lt;strong&gt;同一 home 只允许一个进程&lt;/strong&gt;。若看到：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;runtime_busy: Another direct runtime or import is active in this home.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先停服务：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl stop prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pgrep -af prism2api &lt;span style="color:#75715e"&gt;# 确认无残留&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;每次重新 &lt;code&gt;import-curl&lt;/code&gt; 前必须先停服务&lt;/strong&gt;，否则导入会被锁拒绝。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="七安全加固不做完不要对外开放"&gt;七、安全加固（不做完不要对外开放）&#10;&lt;/h2&gt;&lt;h3 id="71-服务只绑回环"&gt;7.1 服务只绑回环&#10;&lt;/h3&gt;&lt;p&gt;程序&lt;strong&gt;默认只绑 &lt;code&gt;127.0.0.1&lt;/code&gt; 或 &lt;code&gt;::1&lt;/code&gt;&lt;/strong&gt;，且不提供 &lt;code&gt;--host 0.0.0.0&lt;/code&gt; 这类选项。&lt;strong&gt;不要想办法突破它。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ss -tlnp | grep &lt;span style="color:#ae81ff"&gt;8765&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 应看到 127.0.0.1:8765，不是 0.0.0.0:8765&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="72-防火墙只开-ssh"&gt;7.2 防火墙只开 SSH&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ufw default deny incoming&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ufw allow OpenSSH&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ufw enable&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;绝不要 &lt;code&gt;ufw allow 8765&lt;/code&gt;。&lt;/strong&gt; 这个接口一旦暴露公网，等于把你的 OpenAI 账号挂在网上任人调用。&lt;/p&gt;&#10;&lt;h3 id="73-用-ssh-隧道访问"&gt;7.3 用 SSH 隧道访问&#10;&lt;/h3&gt;&lt;p&gt;在你&lt;strong&gt;自己电脑&lt;/strong&gt;上：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh -N -L 8765:127.0.0.1:8765 prism@&amp;lt;你的VPS IP&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;想长期用，写进 &lt;code&gt;~/.ssh/config&lt;/code&gt;：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Host prism-vps&#10; HostName &amp;lt;你的VPS IP&amp;gt;&#10; User prism&#10; LocalForward 8765 127.0.0.1:8765&#10; ServerAliveInterval 60&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;之后 &lt;code&gt;ssh -N prism-vps&lt;/code&gt; 即可。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;项目文档说&amp;quot;不可公网暴露或通过 tunnel 转发&amp;quot;——指的是 frp / ngrok 这类&lt;strong&gt;公网&lt;/strong&gt;穿透。SSH 本地端口转发不在此列，是安全的。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="74-本地调用密钥"&gt;7.4 本地调用密钥&#10;&lt;/h3&gt;&lt;p&gt;服务启动生成 &lt;code&gt;~/.prism2api/direct/gateway.key&lt;/code&gt;（0600），除 &lt;code&gt;/healthz&lt;/code&gt; 外所有接口都要带：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -iu prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat ~/.prism2api/direct/gateway.key&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="八调用示例"&gt;八、调用示例&#10;&lt;/h2&gt;&lt;h3 id="健康检查无需鉴权"&gt;健康检查（无需鉴权）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl http://127.0.0.1:8765/healthz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="curl-调用"&gt;curl 调用&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;KEY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;sudo -iu prism cat /home/prism/.prism2api/direct/gateway.key&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl http://127.0.0.1:8765/v1/chat/completions &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;$KEY&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Idempotency-Key: req-001&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -d &lt;span style="color:#e6db74"&gt;&amp;#39;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;model&amp;#34;: &amp;#34;prism-default&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;用中文解释强化学习。&amp;#34;}]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="python-调用"&gt;Python 调用&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; pathlib &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Path&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; httpx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Path(&lt;span style="color:#e6db74"&gt;&amp;#39;/home/prism/.prism2api/direct/gateway.key&amp;#39;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read_text()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; httpx&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Client(trust_env&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;, timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;190&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; client:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; client&lt;span style="color:#f92672"&gt;.&lt;/span&gt;post(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;http://127.0.0.1:8765/v1/chat/completions&amp;#39;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;Bearer &amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; key,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Idempotency-Key&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;my-request-001&amp;#39;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; json&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;model&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;prism-default&amp;#39;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;messages&amp;#39;&lt;/span&gt;: [{&lt;span style="color:#e6db74"&gt;&amp;#39;role&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;用中文解释强化学习。&amp;#39;&lt;/span&gt;}],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r&lt;span style="color:#f92672"&gt;.&lt;/span&gt;raise_for_status()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(r&lt;span style="color:#f92672"&gt;.&lt;/span&gt;json()[&lt;span style="color:#e6db74"&gt;&amp;#39;choices&amp;#39;&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;][&lt;span style="color:#e6db74"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;][&lt;span style="color:#e6db74"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;])&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="接口清单与限制"&gt;接口清单与限制&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;接口&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;GET /healthz&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;配置/忙闲状态，不含凭据&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;GET /v1/models&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;只返回本地别名 &lt;code&gt;prism-default&lt;/code&gt;，&lt;strong&gt;不是模型身份确认&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;POST /v1/chat/completions&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单条 user 文本、非流式、&lt;code&gt;n=1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;GET /v1/runs/{run_id}&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查本地任务状态与调用计数&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;会被明确拒绝&lt;/strong&gt;（不静默丢弃）：多条 &lt;code&gt;messages&lt;/code&gt;、&lt;code&gt;tools&lt;/code&gt;、&lt;code&gt;system&lt;/code&gt; / &lt;code&gt;developer&lt;/code&gt; role、&lt;code&gt;stream: true&lt;/code&gt;、任何未支持的额外参数。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;并发&lt;/strong&gt;：固定项目/会话共享上游上下文，&lt;strong&gt;同一时刻只允许一条任务&lt;/strong&gt;，忙时返回 &lt;code&gt;409&lt;/code&gt;，不排队。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="九故障排查"&gt;九、故障排查&#10;&lt;/h2&gt;&lt;h3 id="91-错误码对照"&gt;9.1 错误码对照&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;错误码&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;处理&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;upstream_unauthorized&lt;/code&gt; / &lt;code&gt;sandbox_unauthorized&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上游或 sandbox 拒绝&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;凭据过期/不匹配。回网页确认能正常回答，重新 Copy as cURL&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;sandbox_not_ready&lt;/code&gt; / &lt;code&gt;sandbox_sync_timeout&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;远端明确失败&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;程序不会自动重试提交，需人工处理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;uncertain&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可能已发出 start，结果不明&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;该目录会阻止下一次生成，重启也不清除&lt;/strong&gt;，见 9.2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;busy&lt;/code&gt; (409)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;已有请求在进行&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;等待或串行化调用&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;runtime_busy&lt;/code&gt; (409)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;同 home 已有进程&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;systemctl stop&lt;/code&gt; 后重试&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="92-处理-uncertain务必按规矩来"&gt;9.2 处理 &lt;code&gt;uncertain&lt;/code&gt;（务必按规矩来）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl stop prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 只查询，不重新提交&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct run-status --run run_...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct reconcile-http --run run_...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只有&lt;strong&gt;人工在网页上确认原任务已停止&lt;/strong&gt;后，才可执行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.venv/bin/python -m prism2api.direct acknowledge-run --run run_... --remote-stopped&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会留下 &lt;code&gt;abandoned / operator_confirmed_remote_stopped&lt;/code&gt; 的人工记录。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;❌ &lt;strong&gt;严禁&lt;/strong&gt;：为继续测试随手加 &lt;code&gt;--remote-stopped&lt;/code&gt;；或删库、换 home 目录绕过闸门。程序这么设计就是防重复提交与资源泄漏。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="93-凭据失效"&gt;9.3 凭据失效&#10;&lt;/h3&gt;&lt;p&gt;Cookie 会过期，&lt;strong&gt;没有自动刷新机制&lt;/strong&gt;。表现是突然全部 &lt;code&gt;upstream_unauthorized&lt;/code&gt;。处理：停服务 → 重抓 → 重新 import-curl → 启服务。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十卸载与善后"&gt;十、卸载与善后&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl stop prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl disable prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo rm /etc/systemd/system/prism2api.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -iu prism&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -rf ~/prism2api ~/.prism2api&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;若凭据有任何泄漏嫌疑&lt;/strong&gt;，立即：在 OpenAI / Prism 网页端登出所有会话 → 改密码 → 查账号活动记录。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十一客观评价"&gt;十一、客观评价&#10;&lt;/h2&gt;&lt;p&gt;跑完全流程，我的看法是：&lt;strong&gt;代码质量明显高于同类逆向项目，但它依然不是值得投入的东西。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="值得肯定的工程细节"&gt;值得肯定的工程细节&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;secure.py&lt;/code&gt; 用 &lt;code&gt;O_NOFOLLOW&lt;/code&gt; 防符号链接劫持、&lt;code&gt;flock&lt;/code&gt; 防双写、&lt;code&gt;O_EXCL + fsync&lt;/code&gt; 原子写、强制 &lt;code&gt;0600&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;拒绝把私有状态放在 Git 目录内（&lt;code&gt;runtime_in_repository&lt;/code&gt;）&lt;/li&gt;&#10;&lt;li&gt;强制 &lt;code&gt;follow_redirects=False&lt;/code&gt;，源码注释点明理由：&lt;em&gt;防止导入的 URL 重定向导致 Cookie 外泄&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;主动丢弃 hop-by-hop 头部（&lt;code&gt;host&lt;/code&gt; / &lt;code&gt;content-length&lt;/code&gt; / &lt;code&gt;connection&lt;/code&gt; 等），避免请求走私&lt;/li&gt;&#10;&lt;li&gt;未知结局进 &lt;code&gt;uncertain&lt;/code&gt; 并阻断新生成，&lt;strong&gt;而不是偷偷重试&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;全仓无 &lt;code&gt;subprocess&lt;/code&gt; / &lt;code&gt;eval&lt;/code&gt; / 遥测 / 外发通道；依赖只有 4 个主流包&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="但结构性问题是工程水平解决不了的"&gt;但结构性问题是工程水平解决不了的&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;跨网络凭据基本不可移植&lt;/strong&gt;（Cloudflare 令牌 IP 绑定）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;真实链路从未验证&lt;/strong&gt;（作者自承 &lt;code&gt;NOT_RUN&lt;/code&gt;）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;违反服务条款&lt;/strong&gt;，封号风险自担&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;单人、数天历史、0 release、无 CI&lt;/strong&gt;，随时可能烂尾或被强推恶意提交&lt;/li&gt;&#10;&lt;li&gt;需周期性手动重抓 Cookie，&lt;strong&gt;无法长期无人值守&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="建议"&gt;建议&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;你的目的&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;建议&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想要能用的 GPT API&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用官方 API，别折腾&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想学协议逆向 / 本地网关安全工程&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;值得&lt;strong&gt;读源码&lt;/strong&gt;（&lt;code&gt;secure.py&lt;/code&gt;、&lt;code&gt;bootstrap.py&lt;/code&gt;、&lt;code&gt;engine.py&lt;/code&gt;），不必真跑&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想省钱绕过额度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;别，封号代价更高&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;纯好奇想试试&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用一次性账号，隔离环境，用完即弃&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;em&gt;项目状态截至 2026-10-01。若上游接口或仓库有更新，请以仓库 README 与 &lt;code&gt;docs/guides/direct-http.md&lt;/code&gt; 为准。&lt;/em&gt;&lt;/p&gt;&#10;</description></item></channel></rss>