wecom-cs-automation
11
总安装量
11
周安装量
#27896
全站排名
安装命令
npx skills add https://github.com/aaaaqwq/claude-code-skills --skill wecom-cs-automation
Agent 安装分布
cline
10
github-copilot
10
codex
10
kimi-cli
10
gemini-cli
10
cursor
10
Skill 文档
ä¼ä¸å¾®ä¿¡å®¢æèªå¨åç³»ç»
è¿æ¯ä¸ä¸ªå®æ´çä¼ä¸å¾®ä¿¡å®¢æ AI å©æè§£å³æ¹æ¡ï¼è½å¤èªå¨å¤ç好忷»å ãæºè½é®çã人工转æ¥çåºæ¯ã
æ ¸å¿åè½
1. èªå¨åæå¥½åæ·»å
- 宿¶çå¬å¥½åæ·»å äºä»¶
- èªå¨éè¿å¥½å请æ±
- å鿬¢è¿æ¶æ¯
- æ æ³¨ç¨æ·æ¥æºåæ ç¾
2. åºäºç¥è¯åºçæºè½é®ç
- åéç¥è¯åºåå¨ä¼ä¸ç¥è¯
- è¯ä¹æç´¢å¹é é®é¢
- LLM çæä¸ä¸åå¤
- æ¯æå¤è½®å¯¹è¯ä¸ä¸æ
3. æªç¥é®é¢äººå·¥ä»å ¥
- 置信度éå¼å¤æ
- èªå¨æé人工客æ
- 转æ¥å¯¹è¯ç»äººå·¥
- è®°å½æªè§£å³é®é¢ç¨äºä¼å
ææ¯æ¶æ
âââââââââââââââ
â ä¼ä¸å¾®ä¿¡ â
â Webhook â
ââââââââ¬âââââââ
â
â¼
âââââââââââââââââââ
â åè°æå¡å¨ â
â (Go/Python) â
ââââââââ¬âââââââââââ
â
ââââââââââââââââââââ
â â
â¼ â¼
ââââââââââââââââ ââââââââââââââââ
â åéç¥è¯åº â â LLM API â
â (PG+pgvector)â â (Kimi/GPT-4) â
ââââââââââââââââ ââââââââââââââââ
â
â¼
ââââââââââââââââ
â 人工æé â
â (Telegram) â
ââââââââââââââââ
å¿«éå¼å§
ç¬¬ä¸æ¥ï¼é ç½®ä¼ä¸å¾®ä¿¡åºç¨
-
å建ä¼ä¸å¾®ä¿¡åºç¨
- ç»å½ä¼ä¸å¾®ä¿¡ç®¡çåå°
- åºç¨ç®¡ç â å建åºç¨ â éæ©”微信客æ”
- è®°å½ä»¥ä¸ä¿¡æ¯ï¼
corp_id: ä¼ä¸ IDagent_id: åºç¨ AgentIdsecret: åºç¨ Secret
-
é ç½®åè°å°å
URL: https://your-domain.com/wecom/callback Token: èªå®ä¹éªè¯ä»¤ç EncodingAESKey: èªå¨çæ -
è®¢é æéäºä»¶
- èç³»äººåæ´äºä»¶
- æ¶æ¯äºä»¶
- å¤é¨è系人å éªè¯æ·»å äºä»¶
ç¬¬äºæ¥ï¼è®¾ç½®ç¥è¯åº
# 1. å®è£
PostgreSQL + pgvector
sudo apt install postgresql-14
sudo -u postgres psql -c "CREATE EXTENSION vector;"
# 2. åå»ºæ°æ®åº
sudo -u postgres createdb wecom_kb
# 3. åå§åè¡¨ç»æ
psql wecom_kb < ~/clawd/skills/wecom-cs-automation/schema.sql
ç¬¬ä¸æ¥ï¼å¯¼å ¥ç¥è¯åºæ°æ®
# 1. åå¤ç¥è¯ææ¡£ï¼Markdown æ ¼å¼ï¼
# 2. åçå¹¶åéå
python3 ~/clawd/skills/wecom-cs-automation/scripts/import_kb.py \
--input knowledge.md \
--token $(pass show api/kimi)
# 3. éªè¯å¯¼å
¥
psql wecom_kb -c "SELECT COUNT(*) FROM knowledge_chunks;"
ç¬¬åæ¥ï¼å¯å¨åè°æå¡
# 1. é
ç½®ç¯å¢åé
cat > .env << EOF
WECOM_CORP_ID=$(pass show api/wecom-corp-id)
WECOM_AGENT_SECRET=$(pass show api/wecom-agent-secret)
WECOM_TOKEN=your_webhook_token
WECOM_AES_KEY=your_aes_key
KB_DB_URL=postgresql://localhost/wecom_kb
LLM_API_KEY=$(pass show api/kimi)
LLM_API_BASE=https://api.moonshot.cn/v1
NOTIFICATION_CHANNEL=telegram:8518085684
EOF
# 2. å¯å¨æå¡ï¼Python FastAPIï¼
uvicorn wecom_callback_server:app --host 0.0.0.0 --port 8000
# æä½¿ç¨ Go
go run cmd/server/main.go
ç¬¬äºæ¥ï¼éªè¯æå¡
# 1. æ£æ¥æå¡ç¶æ
curl http://localhost:8000/health
# 2. æµè¯ç¥è¯åºæç´¢
curl -X POST http://localhost:8000/api/test_kb \
-H "Content-Type: application/json" \
-d '{"query": "å¦ä½é款ï¼"}'
ä½¿ç¨æ¹æ³
åºæ¯ 1ï¼èªå¨æ¬¢è¿æ°å¥½å
å½ç¨æ·æ·»å 客æä¸ºå¥½åæ¶ï¼
# skills/wecom-cs-automation/workflows/on_friend_add.py
async def handle_friend_add(user_id, user_name):
# 1. éè¿å¥½å请æ±
await wecom.accept_friend(user_id)
# 2. æ·»å ç¨æ·æ ç¾
await wecom.add_external_tag(user_id, tags=["æ°å®¢æ·"])
# 3. å鿬¢è¿æ¶æ¯
welcome_msg = f"""ð æ¬¢è¿æ¥å°{name}ï¼
ææ¯æºè½å®¢æå°å©æï¼å¯ä»¥å¸®æ¨ï¼
⢠æ¥è¯¢è®¢åç¶æ
⢠解ç常è§é®é¢
⢠å¤çå®åé®é¢
妿夿é®é¢ï¼æä¼è½¬æ¥äººå·¥å®¢æä¸ºæ¨æå¡ã"""
await wecom.send_text(user_id, welcome_msg)
åºæ¯ 2ï¼ç¥è¯åºé®ç
# skills/wecom-cs-automation/workflows/answer_question.py
async def handle_question(user_id, question):
# 1. æç´¢ç¥è¯åº
chunks = await search_knowledge(question, top_k=3)
# 2. æå»ºæç¤ºè¯
context = "\n\n".join([c.content for c in chunks])
prompt = f"""åºäºä»¥ä¸ç¥è¯åºå
容åçç¨æ·é®é¢ï¼
ç¥è¯åºï¼
{context}
ç¨æ·é®é¢ï¼{question}
妿ç¥è¯åºä¸æ²¡æç¸å
³ä¿¡æ¯ï¼è¯·åå¤"æ±æï¼è¿ä¸ªé®é¢æææ¶æ æ³åçï¼å·²ä¸ºæ¨è½¬æ¥äººå·¥å®¢æã\""""
# 3. è°ç¨ LLM
answer = await call_llm(prompt)
# 4. 夿æ¯å¦éè¦äººå·¥ä»å
¥
if "ææ¶æ æ³åç" in answer or chunks[0].similarity < 0.7:
await escalate_to_human(user_id, question)
else:
await wecom.send_text(user_id, answer)
åºæ¯ 3ï¼äººå·¥ä»å ¥æé
# skills/wecom-cs-automation/workflows/escalate.py
async def escalate_to_human(user_id, question):
# 1. åéç¨æ·æ¶æ¯
await wecom.send_text(user_id, "Ⳡ已为æ¨è½¬æ¥äººå·¥å®¢æï¼è¯·ç¨å...")
# 2. éè¿ Telegram éç¥äººå·¥å®¢æ
user_info = await wecom.get_user_info(user_id)
notification = f"""ð¨ éè¦äººå·¥ä»å
¥
ç¨æ·ï¼{user_info.name} ({user_info.id})
é®é¢ï¼{question}
æ¶é´ï¼{datetime.now().strftime('%Y-%m-%d %H:%M')}
è¯·åæ¶å¤çã"""
await send_telegram_message(notification)
# 3. è®°å½æªè§£å³é®é¢
await save_unknown_question(user_id, question)
ç®å½ç»æ
~/clawd/skills/wecom-cs-automation/
âââ SKILL.md # æ¬æä»¶
âââ schema.sql # æ°æ®åºè¡¨ç»æ
âââ config/
â âââ kb_config.yaml # ç¥è¯åºé
ç½®
â âââ escalation_rules.yaml # 转人工è§å
âââ scripts/
â âââ import_kb.py # 导å
¥ç¥è¯åº
â âââ search_kb.py # æµè¯ç¥è¯åºæç´¢
â âââ init_db.py # åå§åæ°æ®åº
âââ workflows/
â âââ on_friend_add.py # 好忷»å å¤ç
â âââ answer_question.py # é®çå¤ç
â âââ escalate.py # 人工转æ¥
âââ server/
â âââ main.py # FastAPI 主æå¡
â âââ wecom_client.py # ä¼ä¸å¾®ä¿¡ API 客æ·ç«¯
â âââ kb_searcher.py # ç¥è¯åºæç´¢
â âââ notification.py # éç¥æå¡
âââ knowledge/
âââ sample.md # 示ä¾ç¥è¯ææ¡£
API é ç½®
æéå¯é¥
# ä¼ä¸å¾®ä¿¡
pass insert api/wecom-corp-id # ä¼ä¸ ID
pass insert api/wecom-agent-secret # åºç¨ Secret
# LLMï¼æ¨è Kimiï¼ä¸æä¼åï¼
pass insert api/kimi # å·²æ
# Telegram éç¥ï¼å¯éï¼
pass insert api/telegram-bot # å·²æ
é ç½®æä»¶
å建 ~/clawd/skills/wecom-cs-automation/.envï¼
# ä¼ä¸å¾®ä¿¡é
ç½®
WECOM_CORP_ID=${WECOM_CORP_ID}
WECOM_AGENT_ID=1000002
WECOM_AGENT_SECRET=${WECOM_AGENT_SECRET}
WECOM_TOKEN=random_token_here
WECOM_ENCODING_AES_KEY=base64_key_here
# æ°æ®åº
KB_DB_URL=postgresql://postgres@localhost/wecom_kb
# LLM
LLM_PROVIDER=kimi
LLM_API_KEY=${LLM_API_KEY}
LLM_API_BASE=https://api.moonshot.cn/v1
LLM_MODEL=moonshot-v1-8k
# ç¥è¯åºæç´¢
KB_SIMILARITY_THRESHOLD=0.7
KB_TOP_K=3
# 人工ä»å
¥
NOTIFICATION_ENABLED=true
NOTIFICATION_CHANNEL=telegram:8518085684
工使µç¨è¯¦è§£
宿´æ¶æ¯å¤çæµç¨
graph TD
A[æ¥æ¶æ¶æ¯] --> B{æ¯å¦ä¸ºææ¬?}
B -->|æ¯| C[æç´¢ç¥è¯åº]
B -->|å¦| D[å
¶ä»ç±»åå¤ç]
C --> E{ç¸ä¼¼åº¦ > éå¼?}
E -->|æ¯| F[çæåç]
E -->|å¦| G[转人工]
F --> H[åéåå¤]
G --> I[éç¥äººå·¥å®¢æ]
D --> J[æç±»åå¤ç]
æ°æ®æµ
# 1. æ¥æ¶ Webhook
@app.post("/wecom/callback")
async def wecom_callback(payload: WebhookPayload):
event = payload.Event[0]
# 2. è·¯ç±äºä»¶
if event.Event == "add_external_contact":
await handle_friend_add(event.UserId)
elif event.Event == "msg":
await handle_message(event)
return {"errcode": 0}
# 3. å¤çæ¶æ¯
async def handle_message(event):
user_id = event.FromUserName
content = event.Content
# æç´¢ç¥è¯åº
results = search_kb(content)
# å¤æç½®ä¿¡åº¦
if results[0].score > CONFIDENCE_THRESHOLD:
# èªå¨åå¤
answer = generate_answer(results, content)
send_message(user_id, answer)
else:
# 转人工
escalate_to_human(user_id, content)
ç¥è¯åºç®¡ç
æ·»å ç¥è¯
# æ¹å¼ 1ï¼ä» Markdown 导å
¥
python3 scripts/import_kb.py \
--input ~/clawd/knowledge/faq.md \
--category "常è§é®é¢"
# æ¹å¼ 2ï¼ç´æ¥æå
¥æ°æ®åº
psql wecom_kb
INSERT INTO knowledge_chunks (content, metadata)
VALUES (
'éè´§æ¿çï¼7天æ çç±éè´§',
'{"category": "å®å", "tags": ["éè´§", "æ¿ç"]}'
);
æ´æ°ç¥è¯
# 鿰坼å
¥ï¼èªå¨å»éï¼
python3 scripts/import_kb.py --input faq.md --refresh
æµè¯æç´¢
python3 scripts/search_kb.py "å¦ä½é款ï¼"
çæ§ä¸ç»´æ¤
æ¥å¿æ¥ç
# æå¡æ¥å¿
tail -f /var/log/wecom-cs/server.log
# æ°æ®åºæ¥å¿
tail -f /var/log/postgresql/postgresql-14-main.log
æ§è½çæ§
# æ·»å å° server/main.py
from prometheus_client import Counter, Histogram
message_counter = Counter('messages_total', 'Total messages')
answer_latency = Histogram('answer_latency_seconds', 'Answer latency')
@answer_latency.time()
def handle_message():
message_counter.inc()
# ...
人工ä»å ¥ç»è®¡
-- æ¥çæªè§£å³é®é¢åå¸
SELECT
COUNT(*) as count,
SUBSTRING(content, 1, 30) as question_preview
FROM unknown_questions
GROUP BY question_preview
ORDER BY count DESC
LIMIT 10;
å®å ¨æä½³å®è·µ
-
å¯é¥ç®¡ç
- ææå¯é¥ä½¿ç¨
passåå¨ - ç¯å¢åéå¼ç¨ï¼ä¸ç¡¬ç¼ç
- ææå¯é¥ä½¿ç¨
-
æ°æ®éç§
- 客æ·ä¿¡æ¯å å¯åå¨
- å®ææ¸ çæææ¥å¿
-
è®¿é®æ§å¶
- Webhook éªè¯ç¾å
- IP ç½ååéå¶
-
审计æ¥å¿
- è®°å½ææäººå·¥ä»å ¥
- 宿审æ¥è®¿é®æ¥å¿
æ éææ¥
é®é¢ 1ï¼åè°æ¥æ¶ä¸å°æ¶æ¯
# æ£æ¥ç«¯å£çå¬
ss -ltnp | grep 8000
# æ£æ¥ Nginx é
ç½®ï¼å¦æï¼
nginx -t
# æ¥çé²ç«å¢
sudo ufw status
é®é¢ 2ï¼ç¥è¯åºæç´¢æ ç»æ
# æ£æ¥æ°æ®
psql wecom_kb -c "SELECT COUNT(*) FROM knowledge_chunks;"
# æµè¯æç´¢
python3 scripts/search_kb.py "æµè¯æ¥è¯¢"
# éæ°åéå
python3 scripts/import_kb.py --rebuild
é®é¢ 3ï¼äººå·¥æéæªåé
# æµè¯ Telegram è¿æ¥
curl -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
-d "chat_id=8518085684&text=æµè¯"
# æ£æ¥éç¥é
ç½®
cat .env | grep NOTIFICATION
æ©å±åè½
1. å¤è½®å¯¹è¯è®°å¿
# ä½¿ç¨ Redis åå¨ä¼è¯ä¸ä¸æ
async def get_conversation_history(user_id):
return redis.get(f"conv:{user_id}")
async def append_message(user_id, role, content):
redis.rpush(f"conv:{user_id}", f"{role}:{content}")
2. æ æåæ
# æ£æµç¨æ·æ
绪
async def analyze_sentiment(text):
result = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "å¤æç¨æ·æ
ç»ªï¼æ£é¢/è´é¢/䏿§ï¼ï¼åªè¿åä¸ä¸ªè¯ã"
}, {
"role": "user",
"content": text
}]
)
return result.choices[0].message.content
3. 主å¨è¥é
# 宿æ¨é
async def daily_promotion():
users = get_active_users(days=7)
for user_id in users:
await wecom.send_text(user_id, "仿¥ç¹æ ï¼...")
ç¸å ³æè½
- feishu-automation: é£ä¹¦å¹³å°èªå¨å
- notion-automation: Notion ç¥è¯åºéæ
- telegram-automation: Telegram éç¥éæ