如何扩展 chatbot-template:添加自定义 Tool 与 Part 组件完整步骤
【免费下载链接】chatbot-templateA minimal chatbot template built with Next.js, AI SDK, shadcn/ui, shadcn/react, shadcn/typeset. It runs on the Vercel AI Gateway.项目地址https://gitcode.com/gh_mirrors/chatbo/chatbot-template点击查看免费下载chatbot-template 是一个基于 Next.js Vercel AI SDK shadcn/ui 构建的极简 AI 聊天机器人模板运行在 Vercel AI Gateway 上。本文带你走通扩展聊天机器人的完整流程从定义自定义 Tool、注册到工具集到创建配套的 Part 组件并接入消息渲染一个示例讲清全部步骤。先认识模板为什么扩展只需改两个地方模板内置了三个现成的 Tool 可以当参考样板Tool定义文件说明github_repotools/github_repo.ts服务端执行查询 GitHub 仓库数据web_searchtools/web_search.ts各模型提供商的原生联网搜索ask_usertools/ask_user.ts交互式问卷由用户在界面中作答要给它加新能力比如查天气、查汇率、连内部 API只需要动两处Tool工具模型会做什么——在服务端定义能力模型调用后返回结果。Part部件消息长什么样——把工具的输入/输出渲染成界面上的一块内容。一条助手消息是由若干有类型的 Part 组成的列表。app/api/chat/route.ts 用streamText流式返回响应components/chat-message.tsx 则对每个part.type做 switch 分发把每种 Tool Part 交给 components/parts/ 目录下对应的组件渲染。理解关键机制Tool 状态流转与类型推导Tool Part 在流式输出过程中会经历如下状态这是写 Part 组件时的核心依据input-streaming → input-available → output-available或 output-error以 components/parts/github-repo-part.tsx 为例前两个状态显示正在查询…的加载动画output-available渲染 stars/forks 统计output-error显示错误信息。更省心的是类型推导消息类型由工具定义通过 AI SDK 的InferUITools自动推断所以在 Part 组件里part.input和part.output都是完整类型化的——改错一个字段名构建会直接报错而不是运行时悄悄出现undefined。第 1 步在 tools/ 下创建 Tool 定义文件新建tools/get_weather.ts。注意文件名就是模型识别到的工具名推荐用下划线命名如get_weather、github_repo。文件内导出一个tool()调用包含三部分import { tool } from ai import { z } from zod export const getWeather tool({ description: Get the current weather for a city., inputSchema: z.object({ city: z.string().describe(The city name), }), outputSchema: z.object({ temperature: z.number(), condition: z.string(), }), execute: ({ city }) { // 调用你的天气 API这里只是示意 return { temperature: 25, condition: Sunny } }, })description写给模型看的说明书决定模型何时调用它建议写清楚触发场景。inputSchema/outputSchema用 zod 描述输入输出结构。execute服务端执行逻辑。 如果是由用户在界面中作答的交互型工具如ask_user可以省略execute后面进阶部分会讲。第 2 步在 tools/index.ts 注册工具打开 tools/index.ts把新工具加进baseTools并导入即可import { getWeather } from ./get_weather const baseTools { github_repo: githubRepo, ask_user: askUser, get_weather: getWeather, // ← 新增 }baseTools会被getTools()取出并传入聊天路由的streamText模型从此就能调用它了。同时ChatUIMessage类型基于InferUIToolstypeof baseTools自动推导新工具的part.input/part.output类型也随之就绪。第 3 步创建配套的 Part 组件在 components/parts/ 新建get-weather-part.tsx按part.state分支渲染不同阶段import { type ChatMessagePart } from /tools import { Spinner } from /components/ui/spinner type GetWeatherToolPart Extract ChatMessagePart, { type: tool-get_weather } export function GetWeatherPart({ part }: { part: GetWeatherToolPart }) { switch (part.state) { case input-streaming: case input-available: return ( div classNameflex items-center gap-2 text-sm Spinner / Looking up weather… /div ) case output-available: return div {part.output.temperature}°C, {part.output.condition}/div case output-error: return div classNametext-destructive{part.errorText}/div default: return null } }类型GetWeatherToolPart从ChatMessagePart中用Extract精确挑出来写法与 tools/index.ts 中GithubRepoToolPart、AskUserToolPart完全一致保证只接收自己那种 Part。第 4 步在 chat-message.tsx 中接入渲染最后一步打开 components/chat-message.tsx在 switch 中新增一个 casecase tool-get_weather: return GetWeatherPart key{part.toolCallId} part{part} /到这里pnpm dev跑起来后只要对话中模型判断需要查天气界面就会先显示加载动画再显示天气结果——完整的 Tool Part 扩展就完成了。✅进阶交互型 Toolask_user 模式如果工具的结果不来自服务端而来自用户本人例如问卷、审批、表单确认可以省略execute参考 tools/ask_user.ts。此时流程变为模型调用ask_user并传入问题列表components/chat.tsx 检测到最后一条消息存在待回答的tool-ask_userPart就在滚动区底部钉住一个 components/question-card.tsx 问卷卡片用户作答后客户端调用addToolOutput把答案作为工具输出回传sendAutomaticallyWhen配置会自动续流模型继续生成回复。这个服务端执行与客户端作答两种模式覆盖了绝大多数自定义 Tool 场景。新手常见问题 FAQQ1Tool 的字段类型在 Part 里是undefined为什么确认该工具已经加进tools/index.ts的baseTools——类型是通过InferUITools从baseTools推导的未注册的工具没有对应类型。Q2想给 Part 组件加按钮、抽屉等 UI怎么装模板已内置 shadcn CLI直接运行npx shadcnlatest add button组件会落到 components/ui/Spinner、Drawer、Item等现成组件可直接复用。Q3想换模型或加模型在哪改模型列表在 lib/models.ts第一个条目是默认模型聊天路由会用它校验请求防止调用未授权的模型。Q4web_search为什么不在baseTools里它由模型 ID 决定——tools/web_search.ts 根据前缀openai/或anthropic/动态返回对应提供商的搜索工具getTools()会按需合并进工具集。这是条件性工具的参考写法。小结步骤文件位置做什么1tools/name.ts定义tool()description schema execute2tools/index.ts注册进baseTools3components/parts/name-part.tsx按part.state渲染各阶段 UI4components/chat-message.tsx新增case tool-name记住这条主线文件名即工具名注册后类型自动推导状态驱动渲染。有了github_repo这个样板加上任意能力都不过是四步小事——这就是 chatbot-template 作为扩展底座的魅力。赞分享【免费下载链接】chatbot-templateA minimal chatbot template built with Next.js, AI SDK, shadcn/ui, shadcn/react, shadcn/typeset. It runs on the Vercel AI Gateway.项目地址https://gitcode.com/gh_mirrors/chatbo/chatbot-template点击查看免费下载相关推荐DBeaver 数据库管理实操手册连接配置、日常查询与故障排查DBeaver 数据库管理实操手册连接配置、日常查询与故障排查 本文面向刚接触 DBeaver 的开发者讲清 DBeaver 连接配置、SQL 查询、性能调数据库客户端桌面应用数据库PaddleSeg项目扩展指南如何添加自定义模型组件PaddleSeg项目扩展指南如何添加自定义模型组件 前言 PaddleSeg作为一款优秀的图像分割开发套件其强大的可扩展性让开发者能够轻松集成自定义组件。人工智能计算机视觉预训练Airframe React扩展开发如何自定义组件和添加新功能Airframe React扩展开发如何自定义组件和添加新功能 Airframe React是一个基于Bootstrap 4和React 16构建的高质量开源创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Chinese-LLaMA-Alpaca-2 的 llama.cpp 本地部署指南:chat.sh 交互对话与 server curl API 调用

Chinese-LLaMA-Alpaca-2 的 llama.cpp 本地部署指南:chat.sh 交互对话与 server curl API 调用

人工智能大模型预训练微调RLHFLoRA本地部署模型量化 【免费下载链接】Chinese-LLaMA-Alpaca-2 中文LLaMA-2 & Alpaca-2大模型二期项目 64K超长上下文模型 (Chinese LLaMA-2 & Alpaca-2 LLMs with 64K long context models) 项目地址: https://gitcode.com/…

2026/10/15 17:01:06 阅读更多 →
RSA加解密原理深度解析:从欧拉定理到安全边界

RSA加解密原理深度解析:从欧拉定理到安全边界

1. 为什么RSA看起来像"魔术":从一次现场演示说起先讲我第一次在项目里落地RSA时的困惑。当时我照着文档写了个Demo:生成一对密钥,用公钥加密"HELLO",拿私钥解密,屏幕上顺利还原出"HELLO"…

2026/10/15 17:01:06 阅读更多 →
美国用出生公证:办理流程与材料清单详解

美国用出生公证:办理流程与材料清单详解

摘要:打算办理美国移民、签证申请的朋友,大多需要准备双号出生公证书,很多人分不清出生公证和出生医学证明公证,材料准备不全、选错公证类型,容易导致申请被退回。本文整理美国使用出生公证的基础概念、材料清单、线上…

2026/10/15 17:00:05 阅读更多 →

最新新闻

基于C++的USB通信上位机开发:从枚举到批量传输的完整实现

基于C++的USB通信上位机开发:从枚举到批量传输的完整实现

简介:这是一份面向C开发者与嵌入式方向学习者的USB通信上位机完整工程源码,聚焦于通过C实现与USB设备的数据交互,涵盖设备枚举、驱动初始化、异步数据传输、错误处理及图形界面等核心模块,适合希望深入理解USB协议与底层硬件操作的…

2026/10/15 17:49:04 阅读更多 →
language-ext Monad Trait 体系深度解析:从 Monad、MonadIO 到 MonadT 的纯函数式组合指南

language-ext Monad Trait 体系深度解析:从 Monad、MonadIO 到 MonadT 的纯函数式组合指南

后端 【免费下载链接】language-ext C# pure functional programming framework - come and get declarative! 项目地址: https://gitcode.com/gh_mirrors/la/language-ext 点击查看 免费下载 导读 language-ext 是一个 C# 纯函数式编程框架,而 Monad&…

2026/10/15 17:49:04 阅读更多 →
Flutter 与 FastAPI 构建多智能体应用:流式输出与状态管理实战

Flutter 与 FastAPI 构建多智能体应用:流式输出与状态管理实战

多智能体系统这两年从论文里走出来,落到实际项目里的速度比很多人预想的要快。但真到动手阶段,一个很现实的问题摆在面前:后端用 Python 写 Agent 编排逻辑,前端用什么?Web 页面在移动端体验拉胯,原生开发又…

2026/10/15 17:49:04 阅读更多 →
Sprite Atlas性能优化:从图集生成到GPU渲染的全链路实践

Sprite Atlas性能优化:从图集生成到GPU渲染的全链路实践

1. 为什么一张图集(Sprite Atlas)能决定UI加载速度的生死线我第一次在某跨平台系统项目里看到“加载卡顿”问题时,团队里有位前端老手直接打开资源面板,指着内存占用曲线说:“不是逻辑卡,是图没加载完。”—…

2026/10/15 17:49:04 阅读更多 →
Android Studio Tab被顶掉与自动关闭?一文教你配置Editor Tabs

Android Studio Tab被顶掉与自动关闭?一文教你配置Editor Tabs

1. 问题现象与影响分析1.1 Android Studio 里 Tab 被顶掉的典型场景很多人在日常开发中都会遇到一个特别恼火的场景:你正在 Android Studio 里同时开着MainActivity.java、build.gradle.kts、AndroidManifest.xml,然后在左侧 Project 面板里随手点开一个…

2026/10/15 17:49:04 阅读更多 →
VLC 3.0.11 定制版支持 AVS+ 与 DRA 软解实战指南

VLC 3.0.11 定制版支持 AVS+ 与 DRA 软解实战指南

简介:本资源为适配Windows 7及以上系统的VLC媒体播放器3.0.11定制增强版,专为需播放国产音视频编码内容的开发者、广电从业人员及高清影音爱好者设计,解决主流播放器对AVS和DRA格式兼容性不足的问题。压缩包为7z格式,大小130.6MB&…

2026/10/15 17:48:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →