feat(hands): restructure Hands UI with Chinese localization

Major changes:
- Add HandList.tsx component for left sidebar
- Add HandTaskPanel.tsx for middle content area
- Restructure Sidebar tabs: 分身/HANDS/Workflow
- Remove Hands tab from RightPanel
- Localize all UI text to Chinese
- Archive legacy OpenClaw documentation
- Add Hands integration lessons document
- Update feature checklist with new components

UI improvements:
- Left sidebar now shows Hands list with status icons
- Middle area shows selected Hand's tasks and results
- Consistent styling with Tailwind CSS
- Chinese status labels and buttons

Documentation:
- Create docs/archive/openclaw-legacy/ for old docs
- Add docs/knowledge-base/hands-integration-lessons.md
- Update docs/knowledge-base/feature-checklist.md
- Update docs/knowledge-base/README.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-03-14 23:16:32 +08:00
parent 67e1da635d
commit 07079293f4
126 changed files with 36229 additions and 1035 deletions

View File

@@ -1,12 +1,15 @@
/**
* ZCLAW Chinese Models Plugin
*
*
* Registers Chinese AI model providers for OpenClaw Gateway:
* - Zhipu GLM (智谱)
* - Qwen (通义千问)
* - Kimi (月之暗面)
* - MiniMax
*
* - DeepSeek
* - Baidu ERNIE (文心一言)
* - iFlytek Spark (讯飞星火)
*
* All providers use OpenAI-compatible API format.
*/
@@ -41,22 +44,6 @@ const zhipuProvider: ProviderDefinition = {
baseUrl: 'https://open.bigmodel.cn/api/paas/v4',
apiKeyEnvVar: 'ZHIPU_API_KEY',
models: [
{
id: 'glm-5',
alias: 'GLM-5',
contextWindow: 128000,
maxOutputTokens: 4096,
supportsVision: true,
supportsStreaming: true,
},
{
id: 'glm-4.7',
alias: 'GLM-4.7',
contextWindow: 128000,
maxOutputTokens: 4096,
supportsVision: true,
supportsStreaming: true,
},
{
id: 'glm-4-plus',
alias: 'GLM-4-Plus',
@@ -73,6 +60,22 @@ const zhipuProvider: ProviderDefinition = {
supportsVision: false,
supportsStreaming: true,
},
{
id: 'glm-4v-plus',
alias: 'GLM-4V-Plus (视觉)',
contextWindow: 128000,
maxOutputTokens: 4096,
supportsVision: true,
supportsStreaming: true,
},
{
id: 'glm-z1-airx',
alias: 'GLM-Z1-AirX (推理)',
contextWindow: 128000,
maxOutputTokens: 16384,
supportsVision: false,
supportsStreaming: true,
},
],
headers: (apiKey: string) => ({
'Authorization': `Bearer ${apiKey}`,
@@ -87,14 +90,6 @@ const qwenProvider: ProviderDefinition = {
baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
apiKeyEnvVar: 'QWEN_API_KEY',
models: [
{
id: 'qwen3.5-plus',
alias: 'Qwen3.5+',
contextWindow: 131072,
maxOutputTokens: 8192,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'qwen-max',
alias: 'Qwen-Max',
@@ -103,14 +98,38 @@ const qwenProvider: ProviderDefinition = {
supportsVision: false,
supportsStreaming: true,
},
{
id: 'qwen-plus',
alias: 'Qwen-Plus',
contextWindow: 128000,
maxOutputTokens: 8192,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'qwen-turbo',
alias: 'Qwen-Turbo',
contextWindow: 128000,
maxOutputTokens: 8192,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'qwen-vl-max',
alias: 'Qwen-VL-Max',
alias: 'Qwen-VL-Max (视觉)',
contextWindow: 32768,
maxOutputTokens: 4096,
maxOutputTokens: 8192,
supportsVision: true,
supportsStreaming: true,
},
{
id: 'qwen-long',
alias: 'Qwen-Long (长上下文)',
contextWindow: 1000000,
maxOutputTokens: 10000,
supportsVision: false,
supportsStreaming: true,
},
],
headers: (apiKey: string) => ({
'Authorization': `Bearer ${apiKey}`,
@@ -126,17 +145,25 @@ const kimiProvider: ProviderDefinition = {
apiKeyEnvVar: 'KIMI_API_KEY',
models: [
{
id: 'kimi-k2.5',
alias: 'Kimi-K2.5',
contextWindow: 131072,
maxOutputTokens: 8192,
id: 'moonshot-v1-8k',
alias: 'Kimi (8K)',
contextWindow: 8192,
maxOutputTokens: 4096,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'moonshot-v1-32k',
alias: 'Kimi (32K)',
contextWindow: 32768,
maxOutputTokens: 4096,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'moonshot-v1-128k',
alias: 'Moonshot-128K',
contextWindow: 128000,
alias: 'Kimi (128K)',
contextWindow: 131072,
maxOutputTokens: 4096,
supportsVision: false,
supportsStreaming: true,
@@ -156,21 +183,119 @@ const minimaxProvider: ProviderDefinition = {
apiKeyEnvVar: 'MINIMAX_API_KEY',
models: [
{
id: 'minimax-m2.5',
alias: 'MiniMax-M2.5',
contextWindow: 245760,
id: 'abab6.5s-chat',
alias: 'MiniMax-6.5s',
contextWindow: 245000,
maxOutputTokens: 16384,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'abab6.5s-chat',
alias: 'ABAB-6.5s',
contextWindow: 245760,
id: 'abab6.5g-chat',
alias: 'MiniMax-6.5g',
contextWindow: 128000,
maxOutputTokens: 8192,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'abab5.5-chat',
alias: 'MiniMax-5.5',
contextWindow: 16384,
maxOutputTokens: 4096,
supportsVision: false,
supportsStreaming: true,
},
],
headers: (apiKey: string) => ({
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
}),
};
// DeepSeek Provider
const deepseekProvider: ProviderDefinition = {
id: 'deepseek',
name: 'DeepSeek',
baseUrl: 'https://api.deepseek.com/v1',
apiKeyEnvVar: 'DEEPSEEK_API_KEY',
models: [
{
id: 'deepseek-chat',
alias: 'DeepSeek Chat',
contextWindow: 64000,
maxOutputTokens: 4096,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'deepseek-reasoner',
alias: 'DeepSeek Reasoner (R1)',
contextWindow: 64000,
maxOutputTokens: 8192,
supportsVision: false,
supportsStreaming: true,
},
],
headers: (apiKey: string) => ({
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
}),
};
// 百度文心一言 Provider (OpenAI-compatible endpoint)
const baiduProvider: ProviderDefinition = {
id: 'baidu',
name: 'Baidu ERNIE (文心一言)',
baseUrl: 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat',
apiKeyEnvVar: 'BAIDU_API_KEY',
models: [
{
id: 'ernie-4.0-8k',
alias: 'ERNIE-4.0 (8K)',
contextWindow: 8192,
maxOutputTokens: 2048,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'ernie-3.5-8k',
alias: 'ERNIE-3.5 (8K)',
contextWindow: 8192,
maxOutputTokens: 2048,
supportsVision: false,
supportsStreaming: true,
},
],
headers: (apiKey: string) => ({
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
}),
};
// 讯飞星火 Provider (OpenAI-compatible endpoint)
const sparkProvider: ProviderDefinition = {
id: 'spark',
name: 'iFlytek Spark (讯飞星火)',
baseUrl: 'https://spark-api-open.xf-yun.com/v1',
apiKeyEnvVar: 'SPARK_API_KEY',
models: [
{
id: 'generalv3.5',
alias: '星火 3.5',
contextWindow: 8192,
maxOutputTokens: 4096,
supportsVision: false,
supportsStreaming: true,
},
{
id: 'generalv4.0',
alias: '星火 4.0',
contextWindow: 8192,
maxOutputTokens: 4096,
supportsVision: false,
supportsStreaming: true,
},
],
headers: (apiKey: string) => ({
'Authorization': `Bearer ${apiKey}`,
@@ -204,8 +329,23 @@ export default function register(api: PluginAPI) {
if (pluginConfig.minimaxBaseUrl) minimax.baseUrl = pluginConfig.minimaxBaseUrl;
api.registerProvider(minimax);
// Register DeepSeek
const deepseek = { ...deepseekProvider };
if (pluginConfig.deepseekBaseUrl) deepseek.baseUrl = pluginConfig.deepseekBaseUrl;
api.registerProvider(deepseek);
// Register Baidu ERNIE
const baidu = { ...baiduProvider };
if (pluginConfig.baiduBaseUrl) baidu.baseUrl = pluginConfig.baiduBaseUrl;
api.registerProvider(baidu);
// Register iFlytek Spark
const spark = { ...sparkProvider };
if (pluginConfig.sparkBaseUrl) spark.baseUrl = pluginConfig.sparkBaseUrl;
api.registerProvider(spark);
// Log registration
api.registerHook('gateway:startup', async () => {
console.log('[ZCLAW] Chinese model providers registered: zhipu, qwen, kimi, minimax');
console.log('[ZCLAW] Chinese model providers registered: zhipu, qwen, kimi, minimax, deepseek, baidu, spark');
}, { name: 'zclaw-chinese-models.startup', description: 'Log provider registration on startup' });
}

View File

@@ -1,8 +1,8 @@
{
"id": "zclaw-chinese-models",
"name": "ZCLAW Chinese Models",
"version": "0.1.0",
"description": "Chinese AI model providers for ZCLAW: Zhipu GLM, Qwen, Kimi, MiniMax",
"version": "0.2.0",
"description": "Chinese AI model providers for ZCLAW: Zhipu GLM, Qwen, Kimi, MiniMax, DeepSeek, Baidu ERNIE, iFlytek Spark",
"author": "ZCLAW",
"entry": "index.ts",
"configSchema": {
@@ -16,7 +16,13 @@
"kimiApiKey": { "type": "string" },
"kimiBaseUrl": { "type": "string" },
"minimaxApiKey": { "type": "string" },
"minimaxBaseUrl": { "type": "string" }
"minimaxBaseUrl": { "type": "string" },
"deepseekApiKey": { "type": "string" },
"deepseekBaseUrl": { "type": "string" },
"baiduApiKey": { "type": "string" },
"baiduBaseUrl": { "type": "string" },
"sparkApiKey": { "type": "string" },
"sparkBaseUrl": { "type": "string" }
}
},
"uiHints": {
@@ -27,6 +33,12 @@
"kimiApiKey": { "label": "Kimi API Key", "sensitive": true },
"kimiBaseUrl": { "label": "Kimi Base URL", "placeholder": "https://api.moonshot.cn/v1" },
"minimaxApiKey": { "label": "MiniMax API Key", "sensitive": true },
"minimaxBaseUrl": { "label": "MiniMax Base URL", "placeholder": "https://api.minimax.chat/v1" }
"minimaxBaseUrl": { "label": "MiniMax Base URL", "placeholder": "https://api.minimax.chat/v1" },
"deepseekApiKey": { "label": "DeepSeek API Key", "sensitive": true },
"deepseekBaseUrl": { "label": "DeepSeek Base URL", "placeholder": "https://api.deepseek.com/v1" },
"baiduApiKey": { "label": "百度 API Key", "sensitive": true },
"baiduBaseUrl": { "label": "百度 Base URL", "placeholder": "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat" },
"sparkApiKey": { "label": "讯飞星火 API Key", "sensitive": true },
"sparkBaseUrl": { "label": "讯飞星火 Base URL", "placeholder": "https://spark-api-open.xf-yun.com/v1" }
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "@zclaw/chinese-models",
"version": "0.1.0",
"description": "Chinese AI model providers for ZCLAW: Zhipu GLM, Qwen, Kimi, MiniMax",
"name": "@zclaw/zclaw-chinese-models",
"version": "0.2.0",
"description": "Chinese AI model providers for ZCLAW: Zhipu GLM, Qwen, Kimi, MiniMax, DeepSeek, Baidu ERNIE, iFlytek Spark",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
@@ -17,7 +17,12 @@
"glm",
"qwen",
"kimi",
"minimax"
"minimax",
"deepseek",
"baidu",
"ernie",
"spark",
"iflytek"
],
"author": "ZCLAW Team",
"license": "MIT",
@@ -29,6 +34,6 @@
"files": [
"dist",
"index.ts",
"plugin.json"
"openclaw.plugin.json"
]
}