feat: 增强 Agent 系统和完善项目结构

主要改进:
- Agent 增强: 订单查询、售后支持、客服路由等功能优化
- 新增语言检测和 Token 管理模块
- 改进 Chatwoot webhook 处理和用户标识
- MCP 服务器增强: 订单 MCP 和 Strapi MCP 功能扩展
- 新增商城客户端、知识库、缓存和同步模块
- 添加多语言提示词系统 (YAML)
- 完善项目结构: 整理文档、脚本和测试文件
- 新增调试和测试工具脚本

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
wangliang
2026-01-16 16:28:47 +08:00
parent 0e59f3067e
commit e093995368
48 changed files with 5263 additions and 395 deletions

108
scripts/check-chatwoot-config.sh Executable file
View File

@@ -0,0 +1,108 @@
#!/bin/bash
# Chatwoot 配置诊断工具
echo "======================================"
echo "Chatwoot 配置诊断工具"
echo "======================================"
echo ""
# 检查是否提供了 API Token
if [ -z "$CHATWOOT_API_TOKEN" ]; then
echo "❌ 请先设置 CHATWOOT_API_TOKEN 环境变量"
echo ""
echo "获取方式:"
echo "1. 访问 http://localhost:3000"
echo "2. 登录后进入 Settings → Profile → Access Tokens"
echo "3. 创建一个新的 Access Token"
echo ""
echo "然后运行:"
echo " CHATWOOT_API_TOKEN=your_token $0"
echo ""
exit 1
fi
CHATWOOT_BASE_URL="http://localhost:3000"
ACCOUNT_ID="2"
echo "🔍 正在检查 Chatwoot 配置..."
echo ""
# 1. 检查服务是否运行
echo "1⃣ 检查 Chatwoot 服务状态..."
if curl -s "$CHATWOOT_BASE_URL" > /dev/null; then
echo " ✅ Chatwoot 服务正常运行"
else
echo " ❌ Chatwoot 服务无法访问"
exit 1
fi
echo ""
# 2. 获取所有收件箱
echo "2⃣ 获取所有收件箱..."
INBOXES=$(curl -s \
-H "Authorization: Bearer $CHATWOOT_API_TOKEN" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes")
echo "$INBOXES" | grep -o '"id":[0-9]*' | wc -l | xargs echo " 找到收件箱数量:"
echo ""
# 3. 解析并显示每个收件箱的详细信息
echo "3⃣ 收件箱详细信息:"
echo "======================================"
# 提取所有收件箱的 ID
INBOX_IDS=$(echo "$INBOXES" | grep -o '"id":[0-9]*' | grep -o '[0-9]*' | sort -u)
for INBOX_ID in $INBOX_IDS; do
echo ""
echo "📬 收件箱 ID: $INBOX_ID"
echo "--------------------------------------"
# 获取收件箱详情
INBOX_DETAIL=$(curl -s \
-H "Authorization: Bearer $CHATWOOT_API_TOKEN" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes/$INBOX_ID")
# 提取收件箱名称
NAME=$(echo "$INBOX_DETAIL" | grep -o '"name":"[^"]*"' | head -1 | cut -d'"' -f4)
echo " 名称: $NAME"
# 提取收件箱类型
TYPE=$(echo "$INBOX_DETAIL" | grep -o '"inbox_type":"[^"]*"' | head -1 | cut -d'"' -f4)
echo " 类型: $TYPE"
# 提取 Website Token如果有
WEBSITE_TOKEN=$(echo "$INBOX_DETAIL" | grep -o '"website_token":"[^"]*"' | head -1 | cut -d'"' -f4)
if [ -n "$WEBSITE_TOKEN" ]; then
echo " Website Token: $WEBSITE_TOKEN"
fi
# 提取 Webhook URL
WEBHOOK_URL=$(echo "$INBOX_DETAIL" | grep -o '"webhook_url":"[^"]*"' | head -1 | cut -d'"' -f4)
if [ -n "$WEBHOOK_URL" ]; then
echo " Webhook URL: $WEBHOOK_URL"
else
echo " Webhook URL: ❌ 未配置"
fi
# 检查是否是测试页面使用的 token
if [ "$WEBSITE_TOKEN" = "39PNCMvbMk3NvB7uaDNucc6o" ]; then
echo ""
echo " ⭐ 这是测试页面使用的收件箱!"
echo " Webhook 应该配置为: http://agent:8000/webhooks/chatwoot"
fi
done
echo ""
echo "======================================"
echo ""
echo "📋 下一步操作:"
echo ""
echo "1. 找到 Website Token 为 '39PNCMvbMk3NvB7uaDNucc6o' 的收件箱"
echo "2. 记录该收件箱的 ID"
echo "3. 确保该收件箱的 Webhook URL 配置为:"
echo " http://agent:8000/webhooks/chatwoot"
echo ""
echo "💡 提示:可以通过 Chatwoot 界面更新配置:"
echo " Settings → Inboxes → 选择收件箱 → Configuration → Webhook URL"
echo ""

102
scripts/check-conversations.sh Executable file
View File

@@ -0,0 +1,102 @@
#!/bin/bash
# 检查 Chatwoot 会话和消息
echo "======================================"
echo "Chatwoot 会话检查工具"
echo "======================================"
echo ""
# 需要设置环境变量
if [ -z "$CHATWOOT_API_TOKEN" ]; then
echo "❌ 请先设置 CHATWOOT_API_TOKEN 环境变量"
echo ""
echo "获取方式:"
echo "1. 访问 http://localhost:3000"
echo "2. 登录后进入 Settings → Profile → Access Tokens"
echo "3. 创建一个新的 Access Token"
echo ""
echo "然后运行:"
echo " CHATWOOT_API_TOKEN=your_token $0"
echo ""
exit 1
fi
CHATWOOT_BASE_URL="http://localhost:3000"
ACCOUNT_ID="2"
echo "🔍 正在检查 Chatwoot 会话..."
echo ""
# 1. 获取所有收件箱
echo "1⃣ 获取所有收件箱..."
INBOXES=$(curl -s \
-H "Authorization: Bearer $CHATWOOT_API_TOKEN" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes")
INBOX_IDS=$(echo "$INBOXES" | grep -o '"id":[0-9]*' | grep -o '[0-9]*' | sort -u | head -5)
echo " 找到收件箱: $(echo "$INBOX_IDS" | wc -l)"
echo ""
# 2. 检查每个收件箱的会话
echo "2⃣ 检查最近的会话..."
echo "======================================"
for INBOX_ID in $INBOX_IDS; do
echo ""
echo "📬 收件箱 ID: $INBOX_ID"
echo "--------------------------------------"
# 获取收件箱名称
INBOX_NAME=$(echo "$INBOXES" | grep -o "\"id\":$INBOX_ID" -A 20 | grep '"name":"' | head -1 | cut -d'"' -f4)
echo " 名称: $INBOX_NAME"
# 获取最近5个会话
CONVERSATIONS=$(curl -s \
-H "Authorization: Bearer $CHATWOOT_API_TOKEN" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/conversations?inbox_id=$INBOX_ID&sort=-created_at" | head -100)
CONV_IDS=$(echo "$CONVERSATIONS" | grep -o '"id":[0-9]*' | grep -o '[0-9]*' | head -5)
if [ -z "$CONV_IDS" ]; then
echo " 没有会话"
continue
fi
echo " 最近的会话:"
echo "$CONV_IDS" | while read CONV_ID; do
# 获取会话详情
CONV_DETAIL=$(curl -s \
-H "Authorization: Bearer $CHATWOOT_API_TOKEN" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/conversations/$CONV_ID")
# 提取会话信息
STATUS=$(echo "$CONV_DETAIL" | grep -o '"status":"[^"]*"' | head -1 | cut -d'"' -f4)
CREATED_AT=$(echo "$CONV_DETAIL" | grep -o '"created_at":[^,}]*' | head -1 | cut -d'"' -f2)
# 获取消息数量
MESSAGES=$(curl -s \
-H "Authorization: Bearer $CHATWOOT_API_TOKEN" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/conversations/$CONV_ID/messages")
MSG_COUNT=$(echo "$MESSAGES" | grep -o '"content":' | wc -l)
echo " • 会话 #$CONV_ID - 状态: $Status - 消息数: $MSG_COUNT"
# 获取最后几条消息
echo "$MESSAGES" | grep -o '"content":"[^"]*"' | tail -3 | while read MSG; do
CONTENT=$(echo "$MSG" | cut -d'"' -f4 | sed 's/&quot;/"/g' | head -c 50)
echo " - $CONTENT..."
done
done
done
echo ""
echo "======================================"
echo ""
echo "💡 提示:"
echo "1. 查看上面的会话列表"
echo "2. 记录你正在测试的会话 ID"
echo "3. 在 Agent 日志中查找相同的 conversation_id"
echo "4. 如果会话 ID 不匹配,说明 Widget 连接到了错误的会话"
echo ""

53
scripts/debug-webhook.sh Executable file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
# 实时监控 Chatwoot 和 Agent 日志
echo "======================================"
echo "Chatwoot 消息流程实时监控"
echo "======================================"
echo ""
echo "📋 使用说明:"
echo "1. 在测试页面 http://localhost:8080/test-chat.html 发送消息"
echo "2. 观察下面的日志输出"
echo "3. 按 Ctrl+C 停止监控"
echo ""
echo "======================================"
echo ""
# 检查 Docker 容器是否运行
if ! docker ps | grep -q "ai_agent"; then
echo "❌ Agent 容器未运行"
exit 1
fi
if ! docker ps | grep -q "ai_chatwoot"; then
echo "❌ Chatwoot 容器未运行"
exit 1
fi
echo "✅ 所有容器运行正常"
echo ""
echo "🔍 开始监控日志..."
echo "======================================"
echo ""
# 使用多 tail 监控多个容器
docker logs ai_agent -f 2>&1 &
AGENT_PID=$!
docker logs ai_chatwoot -f 2>&1 &
CHATWOOT_PID=$!
# 清理函数
cleanup() {
echo ""
echo "======================================"
echo "停止监控..."
kill $AGENT_PID $CHATWOOT_PID 2>/dev/null
exit 0
}
# 捕获 Ctrl+C
trap cleanup INT TERM
# 等待
wait

View File

@@ -0,0 +1,62 @@
#!/bin/bash
# 更新 Chatwoot Webhook 配置脚本
# 配置
CHATWOOT_BASE_URL="http://localhost:3000"
ACCOUNT_ID="2" # 你的账户 ID
INBOX_ID="" # 需要填入你的收件箱 ID
API_TOKEN="" # 需要填入你的 Chatwoot API Token
NEW_WEBHOOK_URL="http://agent:8000/webhooks/chatwoot"
WEBHOOK_SECRET="b7a12b9c9173718596f02fd912fb59f97891a0e7abb1a5e457b4c8858b2d21b5"
# 使用说明
echo "======================================"
echo "Chatwoot Webhook 配置更新工具"
echo "======================================"
echo ""
echo "请先设置以下变量:"
echo "1. INBOX_ID - 你的收件箱 ID"
echo "2. API_TOKEN - Chatwoot API Token从 Settings → Profile → Access Tokens 获取)"
echo ""
echo "然后运行:"
echo " INBOX_ID=<收件箱ID> API_TOKEN=<API Token> $0"
echo ""
echo "或者直接编辑此脚本设置变量。"
echo ""
# 检查参数
if [ -z "$INBOX_ID" ] || [ -z "$API_TOKEN" ]; then
echo "❌ 缺少必要参数"
exit 1
fi
# 获取当前 webhook 配置
echo "📋 获取当前 webhook 配置..."
CURRENT_CONFIG=$(curl -s \
-H "Authorization: Bearer $API_TOKEN" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes/$INBOX_ID")
echo "当前配置:"
echo "$CURRENT_CONFIG" | grep -o '"webhook_url":"[^"]*"' || echo "未找到 webhook_url"
# 更新 webhook
echo ""
echo "🔄 更新 webhook URL 为: $NEW_WEBHOOK_URL"
UPDATE_RESPONSE=$(curl -s -X PUT \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"inbox\": {
\"webhook_url\": \"$NEW_WEBHOOK_URL\"
}
}" \
"$CHATWOOT_BASE_URL/api/v1/accounts/$ACCOUNT_ID/inboxes/$INBOX_ID")
echo "更新响应:"
echo "$UPDATE_RESPONSE"
echo ""
echo "✅ 配置更新完成!"
echo ""
echo "现在可以在 Chatwoot 中测试发送消息了。"

81
scripts/verify-webhook.sh Executable file
View File

@@ -0,0 +1,81 @@
#!/bin/bash
# 验证 Chatwoot Webhook 配置
echo "======================================"
echo "Chatwoot Webhook 配置验证工具"
echo "======================================"
echo ""
# 检查 Agent 服务
echo "1⃣ 检查 Agent 服务..."
if curl -s http://localhost:8000/health | grep -q "healthy"; then
echo " ✅ Agent 服务运行正常 (http://localhost:8000)"
else
echo " ❌ Agent 服务未运行"
exit 1
fi
echo ""
# 检查 Chatwoot 服务
echo "2⃣ 检查 Chatwoot 服务..."
if curl -s http://localhost:3000 > /dev/null; then
echo " ✅ Chatwoot 服务运行正常 (http://localhost:3000)"
else
echo " ❌ Chatwoot 服务未运行"
exit 1
fi
echo ""
# 检查网络连通性(从 Chatwoot 容器访问 Agent
echo "3⃣ 检查容器间网络连通性..."
if docker exec ai_chatwoot wget -q -O - http://agent:8000/health | grep -q "healthy"; then
echo " ✅ Chatwoot 可以访问 Agent (http://agent:8000)"
else
echo " ❌ Chatwoot 无法访问 Agent"
echo " 请检查两个容器是否在同一 Docker 网络中"
exit 1
fi
echo ""
# 检查环境变量配置
echo "4⃣ 检查环境变量配置..."
if [ -f .env ]; then
if grep -q "CHATWOOT_WEBHOOK_SECRET" .env; then
echo " ✅ CHATWOOT_WEBHOOK_SECRET 已配置"
else
echo " ⚠️ CHATWOOT_WEBHOOK_SECRET 未配置(可选)"
fi
else
echo " ⚠️ .env 文件不存在"
fi
echo ""
# 显示配置摘要
echo "======================================"
echo "📋 配置摘要"
echo "======================================"
echo ""
echo "Agent 服务:"
echo " • 容器名称: ai_agent"
echo " • 内部地址: http://agent:8000"
echo " • Webhook 端点: http://agent:8000/webhooks/chatwoot"
echo " • 外部访问: http://localhost:8000"
echo ""
echo "Chatwoot 服务:"
echo " • 容器名称: ai_chatwoot"
echo " • 内部地址: http://chatwoot:3000"
echo " • 外部访问: http://localhost:3000"
echo ""
echo "📝 在 Chatwoot 界面中配置:"
echo " 1. 访问: http://localhost:3000"
echo " 2. 进入: Settings → Inboxes → 选择 Website 收件箱"
echo " 3. 点击: Configuration 标签"
echo " 4. 设置 Webhook URL 为: http://agent:8000/webhooks/chatwoot"
echo " 5. 点击 Save 保存"
echo ""
echo "⚠️ 注意事项:"
echo " • 不要在 Chatwoot 中启用内置机器人Bot"
echo " • 只配置 Webhook 即可"
echo " • Webhook URL 使用 'agent' 而不是 'localhost'"
echo ""
echo "======================================"