<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Chat Completions on lategege 的技术博客</title><link>https://lategege.com/tags/chat-completions/</link><description>Recent content in Chat Completions on lategege 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 31 Jul 2026 09:45:00 +0800</lastBuildDate><atom:link href="https://lategege.com/tags/chat-completions/index.xml" rel="self" type="application/rss+xml"/><item><title>Android Studio 原生 Agent 接第三方 Provider：Gemini 反代不兼容，以及我写的 AS API Bridge</title><link>https://lategege.com/p/android-studio-agent-third-party-provider-bridge/</link><pubDate>Fri, 31 Jul 2026 09:45:00 +0800</pubDate><guid>https://lategege.com/p/android-studio-agent-third-party-provider-bridge/</guid><description>&lt;p&gt;Android Studio 把原生 Agent 能力做进来之后，很多人第一反应都是：能不能接自己的第三方 Provider？&lt;/p&gt;
&lt;p&gt;能配。但真用起来，尤其是走「反重力 / CPA 一类反代」去打 Gemini 模型时，协议对不上的问题会很烦人。我后来干脆写了个本地桥接插件：&lt;a class="link" href="https://github.com/lategege/as-api-bridge-plugin" target="_blank" rel="noopener"
 &gt;as-api-bridge-plugin&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;这篇文章把坑和做法讲清楚。&lt;/p&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;Android Studio 新版 AI / Agent 侧，更偏向 &lt;strong&gt;OpenAI Responses API&lt;/strong&gt;（&lt;code&gt;/v1/responses&lt;/code&gt;）那一套。&lt;/p&gt;
&lt;p&gt;而市面上大量第三方网关、反代、OneAPI / NewAPI、以及很多 Gemini 兼容层，实际更稳的是 &lt;strong&gt;Chat Completions&lt;/strong&gt;（&lt;code&gt;/v1/chat/completions&lt;/code&gt;）流式协议。&lt;/p&gt;
&lt;p&gt;两边差的不只是路径名：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请求体结构不同&lt;/li&gt;
&lt;li&gt;流式 SSE 事件模型不同&lt;/li&gt;
&lt;li&gt;tool / function call 的表达不同&lt;/li&gt;
&lt;li&gt;有些上游对 JSON Schema 更挑，空 &lt;code&gt;enum&lt;/code&gt; 直接 400&lt;/li&gt;
&lt;li&gt;有些网关首帧 &lt;code&gt;content: null&lt;/code&gt;，Studio 界面会直接打出字面量 &lt;code&gt;null&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以你在 Studio 里配了第三方 Base URL 和 Key，不等于就能顺滑用。&lt;strong&gt;配置能通，协议不一定通。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="我碰到的具体场景"&gt;我碰到的具体场景
&lt;/h2&gt;&lt;p&gt;目标很简单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Android Studio 原生 Agent 继续用&lt;/li&gt;
&lt;li&gt;Provider 走第三方 / 自建网关&lt;/li&gt;
&lt;li&gt;上游实际是反代出来的 Gemini 模型&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;结果是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有的请求直接 400&lt;/li&gt;
&lt;li&gt;有的能出字，但流式体验差&lt;/li&gt;
&lt;li&gt;有的 tool call 直接炸&lt;/li&gt;
&lt;li&gt;有的首包把 &lt;code&gt;null&lt;/code&gt; 渲染到聊天区&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根因基本可以归成一句话：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Studio 按 Responses 说话，反代按 Chat 听；中间缺一层翻译。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="为什么反代-gemini更容易踩坑"&gt;为什么「反代 Gemini」更容易踩坑
&lt;/h2&gt;&lt;p&gt;反代本身没问题，问题在「兼容层」往往只做了最常见路径。&lt;/p&gt;
&lt;p&gt;很多反代 / 聚合网关优先保证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/v1/chat/completions&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;标准 &lt;code&gt;messages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;标准 &lt;code&gt;tool_calls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SSE &lt;code&gt;data: {choices:[{delta:...}]}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而 Android Studio Agent 侧更像在走：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/v1/responses&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;另一套 input / output item&lt;/li&gt;
&lt;li&gt;另一套 function_call 事件流&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gemini 这条线再叠一层：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;schema 校验更严&lt;/li&gt;
&lt;li&gt;空 &lt;code&gt;enum: []&lt;/code&gt;、空 &lt;code&gt;required&lt;/code&gt; 更容易被拒&lt;/li&gt;
&lt;li&gt;流式首帧行为不一定按 OpenAI 官方习惯来&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是就出现一种很典型的状态：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Postman 测 Chat 接口正常&lt;/li&gt;
&lt;li&gt;Studio Agent 一开就不正常&lt;/li&gt;
&lt;li&gt;你以为是 Key 或模型名错了，其实是协议形态不对&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="我的解法本地桥不改上游不改模型名"&gt;我的解法：本地桥，不改上游、不改模型名
&lt;/h2&gt;&lt;p&gt;插件名字叫 &lt;strong&gt;AS API Bridge&lt;/strong&gt;，仓库在：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/lategege/as-api-bridge-plugin" target="_blank" rel="noopener"
 &gt;https://github.com/lategege/as-api-bridge-plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;思路很直接：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Android Studio Agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | /v1/responses (SSE)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS API Bridge (127.0.0.1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | /v1/chat/completions (stream=true)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第三方网关 / 反重力反代 / OneAPI / NewAPI / Gemini 兼容层
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它干的事主要有五块：&lt;/p&gt;
&lt;h3 id="1-responses--chat-的实时流式转换"&gt;1. Responses → Chat 的实时流式转换
&lt;/h3&gt;&lt;p&gt;命中转换规则的模型：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;吃 Studio 的 &lt;code&gt;/v1/responses&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;转成上游 &lt;code&gt;/v1/chat/completions&lt;/code&gt;，并且强制真流式&lt;/li&gt;
&lt;li&gt;把上游 Chat SSE 再转回 Responses SSE 给 Studio&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重点是 &lt;strong&gt;流式管道&lt;/strong&gt;，不是等整段生成完再回包。这样首字延迟（TTFT）会好很多，打字机效果也正常。&lt;/p&gt;
&lt;h3 id="2-按模型规则决定转还是透传"&gt;2. 按模型规则决定「转」还是「透传」
&lt;/h3&gt;&lt;p&gt;不是所有模型都需要转换。&lt;/p&gt;
&lt;p&gt;你可以配通配规则，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gemini*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude-3-5*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpt-4o
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;命中：走协议转换&lt;/li&gt;
&lt;li&gt;未命中：原样透传&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;模型名本身不改。这个很重要，避免网关侧按模型名做的路由被你手贱改坏。&lt;/p&gt;
&lt;h3 id="3-tool-calls-映射"&gt;3. Tool Calls 映射
&lt;/h3&gt;&lt;p&gt;Responses 里的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;function_call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function_call_output&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;会映射到 Chat 侧更常见的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tool_calls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;role: &amp;quot;tool&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agent 场景如果没有这层，工具调用基本用不舒服。&lt;/p&gt;
&lt;h3 id="4-json-schema-清洗"&gt;4. JSON Schema 清洗
&lt;/h3&gt;&lt;p&gt;针对 Gemini / 部分网关常见的 400：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;空 &lt;code&gt;enum: []&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;空 &lt;code&gt;required&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;一些不友好的 schema 边角&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请求发出去前先洗一遍，少踩无意义的 Bad Request。&lt;/p&gt;
&lt;h3 id="5-首帧-null-过滤"&gt;5. 首帧 &lt;code&gt;null&lt;/code&gt; 过滤
&lt;/h3&gt;&lt;p&gt;有些兼容网关第一帧会给：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;delta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;assistant&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Studio 如果直接当文本处理，聊天区就可能冒出字符串 &lt;code&gt;null&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;插件里对 &lt;code&gt;JSONObject.NULL&lt;/code&gt; 和 &lt;code&gt;&amp;quot;null&amp;quot;&lt;/code&gt; 做了过滤。这个修在 1.2.2。&lt;/p&gt;
&lt;h2 id="在-android-studio-里怎么配"&gt;在 Android Studio 里怎么配
&lt;/h2&gt;&lt;h3 id="安装插件"&gt;安装插件
&lt;/h3&gt;&lt;p&gt;目前按源码构建：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/lategege/as-api-bridge-plugin.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; as-api-bridge-plugin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./gradlew build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;产物大概在：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build/distributions/as-api-bridge-plugin-1.2.2.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;Plugins&lt;/code&gt; → 齿轮 → &lt;code&gt;Install Plugin from Disk...&lt;/code&gt; → 选 zip → 重启。&lt;/p&gt;
&lt;h3 id="插件设置"&gt;插件设置
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;Tools&lt;/code&gt; → &lt;code&gt;AS API Bridge&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;常见配置：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;项&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;例子&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Listen Port&lt;/td&gt;
 &lt;td&gt;本地监听端口&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;8088&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Upstream Base URL&lt;/td&gt;
 &lt;td&gt;上游网关地址&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http://127.0.0.1:3000/v1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API Key (Fallback)&lt;/td&gt;
 &lt;td&gt;客户端没带 Key 时兜底&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sk-xxx&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Need Protocol Conversion Models&lt;/td&gt;
 &lt;td&gt;哪些模型要转换&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gemini*&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Auto-start on IDE launch&lt;/td&gt;
 &lt;td&gt;启动 IDE 自动开桥&lt;/td&gt;
 &lt;td&gt;建议开&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;菜单里也可以手动：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Tools&lt;/code&gt; → &lt;code&gt;AS API Bridge&lt;/code&gt; → &lt;code&gt;Start Bridge&lt;/code&gt; / &lt;code&gt;Stop Bridge&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="studio-的-provider-指到本地桥"&gt;Studio 的 Provider 指到本地桥
&lt;/h3&gt;&lt;p&gt;关键点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android Studio 的自定义 Provider / Base URL，指到桥：&lt;code&gt;http://127.0.0.1:8088/v1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;桥的 Upstream，再指到你的反代 / 网关真实地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不要让 Studio 直连反代，然后指望反代同时完美兼容 Responses。把翻译放到本地，问题面更小，也更好排障。&lt;/p&gt;
&lt;h2 id="推荐的排障顺序"&gt;推荐的排障顺序
&lt;/h2&gt;&lt;p&gt;如果还是不通，按这个顺序查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;桥有没有起来&lt;/strong&gt;&lt;br&gt;
本地端口通不通，插件是否 Start 成功。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Studio 是不是打到了桥&lt;/strong&gt;&lt;br&gt;
Base URL 是否真的是 &lt;code&gt;127.0.0.1:端口&lt;/code&gt;，别还指着上游。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型名是否命中转换规则&lt;/strong&gt;&lt;br&gt;
Gemini 相关建议先写 &lt;code&gt;gemini*&lt;/code&gt;。不确定就临时用 &lt;code&gt;*&lt;/code&gt; 验证，确认后再收窄。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上游 Chat 接口本身是否健康&lt;/strong&gt;&lt;br&gt;
用同一 Key 直接打 &lt;code&gt;/v1/chat/completions&lt;/code&gt;。上游 Chat 都不稳，桥也救不了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;是不是 schema / tools 400&lt;/strong&gt;&lt;br&gt;
看返回体。若是空 enum 一类，确认你用的是带清洗逻辑的版本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;是不是首包 null&lt;/strong&gt;&lt;br&gt;
升级到 1.2.2+。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="这插件解决了什么没解决什么"&gt;这插件解决了什么，没解决什么
&lt;/h2&gt;&lt;h3 id="解决了"&gt;解决了
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Studio Responses 协议和常见 Chat 反代之间的主路径鸿沟&lt;/li&gt;
&lt;li&gt;Gemini 兼容层上的一部分 schema 拒识&lt;/li&gt;
&lt;li&gt;tool call 形态差异&lt;/li&gt;
&lt;li&gt;流式体验和首帧 null 显示问题&lt;/li&gt;
&lt;li&gt;「部分模型要转、部分模型要透传」的现实需求&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="没打算伪装成"&gt;没打算伪装成
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;官方完美兼容层&lt;/li&gt;
&lt;li&gt;所有 Provider 的万能适配器&lt;/li&gt;
&lt;li&gt;对任何非标反代都 100% 语义等价&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;协议翻译天然有损。尤其是 Responses 和 Chat 在工具调用、输出分片、usage 字段上并不一一镜像。目标是：&lt;strong&gt;让 Android Studio 原生 Agent 在第三方 Gemini 反代场景下能稳定工作&lt;/strong&gt;，不是证明两边协议数学上全等。&lt;/p&gt;
&lt;h2 id="为什么我选择做-ide-插件而不是外部-nginx"&gt;为什么我选择做 IDE 插件，而不是外部 nginx
&lt;/h2&gt;&lt;p&gt;也考虑过外部反代脚本。最后还是做成 Android Studio / IntelliJ 插件，原因很实际：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地环回，链路短&lt;/li&gt;
&lt;li&gt;跟 IDE 生命周期绑在一起，开关方便&lt;/li&gt;
&lt;li&gt;设置页直接改规则，不用另维一套服务&lt;/li&gt;
&lt;li&gt;鉴权可以优先透传 Studio 自己带的 Header&lt;/li&gt;
&lt;li&gt;出问题看日志和端口都在本机，心智负担小&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对个人开发者来说，这种「IDE 内一小桥」比再维护一个常驻转换服务更省事。&lt;/p&gt;
&lt;h2 id="使用上的一点建议"&gt;使用上的一点建议
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;先只转 Gemini&lt;/strong&gt;&lt;br&gt;
规则从 &lt;code&gt;gemini*&lt;/code&gt; 开始，别一上来 &lt;code&gt;*&lt;/code&gt; 全开，不好定位。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上游尽量选真正支持 stream 的 Chat 接口&lt;/strong&gt;&lt;br&gt;
桥可以转协议，不能把假流式变真流式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型名保持网关侧原名&lt;/strong&gt;&lt;br&gt;
桥的设计就是不改模型名，只改协议。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Agent 场景优先验证 tool call&lt;/strong&gt;&lt;br&gt;
纯聊天通了不算完，带工具的链路才是 Agent 真正会炸的地方。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;把桥当适配层，不当业务层&lt;/strong&gt;&lt;br&gt;
限流、计费、模型路由还是放上游网关。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="仓库和版本"&gt;仓库和版本
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;项目：&lt;a class="link" href="https://github.com/lategege/as-api-bridge-plugin" target="_blank" rel="noopener"
 &gt;lategege/as-api-bridge-plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;当前 README 对应版本：&lt;strong&gt;1.2.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;技术栈：Kotlin + IntelliJ Platform Plugin&lt;/li&gt;
&lt;li&gt;兼容基线：Android Studio / IntelliJ 2024.1+（&lt;code&gt;since-build 241&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你也在用 Android Studio 原生 Agent，又想接自己的第三方 Provider，尤其是 Gemini 反代，被 &lt;code&gt;/responses&lt;/code&gt; 和 &lt;code&gt;/chat/completions&lt;/code&gt; 来回抽，可以试试这层本地桥。&lt;/p&gt;
&lt;p&gt;有问题直接去仓库提 issue。我这篇更偏复盘和排障思路；安装细节以仓库 README 为准。&lt;/p&gt;</description></item></channel></rss>