@aphrody/m3-ai (英语)
材质设计 3 代理界面的回放组件(工具调用卡,打出标记,聊天泡和作曲,模型选择器,任务板)和OpenAI兼容聊天服务器的流媒体客户端,由SpaceUI重建 @spacedrive/ai。 。 。 .
bun add @aphrody/m3-ai @aphrody/m3-primitives @aphrody/m3-motion react react-dom tailwindcss
import { useState } from "react";
import { ChatComposer, MessageBubble } from "@aphrody/m3-ai";
export function Chat() {
const [draft, setDraft] = useState("");
return (
<>
<MessageBubble content="Hello" isUser />
<ChatComposer
draft={draft}
onDraftChange={setDraft}
onSend={() => setDraft("")}
/>
</>
);
}
许可证:Apache-2.0和麻省理工学院LICENSE, (中文(简体) ), LICENSE.spaceui) (中文(简体) ). 安装指南 : 文件/材料/立方米/INSTALL.md。 。 。 .
建造在 @aphrody/m3-primitives,M3颜色角色,打字尺,形状和运动,以及材料符号图标。 端点 :
react 财务报告和审定财务报表 react-dom 18或19岁, tailwindcss 4.1+ (英语). @aphrody/m3-ai/ag-ui 持有AG-UI协议约束.
CSS 设置
使用 M3 公用事业的 Tailwind 级名称 @aphrody/m3-theme导入
然后让Tailwind扫描软件包的输出。 这个
全食谱在 空间-M3-未来.md, (中文(简体) ),
节"集成":
@import "tailwindcss";
@import "@aphrody/m3-tokens/m3-tokens.css";
@import "@aphrody/m3-theme/spaceui.css";
@import "@aphrody/m3-theme/tailwind.css";
@source "../node_modules/@aphrody/m3-primitives/dist";
@source "../node_modules/@aphrody/m3-ai/dist";
装入 材料符号字体一次: 导入 @aphrody/m3-fonts/fonts-symbols.css,或打电话 ensureMaterialSymbols() 从
@aphrody/material-web/icon/material-symbols.js。 。 。 .
使用量
import { ChatComposer, MessageBubble, ToolCall } from "@aphrody/m3-ai";
import type { ToolCallPair } from "@aphrody/m3-ai";
const pair: ToolCallPair = {
id: "1",
name: "file_read",
argsRaw: '{"path":"README.md"}',
args: { path: "README.md" },
resultRaw: '{"text":"# Aphrody"}',
result: { text: "# Aphrody" },
status: "completed",
};
export function Conversation({ draft, setDraft, send }: Props) {
return (
<>
<MessageBubble content="List the files" isUser />
<ToolCall pair={pair} />
<MessageBubble content="There is one file: `README.md`." isUser={false} />
<ChatComposer draft={draft} onDraftChange={setDraft} onSend={send} />
</>
);
}
构成部分
| 构成部分 | M3 解剖学 |
|---|---|
ToolCall | 外观卡surface-container-low中形状):状态图标或圆形指示器, text-label-large 工具名、可扩展参数和结果块 font-code 打开 surface-container-highest错误结果 error-container。 。 。 . |
Markdown | M3型号(标题/标题/正文)上的Prose, font-code 代码块, primary 链接, outline-variant 引用和表. size 选择体积; allowHtml 为可信任的内容启用原始 HTML . |
MessageBubble | 用户转身为 secondary-container 气泡 (大形状),助手在表面以标准复制图标按钮为标记下转. |
ChatComposer | 搜索栏解剖学 : surface-container-high超大的形状, text-body-large 输入,项目避孕药,模型芯片,标准mic图标按钮,填充后发送/停止图标按钮. |
ModelSelector | 药丸触发器打开 M3 菜单(surface-container, 外小形状, 第 2 级 : 搜索字段, 提供者区域标题, 48 dp 项, 选择在 secondary-container,能力芯片. ModelOptionList 财务报告和审定财务报表 groupModelsByProvider 单挑名单. |
InlineWorkerCard | 已填入的卡片( E)surface-container,中等形状), text-title-small 标题、状态芯片、在运行时循环指示器、可扩展记录 ToolCalls和马克下. |
InlineBranchCard | 一个思维分支的填充卡:指标或分支图标,状态芯片,可扩展结论. |
TaskStatusIcon | 每个状态的符号:已完成 success,正在进行并准备就绪 primary,待核准 warning积压 outline。 。 。 . |
TaskPriorityIcon | 按优先事项分列的编号: error高级 warning中间 primary低调 outline。 。 。 . |
TaskRow | Ense M3列表项目(48 dp): text-body-large 头条, text-body-small 支撑柱,8%悬浮状态层, secondary-container 选择、 超时菜单. |
TaskList | 按状态分组的任务:相撞 text-title-small 区域标题, outline-variant 分裂者. |
TaskDetail | M3 表面任务 : text-headline-small 标题、属性网格、子任务作为复选框列表、下标描述、填充和文本按钮. |
TaskCreateForm | 标题和描述文本字段, 优先级选择, 填充 Create 文本 Cancel 按钮. |
来自 types.ts数字 : pairTranscriptSteps, (中文(简体) ), tryParseJson, (中文(简体) ), isErrorResult, (中文(简体) ),
TASK_STATUS_ORDER, (中文(简体) ), TASK_STATUS_LABEL, (中文(简体) ), TASK_PRIORITY_LABEL,以及记录、任务和
模型类型.
本地聊天
在 OpenAI 兼容服务器( lama- server, vLLM, Apprody 网关) 上聊天 ,没有可见的字符串硬码:
| 导出 | 作用 |
|---|---|
ChatLabels, (中文(简体) ), chatLabelsFr 编号 : chatLabelsEn 编号 : chatLabelsJa, (中文(简体) ), resolveChatLabels, (中文(简体) ), formatLabel | 每个可见的字符串和 aria- label 都有一个词典 。 每个聊天组件都使用 labels?: Partial<ChatLabels>; 缺少的密钥会回到英语上. |
streamChatCompletion, (中文(简体) ), createSseParser, (中文(简体) ), parseChatCompletionChunk, (中文(简体) ), chatReducer, (中文(简体) ), ChatStreamError | 纯流客户端 POST <baseUrl>/chat/completions (单位:千美元)stream: true:SSE 框架、内容 / reasoning_content /工具召唤三角洲, finish_reason顶级 citations 财务报告和审定财务报表 refusal网络故障和404/502/503/504 unavailable。 。 。 . |
useOpenAIChat({ baseUrl, model, fetch?, headers?, initialMessages?, preamble?, body? }) | 反应钩子 : { messages, send, stop, status, error, reset, setMessages }, (中文(简体) ), status 实值 idle, (中文(简体) ), streaming, (中文(简体) ), error 或者说 unavailable。 。 。 . |
ConversationList | 导航-绘图列表:新对话,可选搜索,重命名/删除回调,空状态,本地化日期. |
ModelUnavailable | 下载 / 装入 / 不可用状态 . |
CitedMarkdown, (中文(简体) ), CitationChip, (中文(简体) ), CitationList, (中文(简体) ), RefusalNotice | 基础答案 : [n] 标记为芯片,编号来源,"来源中未建立的"通知. MessageBubble 带 citations 财务报告和审定财务报表 refusal 直接说. |
MemoryPanel | 通过逐项删除和确认的"清除所有"来保存记忆(confirmClear 输入您自己的对话框 . |
ChatIcon | 聊天图标作为内置材料符号SVG:聊天组件不需要图标字体. |
Markdown (和 MessageBubble, (中文(简体) ), CitedMarkdown开放外部链接
target="_blank" rel="noopener noreferrer" 并带 onLinkClick(href, event) (电话)
event.preventDefault() 从 Tauri 网页视图打开系统浏览器) 或 renderLink。 。 。 .
ChatComposer 带 disabled (该模型没有可用性:输入、发送、语音和选择器为
相对于 isSending。 。 。 .
测试
bun test
test/preload.ts 决定 @aphrody/m3-primitives 因此,测试不需要一个
已建成 dist。 。 。 .
贷项
衍生自 SpaceUI @spacedrive/ai (麻省理工学院,见
LICENSE.spaceui),在材料设计3上重建. 新代码为Apache-2.0.