138 lines
4.6 KiB
Python
138 lines
4.6 KiB
Python
|
|
#!/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()
|