ð§ åå«é»çïŒçš Mattermost + OpenCode æé ç§æ AI åäœäžæ¢
> *"OpenClaw åŸç«ïŒäœäœ æ¯åŠå 䞺å®ç'é»ç'屿§èæå°æææèïŒ"*
---
äžã䞺ä»ä¹éèŠç§æ AI åäœç³»ç»ïŒ
OpenClaw ç¡®å®æ¹åäºåŸå€äººäž AI åäœçæ¹åŒãäœåœäœ çæ£æ·±å ¥äœ¿çšæ¶ïŒäžäºé®é¢åŒå§æµ®ç°ïŒ
ð€ é£äºè®©äººäžå®ç"é»ç"æ¶å»ïŒ
- æçä»£ç æ°æ®è¢«åéå°åªéå€çïŒ
- AI çå³çè¿çšèœåŠè¢«å®¡è®¡ååæº¯ïŒ
- å¢éåäœæ¶ïŒæéåäžäžæåŠäœé犻ïŒ
- åŠææå¡å®æºïŒæçå·¥äœæµäŒäžäŒå®å šäžæïŒ
---
äºãæä»¬çè§£å³æ¹æ¡
ä»å€©ïŒæä»¬èŠçšåŒæºå·¥å ·æåšæå»ºäžå¥å®å šå¯æ§ç䞪人 AI åäœç³»ç»ïŒ
| ç»ä»¶ | è§è² | åŒæºåè®® |
|---|---|---|
| Mattermost | åäœäžæ¢ / æ¶æ¯æ»çº¿ | MIT |
| OpenCode | AI çŒçšåŒæ | Apache 2.0 |
| Bridge | è¿æ¥å± / åè®®èœ¬æ¢ | èªç |
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â åäœå± (Mattermost) â
â âââââââââââ âââââââââââ âââââââââââ âââââââââââ â
â â é¢é A â â é¢é B â â é¢é C â â ç§ä¿¡ DM â â
â â 项ç®äž â â 项ç®äº â â è¿ç»Ž â â 䞪人 â â
â ââââââ¬âââââ ââââââ¬âââââ ââââââ¬âââââ ââââââ¬âââââ â
â âââââââââââââââŽââââââââââââââŽââââââââââââââ â
â â â
â Bridge è¿æ¥å± â
â â â
âââââââââââââââââââââââââââŒââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââŒââââââââââââââââââââââââââââââââââââ
â æ§è¡å± (OpenCode) â
â â â
â ââââââââââââââââââââââââŽâââââââââââââââââââââââ â
â â OpenCode AI åŒæ â â
â â âââââââââââ âââââââââââ âââââââââââ â â
â â â 代ç çæ â â 代ç å®¡æ¥ â â ææ¡£çŒå â â â
â â âââââââââââ âââââââââââ âââââââââââ â â
â âââââââââââââââââââââââââââââââââââââââââââââââ â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
---
äžãMattermostïŒåäœäžæ¢çéæ©
䞺ä»ä¹æ¯ MattermostïŒ
1. å®å šåŒæº
- 代ç éæïŒå¯èªè¡å®¡è®¡
- æ¯æç§æåéšçœ²ïŒæ°æ®äžåºå¢
- æ äŸåºåéå®é£é©
- é¢éã线çšãç§ä¿¡å®æŽæ¯æ
- äž°å¯çæé管çäœç³»
- 区倧çéæèœåïŒWebhookãBotãæä»¶ïŒ
- å®åç API ææ¡£
- æ¯æèªå®ä¹ Bot åŒå
- äž CI/CD å·¥å ·éŸæ çŒéæ
éšçœ²æ¹åŒ
# Docker äžé®éšçœ²
docker run -d --name mattermost \
-p 8065:8065 \
-v mattermost-data:/mattermost/data \
mattermost/mattermost-team-edition:latest
æè äœ¿çš Docker Compose 宿Žéšçœ²ïŒ
version: '3'
services:
mattermost:
image: mattermost/mattermost-team-edition:latest
ports:
- "8065:8065"
environment:
- MM_SQLSETTINGS_DRIVERNAME=postgres
- MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mmuser_password@postgres:5432/mattermost?sslmode=disable
volumes:
- mattermost-data:/mattermost/data
depends_on:
- postgres
postgres:
image: postgres:15
environment:
- POSTGRES_USER=mmuser
- POSTGRES_PASSWORD=mmuser_password
- POSTGRES_DB=mattermost
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
mattermost-data:
postgres-data:
---
åãOpenCodeïŒAI æ§è¡åŒæ
OpenCode æ¯ä»ä¹ïŒ
OpenCode æ¯äžäžªåŒæºç AI çŒçšåŒæïŒå¯ä»¥ç解䞺å¯èªæç®¡ç Claude Code / Cursorã宿äŸïŒ
- 代ç çæäžè¡¥å š
- 代ç 审æ¥äžéæå»ºè®®
- èªç¶è¯èšå°ä»£ç ç蜬æ¢
- 倿件äžäžæçè§£
æ žå¿äŒå¿
| ç¹æ§ | OpenCode | åäžæ¹æ¡ |
|---|---|---|
| æ°æ®éç§ | å®å šæ¬å°ïŒä»£ç äžäžäº | 代ç éåéå°æå¡å |
| æš¡åéæ© | æ¯æä»»æ OpenAI å Œå®¹ API | åºå®æš¡å |
| ææ¬æ§å¶ | æéè°çšïŒæ 订é 莹 | æèŽ¹å¶ |
| å¯å®å¶æ§ | å®å šåŒæºïŒå¯äºæ¬¡åŒå | é»çïŒæ æ³ä¿®æ¹ |
å¿«éåŒå§
# å®è£
OpenCode
pip install opencode
# é
眮 API Key
export OPENAI_API_KEY="your-api-key"
# å¯åš
opencode
---
äºãBridge æ¶æïŒåäœäžæ§è¡çè§£èŠ
䞺ä»ä¹èŠè§£èŠïŒ
äŒ ç»æ¶æçé®é¢ïŒ
çšæ· â OpenClaw â çŽæ¥æ§è¡
â
é»çïŒæ æ³å¹²é¢
è§£èŠåçæ¶æïŒ
çšæ· â Mattermost â Bridge â OpenCode â æ§è¡
â
å¯å®¡è®¡ãå¯å¹²é¢ã坿©å±
Bridge çæ žå¿è莣
1. å议蜬æ¢
- å° Mattermost æ¶æ¯æ ŒåŒèœ¬æ¢äžº OpenCode æä»€
- æ¯æå€ç§äº€äºæš¡åŒïŒåœä»€åŒã对è¯åŒãæ¹å€çåŒïŒ
- 绎æ€é¢é级å«ç对è¯åå²
- 管çæä»¶éä»¶å代ç çæ®µ
- å€çå€çšæ·åäœæ¶çæéé犻
- åœä»€çœåå/é»åå
- æææäœç¡®è®€æºå¶
- æ§è¡æ¥å¿è®°åœ
Bridge å®ç°ç€ºäŸ
# bridge.py
import asyncio
import json
from mattermostdriver import Driver
from opencode import OpenCodeClient
class MattermostOpenCodeBridge:
def __init__(self, mm_url, mm_token, opencode_config):
self.mm = Driver({
'url': mm_url,
'token': mm_token,
'scheme': 'https',
'port': 443
})
self.opencode = OpenCodeClient(**opencode_config)
self.contexts = {} # é¢éäžäžæååš
async def handle_message(self, post):
"""å€ç Mattermost æ¶æ¯"""
channel_id = post['channel_id']
message = post['message']
# æååœä»€
if message.startswith('!code'):
command = message[5:].strip()
# è·åæå建äžäžæ
if channel_id not in self.contexts:
self.contexts[channel_id] = []
# è°çš OpenCode
response = await self.opencode.execute(
command,
context=self.contexts[channel_id]
)
# æŽæ°äžäžæ
self.contexts[channel_id].append({
'role': 'user',
'content': command
})
self.contexts[channel_id].append({
'role': 'assistant',
'content': response
})
# åéåå€å° Mattermost
await self.mm.posts.create_post({
'channel_id': channel_id,
'message': f'\n{response}\n``'
})
async def run(self):
"""å¯åš Bridge"""
await self.mm.login()
# 订é
æ¶æ¯
self.mm.init_websocket(self.handle_message)
while True:
await asyncio.sleep(1)å¯åš
if __name__ == '__main__':
bridge = MattermostOpenCodeBridge(
mm_url='your-mattermost-url',
mm_token='your-bot-token',
opencode_config={
'model': 'gpt-4',
'temperature': 0.7
}
)
asyncio.run(bridge.run())
---
## å
ãå®æåºæ¯æŒç€º
### åºæ¯äžïŒä»£ç 审æ¥åäœ
**Mattermost é¢é对è¯ïŒ**
[åŒåè
A] æäº€äº PR #123ïŒå€§å®¶åž®å¿ review äžäž[AI Bot] æ¶å°ä»£ç åæŽïŒæ£åšåæ...
[AI Bot] ð 代ç å®¡æ¥æ¥å
ââââââââââââââââââââ
æä»¶: src/auth.py
â ïž å®å
šé®é¢:
- 第 45 è¡: äœ¿çšææååšå¯ç ïŒå»ºè®®äœ¿çš bcrypt
- 第 78 è¡: JWT å¯é¥ç¡¬çŒç ïŒå»ºè®®ç§»è³ç¯å¢åé
ð¡ æ¹è¿å»ºè®®:
- 第 32 è¡: åœæ°è¿é¿ïŒå»ºè®®æå䞺å°åœæ°
- 第 91 è¡: 猺å°åŒåžžå€ç
[åŒåè
B] @AI Bot åž®æçæä¿®å€ä»£ç [AI Bot] æ£åšçæ...
[AI Bot]
# ä¿®å€åç auth.py
def hash_password(password: str) -> str:
"""äœ¿çš bcrypt ååžå¯ç """
import bcrypt
salt = bcrypt.gensalt()
return bcrypt.hashpw(password.encode(), salt)
# JWT é
眮ä»ç¯å¢åé读å
JWT_SECRET = os.environ.get('JWT_SECRET')
if not JWT_SECRET:
raise ValueError("JWT_SECRET not set")
### åºæ¯äºïŒèªåšåè¿ç»Ž
**Mattermost è¿ç»Žé¢éïŒ**
[è¿ç»Žäººå] !code æ£æ¥æå¡åšèŽèœœïŒåŠæ CPU > 80% ååéåèŠ[AI Bot] æ£åšæ§è¡...
[AI Bot] ð æå¡åšç¶æ
ââââââââââââââââââââ
CPU 䜿çšç: 87% â ïž
å
å䜿çš: 12GB / 16GB
ç£ç䜿çš: 78%
已觊ååèŠæ¡ä»¶ïŒåééç¥å° #alerts é¢é
[AI Bot] â ïž èªåšæ§è¡å»ºè®®:
1. éå¯ nginx æå¡ïŒå»ºè®®ïŒ
2. æž
çæ¥å¿æä»¶ïŒèç 2.3GBïŒ
3. æ©å®¹ CPU èµæº
æ¯åŠæ§è¡ïŒåå€ Y/N æå
·äœçŒå·
### åºæ¯äžïŒç¥è¯åºé®ç
**Mattermost ç§ä¿¡ïŒ**
[çšæ·] æä»¬é¡¹ç®ç API è®€è¯æµçšæ¯ä»ä¹ïŒ[AI Bot] æ ¹æ®ç¥è¯åºïŒAPI è®€è¯æµçšåŠäžïŒ
1. 客æ·ç«¯åéç»åœè¯·æ±å° /api/v1/auth/login
2. æå¡ç«¯éªè¯çšæ·åå¯ç ïŒè¿å JWT Token
3. åç»è¯·æ±åš Header äžæºåžŠ: Authorization: Bearer
4. Token æææ 24 å°æ¶ïŒå·æ°äœ¿çš /api/v1/auth/refresh
ð çžå
³ææ¡£:
éèŠæçæç€ºäŸä»£ç åïŒ
---
## äžãè¿é¶ïŒå€ Agent åäœ
åœå¢éæ©å€§æ¶ïŒå¯ä»¥éšçœ²å€äžª OpenCode å®äŸïŒæ¯äžªäžç²Ÿäžåé¢åïŒ
Mattermost
â
ââââ Bridge âââ OpenCode-Frontend (å端äžå®¶)
â
ââââ Bridge âââ OpenCode-Backend (å端äžå®¶)
â
ââââ Bridge âââ OpenCode-DevOps (è¿ç»Žäžå®¶)
â
ââââ Bridge âââ OpenCode-Data (æ°æ®äžå®¶)
**é¢éè·¯ç±è§åïŒ**
- `#frontend` â OpenCode-Frontend
- `#backend` â OpenCode-Backend
- `#devops` â OpenCode-DevOps
- `#data` â OpenCode-Data
- `#general` â æºèœè·¯ç±ïŒæ ¹æ®é®é¢å
容åé
ïŒ
---
## å
«ãå®å
šäžéç§èé
### æ°æ®æµçšæ§å¶
çšæ·èŸå
¥ â Mattermost (æ¬å°) â Bridge (æ¬å°) â OpenCode (æ¬å°)
â
å¯é: LLM API (å€éš)
â
代ç çæ®µè±æååé
### å
³é®å®å
šæªæœ
1. **代ç è±æ**
- èªåšè¯å«å¹¶æ¿æ¢ææä¿¡æ¯ïŒå¯é¥ãå¯ç ãIPïŒ
- 䜿çšå äœç¬Šæ¿æ¢ç宿°æ®
2. **æéé犻**
- é¢é级å«çäžäžæé犻
- çšæ·çº§å«çæäœæéæ§å¶
3. **审计æ¥å¿**
- ææ AI æäœè®°åœå°æ¬å°æ¥å¿
- æ¯ææäœå溯åå€ç
4. **çœç»é犻**
- å¯å®å
šåšå
çœè¿è¡
- LLM è°çšå¯éè¿æ¬å°éšçœ²æš¡åå®ç°
---
## ä¹ãéšçœ²æž
å
### æå°å¯è¡éšçœ² (MVP)
bash
1. éšçœ² Mattermost
docker-compose up -d mattermost2. å®è£
OpenCode
pip install opencode3. å¯åš Bridge
python bridge.py4. é
眮 Mattermost Bot
- å建 Bot 莊å·
- è·å Token
- æ·»å å°é¢é
### ç产ç¯å¢éšçœ²
yaml
docker-compose.prod.yml
version: '3.8'
services:
mattermost:
image: mattermost/mattermost-team-edition:latest
restart: always
volumes:
- mattermost-data:/mattermost/data
networks:
- ai-collab-network
opencode:
image: your-registry/opencode:latest
restart: always
environment:
- MODEL_ENDPOINT=http://local-llm:8080
networks:
- ai-collab-network
bridge:
image: your-registry/bridge:latest
restart: always
environment:
- MATTERMOST_URL=http://mattermost:8065
- OPENCODE_URL=http://opencode:8080
networks:
- ai-collab-network
local-llm:
image: vllm/vllm-openai:latest
command: --model Qwen/Qwen2.5-Coder-32B-Instruct
volumes:
- model-cache:/root/.cache/huggingface
networks:
- ai-collab-network
networks:
ai-collab-network:
driver: bridge
``---
åãç»è¯ïŒå¯æ§ç AI åäœæªæ¥
OpenClaw 们确å®éäœäº AI çŒçšçéšæ§ïŒäœå¯æ§æ§åéæåºŠå§ç»æ¯äžäžåŒåè æ æ³åŠ¥åçåºçº¿ã
éè¿ Mattermost + OpenCode + Bridge çç»åïŒæä»¬è·åŸïŒ
â æ°æ®äž»æ ââ ä»£ç æ°žè¿åšèªå·±çæå¡åšäž â è¿çšå¯æ§ ââ æ¯äžæ¥æäœéœå¯å®¡è®¡ãå¯å¹²é¢ â ææ¬å¯æ§ ââ æéè°çšïŒæ 订é ç»æ¶ â æ éæ©å± ââ åŒæºçæïŒèªç±å®å¶
è¿äžæ¯å¯¹ OpenClaw çåŠå®ïŒèæ¯å¯¹"é»ç"çè¶ è¶ã
---
åèéŸæ¥
- Mattermost: https://mattermost.com
- OpenCode: https://github.com/opencode-ai/opencode
- æ¬æ Bridge 瀺äŸä»£ç : https://github.com/your-repo/ai-collab-bridge
*æ¬æåºäºåŒæºé¡¹ç®æŽçïŒä» äŸææ¯äº€æµã*
ð æºè°± GLM-5 å·²äžçº¿
ææ£åšæºè°±å€§æš¡ååŒæŸå¹³å° BigModel.cn äžæé AI åºçšïŒæºè°±æ°äžä»£æè°æš¡å GLM-5 å·²äžçº¿ïŒåšæšçã代ç ãæºèœäœç»Œåèœå蟟å°åŒæºæš¡å SOTA æ°Žå¹³ã
ð é¢å 2000äž Tokens