magpie-gemini-web 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/index.mjs +7 -1
- package/package.json +1 -1
- package/patches/argon.patch +1518 -57
- package/scripts/backend-argon.mjs +1 -1
package/README.md
CHANGED
|
@@ -93,6 +93,10 @@ http://127.0.0.1:8083/admin
|
|
|
93
93
|
- **Gemini Web backend API key**:填入 `secrets.json` 中的 `apiKey`。
|
|
94
94
|
- **Backend OpenAI base URL**:留空使用默认的 `http://127.0.0.1:8083/v1`,或填入其他自定义本地/代理地址。
|
|
95
95
|
|
|
96
|
+
> 重新登录(例如更换 API key 或 base URL)后,正在运行的 Magpie 不会重新读取 provider 地址,需要执行 `magpie plugin off magpie-gemini-web && magpie plugin on magpie-gemini-web` 或重启 Magpie App 才会生效。
|
|
97
|
+
>
|
|
98
|
+
> 0.1.0 登录时若留空 base URL,会把空字符串存进登录信息;0.1.1 起改为存入补全后的默认地址。若遇到网关返回 502「Gemini Web has no endpoint configured」([#3](https://github.com/BUKOWSKIREAL/magpie-gemini-web/issues/3)),升级后重新登录一次,或登录时显式填写 `http://127.0.0.1:8083/v1`。
|
|
99
|
+
|
|
96
100
|
3. **配置插件选项(开启工具或图片支持)**:
|
|
97
101
|
插件默认关闭工具调用与图片输入以确保安全和兼容性。若 Coding Agent(如 Claude Code / OpenCode / Cursor)需要使用工具调用,**必须显式开启 `allowTools`**,否则发送工具请求时将被插件直接返回 400 拦截:
|
|
98
102
|
|
|
@@ -129,8 +133,14 @@ http://127.0.0.1:8083/admin
|
|
|
129
133
|
### 5.1 架构与协议保护机制
|
|
130
134
|
- **模型标识**:`gemini-4-argon`(固定 HexID `95a4c0abcba24364`,Mode 8,仅支持 low thinking 基础档位)。
|
|
131
135
|
- **账号权限要求**:必须在后端管理面板配置拥有 Argon 访问权限的 Google 登录 Cookie;无 Cookie 或未获授权的账号无法使用该模型(未配 Cookie 时后端自动隐藏)。
|
|
132
|
-
- **结构化元数据校验**:由于 Google Web 存在对未授权模型静默降级的问题,后端在底层响应解析层(`argon.go`)对 Argon 请求实行严格的结构化元数据身份校验(解析 `wrb.fr` payload 中的模型 hex
|
|
136
|
+
- **结构化元数据校验**:由于 Google Web 存在对未授权模型静默降级的问题,后端在底层响应解析层(`argon.go`)对 Argon 请求实行严格的结构化元数据身份校验(解析 `wrb.fr` payload 中的模型 hex 与显示名,而非依赖模型自述文本)。流式请求逐帧校验:确认 Argon 身份之前的帧先暂存、不发给客户端,确认后放行并继续增量转发(实测身份与首段正文同帧到达)。身份缺失或首次出现即不符时请求报错,不发送任何未验证内容;若放行之后上游又报告了其他模型,后端立即停止读取并发送流错误,但已发出的内容无法撤回。非流式请求仍完整读取后再校验。
|
|
133
137
|
- **协议验证状态**:已通过真实 Magpie 网关验证普通对话和 SSE;后端记录的实际模型均为 `4 Argon`。首轮工具调用名称与参数正确,第二轮含正确测试值但附带额外说明,不代表工具兼容性已完全解决。本地验收记录不随公开仓库或 npm 包分发。
|
|
138
|
+
- **`4.21.0-argon.2` 延迟优化**(2026-10-14 直连后端实测,单次样本、上游波动大,仅供参考):
|
|
139
|
+
- XSRF token 按账号身份缓存,不再因每次响应刷新 SIDCC 而失效,登录态请求的前置开销由约 0.9–1.3 秒降至约 10 毫秒;Cookie 轮转后在后台重取 token。
|
|
140
|
+
- Argon 流式首字约 5.4 秒(同次总耗时 9.8 秒),不再等待整段生成结束。
|
|
141
|
+
- 工具调用块闭合且函数名有效时即结束读取上游并返回 `tool_calls`,Argon 首轮工具调用约 6.1 秒。
|
|
142
|
+
- 超过 `max_prompt_bytes` 的请求转附件时,工具定义(紧凑 JSON)与末尾格式提醒保留在正文,附件只含对话历史;158KB 带工具请求实测可正确发起工具调用并回传结果。
|
|
143
|
+
- 客户端断开或超时后,后端中止上游读取、上传与重试等待,并在请求记录中记为 499。
|
|
134
144
|
|
|
135
145
|
### 5.2 本地构建与安装步骤 (macOS arm64)
|
|
136
146
|
|
|
@@ -147,7 +157,7 @@ git -C backend-source apply ../patches/argon.patch
|
|
|
147
157
|
```bash
|
|
148
158
|
npm run backend:build:argon
|
|
149
159
|
```
|
|
150
|
-
该命令将在 `backend-source/` 目录执行 Go 编译,并在 `backend-build/` 生成校验清单 `manifest.json` 与二进制(版本 `4.21.0-argon.
|
|
160
|
+
该命令将在 `backend-source/` 目录执行 Go 编译,并在 `backend-build/` 生成校验清单 `manifest.json` 与二进制(版本 `4.21.0-argon.2`)。
|
|
151
161
|
|
|
152
162
|
2. **安装到本地数据目录**:
|
|
153
163
|
```bash
|
|
@@ -168,7 +178,7 @@ git -C backend-source apply ../patches/argon.patch
|
|
|
168
178
|
|
|
169
179
|
1. **实验性工具调用(Prompt Emulation)**:
|
|
170
180
|
- Gemini 网页版无原生 OpenAI 格式 Function Calling 协议,上游通过系统提示词模拟实现。
|
|
171
|
-
-
|
|
181
|
+
- 工具调用块需要完整解析后才以 `tool_calls` 返回(块外正文仍实时流式输出),准确度受模型指令遵循能力影响;实测 Flash 系列经常拒绝调用模拟工具。
|
|
172
182
|
- 默认配置下(`allowTools: false`),若请求包含 `tools` 或 `functions`,插件会直接拒绝并返回 400 提示,绝不静默剥离工具参数。
|
|
173
183
|
2. **媒体输入类型限制**:
|
|
174
184
|
- 即使开启 `allowImages: true`,插件也仅允许 `text` 与包含有效 URL 的 `image_url`,其他媒体类型(如 `input_audio` 等)将被严格拒绝。
|
package/index.mjs
CHANGED
|
@@ -28,7 +28,13 @@ export const GeminiWebPlugin = async (_input, options = {}) => {
|
|
|
28
28
|
return e.message;
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
}]
|
|
31
|
+
}],
|
|
32
|
+
// Magpie stores raw prompt inputs as metadata unless authorize returns its own;
|
|
33
|
+
// write the resolved URL so a blank answer doesn't persist as baseURL: "".
|
|
34
|
+
authorize: async inputs => ({
|
|
35
|
+
type: 'success',
|
|
36
|
+
metadata: { baseURL: normalizeBaseURL(inputs?.baseURL || opts.baseURL) }
|
|
37
|
+
})
|
|
32
38
|
}],
|
|
33
39
|
async loader(getAuth) {
|
|
34
40
|
const auth = await getAuth();
|