用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/antdv-next/x --skill x-chat-provider命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | x-chat-provider |
| version | 0.0.1 |
| description | 专注于自定义 Chat Provider 的实现,帮助将任意流式接口适配为 Antdv Next X 标准格式 |
本技能专注解决一个问题:如何将你的流式接口快速适配为 Antdv Next X 的 Chat Provider。
不涉及的:useXChat 的使用教程(那是另一个技能)。
| 层级 | 包名 | 核心作用 | 典型使用场景 |
|---|---|---|---|
| UI层 | @antdv-next/x | Vue 3 UI 组件库 | 构建聊天界面、气泡、输入框 |
| 逻辑层 | @antdv-next/x-sdk | 开发工具包 | 数据流管理、Provider、Hook |
| 渲染层 | @antdv-next/x-markdown | Markdown 渲染器 | 内容展示、代码高亮 |
⚠️ 重要提醒:这三个包功能定位不同,请务必从正确的包导入所需功能
// ✅ 正确导入示例 import { Bubble } from "@antdv-next/x"; // UI组件 import { AbstractChatProvider } from "@antdv-next/x-sdk"; // Provider基类 import { XRequest } from "@antdv-next/x-sdk"; // 请求工具
graph LR
A[原始API接口] -->|适配| B[Chat Provider]
B -->|提供数据| C[useXChat Hook]
C -->|渲染| D[Antdv Next X UI]
E[XRequest] -->|网络请求| B
| 概念 | 角色定位 | 核心职责 | 使用场景 |
|---|---|---|---|
| Chat Provider | 🔄 数据适配器 | 将任意接口格式转换为Antdv Next X标准格式 | 私有API适配、格式转换 |
| useXChat | 🧩 Vue 3 Composable | 管理对话状态、消息流、请求控制 | 构建AI对话界面 |
| XRequest | 🌐 请求工具 | 处理所有网络通信、认证、错误处理 | 统一请求管理 |
| 依赖包 | 版本要求 | 自动安装 | 作用 |
|---|---|---|---|
| @antdv-next/x-sdk | ≥0.0.1 | ✅ | 核心SDK,包含Provider和Hook |
| @antdv-next/x | 最新版 | ✅ | UI组件库,构建聊天界面 |
# 自动检查并修复版本
npm ls @antdv-next/x-sdk
# 如版本不符,自动提示:
npm install @antdv-next/x-sdk@latest
| SDK版本 | 支持功能 | 兼容性 |
|---|---|---|
| ≥0.0.1 | 完整Provider功能 | ✅ 推荐 |
graph TD
A[开始] --> B{使用标准API?}
B -->|是| C[使用内置Provider]
B -->|否| D{私有API?}
D -->|是| E[自定义Provider]
D -->|否| F[特殊格式?]
F -->|是| E
F -->|否| C
C --> G[OpenAI/DeepSeek Provider]
E --> H[四步创建自定义Provider]
| Provider类型 | 适用场景 | 使用方式 |
|---|---|---|
| OpenAI Provider | 标准OpenAI API | 直接导入使用 |
| DeepSeek Provider | 标准DeepSeek API | 直接导入使用 |
| 场景 | 推荐方案 | 示例 |
|---|---|---|
| 调用官方OpenAI | 内置OpenAI Provider | new OpenAIProvider() |
| 调用官方DeepSeek | 内置DeepSeek Provider | new DeepSeekProvider() |
| 公司内部API | 自定义Provider | 见四步实现 |
| 第三方非标API | 自定义Provider | 见四步实现 |
journey
title 自定义Provider实现路径
section 分析阶段
接口分析: 2: 用户
section 开发阶段
创建类: 5: 用户
检查验证: 1: 用户
section 集成阶段
配置使用: 1: 用户
| 信息类型 | 示例值 | 你的接口 |
|---|---|---|
| 接口URL | https://your-api.com/chat | _____________ |
| 请求方法 | POST | _____________ |
| 请求格式 | JSON | _____________ |
| 响应格式 | Server-Sent Events | _____________ |
| 认证方式 | Bearer Token | _____________ |
// 你的实际请求格式
interface MyAPIRequest {
query: string; // 用户问题
context?: string; // 对话历史(可选)
model?: string; // 模型选择(可选)
stream?: boolean; // 是否流式(可选)
}
// 流式响应格式
// 实际响应:data: {"content": "回答内容"}
interface MyAPIResponse {
content: string; // 回答片段
finish_reason?: string; // 结束标记
}
// 结束标记:data: [DONE]
// MyChatProvider.ts
import { AbstractChatProvider } from "@antdv-next/x-sdk";
// ====== 第1处修改:定义你的接口类型 ======
interface MyInput {
query: string;
context?: string;
model?: string;
stream?: boolean;
}
interface MyOutput {
content: string;
finish_reason?: string;
}
interface MyMessage {
content: string;
role: "user" | "assistant";
timestamp: number;
}
// ====== 第2处修改:修改类名 ======
export class MyChatProvider extends AbstractChatProvider<
MyMessage,
MyInput,
MyOutput
> {
// 参数转换:将useXChat参数转为你的API参数
transformParams(
requestParams: Partial<MyInput>,
options: XRequestOptions<MyInput, MyOutput, MyMessage>,
): MyInput {
( requestParams !== ) {
();
}
{
: requestParams. || ,
: requestParams.,
: ,
: ,
...(options?. || {}),
};
}
(: <>): {
{
: requestParams. || ,
: ,
: .(),
};
}
(: {
: ;
: ;
}): {
{ originMessage, chunk } = info;
(!chunk?. || chunk. === ) {
{ ...originMessage, : };
}
{
...originMessage,
: ,
: ,
: ,
};
}
}
| 检查项 | 状态 | 说明 |
|---|---|---|
| 类名正确 | ⏳ | MyChatProvider → 你的类名 |
| 类型匹配 | ⏳ | 接口类型与实际API一致 |
| 方法完整 | ⏳ | 3个方法都已实现 |
| 无request方法 | ⏳ | 确认没有实现request方法 |
| 类型检查通过 | ⏳ | tsc --noEmit 无错误 |
# 运行类型检查
npx tsc --noEmit MyChatProvider.ts
# 预期结果:无错误输出
// 1. 引入依赖
import { MyChatProvider } from "./MyChatProvider";
import { XRequest } from "@antdv-next/x-sdk";
// 2. 配置XRequest(由x-request技能负责)
const request = XRequest("https://your-api.com/chat", {
// 认证配置
headers: {
Authorization: "Bearer your-token-here",
"Content-Type": "application/json",
},
// 默认参数
params: {
model: "gpt-3.5-turbo",
max_tokens: 1000,
temperature: 0.7,
},
// 流式配置
manual: true,
});
// 3. 创建Provider实例
const provider = new MyChatProvider({
request, // 必须传入XRequest实例
});
// 4. 现在可以配合useXChat使用
// 这部分由use-x-chat技能负责
export { provider };
| 场景类型 | 难度 | 示例链接 | 说明 |
|---|---|---|---|
| 标准OpenAI | 🟢 简单 | [内置Provider示例](reference/EXAMPLES.md#场景1:OpenAI 格式) | 直接使用内置Provider |
| 标准DeepSeek | 🟢 简单 | [内置Provider示例](reference/EXAMPLES.md#场景2 DeepSeek 格式) | 直接使用内置Provider |
| 私有API | 🟡 中等 | [自定义Provider的一些细节场景](reference/EXAMPLES.md#场景3:自定义 provider) | 需要四步实现 |
📖 完整示例:EXAMPLES.md 包含所有实际场景的完整代码
graph TD
User[开发者] --> A{选择方案}
A -->|标准API| B[内置Provider]
A -->|私有API| C[自定义Provider]
B --> D[use-x-chat]
C --> E[x-chat-provider]
E --> D
D --> F[x-request]
F --> G[最终应用]
| 技能角色 | 技能名称 | 前置条件 | 核心职责 | 使用场景 |
|---|---|---|---|---|
| 🏗️ 创建者 | x-chat-provider | 无 | 创建自定义Provider | 适配私有/非标API |
| 🧩 使用者 | use-x-chat | 需要Provider | 构建AI对话界面 | Vue 3 组件开发 |
| 🔧 配置者 | x-request | 无 | 配置请求参数认证 | 统一网络请求管理 |
适用:从零构建完整的AI对话产品
sequenceDiagram
participant Dev as 开发者
participant CP as x-chat-provider
participant UX as use-x-chat
participant XR as x-request
Dev->>CP: 1. 创建自定义Provider
CP->>Dev: 返回适配后的Provider
Dev->>XR: 2. 配置XRequest参数
XR->>Dev: 返回配置好的request
Dev->>UX: 3. 使用Provider构建界面
UX->>Dev: 完整的AI对话应用
实施步骤:
适用:为其他框架或团队提供Provider
graph LR
A[私有API] -->|适配| B[自定义Provider]
B -->|导出| C[其他框架使用]
B -->|发布| D[NPM包]
核心价值:
适用:快速原型开发或标准API调用
graph LR
A[标准API] -->|内置| B[OpenAI/DeepSeek Provider]
B -->|直接使用| C[use-x-chat]
C -->|配置| D[x-request]
D --> E[快速上线]
优势:
强制要求:
request 方法❌ 严重错误(绝对禁止):
// ❌ 严重错误:自己实现 request 方法
class MyProvider extends AbstractChatProvider {
async request(params: any) {
// 禁止自己写网络请求逻辑!
const response = await fetch(this.url, { ... });
return response;
}
}
✅ 强制要求(唯一正确方式):
// ✅ 强制要求:使用 XRequest,禁止实现 request 方法
class MyProvider extends AbstractChatProvider {
// 禁止实现 request 方法!
transformParams(params) {
/* ... */
}
transformLocalMessage(params) {
/* ... */
}
transformMessage(info) {
/* ... */
}
}
// 强制使用 XRequest:
const provider = new MyProvider({
request: XRequest("https://your-api.com/chat"),
});
创建 Provider 前,确认:
完成后:
tsc --noEmit 确保无类型错误