Skip to content

Commit a195146

Browse files
committed
feat: v3.0.1 — 稳定性修复 + 智能缓存 + OOM 防护
🛡️ 崩溃防护: - 修复 augmentConfig.update() 重复写入导致窗口无限重载 - OOM 崩溃检测: 大模型加载崩溃后自动回退默认小模型 - 模型初始化改为后台异步, 不阻塞插件启动 - deactivate() 自动恢复场景不清除配置 ⚡ 性能优化: - 智能缓存检测: 已下载模型直接加载, 跳过下载流程 - 移除 BGE-Large (335MB) 和 E5-Base (278MB), 避免 OOM 🔧 Bug 修复: - 下载进度条直接 100% (transformers.js v3 状态名) - checkbox 设置不持久化 - embedding.enabled 错误阻止本地模型加载 - 新增 HuggingFace 镜像加速 / 下载取消 / 缓存损坏自动修复 🎨 UI: 侧边栏本地模型与远程 API 分区显示 + 取消下载按钮
1 parent b3ed428 commit a195146

11 files changed

Lines changed: 1390 additions & 156 deletions

File tree

package.json

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "augment-proxy-manager",
33
"displayName": "Augment Proxy Manager",
44
"description": "管理 Augment API 代理服务器,支持自定义 API 端点和多种 AI 供应商",
5-
"version": "2.1.5",
5+
"version": "3.0.1",
66
"publisher": "legna",
77
"repository": {
88
"type": "git",
@@ -317,6 +317,40 @@
317317
"type": "string",
318318
"default": "",
319319
"description": "自定义 Embedding 模型名称 (留空使用默认)"
320+
},
321+
"augmentProxy.embedding.localModel": {
322+
"type": "string",
323+
"default": "Xenova/all-MiniLM-L6-v2",
324+
"enum": [
325+
"Xenova/all-MiniLM-L6-v2",
326+
"Xenova/all-MiniLM-L12-v2",
327+
"Xenova/bge-small-en-v1.5",
328+
"Xenova/bge-base-en-v1.5",
329+
"Xenova/multilingual-e5-small"
330+
],
331+
"enumDescriptions": [
332+
"MiniLM-L6 (22MB, 384d) — 最小最快",
333+
"MiniLM-L12 (33MB, 384d) — 12层更准",
334+
"BGE-Small (33MB, 384d) — 代码搜索好",
335+
"BGE-Base (109MB, 768d) — 性价比最高 ⭐",
336+
"E5-Multi-Small (118MB, 384d) — 多语言"
337+
],
338+
"description": "本地 Embedding 模型选择 (不配置远程 API 时使用)"
339+
},
340+
"augmentProxy.embedding.mirror": {
341+
"type": "string",
342+
"default": "",
343+
"enum": [
344+
"",
345+
"https://hf-mirror.com/",
346+
"https://huggingface.co/"
347+
],
348+
"enumDescriptions": [
349+
"默认 (HuggingFace 官方)",
350+
"hf-mirror.com — 国内镜像,下载更快",
351+
"HuggingFace 官方"
352+
],
353+
"description": "HuggingFace 模型下载镜像 (国内用户建议选 hf-mirror.com)"
320354
}
321355
}
322356
}

readme.md

Lines changed: 135 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
零注入 · 零登录 · 零配置
1010

11-
[![Version](https://img.shields.io/badge/version-2.1.5-blue.svg)](https://github.com/LegnaOS/VSC-Augment-Proxy-Manager)
11+
[![Version](https://img.shields.io/badge/version-3.0.1-blue.svg)](https://github.com/LegnaOS/VSC-Augment-Proxy-Manager)
1212
[![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Windows%20%7C%20Linux-lightgrey.svg)]()
1313

1414
</div>
@@ -19,11 +19,9 @@
1919

2020
Augment Proxy Manager 运行一个本地 HTTP 代理服务器,拦截 Augment 扩展的 API 请求并转发到你选择的 AI 供应商。
2121

22-
**v1.9 引入零注入模式** — 无需修改代码、无需登录。代理利用 Augment 扩展内置的 API Token 模式,自动配置请求路由。
23-
2422
```
2523
Augment 扩展 → 本地代理 (:8765) → 你的 AI 供应商 API
26-
↑ 自动配置
24+
↑ 自动配置 ↑ Viking 上下文增强
2725
```
2826

2927
启动代理时,自动设置 `augment.advanced.completionURL` 指向本地代理,`augment.advanced.apiToken` 为占位 token。Augment 扩展检测到配置变更后,切换到 API Token 模式(绕过 OAuth),所有流量通过代理转发。停止代理时,自动清除配置,扩展恢复正常。
@@ -51,19 +49,52 @@ Augment 扩展 → 本地代理 (:8765) → 你的 AI 供应商 API
5149

5250
## 功能特性
5351

52+
### 🧠 v3.0 — 智能上下文引擎
53+
54+
- **Viking 分层上下文** — 借鉴 [OpenViking](https://github.com/volcengine/OpenViking) 的文件系统范式,L0 摘要 / L1 结构 / L2 全文三级按需加载,精准控制注入 token 量
55+
- **目录聚合 + 递归下钻** — 向量初筛 → 目录级聚合 → Top 目录递归下钻,用结构化信号弥补向量精度不足
56+
- **Session Memory** — 自动从对话中提取用户偏好(语言/框架/代码风格),LevelDB 持久化,跨会话长期记忆
57+
- **本地模型选择** — 侧边栏可视化选择 5 种本地 Embedding 模型(22MB ~ 118MB),支持运行时切换,下载进度实时显示
58+
- **远程 Embedding API** — 支持 GLM / OpenAI / 自定义远程 Embedding,远程失败自动回退本地
59+
- **HuggingFace 镜像加速** — 内置 hf-mirror.com 国内镜像,模型下载速度大幅提升
60+
- **下载取消 + 缓存自动修复** — 支持取消正在进行的模型下载;检测到缓存损坏自动清理并重新下载
61+
- **智能缓存检测** — 已下载的模型直接从本地加载,不重复检查下载
62+
- **OOM 崩溃防护** — 大模型加载导致 extension host 崩溃时,自动回退到默认小模型
63+
64+
### 🔌 代理核心
65+
5466
- **零注入绕过** — 自动配置 Augment 使用代理,无需修改任何代码
5567
- **流式响应** — 聊天、补全、指令全程实时 SSE 流式传输
5668
- **完整 Agent 模式** — 工具调用、文件编辑、代码库检索全部正常工作
57-
- **本地代码索引** — 内置 RAG 语义搜索索引,无需云端同步
58-
- **OMC 编排增强** — 集成 [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode),6 种编排模式 + 魔法关键词,可在侧边栏开关
59-
- **Embedding 配置** — 侧边栏可视化配置语义搜索的 Embedding 供应商 (GLM/OpenAI/自定义)
69+
- **配置热更新** — 切换供应商或模型无需重启代理,实时生效
70+
71+
### 🔍 RAG 语义搜索
72+
73+
- **本地代码索引** — 内置 RAG 语义搜索,无需云端同步
74+
- **5 种 Embedding 模型** — MiniLM / BGE / E5 系列,含多语言模型,侧边栏一键下载切换
75+
- **模型专属缓存** — 不同模型独立缓存文件,切换模型不丢失历史缓存
76+
77+
### ⚡ 增强功能
78+
79+
- **OMC 编排增强** — 集成 [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode),6 种编排模式 + 魔法关键词
6080
- **思考模式** — 支持 DeepSeek、MiniMax、GLM 的扩展思考 (Thinking)
61-
- **JSON Mode** — 支持 Kimi API 的结构化 JSON 输出模式
62-
- **联网搜索** — 支持 Kimi 内置的 `$web_search` 联网搜索功能
6381
- **Prompt 缓存** — 自动为支持的供应商注入 cache_control
6482
- **上下文压缩** — 基于 token 使用率的智能对话历史压缩
65-
- **配置热更新** — 切换供应商或模型无需重启代理,实时生效
66-
- **侧边栏控制面板** — 可视化界面管理供应商、API Key 和运行状态
83+
- **侧边栏控制面板** — 可视化界面管理全部配置和运行状态
84+
85+
## 本地 Embedding 模型
86+
87+
v3.0 支持在侧边栏选择并下载本地 Embedding 模型,无需配置远程 API 即可使用语义搜索:
88+
89+
| 模型 | 大小 | 维度 | 语言 | 说明 |
90+
|:-----|:-----|:-----|:-----|:-----|
91+
| MiniLM-L6 | 22MB | 384 | English | 最小最快,基础语义搜索 |
92+
| MiniLM-L12 | 33MB | 384 | English | 12 层,比 L6 更准 |
93+
| BGE-Small | 33MB | 384 | English | BAAI BGE 小模型,代码搜索效果好 |
94+
| **BGE-Base**| 109MB | 768 | English | 性价比最高,推荐 |
95+
| E5-Multi-Small | 118MB | 384 | 多语言 | 支持中/英/日/韩 |
96+
97+
模型基于 [Xenova/transformers.js](https://github.com/xenova/transformers.js) ONNX 格式,首次使用自动下载到本地缓存。
6798

6899
## 配置项
69100

@@ -76,17 +107,46 @@ Augment 扩展 → 本地代理 (:8765) → 你的 AI 供应商 API
76107
| `augmentProxy.{provider}.baseUrl` | *按供应商* | API 端点地址 |
77108
| `augmentProxy.{provider}.model` | *按供应商* | 模型名称 |
78109
| `augmentProxy.omc.enabled` | `false` | 启用 OMC 编排增强 |
79-
| `augmentProxy.omc.mode` | `team` | OMC 编排模式 (team/autopilot/ultrawork/ralph/ecomode/pipeline) |
80-
| `augmentProxy.embedding.enabled` | `false` | 启用语义搜索 Embedding |
81-
| `augmentProxy.embedding.provider` | `glm` | Embedding 供应商 (glm/openai/custom) |
110+
| `augmentProxy.omc.mode` | `team` | OMC 编排模式 |
111+
| `augmentProxy.embedding.localModel` | `Xenova/all-MiniLM-L6-v2` | 本地 Embedding 模型 |
112+
| `augmentProxy.embedding.enabled` | `false` | 启用远程 Embedding API |
113+
| `augmentProxy.embedding.provider` | `glm` | 远程 Embedding 供应商 |
114+
| `augmentProxy.embedding.mirror` | `""` | HuggingFace 下载镜像 (hf-mirror.com) |
82115

83116
各供应商的专属选项(思考模式、缓存等)在设置中 `augmentProxy.{provider}.*` 下配置。
84117

85118
API Key 安全存储在 VSCode 内置的 SecretStorage 中。
86119

87-
## 跨平台支持
120+
## 架构
88121

89-
支持所有主流 VSCode 变体的路径检测:
122+
```
123+
src/
124+
├── extension.ts # 扩展入口
125+
├── proxy.ts # HTTP 代理服务器 + 初始化
126+
├── messages.ts # Augment 协议解析 + System Prompt 注入
127+
├── sidebar.ts # 侧边栏 Webview UI
128+
├── config.ts # 供应商配置
129+
├── globals.ts # 全局状态 (Viking/SessionMemory/RAG/Embedding)
130+
├── context-manager.ts # 上下文管理
131+
├── context-compression.ts # 智能压缩
132+
├── injection.ts # Augment 扩展自动配置
133+
├── omc.ts # OMC 编排增强
134+
├── tools.ts # 工具调用处理
135+
├── providers/
136+
│ ├── anthropic.ts # Anthropic 流式转发
137+
│ ├── openai.ts # OpenAI 流式转发
138+
│ └── google.ts # Google Gemini 流式转发
139+
└── rag/
140+
├── index.ts # RAG 索引 + Viking 增强搜索
141+
├── embeddings.ts # Embedding 引擎 (本地 5 模型 + 远程 API)
142+
├── viking-context.ts # Viking L0/L1/L2 分层上下文
143+
├── session-memory.ts # Session Memory 长期记忆
144+
├── code-parser.ts # 代码解析器
145+
├── context-generator.ts # 上下文生成
146+
└── storage.ts # LevelDB 持久化存储
147+
```
148+
149+
## 跨平台支持
90150

91151
| 编辑器 | macOS / Linux | Windows |
92152
|:------|:-------------|:--------|
@@ -97,40 +157,72 @@ API Key 安全存储在 VSCode 内置的 SecretStorage 中。
97157

98158
## 更新日志
99159

160+
### v3.0.1 — 稳定性修复
161+
162+
**🛡️ 崩溃防护**
163+
- 修复 `augmentConfig.update()` 重复写入导致窗口无限重载的问题
164+
- 新增 OOM 崩溃检测:大模型加载导致 extension host 崩溃时,下次启动自动回退到默认小模型 (MiniLM-L6 22MB)
165+
- 模型初始化改为后台异步 (fire-and-forget),不再阻塞插件启动
166+
- `deactivate()` 在自动恢复场景下不再清除 Augment 配置
167+
168+
**⚡ 性能优化**
169+
- 智能缓存检测:已下载的模型直接从本地加载,跳过下载流程和进度回调
170+
- 移除两个过大的模型 (BGE-Large 335MB、E5-Base 278MB),避免 OOM 风险
171+
172+
**🔧 Bug 修复**
173+
- 修复下载进度条直接显示 100% 的问题 (transformers.js v3 状态名变更)
174+
- 修复 checkbox 设置 (OMC/远程 Embedding) 不持久化的问题
175+
- 修复 `embedding.enabled` 错误地阻止本地模型加载的问题 ("BM25 mode")
176+
- 新增 HuggingFace 镜像加速 (hf-mirror.com)
177+
- 新增下载取消功能
178+
- 新增缓存损坏自动检测清理并重新下载
179+
180+
**🎨 UI 改进**
181+
- 侧边栏重构:本地模型 (默认) 与远程 Embedding API (可选) 分区显示
182+
- 新增取消下载按钮
183+
184+
### v3.0.0 — 智能上下文引擎
185+
186+
**🧠 Viking 分层上下文系统**
187+
- 借鉴 [OpenViking](https://github.com/volcengine/OpenViking) 上下文数据库理念
188+
- L0 摘要 (~100 tokens) / L1 结构化 (~2K tokens) / L2 全文,三级按需加载
189+
- 向量初筛 → 目录聚合 → Top 目录递归下钻 → 结果合并加权
190+
- 用结构化文件系统信号弥补向量精度不足,对弱模型提升尤为显著
191+
192+
**📦 本地模型选择**
193+
- 侧边栏可视化选择 5 种本地 Embedding 模型 (22MB ~ 118MB)
194+
- 支持运行时一键切换模型,自动重新初始化
195+
- 下载进度条显示文件名和百分比
196+
- 模型专属缓存文件,切换不丢失历史数据
197+
- HuggingFace 镜像加速 (hf-mirror.com),国内下载速度大幅提升
198+
- 支持取消下载;缓存损坏自动检测清理并重新下载
199+
200+
**🧬 Session Memory 长期记忆**
201+
- 自动从用户消息中提取偏好(编程语言、框架、代码风格)
202+
- 记录 Agent 经验和教训
203+
- LevelDB 持久化,跨会话保持记忆
204+
- 自动注入 System Prompt,AI 具备长期记忆能力
205+
206+
**🌐 远程 Embedding API**
207+
- 支持 GLM embedding-3 / OpenAI text-embedding-3-small / 自定义 API
208+
- 远程 API 失败自动回退本地模型
209+
- 远程/本地独立缓存,维度不冲突
210+
100211
### v2.1.5
101-
- 🚀 **OMC 编排增强** — 集成 oh-my-claudecode,6 种编排模式 (Team/Autopilot/Ultrawork/Ralph/Ecomode/Pipeline)
102-
- 🔮 **魔法关键词** — 消息中输入 ultrawork/search/analyze/ultrathink 自动增强提示
103-
- 🧠 **Embedding 配置 UI** — 侧边栏可视化配置语义搜索供应商、API Key、自定义端点
104-
- 🔧 修复配置保存后状态丢失的 race condition (debounced sendFullStatus)
105-
- 🧹 清理无用的 release notes 文件
212+
- 🚀 **OMC 编排增强** — 集成 oh-my-claudecode,6 种编排模式
213+
- 🔮 **魔法关键词** — ultrawork/search/analyze/ultrathink 自动增强
214+
- 🧠 **Embedding 配置 UI** — 侧边栏可视化配置
215+
- 🔧 修复配置保存 race condition
106216

107217
### v2.1.4
108-
- 🛠️ **完整支持 `apply_patch` 工具** — 支持 Augment 的两种 patch 格式(diff 格式和完整文件替换)
109-
- 🤖 **GLM-5 支持** — 更新智谱 AI 默认模型为 `glm-5`
110-
- 🔧 修复 patch 解析器的 substring 逻辑,正确处理缩进
111-
- 🔧 自动检测 patch 格式,智能选择 `str-replace-editor``save-file`
112-
113-
### v2.1.3
114-
- 🌙 **Kimi Coding Plan 支持** — 支持月之暗面 Coding Plan API(需要特殊订阅)
115-
- 🔧 修复 Kimi API 端点配置
116-
- 🔧 完善 Anthropic 格式检测逻辑
218+
- 🛠️ 完整支持 `apply_patch` 工具
219+
- 🤖 GLM-5 支持
117220

118221
### v2.1.0
119-
- 🌙 **Kimi (月之暗面) 支持** — 新增 Kimi 标准 API 支持
120-
- 🔍 **JSON Mode** — 支持 Kimi 的结构化 JSON 输出
121-
- 🌐 **联网搜索** — 支持 Kimi 内置的 `$web_search` 功能
122-
123-
### v1.9.1
124-
- 🐛 修复模型选择器后显示 "noCanvas" 的问题
125-
- 🔄 切换供应商或模型后自动生效,无需重启代理
126-
- 📊 上下文压缩配置从 Google 专属移至全局,适用于所有供应商
127-
- 📊 上下文/Token 统计在侧边栏刷新后保持显示
222+
- 🌙 Kimi (月之暗面) 支持 + JSON Mode + 联网搜索
128223

129224
### v1.9.0
130-
- 🚀 零注入模式 — 自动配置 Augment 扩展
131-
- 🤖 完整 Agent 模式支持
132-
- 🔍 本地 RAG 语义搜索索引
133-
- 💬 思考模式 / Prompt 缓存 / 上下文压缩
225+
- 🚀 零注入模式 + 完整 Agent 模式 + RAG 语义搜索 + 上下文压缩
134226

135227
## 许可证
136228

src/extension.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,18 @@ export function activate(context: vscode.ExtensionContext) {
5252
}
5353

5454
export async function deactivate() {
55-
// 清除 Augment 扩展的自动配置,避免代理停止后扩展仍指向已关闭的代理
56-
try {
57-
const augmentConfig = vscode.workspace.getConfiguration('augment');
58-
const currentAdvanced = augmentConfig.get<any>('advanced', {}) || {};
59-
await augmentConfig.update('advanced', { ...currentAdvanced, apiToken: '', completionURL: '' }, vscode.ConfigurationTarget.Global);
60-
} catch {}
55+
// 只在代理不需要自动恢复时清除配置
56+
// 如果 proxyAutoStart = true,说明是 reloadWindow 触发的 deactivate,重载后会自动恢复代理,不能清配置
57+
const willAutoRestart = state.extensionContext?.globalState.get<boolean>('proxyAutoStart');
58+
if (!willAutoRestart) {
59+
try {
60+
const augmentConfig = vscode.workspace.getConfiguration('augment');
61+
const currentAdvanced = augmentConfig.get<any>('advanced', {}) || {};
62+
if (currentAdvanced.apiToken || currentAdvanced.completionURL) {
63+
await augmentConfig.update('advanced', { ...currentAdvanced, apiToken: '', completionURL: '' }, vscode.ConfigurationTarget.Global);
64+
}
65+
} catch {}
66+
}
6167
await closeRAGIndex();
6268
if (state.proxyServer) state.proxyServer.close();
6369
}

src/globals.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import * as vscode from 'vscode';
22
import * as http from 'http';
33
import { CurrentConfig } from './types';
4+
import type { VikingContextStore } from './rag/viking-context';
5+
import type { SessionMemory } from './rag/session-memory';
46

57
// ===== 全局共享状态 =====
68
// 所有模块通过 state 对象访问共享状态
7-
// 使用对象属性而非 export let,确保 CommonJS 下跨模块引用一致
89

910
export const state = {
1011
proxyServer: null as http.Server | null,
@@ -15,10 +16,12 @@ export const state = {
1516
ragIndex: null as any,
1617
semanticEngine: null as any,
1718

18-
// 会话级请求队列 - 防止同一会话并发请求冲突
19-
conversationQueues: new Map<string, Promise<void>>(),
19+
// v2.0.0: Viking 子系统
20+
vikingStore: null as VikingContextStore | null,
21+
sessionMemory: null as SessionMemory | null,
2022

21-
// 保存每个会话的原始用户消息(Augment 不在 chat_history 中保存 request_message)
23+
// 会话级请求队列
24+
conversationQueues: new Map<string, Promise<void>>(),
2225
conversationUserMessages: new Map<string, string>(),
2326

2427
// 当前配置
@@ -31,7 +34,6 @@ export const state = {
3134
enableCache: true,
3235
enableInterleavedThinking: true,
3336
enableThinking: true,
34-
// OMC defaults
3537
omcEnabled: false,
3638
omcMode: 'team',
3739
omcContinuationEnforcement: true,

src/messages.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,15 @@ Example bad behavior (DO NOT DO THIS):
128128
log(`[OMC] System prompt injected (mode: ${state.currentConfig.omcMode}, continuation: ${state.currentConfig.omcContinuationEnforcement})`);
129129
}
130130
}
131+
132+
// v2.0.0: Viking Session Memory 注入 — 从历史对话中学习到的用户偏好和 Agent 经验
133+
if (state.sessionMemory) {
134+
const memoryPrompt = state.sessionMemory.buildMemoryPrompt(500);
135+
if (memoryPrompt) {
136+
parts.push(`# Session Memory\n${memoryPrompt}`);
137+
}
138+
}
139+
131140
return parts.join('\n\n');
132141
}
133142

0 commit comments

Comments
 (0)