AI 界面成了标配,Harness 层还是空白
竞品 @ai-sdk/vue 的月下载量实测 626 万(2026-10,npm registry)——人人都在给应用装 AI 对话,但官方只给到 useChat 这类逻辑层;模型之上的界面、协议、交互,也就是 Harness,仍要自己搭。
来源:npm downloads API · 2026-10@toimc/vue 真组件循环播放活演示:思考链、工具调用、流式回答、RAG 引用,一个不缺。 模型解决「会思考」,Harness 解决「能干活」——AI 应用的界面层、协议层、服务端,正在成为和框架一样的基础设施。三个来自 2026-10 的实测数字:
竞品 @ai-sdk/vue 的月下载量实测 626 万(2026-10,npm registry)——人人都在给应用装 AI 对话,但官方只给到 useChat 这类逻辑层;模型之上的界面、协议、交互,也就是 Harness,仍要自己搭。
来源:npm downloads API · 2026-10565 次提交、142 天,90% 代码由 AI 生成(git 仓库实测可点验)——用 AI 开发 AI 应用的界面,是当下效率最高的开发范式;这套组件库本身就是这条工作流的产物,全程 dogfooding。
来源:git log 实测 · learn-ai 仓库 · 2026-1062 个组件只是入口——ChatAdapter 协议层、server/agents 服务端网关、RAG 与会话记忆、MCP 双向接入,一个仓库覆盖 AI 应用全栈,不用在前端、协议、后端之间拼积木。
来源:仓库结构实测 · pnpm workspace · 2026-10全部数字来自仓库实测:组件数按 @toimc/vue 的 index.ts 导出统计,测试用例按 173 个测试文件中的 it/test 计数(另含 22 个 Playwright E2E 用例),core 包零运行时依赖、agents 包零外部依赖。
第一步,安装。 五个包按需组合,最小只要两个:
pnpm add @toimc/core @toimc/vue @toimc/markdown样式一次性引入(Design Token + 全部组件样式,零 CSS 框架):
import '@toimc/vue/style.css'第二步,实现一个 ChatAdapter。 前端只认这一个接口——sendMessage 返回 AsyncGenerator<StreamChunk>,接谁由你决定:
import type { ChatAdapter } from '@toimc/core'
const adapter: ChatAdapter = {
async *sendMessage({ messages, signal }) {
const res = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ messages }),
signal, // 中止信号自动透传
})
const reader = res.body!.getReader()
const decoder = new TextDecoder()
while (true) {
const { done, value } = await reader.read()
if (done) break
yield { type: 'text', content: decoder.decode(value, { stream: true }) }
}
yield { type: 'done', content: '' }
},
}对接 OpenAI 兼容协议、加思考帧、走 SSE,用法指南里有现成的完整实现;服务端想省事,@toimc/agents 内置 OpenAI 兼容 / Anthropic 协议适配器。
第三步,组装界面。 布局、滚动锚定、流式光标、中断切换,全部内置:
<script setup lang="ts">
import { useChat } from '@toimc/core'
import {
Conversation, ConversationContent,
Message, MessageContent,
PromptInput, PromptInputBody, PromptInputTextarea, PromptInputFooter, PromptInputSubmit,
} from '@toimc/vue'
const chat = useChat(adapter)
</script>
<template>
<Conversation>
<ConversationContent>
<Message v-for="msg in chat.messages" :key="msg.id" :from="msg.role">
<MessageContent :content="msg.content" :streaming="chat.isStreaming" />
</Message>
</ConversationContent>
<PromptInput :disabled="chat.isStreaming" @send="(p) => chat.send(p.text)" @abort="chat.abort">
<PromptInputBody>
<PromptInputTextarea />
</PromptInputBody>
<PromptInputFooter>
<PromptInputSubmit />
</PromptInputFooter>
</PromptInput>
</Conversation>
</template>完整可复制版本(含 Markdown 渲染注入、附件、思考链)见快速开始。
组件不关心模型,useChat 不关心协议,你的应用只依赖 ChatAdapter 这一层薄接口。换模型 = 换一个 adapter 文件;API Key 永远留在服务端。
层间流向:你的应用 → 组件层 → 状态机 → ChatAdapter 接口 → 后端任选
React 生态的同类库很多,但「Vue 原生 + 后端无关 + 组件可拆用」三者同时成立的,目前只有这一家:
| 维度 | AI Chat UI@toimc · 本库 | assistant-ui12.4k star | Vercel AI Elements2.5k star | CopilotKit37.8k star |
|---|---|---|---|---|
| 框架支持 | Vue 3.5+ 原生 | React(Vue 绑定 npm 未发布) | React(copy-paste) | React 为主,Vue 包 2026-05 新发 |
| 后端耦合 | ChatAdapter 接口,任意后端 | 默认绑 Vercel AI SDK | 绑 AI SDK 协议 | 绑 CopilotRuntime + AG-UI |
| 使用方式 | 组件级拆用,5 包按需安装 | headless + 组件 | 复制代码进仓库 | 整体框架接入 |
| 样式方案 | 零 CSS 框架 · CSS Variables · @layer 隔离 | Tailwind + shadcn | Tailwind + shadcn | Tailwind 系 |
| 思考链流式展示 | ✅ | ✅ | ✅ | 部分 |
| 工具调用人工审批 | ✅ | ✅ | — | ✅ |
| RAG 行内引用 | ✅ | ✅ | ✅ | 部分 |
| 生成式 UI | ✅ 白名单注册表 | ✅ | 部分 | ✅ |
| 消息分支 / 双模型对比 | ✅ | ✅ branching | — | — |
| 中文文档 | ✅ | — | — | — |
← 左右滑动查看完整对比 →
star 数与发布状态实测于 GitHub API / npm registry,数据截至 2026-10;CopilotKit 与 assistant-ui 的 Vue 支持均在快速演进,以各项目官网为准。
以下页面全部由本库组件搭建。「纯静态」演示无需任何后端,「需 dev-server」的页面在仓库里跑 pnpm dev 即可获得完整体验:
| 包 | 版本 | 职责 | 什么时候装它 |
|---|---|---|---|
@toimc/core | 0.0.2 | 类型 + useChat 状态机,零运行时依赖 | 必装 |
@toimc/vue | 0.0.2 | 62 个组件、主题令牌、i18n | 必装 |
@toimc/markdown | 0.0.2 | 流式 Markdown / Shiki 高亮 / KaTeX / Mermaid | 要渲染 Markdown 时 |
@toimc/agents | 0.2.0 | 服务端模型适配层(OpenAI 兼容 / Anthropic / Mastra),零外部依赖 | 自建后端时 |
@toimc/server | 0.1.1 | Hono 网关:Bearer 认证、限流、SSE 转发、JWT / API Key / 每日配额 | 要现成服务端时 |
从界面到生产,链路是通的:服务端网关数行起一个带认证与限流的聊天网关;智能体接入一行 createMastraGateway 挂载 Mastra Agent(工具调用 + 会话记忆);语义检索演示 Ollama 本地向量化 + 混合检索的完整 RAG;会话记忆讲透 LibSQL 落盘与 token 成本取舍。仓库还内置 MCP 双向接入(Context7 客户端 + 把本地工具暴露给 Claude Code)与多 Agent 编排的参考实现。
pnpm add @toimc/core @toimc/vue三分钟得到一个能流的聊天界面,剩下的零件——思考链、工具审批、引用角标、生成式 UI——在组件文档里随取随用。