🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

AGY 智能体增强 flg1217/dsh-llm-agy

DeepSeek Harness
flg12175 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness 的 AGY(Antigravity 命令行)集成:LLM 适配器子代理、深度网络搜索、连通性诊断面板

39.2/100
综合分
6
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add flg1217/dsh-llm-agy
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · search
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@flg1217/dsh-llm-agy(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 03:44:28

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 90 处,展示前 90 条)
  • 写入剪贴板
    lib/types/client/index.d.ts:112
    try { await writeClipboard(cmd) } catch { }
  • 发起网络请求
    lib/types/client/index.d.ts:248
    const resp = await fetch('/api/llm-agy/models', { headers: { accept: 'application/json' } })
  • 写入剪贴板
    lib/client.js:112
    try { await writeClipboard(cmd) } catch { }
  • 发起网络请求
    lib/client.js:248
    const resp = await fetch('/api/llm-agy/models', { headers: { accept: 'application/json' } })
  • 执行外部命令固定命令
    lib/adapter.js:146
    spawn('taskkill', ['/PID', String(proc.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true })
  • 执行外部命令来自配置/变量
    lib/adapter.js:322
    const proc = spawn(this.options.command, [
  • 执行外部命令固定命令
    lib/adapter.js:740
    execFile('powershell.exe', ['-NoProfile', '-Command',
  • 执行外部命令来自配置/变量
    lib/search.js:45
    const r = spawnSync(this.options.command, ['--version'], { stdio: 'ignore', windowsHide: true });
  • 执行外部命令来自配置/变量
    lib/settings.js:16
    const r = spawnSync(command, ['--version'], { stdio: 'ignore', windowsHide: true });
  • 读取本地文件
    lib/settings.js:26
    if (!existsSync(base))
  • 读取本地文件
    lib/settings.js:30
    if (existsSync(conversations)) {
  • 读取本地文件
    lib/settings.js:32
    return readdirSync(conversations).length > 0;
  • 执行外部命令来自配置/变量
    lib/settings.js:41
    const proc = spawn(command, [
  • 执行外部命令来自配置/变量
    lib/settings.js:88
    const r = spawnSync(command, ['models'], { encoding: 'utf8', timeout: 15_000, windowsHide: true });
  • 写入本地文件
    lib/image-paste.js:77
    writeFileSync(tmp, stored.data);
  • 删除本地文件递归
    lib/image-paste.js:84
    rmSync(dir, { recursive: true, force: true });
  • 读取本地文件
    lib/read-image.js:99
    const stat = statSync(diskPath);
  • 读取本地文件
    lib/read-image.js:102
    const data = new Uint8Array(readFileSync(diskPath));
  • 写入本地文件
    lib/read-image.js:164
    writeFileSync(tmp, out.data);
  • 删除本地文件递归
    lib/read-image.js:169
    rmSync(dir, { recursive: true, force: true });
  • 读取本地文件
    lib/read-image.js:243
    if (!existsSync(diskPath) && !isAbsolute(diskPath)) {
  • 读取本地文件
    lib/read-image.js:245
    if (sessionCwd !== undefined && existsSync(join(sessionCwd, diskPath))) {
  • 读取本地文件
    lib/read-image.js:249
    if (existsSync(diskPath)) {
  • 执行外部命令来自配置/变量
    lib/models.js:39
    child = spawn(command, ['models'], {
  • 写入本地文件
    lib/serialize.js:112
    await writeFile(file, stored.data);
  • 写入本地文件
    lib/serialize.js:133
    await writeFile(file, prompt);
  • 删除本地文件
    lib/serialize.js:140
    await Promise.allSettled(tempFiles.map(p => unlink(p).catch(() => { })));
  • 读取本地文件
    lib/conversations.js:64
    const parsed = JSON.parse(readFileSync(this.file, 'utf8'));
  • 写入本地文件
    lib/conversations.js:97
    mkdirSync(dirname(this.file), { recursive: true });
  • 写入本地文件
    lib/conversations.js:99
    writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2));
  • 写入本地文件
    lib/conversations.js:100
    renameSync(tmp, this.file);
  • 执行外部命令来自配置/变量
    lib/agy-run.js:61
    const proc = spawn(command, [
  • 读取本地文件
    lib/tool-preview.js:57
    const stat = statSync(filePath);
  • 读取本地文件
    lib/tool-preview.js:60
    const data = new Uint8Array(readFileSync(filePath));
  • 读取本地文件
    lib/tool-preview.js:92
    const stat = statSync(filePath);
  • 读取本地文件
    lib/tool-preview.js:95
    return readFileSync(filePath, 'utf8');
  • 读取本地文件
    lib/tool-preview.js:191
    const stat = statSync(file);
  • 读取本地文件
    lib/agy-executor.js:86
    if (existsSync(file)) {
  • 读取本地文件
    lib/agy-executor.js:87
    const current = readFileSync(file, 'utf8');
  • 写入本地文件
    lib/agy-executor.js:91
    mkdirSync(dirname(file), { recursive: true });
  • 写入本地文件
    lib/agy-executor.js:92
    writeFileSync(file, EXECUTOR_AGENT_MD);
  • 读取本地文件
    lib/agy-executor.js:109
    raw = readFileSync(mcpConfigFile(), 'utf8');
  • 写入本地文件
    lib/agy-executor.js:137
    copyFileSync(file, `${file}.bak`);
  • 写入本地文件
    lib/agy-executor.js:150
    mkdirSync(dirname(file), { recursive: true });
  • 写入本地文件
    lib/agy-executor.js:151
    writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`);
  • 写入本地文件
    lib/agy-executor.js:177
    writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`);
  • 执行外部命令固定命令
    src/adapter.ts:215
    spawn('taskkill', ['/PID', String(proc.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true })
  • 执行外部命令来自配置/变量
    src/adapter.ts:478
    const proc = spawn(this.options.command, [
  • 执行外部命令固定命令
    src/adapter.ts:897
    execFile('powershell.exe', ['-NoProfile', '-Command',
  • 读取本地文件
    src/agy-executor.ts:93
    if (existsSync(file)) {
  • 读取本地文件
    src/agy-executor.ts:94
    const current = readFileSync(file, 'utf8')
  • 写入本地文件
    src/agy-executor.ts:97
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/agy-executor.ts:98
    writeFileSync(file, EXECUTOR_AGENT_MD)
  • 读取本地文件
    src/agy-executor.ts:115
    raw = readFileSync(mcpConfigFile(), 'utf8')
  • 写入本地文件
    src/agy-executor.ts:140
    try { copyFileSync(file, `${file}.bak`) } catch { }
  • 写入本地文件
    src/agy-executor.ts:150
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    src/agy-executor.ts:151
    writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`)
  • 写入本地文件
    src/agy-executor.ts:175
    writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`)
  • 执行外部命令来自配置/变量
    src/agy-run.ts:97
    const proc = spawn(command, [
  • 写入剪贴板
    src/client/index.js:112
    try { await writeClipboard(cmd) } catch { }
  • 发起网络请求
    src/client/index.js:248
    const resp = await fetch('/api/llm-agy/models', { headers: { accept: 'application/json' } })
  • 读取本地文件
    src/conversations.ts:83
    const parsed = JSON.parse(readFileSync(this.file, 'utf8')) as Record<string, Partial<AgyConversationRecord>>
  • 写入本地文件
    src/conversations.ts:114
    mkdirSync(dirname(this.file), { recursive: true })
  • 写入本地文件
    src/conversations.ts:116
    writeFileSync(tmp, JSON.stringify(Object.fromEntries(this.map), null, 2))
  • 写入本地文件
    src/conversations.ts:117
    renameSync(tmp, this.file)
  • 写入本地文件
    src/image-paste.ts:94
    writeFileSync(tmp, stored.data)
  • 删除本地文件递归
    src/image-paste.ts:99
    rmSync(dir, { recursive: true, force: true })
  • 执行外部命令来自配置/变量
    src/models.ts:50
    child = spawn(command, ['models'], {
  • 读取本地文件
    src/read-image.ts:134
    const stat = statSync(diskPath)
  • 读取本地文件
    src/read-image.ts:136
    const data = new Uint8Array(readFileSync(diskPath))
  • 写入本地文件
    src/read-image.ts:200
    writeFileSync(tmp, out.data)
  • 删除本地文件递归
    src/read-image.ts:204
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    src/read-image.ts:284
    if (!existsSync(diskPath) && !isAbsolute(diskPath)) {
  • 读取本地文件
    src/read-image.ts:288
    if (sessionCwd !== undefined && existsSync(join(sessionCwd, diskPath))) {
  • 读取本地文件
    src/read-image.ts:292
    if (existsSync(diskPath)) {
  • 执行外部命令来自配置/变量
    src/search.ts:60
    const r = spawnSync(this.options.command, ['--version'], { stdio: 'ignore', windowsHide: true })
  • 写入本地文件
    src/serialize.ts:136
    await writeFile(file, stored.data)
  • 写入本地文件
    src/serialize.ts:156
    await writeFile(file, prompt)
  • 删除本地文件
    src/serialize.ts:164
    await Promise.allSettled(tempFiles.map(p => unlink(p).catch(() => {})))
  • 执行外部命令来自配置/变量
    src/settings.ts:32
    const r = spawnSync(command, ['--version'], { stdio: 'ignore', windowsHide: true })
  • 读取本地文件
    src/settings.ts:43
    if (!existsSync(base)) return false
  • 读取本地文件
    src/settings.ts:46
    if (existsSync(conversations)) {
  • 读取本地文件
    src/settings.ts:48
    return readdirSync(conversations).length > 0
  • 执行外部命令来自配置/变量
    src/settings.ts:57
    const proc = spawn(command, [
  • 执行外部命令来自配置/变量
    src/settings.ts:105
    const r = spawnSync(command, ['models'], { encoding: 'utf8', timeout: 15_000, windowsHide: true })
  • 读取本地文件
    src/tool-preview.ts:60
    const stat = statSync(filePath)
  • 读取本地文件
    src/tool-preview.ts:62
    const data = new Uint8Array(readFileSync(filePath))
  • 读取本地文件
    src/tool-preview.ts:93
    const stat = statSync(filePath)
  • 读取本地文件
    src/tool-preview.ts:95
    return readFileSync(filePath, 'utf8')
  • 读取本地文件
    src/tool-preview.ts:185
    const stat = statSync(file)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-llm@deepseek-ai/dsh-settings@deepseek-ai/dsh-tools@deepseek-ai/dsh-subagent@deepseek-ai/dsh-util-values@deepseek-ai/dsh-session@deepseek-ai/dsh-web@deepseek-ai/dsh-host-webserver@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • LLM适配器子代理
  • 深度网络搜索
  • 连通性诊断面板

README

由 DeepSeek 最新模型翻译生成
dsh-llm-agy AGY(Antigravity CLI)— DeepSeek Harness 的智能体增强引擎把 Google 的 AI 编程代理 Antigravity(由 Gemini 驱动)深度集成进 dsh:独立推理子代理、深度网页搜索、文本模型图片输入、一键连通性诊断。开箱即用,零源码改动。 一、这是什么 dsh-llm-agy 是面向 DeepSeek Harness(dsh)的开源插件,把 Google 出品的 AI 编程代理 Antigravity CLI(AGY,基于 Gemini)无缝接入 dsh 生态,为你的工作流提供以下增强通道: | 能力 | 说明 | | 独立推理子代理 | 把前端/UI 等任务委派给 AGY 驱动的子代理(Gemini 3.7 Flash High),与主代理并行,长线会话可复用 | | 深度网页搜索 | web_search 工具经由 AGY 的 Google 搜索通道完成完整深度检索——搜索、打开来源、阅读全文、综合成文,而非简单链接列表 | | 文本模型图片输入 | 纯文本主模型(如 DeepSeek V4 Flash)也能在输入栏直接粘贴图片:后端由 AGY 就地读图,把图片转为文字描述进入消息。
展开完整文档(README 剩余 1 节)
dsh-llm-agy

AGY(Antigravity CLI)— DeepSeek Harness 的智能体增强引擎把 Google 的 AI 编程代理 Antigravity(由 Gemini 驱动)深度集成进 dsh:独立推理子代理、深度网页搜索、文本模型图片输入、一键连通性诊断。开箱即用,零源码改动。

一、这是什么

dsh-llm-agy 是面向 DeepSeek Harness(dsh)的开源插件,把 Google 出品的 AI 编程代理 Antigravity CLI(AGY,基于 Gemini)无缝接入 dsh 生态,为你的工作流提供以下增强通道:

| 能力 | 说明 |
| 独立推理子代理 | 把前端/UI 等任务委派给 AGY 驱动的子代理(Gemini 3.7 Flash High),与主代理并行,长线会话可复用 |
| 深度网页搜索 | web_search 工具经由 AGY 的 Google 搜索通道完成完整深度检索——搜索、打开来源、阅读全文、综合成文,而非简单链接列表 |
| 文本模型图片输入 | 纯文本主模型(如 DeepSeek V4 Flash)也能在输入栏直接粘贴图片:后端由 AGY 就地读图,把图片转为文字描述进入消息。全程无感,不新增模型路由、不切换模型,图片只临时落盘系统临时目录且读完即删 |
| 连通性诊断面板 | dsh 设置 → 插件内的 AntiGravity 卡片:检测本机安装与登录状态、发起真实连通性测试、一键复制各平台安装命令 |

插件严格遵循 dsh 官方扩展机制(profile bundle patch / registerModelDiscovery / registerSearchProvider / llm/stream waterfall / 客户端 slot),不修改 dsh 任何源码,可随 dsh 平滑升级。

二、核心功能

1. 独立推理子代理(provider 路由 agy)

主代理可随时把任务委派给 AGY——一个由 Gemini 驱动、具备独立思维链与工具面的第二大脑:

- 通过 agentOptions.provider: 'agy' 把任意子代理切换为 AGY 推理
- 内置开箱工具:subagent_agy_ui(前端/UI 设计、样式研究、视觉实现、截图核验,可复用长线会话)+ list_agy_models(查询 AGY 当前支持的模型 id,供 subagent_agy_ui 的 model 参数动态指定)
- 复杂大任务可拆分为多个独立子任务并行调度,再汇总整合

2. 文本模型图片输入(全局,零配置)

纯文本主模型(如 DeepSeek V4 Flash)不支持图片输入,但本插件让「输入栏贴图」开箱即用:

- 粘贴即用:在任意输入栏粘贴图片,原生走 ImageBlock;插件在后端把图片写成系统临时文件(不落工作区),由 AGY 就地读图取回文字描述,临时文件随即删除,再把描述交回原模型路由
- 完全透明:不新增 provider 路由、不切换模型、不改前端,用户无感知
- 工具使用提示词:插件注入全局 system prompt section,引导主代理「图片内容已在消息中,禁止委派子代理读图、不轮询后台子代理」(设置面板可关闭)

3. 深度网页搜索(搜索 provider agy)

把 dsh 的 web_search 工具从「返回链接列表」升级为「完成深度调研」:

- 经由 AGY 的 search_web(Google 搜索)发起检索
- AGY 自主完成:搜索 → 打开每个来源阅读全文 → 综合撰写准确、完整、带引用的回答
- 结果语言跟随提问语言;全程不写入会话记录
- 一键接管:设置面板「AGY 搜索接管 web_search」开关。开启时插件经 dsh 的 ctx.configEditor 自动把 web 行的 searchProvider 写成 agy、并把 tool-web 行的 searchTimeoutMs 抬到 300000ms(写入 profile patch 并热重载),关闭时还原,无需手工改配置
- 为什么必须改写配置:dsh 的 provider 选择规则是「显式配置的 id 优先于一切已注册 provider」,而 base bundle 把 web.searchProvider 固定为 deepseek-official —— 只调用 registerSearchProvider() 永远拿不到选择权
- 搜索耗时:一次 web_search = 一次完整 AGY 调研(实测约 130s),所以接管会同时抬高 tool-web.searchTimeoutMs(只在低于 300000ms 时抬高,不压低你配的更大值;关闭时只回收这一档)

4. 连通性诊断面板(设置 → 插件 → AntiGravity)

无需命令行即可完成 AGY 环境体检:

- 检测安装/登录:一键确认本机是否已安装 AGY、是否已登录
- 连通性测试:发起真实指令,直接展示 AGY 的实际回复内容
- 安装命令:Windows(winget)/ macOS(Homebrew)/ Linux(curl)/ npm 四平台命令,一键复制
- 工具说明:内置工具速查(subagent_agy_ui / web_search)
- 开关:「注入工具使用提示词」——控制是否注入全局工具使用提示词(默认开)
- 面板交互走官方模型探测通道(api.llm.discoverModels),不占用会话

三、快速开始

系统要求

- dsh(web profile,npx 版或源码版均可);兼容 dsh >= 0.1.0-rc.6
- Node.js ≥ 20
- AGY CLI(见下方安装命令)
- 兼容性验证日期:2026-08-21(验证于 dsh rc.8)

安装插件

从 Git 仓库安装(免构建——lib/ 已随仓库提交)
git clone https://github.com/flg1217/dsh-llm-agy.git
cd dsh-llm-agy
pnpm install # 安装插件依赖(dsh 以 link: 方式挂载本地目录,需插件自身带 node_modules)
dsh plugin --profile web add <dsh-llm-agy 目录>
安装完成后重启 dsh web,进入 设置 → 插件,应能看到 AntiGravity 卡片;展开卡片,点击「检测安装/登录」确认环境就绪。

卸载插件

dsh plugin --profile web remove @flg1217/dsh-llm-agy

如有残留,手工清理:移除 profile(~/.dsh/profiles/web)的 cordis.patch.yml 中 dsh-llm-agy 的 - insert 块,以及 package.json dependencies 中对应的 @flg1217/dsh-llm-agy 行。卸载后重启 dsh web 即完全移除(AGY CLI 本身不受影响)。

安装 AGY(Antigravity CLI)

Windows
winget install --id Google.Antigravity

macOS
brew install --cask antigravity

Linux / macOS(通用)
curl -fsSL https://antigravity.google/install | bash

或 npm 全局
npm install -g @antigravity/cli

官方文档:https://antigravity.google/docs/cli/install

配置项

| 配置 | 默认值 | 说明 |
| command | agy | AGY 可执行文件命令 |
| model | gemini-3.7-flash-high | 推理模型 |
| effort | high | 推理强度(low / medium / high) |
| proxy | http://127.0.0.1:7890 | 流量代理(空字符串禁用) |
| searchOverride | true | 全局 web_search 接管开关:开启时自动改写 web / tool-web 两行配置,关闭时还原并只提供独立的 agy_web_search 工具 |
| delegationGuide | true | 注入全局「工具使用提示词」系统提示(设置面板可切) |

可在设置面板直接修改,或编辑 profile 的 cordis.patch.yml。

四、典型用法

网页搜索走 AGY 深度调研

设置面板里打开「AGY 搜索接管 web_search」即可:插件会把下面两行写进 profile patch 并热重载,关闭开关时自动还原。

profile patch(~/.dsh/profiles/web/cordis.patch.yml)——由开关自动维护,无需手改
- id: web
config:
searchProvider: agy
fetchProvider: http # patch 对 config 是整体替换,必须写全
- id: tool-web
config:
fetch: true
searchTimeoutMs: 300000 # 一次 AGY 调研约 130s,60000ms 会直接超时

此后主代理调用 web_search 时,将获得 AGY 深度检索后撰写的完整回答与来源引用。

文本模型读图

无需任何配置——输入栏粘贴图片后,后端在请求组装时由 AGY 就地读图,把图片转为文字描述直接进入消息,主代理直接基于图片内容回答(无需调用任何工具)。

用户:请分析这张图片(粘贴图片)
后端:AGY 读图 → 消息里携带图片内容描述 → 主代理直接分析

按模型模态分流读图工具

模型自己调用工具读图时有两条路:原生 read_image(图片块直接进模型上下文,要求模型支持图片输入)与 read_image_agy(AGY/Gemini 转述成文字)。闸门按路由模型的模态自动分流(设置面板「按模型模态分流读图工具」,默认开启):

| 路由模型 | 原生 read_image | read_image_agy |
| 多模态(原生声明支持 image) | 放行(图片直进上下文) | 拒绝 → 指路 read_image(转述会丢细节) |
| 仅文本 / 能力未知 | 拒绝 → 指路 read_image_agy | 放行(AGY 转述是安全兜底) |

判定真值只认原生声明(relay 会把纯文本路由伪声明成支持 image,拿 resolveModelInfo 的返回值判会失效)。关掉该开关则两条规则都不拦,只靠提示词引导模型自己选。

子代理委派给 AGY

无需配置——插件启动时自动注册工具(全局可见,所有会话/预设生效):

- subagent_agy_ui(continuable,可复用长线会话):前端/UI 设计、样式研究、视觉实现、截图核验;接受可选 model 参数,主代理可动态指定模型 id(不传则用插件默认模型)
- list_agy_models:从 agy models 实时解析当前支持的模型 id 列表,委派前先查询再传准确 id

由 AGY/Gemini 驱动(agentOptions.provider: agy),独立于主代理的模型。如不需要,可在插件配置里设 registerSubagentTools: false 关闭。看图不委派子代理——粘贴图片由 AGY 就地读图。

前端/UI 类任务:委派 subagent_agy_ui,由独立 Gemini 模型完成设计、实现与截图核验。

诊断命令行

/agy status # 检测 AGY 安装与登录状态 /agy test # 发起真实测试,展示 AGY 回复 /agy # 帮助

五、工作原理

插件为双面结构,由 dsh 官方扩展机制装配:

┌─────────────── 宿主进程(node 半)───────────────────┐ │ index.ts 插件入口 │ │ adapter.ts AgyLlmAdapter — spawn agy 推理适配 │ │ search.ts ctx.web.registerSearchProvider │ │ settings.ts settings + registerModelDiscovery │ │ image-paste.ts llm/stream 监听器 + resolveModelInfo │ │ 包装:ImageBlock → 工作区路径文本 │ │ read-image.ts AGY 读图执行(图片中继调用) │ │ delegate-guide.ts 全局工具使用提示词 section │ └──────────────────────────────────────────────────────┘ ┌─────────────── 浏览器(web 半)───────────────────────┐ │ client/index.js settings.plugin.item 卡片 │ │ 复用官方组件与样式 │ └──────────────────────────────────────────────────────┘

- 装配:cordis.patch.yml(bundle patch)+ package.json 的 dsh.bundle/dsh.client 清单,dsh plugin add 一键完成
- 推理:服务端 spawn AGY CLI(stream-json 协议),实时流式输出与 token 统计由 dsh harness 统一呈现
- 图片输入:包装 llm.resolveModelInfo,为文本模型声明 image 能力(绕过 dsh 的拒绝校验);llm/stream waterfall 监听器把 ImageBlock 就地读图转成文字描述,然后直接调用原 adapter——不新增 provider、不切换模型、不改前端
- 读图:图片中继在请求组装时 spawn AGY 就地读图,返回文字描述
- 搜索:search() 直接调用 AGY,由其自主完成检索与综合
- 面板:检测/测试经官方 api.llm.discoverModels 通道触发,服务端执行、结果回显,不写会话、不改 dsh 源码

六、参与开发

git clone https://github.com/flg1217/dsh-llm-agy.git
cd dsh-llm-agy
pnpm install
pnpm build # tsc 服务端 + 客户端 bundle 拷贝
pnpm typecheck
pnpm test

详见 docs/CONTRIBUTING.zh.md。

七、许可证

MIT
预览分享卡片长什么样 ↓flg1217/dsh-llm-agy
分享 · DeepSeek Harness Hub
flg1217/dsh-llm-agy

DeepSeek Harness 的 AGY(Antigravity 命令行)集成:LLM 适配器子代理、深度网络搜索、连通性诊断面板

这是你的仓库?认领条目

回到顶部