给桌面应用加一个 AI 助手:用 Fuzio 嵌入 DeepSeek 聊天
#在诸多企业机构中,桌面应用仍然承担着关键业务流程。这两年,很多客户都在问同一件事:“能不能在我们这套桌面系统里也加一个 AI 助手?”
技术上其实并不难。Web 框架通常能轻松构建聊天界面。但是真正落地时会撞上一个问题:如果让用户跳出主窗口去外部浏览器对话 - AI 助手的价值大打折扣。
这是一份技术案例分享:介绍了我们如何把一个基于 DeepSeek V4 的 Web 聊天界面嵌入到已有的 Java Swing 桌面应用里,并通过 Fuzio 让它直接运行在桌面应用窗口内部。

需求
我们从一个已有的 Swing 应用开始。它有标准的内部业务系统结构:左侧导航树、中央多 Tab 工作区、表单、表格。本次开发任务是在不重写应用的前提下加上 AI 助手。
项目需满足两项约束条件:
- 助手必须嵌于应用窗口内。 用户无需切换到浏览器标签页或外部窗口。
- 从应用任意位置一键唤起。 不能要求用户先点几下菜单。
理论上,我们可以借助 Web 框架开发聊天界面,但启动独立浏览器的操作,会完全违背 “集成式 AI” 的设计初衷。
架构
整体方案有三层:一个 Web 应用承担聊天界面,一个 Swing 层管理浮层,中间靠 Web 视图组件把两者连起来。

聊天应用
聊天界面以常规 Web 应用的形式构建,采用 JavaScript 前端框架 Vue 开发用户界面,并通过 DeepSeek V4 实现 AI 聊天功能。
DeepSeek 的 Chat Completions 接口完全兼容 OpenAI 协议,对写过任何 ChatGPT 集成的人来说,迁移成本基本为零;后续想切到通义千问、智谱、Ollama 也只需要改一个 base URL。
最关键的一点是:聊天界面 Web 应用无需感知自身是否运行于桌面应用内——对它来说,自己就是被加载在一个浏览器环境里。这种解耦让前端工程师可以使用标准 Web 开发工具独立完成聊天界面的开发与测试,全程无需编写任何 Java 代码。
Swing 应用
为了不打扰已有的业务界面,我们在既有 Swing 应用程序中 新增 GlassPane 组件来展示 AI 助手界面。一个覆盖在主窗口所有内容之上的透明面板。当用户点击 “Ask AI” 按钮时,应用原有界面之上会弹出一个悬浮窗口,该窗口内置浏览器组件,专门用于加载聊天 Web 应用。
GlassPane 是一种可置于窗口最顶层的 Swing 组件,既能拦截用户交互事件,也能在已有界面内容之上进行绘图渲染。
该悬浮窗口包含以下核心元素:
- 半透明背景,用于淡化现有界面。
- 居中浏览器视图,用于显示聊天应用。
- 点击卡片外的遮罩、或者按 Esc 键,浮层淡出。
用户点击按钮后,悬浮窗口会以渐入动画形式弹出;点击聊天窗口外的区域,即可关闭该悬浮窗口。
Web 视图层
本方案通过 Fuzio 在 Swing 应用中提供嵌入式 Chromium 浏览器视图。具体涉及以下三个步骤:
- 为悬浮窗口创建一个浏览器实例。 通过
BrowserView包装一个 Chromium 视图,将其作为子组件嵌入 GlassPane 容器中。 - 当悬浮窗口弹出时,加载对应的聊天 Web 应用。
- 设置 JavaScript - Java 桥接器。 Fuzio 内置了 JavaScript 与 Java 的直接通信桥,允许 Web UI 直接调用 Java 方法。在本方案中,前端通过该桥向 Java 索取每次请求所需的 API Key,从而让密钥留在 Java 一侧。
集成 DeepSeek
DeepSeek 是国内开源大模型团队“深度求索”推出的对话模型系列。本文使用的 DeepSeek V4 是它面向常规对话场景的最新版本——响应快、价格低、对中文语境理解到位。
DeepSeek 的 API 与 OpenAI 协议兼容,官方文档直接推荐复用 OpenAI 官方 SDK:只需把 baseURL 指向 https://api.deepseek.com、换上 DeepSeek 的 Key 与模型 ID 即可。
集成 DeepSeek 涉及 JavaScript - Java 桥接器的基本用法。本文仅展示与本场景相关的最小用法,详细使用规则,请参阅 Fuzio 文档 · JavaScript。
第一步:声明可访问的 Java 类。 Fuzio 通过 @JsAccessible 注解标识“对 JavaScript 可访问”的类与方法。桥对象不发起任何网络请求,只暴露 Key 管理与配置读取的方法:
@JsAccessible
public final class AiBridge {
/** 返回原始 key "sk-xxx";未配置时返回 null。 */
public String getApiKey() { /* 获取Api Key */ }
/** 端点与模型放在 Java 端:切换 DeepSeek / 智谱 / 自建网关时前端零改动。 */
public String chatCompletionsBaseUrl() { /* OpenAI 兼容端点的 base URL */ }
public String modelName() { /* 模型 ID */ }
}
第二步:注入桥对象。 使用 InjectJsCallback 将后端对象注入到浏览器中:
browser.set(InjectJsCallback.class, params -> {
JsObject window = params.frame().executeJavaScript("window");
window.putProperty("fuzioAi", bridge);
return InjectJsCallback.Response.proceed();
});
该回调会在每个 frame 的 JavaScript 执行之前触发,它将后端对象添加到 window 对象中,使其可以在 JavaScript 中通过 window.fuzioAi 访问。
第三步:前端发起请求。 前端从桥取出 base URL、模型与 API Key,构造 OpenAI 客户端,再以流式方式发起对话。
import OpenAI from "openai";
const bridge = window.fuzioAi;
const client = new OpenAI({
baseURL: bridge.chatCompletionsBaseUrl(), // https://api.deepseek.com
apiKey: bridge.getApiKey(),
dangerouslyAllowBrowser: true,
});
const stream = await client.chat.completions.create(
{ model: bridge.modelName(), messages, stream: true },
{ signal }, // 传入 AbortSignal 即可“停止生成”
);
关于
dangerouslyAllowBrowser。 OpenAI SDK 默认禁止在浏览器中运行,以防 key 被打包进公开的前端代码而泄露。这里的桌面应用是 Fuzio 自有的渲染进程、key 也始终留在 Java 进程,风险可控,所以显式开启该选项。
流式渲染
请求体中 stream 设为 true 后,DeepSeek 按 Server-Sent Events 协议返回响应。
DeepSeek 的每个数据块都符合 OpenAI 兼容协议,响应结构为 { "choices": [{ "delta": { ... } }] }。本文实现只需要累积其中的 delta.content,但理解完整的字段结构有助于后续扩展功能(显示推理过程、统计 token 消耗等):
| 字段 | 出现位置 | 用途 |
|---|---|---|
delta.role |
仅首个数据块 | 标识消息发送方为 assistant |
delta.content |
中间数据块 | 本次增量文本(当前实现使用) |
delta.reasoning_content |
思考模式下(thinking.type=enabled,默认开启) |
推理过程的增量文本 |
finish_reason |
末尾数据块 | stop 表示正常结束,length 表示触发了 token 上限 |
usage |
末尾数据块 | 本轮 token 消耗明细 |
读取响应体:
for await (const chunk of stream) {
const delta = chunk.choices?.[0]?.delta?.content;
if (delta) appendToAssistantBubble(delta);
}
每拿到一段 delta.content,就立即追加到当前的 assistant 气泡并触发重渲染,由此呈现"打字机"式的流式输出效果。
生产环境注意事项
在最简配置下,这就是核心的请求/响应调用流程。而在生产环境中,您仍然需要加入错误处理、身份验证、重试机制或速率限制等功能。
后续可扩展方向
本文展示的是企业桌面应用集成 AI 的起点,一个能够实时对话的内嵌助手。在此基础上,可以沿以下方向继续演进:
| 方向 | 关键技术 |
|---|---|
| 企业知识库 AI 搜索 | RAG(检索增强生成)+ 向量数据库 |
| 业务数据 AI 问答 | 桥对象暴露业务查询方法 + Function Calling |
| 智能体(Agent) | Function Calling + 工具编排 |
每一条路径都可在当前架构上零侵入扩展。
信创平台支持
如果你的桌面应用要进政府、金融、能源、运营商这些行业,“信创合规”是个绕不开的门槛——常见要求是必须支持银河麒麟 V10、飞腾 ARM64、龙芯 LoongArch64 等。
Fuzio 在配置文件里只需要声明对应平台依赖:
dependencies {
implementation(fuzio.win64) // Windows x64
implementation(fuzio.mac) // macOS Intel
implementation(fuzio.macArm) // macOS Apple Silicon
implementation(fuzio.linux64) // Linux x64(覆盖麒麟/openKylin)
implementation(fuzio.linuxArm) // Linux ARM64(飞腾)
implementation(fuzio.linux64Loong) // Linux LoongArch64(龙芯)
implementation(fuzio.swing)
}
结论
为桌面应用程序添加 AI 功能,看似需要攻克诸多复杂难题 —— 既要开发聊天界面、完成 AI 功能集成,又要将其嵌入既有软件中,同时避免对用户操作造成干扰。但在本案例中,我们采用的解决方案简洁高效,且能快速落地实施。
以下三项关键决策,是本方案具备可行性的核心原因:
-
最小化改造既有 Swing 应用。
我们仅为应用新增了一个 GlassPane 悬浮窗口与浏览器容器,原有界面的大部分代码均未改动,无需进行大规模架构调整与高风险的代码重构。
-
用 Fuzio 嵌入 Web 视图。
它为 Swing 提供了嵌入式 Chromium 视图,并构建了在桌面窗口内运行聊天界面的基础模块。
-
用 DeepSeek 替代海外模型。
最新的 DeepSeek V4 系列原生支持 100 万 token 超长上下文,在中文理解、长文档处理与复杂推理上均处于一线水准;API 已于 2026 年 5 月 22 日永久降价至原价的四分之一。
本方案的应用场景不仅限于 AI 助手功能。实际上,任何基于网页的功能模块 —— 例如数据仪表盘、产品文档、统计报表、数据可视化图表等,都可通过这种方式嵌入桌面应用程序中。
更多推荐


所有评论(0)