Tools
Yeizi Openclaw
yeizi-openclaw-plugin
Install
npm install
npm
Configuration Example
{
"type": "message",
"text": "็จๆทๆถๆฏๅ
ๅฎน",
"from": "user_xxx",
"to": "yeizi",
"messageId": "1700000000000",
"chatType": "dm"
}
README
# Yeizi Channel ๆไปถๅผๅ้ๆฑๆๆกฃ
## 1. ้กน็ฎๆฆ่ฟฐ
### 1.1 ้กน็ฎๅ็งฐ
Yeizi Channel ๆไปถ
### 1.2 ้กน็ฎ็ฎๆ
ๅผๅไธไธชๅบไบ Web ็ OpenClaw ๆไปถ็ณป็ป๏ผๅ
ๅซ๏ผ
- **Web ็ซฏ**๏ผๆไพ็จๆทๅฏน่ฏ็้ขๅๅ็ซฏๆๅก๏ผ้ดๆใWebSocket ้ไฟก๏ผ
- **OpenClaw ๆไปถ**๏ผไฝไธบ OpenClaw ็ channel ๆไปถ๏ผไธ Web ๅ็ซฏๅปบ็ซ่ฟๆฅๅนถๅค็ๆถๆฏ
### 1.3 ้กน็ฎ่ๅด
**ๅฝๅ็ๆฌ๏ผๅๆบ่ฝไฝใๅ่ดฆๆทใๅ็จๆท**
- **ๅๆบ่ฝไฝ**๏ผๅชๆฏๆไธไธชๆบ่ฝไฝ๏ผ้ป่ฎค `main`๏ผ
- **ๅ่ดฆๆท**๏ผๅชๆฏๆไธไธช่ดฆๆท๏ผ้ป่ฎค `default`๏ผ
- **ๅ็จๆท**๏ผ็จๆทๆ ้็ปๅฝ๏ผๅ็ซฏ่ชๅจ็ๆ็จๆทๆ ่ฏ
### 1.4 ๆ ธๅฟๅ่ฝ
็จๆท้่ฟ Web ็้ข่พๅ
ฅๆถๆฏ๏ผๆถๆฏ้่ฟ WebSocket ไผ ้็ป OpenClaw ๆไปถ๏ผๆไปถๅไธ OpenClaw ่ฟ่ก้ไฟก๏ผๆ็ปๅฐ AI ๅๅค่ฟๅ็ป็จๆทใ
## 2. ็ณป็ปๆถๆ
### 2.1 ๆดไฝๆถๆๅพ
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็จๆทๆต่งๅจ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Web ๅ็ซฏ๏ผๅฏน่ฏ้กต้ข๏ผ โ โ
โ โ โข ็จๆท่พๅ
ฅๆถๆฏ โ โ
โ โ โข ๆพ็คบ AI ๅๅค โ โ
โ โ โข WebSocket ๅฎๆถ้ไฟก โ โ
โ โ โข ๆไปถ้
็ฝฎๆพ็คบ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โฒ โ
โ โ WebSocket
AI ๅๅค โ ็จๆทๆถๆฏ
โ โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโบ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Web ๅ็ซฏๆๅก โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข ้ดๆๆๅก๏ผAppKey + AppSecret๏ผ โ
โ โข WebSocket ๆๅก โ
โ โข ๆถๆฏ่ทฏ็ฑ โ
โ โข ้
็ฝฎๆฅ่ฏข API (/api/config) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โฒ โ
โ โ WebSocket
AI ๅๅค โ ๆถๆฏ่ฝฌๅ
โ โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโบ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ OpenClaw ๆไปถ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข WebSocket ๅฎขๆท็ซฏ๏ผๆฅๆถ/ๅ้ๆถๆฏ๏ผ โ
โ โข dispatchReplyWithBufferedBlockDispatcher โ
โ โข ChannelDock ้
็ฝฎ โ
โ โข YeiziDock ๅฎไนๆไปถ่ฝๅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
AI ๅๅค
(OpenClaw API)
```
### 2.2 ๆถๆฏๆต็จ
#### ๆถๆฏๅ้ๆต็จ๏ผ็จๆท โ OpenClaw๏ผ
```
็จๆท่พๅ
ฅๆถๆฏ
โ
ๅ็ซฏ้่ฟ WebSocket ๅ้ๆถๆฏๅฐๅ็ซฏ
โ
ๅ็ซฏ่ฝฌๅๆถๆฏๅฐ OpenClaw ๆไปถ
โ
ๆไปถๆๅปบ ctxPayload
โ
่ฐ็จ finalizeInboundContext
โ
่ฐ็จ dispatchReplyWithBufferedBlockDispatcher ่งฆๅ AI ๅค็
```
#### ๆถๆฏๅๅคๆต็จ๏ผOpenClaw โ ็จๆท๏ผ
```
OpenClaw AI ๅค็ๅฎๆ
โ
dispatchReplyWithBufferedBlockDispatcher ็ deliver ๅ่ฐ่งฆๅ
โ
ๆไปถ้่ฟ WebSocket ๅ้ๅๅคๅฐๅ็ซฏ
โ
ๅ็ซฏ้่ฟ WebSocket ๆจ้ๅฐๅ็ซฏ
โ
ๅ็ซฏๆพ็คบ AI ๅๅค
```
## 3. ๅฎ่ฃ
ไธ้
็ฝฎ
### 3.1 ็ฏๅข่ฆๆฑ
- **Node.js**๏ผ>= 18.0.0
- **OpenClaw**๏ผ>= 2026.3.12
### 3.2 ๅฎ่ฃ
ๆญฅ้ชค
#### ๆญฅ้ชค 1๏ผๆๅปบๆไปถ
```bash
cd yeizi-plugin
npm install
npm run build
```
#### ๆญฅ้ชค 2๏ผๅฎ่ฃ
ๆไปถ
```bash
cd yeizi-plugin/scripts
node setup.mjs <app_key> <app_secret> [base_url] [websocket_url]
```
็คบไพ๏ผ
```bash
node setup.mjs yeizi-app-key-2026 yeizi-app-secret-2026 http://localhost:3000 ws://localhost:3000
```
#### ๆญฅ้ชค 3๏ผ้ๅฏ OpenClaw
ๅฎ่ฃ
ๅฎๆๅ้่ฆ้ๅฏ OpenClaw Gateway ไฝฟ้
็ฝฎ็ๆใ
### 3.3 ๅ็ซฏ้
็ฝฎ
ๅ็ซฏไฝฟ็จ็ฏๅขๅ้้
็ฝฎ๏ผ.env ๆไปถ๏ผ๏ผ
```bash
# ๅบ็จ้
็ฝฎ
APP_KEY=yeizi-app-key-2026
APP_SECRET=yeizi-app-secret-2026
# ๆๅกๅฐๅ้
็ฝฎ
HOST=localhost
PORT=3000
PROTOCOL=http
# ๆๅกๅฐๅ
BASE_URL=http://localhost:3000
WEBSOCKET_URL=ws://localhost:3000
```
## 4. ้กน็ฎ็ปๆ
```
yeizi/
โโโ web-channel/ # Web ็ซฏ้กน็ฎ
โ โโโ frontend/ # ๅ็ซฏ้กน็ฎ๏ผVue 3 + TypeScript๏ผ
โ โ โโโ src/
โ โ โ โโโ components/ # Vue ็ปไปถ
โ โ โ โ โโโ ChatInput.vue # ๆถๆฏ่พๅ
ฅ็ปไปถ
โ โ โ โ โโโ ChatMessage.vue # ๆถๆฏๆพ็คบ็ปไปถ
โ โ โ โ โโโ ChatWindow.vue # ่ๅคฉ็ชๅฃ็ปไปถ
โ โ โ โ โโโ ConnectionStatus.vue # ่ฟๆฅ็ถๆ็ปไปถ
โ โ โ โ โโโ SettingsPanel.vue # ๆไปถ้
็ฝฎ้กต้ข
โ โ โ โโโ composables/
โ โ โ โ โโโ useWebSocket.ts # WebSocket ้ฉๅญ
โ โ โ โโโ stores/
โ โ โ โ โโโ chat.ts # ่ๅคฉ็ถๆ็ฎก็
โ โ โ โโโ App.vue # ไธปๅบ็จ็ปไปถ
โ โ โโโ package.json
โ โโโ backend/ # ๅ็ซฏ้กน็ฎ๏ผExpress.js๏ผ
โ โ โโโ src/
โ โ โ โโโ routes/
โ โ โ โ โโโ auth.ts # ้ดๆ่ทฏ็ฑ
โ โ โ โ โโโ config.ts # ้
็ฝฎๆฅ่ฏข่ทฏ็ฑ
โ โ โ โโโ services/
โ โ โ โ โโโ auth.ts # ้ดๆๆๅก
โ โ โ โ โโโ config.ts # ้
็ฝฎๆๅก
โ โ โ โ โโโ websocket.ts # WebSocket ็ฎก็
โ โ โ โโโ index.ts # ๆๅกๅ
ฅๅฃ
โ โ โโโ .env # ็ฏๅขๅ้้
็ฝฎ
โ โ โโโ package.json
โ โโโ package.json
โ
โโโ yeizi-plugin/ # OpenClaw ๆไปถ้กน็ฎ
โโโ src/
โ โโโ accounts.ts # ่ดฆๆท็ฎก็ๅทฅๅ
ท
โ โโโ channel.ts # Channel Plugin ๅฎ็ฐ
โ โโโ config-schema.ts # ้
็ฝฎ Schema ๅฎไน
โ โโโ runtime.ts # ่ฟ่กๆถๅญๅจ็ฎก็
โ โโโ types.ts # ็ฑปๅๅฎไน
โ โโโ websocket-client.ts # WebSocket ๅฎขๆท็ซฏๅฐ่ฃ
โโโ scripts/
โ โโโ setup.mjs # ๅฎ่ฃ
่ๆฌ
โ โโโ README.md # ๅฎ่ฃ
่ฏดๆ
โโโ index.ts # ๆไปถ่ฟ่กๆถๅ
ฅๅฃ
โโโ openclaw.plugin.json # ๆไปถๅ
ๆฐๆฎ
โโโ package.json
โโโ tsconfig.json
```
## 5. ๆไปถๆ ธๅฟๅฎ็ฐ
### 5.1 ๆไปถๅ
ฅๅฃ (index.ts)
```typescript
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
import { plugin, yeiziDock } from "./src/channel.js";
import { setRuntime } from "./src/runtime.js";
export { plugin, yeiziDock } from "./src/channel.js";
const yeizi: any = {
id: "yeizi",
name: "Yeizi",
description: "Yeizi Channel ๆไปถ",
configSchema: emptyPluginConfigSchema(),
register(api: OpenClawPluginApi) {
setRuntime(api.runtime);
api.registerChannel({ plugin, dock: yeiziDock });
},
};
export function register(api: OpenClawPluginApi) {
yeizi.register(api);
}
export function activate(api: OpenClawPluginApi) {
register(api);
}
export default yeizi;
```
### 5.2 ChannelDock ๅฎไน
```typescript
export const yeiziDock: ChannelDock = {
id: "yeizi",
capabilities: {
chatTypes: ["direct"],
blockStreaming: true,
},
};
```
### 5.3 ๆถๆฏๅค็ๆต็จ
```typescript
// 1. ๅฏๅจ่ดฆๆทๆถๅปบ็ซ WebSocket ่ฟๆฅ
startAccount: async (ctx) => {
// HTTP ้ดๆ่ทๅ token
const authResponse = await fetch(`${account.config.baseUrl}/api/auth/token`, {
method: 'POST',
body: JSON.stringify({
appKey: account.config.appKey,
appSecret: account.config.appSecret,
}),
});
// ๅปบ็ซ WebSocket ่ฟๆฅ
const wsClient = new WebSocketClient({
url: `${account.config.websocketUrl}/ws/plugin`,
token: authData.token,
onMessage: handleMessage,
});
wsClient.connect();
// ็ญๅพ
abort ไฟกๅท
return new Promise((resolve) => {
ctx.abortSignal?.addEventListener('abort', () => {
wsClient.disconnect();
resolve();
});
});
}
// 2. ๆถๅฐๆถๆฏๆถๅค็
onMessage: (message: WebSocketMessage) => {
// ๆๅปบ ctxPayload
const ctxPayload = {
Body: message.text,
BodyForAgent: message.text,
RawBody: JSON.stringify(message),
From: message.from ?? 'unknown',
To: message.to ?? 'yeizi',
ChatType: 'dm',
Provider: 'yeizi',
Surface: 'yeizi',
AgentId: agentId,
Timestamp: Date.now(),
AccountId: accountId,
MessageSid: message.messageId ?? Date.now().toString(),
OriginatingChannel: 'yeizi',
OriginatingTo: message.to ?? 'yeizi',
};
const finalized = runtime.channel.reply.finalizeInboundContext(ctxPayload);
// ๅๅๆถๆฏๅฐ AI ๅค็
await runtime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
ctx: finalized,
cfg,
dispatcherOptions: {
deliver: async (payload) => {
const textOut = String(payload.text ?? payload.body ?? "");
const target = message.from;
if (!target || !textOut.trim()) {
return;
}
wsClient.send({
type: 'response',
payload: {
content: textOut,
messageId: message.messageId,
to: target,
},
});
},
},
});
}
```
### 5.4 ๅบ็ซๆถๆฏ้
็ฝฎ
```typescript
outbound: {
deliveryMode: 'direct',
chunker: (text: string, _limit: number) => [text],
textChunkLimit: 4096,
sendText: async ({ to, text, accountId }) => {
const wsClient = accountConnections.get(accountId ?? 'default');
const messageId = Date.now().toString();
if (!wsClient || !wsClient.isConnected()) {
return { channel: 'yeizi', ok: false, messageId };
}
const sent = wsClient.send({
type: 'response',
payload: { content: text, messageId, to },
});
return { channel: 'yeizi', ok: sent, messageId };
},
},
```
## 6. WebSocket ๆถๆฏๆ ผๅผ
### 6.1 ๅ็ซฏ โ ๆไปถ๏ผ็จๆทๆถๆฏ๏ผ
```json
{
"type": "message",
"text": "็จๆทๆถๆฏๅ
ๅฎน",
"from": "user_xxx",
"to": "yeizi",
"messageId": "17000000
... (truncated)
tools
Comments
Sign in to leave a comment