【悟凡】真正意义上的净土重生:只保留核心逻辑
This commit is contained in:
137
backend/meeting_agent.py
Normal file
137
backend/meeting_agent.py
Normal file
@@ -0,0 +1,137 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
龙虾会议轮询客户端
|
||||
用法:python meeting_agent.py --config meeting_config.json
|
||||
"""
|
||||
|
||||
import requests
|
||||
import time
|
||||
import json
|
||||
import argparse
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class MeetingAgent:
|
||||
"""会议 Agent 轮询客户端"""
|
||||
|
||||
def __init__(self, config):
|
||||
self.meeting_id = config['meeting_id']
|
||||
self.agent_id = config['agent_id']
|
||||
self.agent_name = config.get('agent_name', '飞行侠')
|
||||
self.agent_emoji = config.get('agent_emoji', '🦸')
|
||||
self.api_key = config['api_key']
|
||||
self.api_base = config.get('api_base', 'http://localhost:8000')
|
||||
self.check_interval = config.get('check_interval', 5)
|
||||
|
||||
self.headers = {
|
||||
'Authorization': f'Bearer {self.api_key}',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
|
||||
def check_inbox(self):
|
||||
"""查阅信箱"""
|
||||
try:
|
||||
response = requests.get(
|
||||
f'{self.api_base}/api/v1/meetings/{self.meeting_id}/inbox/',
|
||||
params={'agent_id': self.agent_id},
|
||||
headers=self.headers,
|
||||
timeout=10
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"[{datetime.now()}] ❌ 查信箱失败:{e}")
|
||||
return {'messages': []}
|
||||
|
||||
def respond(self, message_id, content):
|
||||
"""回复消息"""
|
||||
try:
|
||||
response = requests.post(
|
||||
f'{self.api_base}/api/v1/meetings/{self.meeting_id}/messages/',
|
||||
json={
|
||||
'agent_id': self.agent_id,
|
||||
'in_reply_to': message_id,
|
||||
'content': content,
|
||||
},
|
||||
headers=self.headers,
|
||||
timeout=10
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"[{datetime.now()}] ❌ 回复失败:{e}")
|
||||
return None
|
||||
|
||||
def generate_response(self, message):
|
||||
"""生成回复内容"""
|
||||
sender = message['sender_name']
|
||||
content = message['content']
|
||||
|
||||
# 简单规则匹配
|
||||
responses = {
|
||||
'Q2 计划': f"关于 Q2 计划,我会全力以赴!",
|
||||
'你好': f"你好,{sender}!👋",
|
||||
'在吗': f"我在!有什么事吗?",
|
||||
'说说': f"让我想想... 我觉得这个很重要。",
|
||||
}
|
||||
|
||||
# 匹配关键词
|
||||
for keyword, response in responses.items():
|
||||
if keyword in content:
|
||||
return response
|
||||
|
||||
# 默认回复
|
||||
return f"收到 {sender} 的消息,我会认真考虑的。"
|
||||
|
||||
def run(self):
|
||||
"""运行轮询"""
|
||||
print(f"🦐 {self.agent_emoji} {self.agent_name} 开始会议轮询")
|
||||
print(f" 会议 ID: {self.meeting_id}")
|
||||
print(f" 轮询间隔:{self.check_interval} 秒")
|
||||
print(f" API: {self.api_base}")
|
||||
print(f" 按 Ctrl+C 停止")
|
||||
print()
|
||||
|
||||
message_count = 0
|
||||
|
||||
try:
|
||||
while True:
|
||||
# 查阅信箱
|
||||
inbox = self.check_inbox()
|
||||
|
||||
# 处理消息
|
||||
for message in inbox['messages']:
|
||||
if not message.get('read') and message.get('requires_response'):
|
||||
print(f"[{datetime.now()}] 📨 收到 {message['sender_name']}: {message['content']}")
|
||||
|
||||
# 生成回复
|
||||
response_content = self.generate_response(message)
|
||||
print(f"[{datetime.now()}] 📤 回复:{response_content}")
|
||||
|
||||
# 发送回复
|
||||
result = self.respond(message['id'], response_content)
|
||||
if result:
|
||||
print(f"[{datetime.now()}] ✅ 回复成功")
|
||||
message_count += 1
|
||||
|
||||
# 等待
|
||||
time.sleep(self.check_interval)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print(f"\n👋 停止轮询,共处理 {message_count} 条消息")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='龙虾会议轮询客户端')
|
||||
parser.add_argument('--config', '-c', required=True, help='配置文件路径')
|
||||
args = parser.parse_args()
|
||||
|
||||
with open(args.config) as f:
|
||||
config = json.load(f)
|
||||
|
||||
agent = MeetingAgent(config)
|
||||
agent.run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user