【悟凡】真正意义上的净土重生:只保留核心逻辑
This commit is contained in:
302
backend/meeting_ai_sdk.py
Normal file
302
backend/meeting_ai_sdk.py
Normal file
@@ -0,0 +1,302 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
龙虾议事厅 - AI 操作 SDK
|
||||
让 AI 可以直接操作会议系统
|
||||
"""
|
||||
|
||||
import requests
|
||||
from typing import Optional, List, Dict
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
@dataclass
|
||||
class Meeting:
|
||||
"""会议数据类"""
|
||||
id: str
|
||||
topic: str
|
||||
host: int
|
||||
status: str
|
||||
invite_code: str
|
||||
created_at: datetime
|
||||
participant_count: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class Message:
|
||||
"""消息数据类"""
|
||||
id: int
|
||||
meeting: str
|
||||
sender_name: str
|
||||
sender_emoji: str
|
||||
content: str
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class MeetingAIOperations:
|
||||
"""
|
||||
AI 专用的会议操作接口
|
||||
|
||||
使用示例:
|
||||
```python
|
||||
api = MeetingAIOperations('http://localhost:8000')
|
||||
|
||||
# 登录
|
||||
await api.login('test', 'test123')
|
||||
|
||||
# 创建会议
|
||||
meeting = await api.create_meeting('Q2 计划讨论')
|
||||
|
||||
# 发送消息
|
||||
await api.send_message(meeting.id, '大家好!')
|
||||
|
||||
# 获取消息
|
||||
messages = await api.get_messages(meeting.id)
|
||||
```
|
||||
"""
|
||||
|
||||
def __init__(self, api_base: str = 'http://localhost:8000'):
|
||||
self.api_base = api_base
|
||||
self.token: Optional[str] = None
|
||||
self.session = requests.Session()
|
||||
|
||||
def _get_headers(self) -> Dict:
|
||||
"""获取请求头"""
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
if self.token:
|
||||
headers['Authorization'] = f'Bearer {self.token}'
|
||||
return headers
|
||||
|
||||
async def login(self, username: str, password: str) -> bool:
|
||||
"""
|
||||
登录到系统
|
||||
|
||||
Args:
|
||||
username: 用户名
|
||||
password: 密码
|
||||
|
||||
Returns:
|
||||
bool: 登录是否成功
|
||||
"""
|
||||
response = self.session.post(
|
||||
f'{self.api_base}/api/v1/auth/login/',
|
||||
json={'username': username, 'password': password},
|
||||
headers={'Content-Type': 'application/json'}
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
self.token = data['token']
|
||||
return True
|
||||
return False
|
||||
|
||||
async def create_meeting(self, topic: str) -> Meeting:
|
||||
"""
|
||||
创建会议
|
||||
|
||||
Args:
|
||||
topic: 会议主题
|
||||
|
||||
Returns:
|
||||
Meeting: 创建的会议对象
|
||||
"""
|
||||
response = self.session.post(
|
||||
f'{self.api_base}/api/v1/meetings/',
|
||||
json={'topic': topic},
|
||||
headers=self._get_headers()
|
||||
)
|
||||
|
||||
if response.status_code in [200, 201]:
|
||||
data = response.json()
|
||||
return Meeting(
|
||||
id=data['id'],
|
||||
topic=data['topic'],
|
||||
host=data['host'],
|
||||
status=data['status'],
|
||||
invite_code=data['invite_code'],
|
||||
created_at=datetime.fromisoformat(data['created_at'].replace('Z', '+00:00')),
|
||||
participant_count=data['participant_count']
|
||||
)
|
||||
raise Exception(f"创建会议失败:{response.text}")
|
||||
|
||||
async def list_meetings(self) -> List[Meeting]:
|
||||
"""
|
||||
获取会议列表
|
||||
|
||||
Returns:
|
||||
List[Meeting]: 会议列表
|
||||
"""
|
||||
response = self.session.get(
|
||||
f'{self.api_base}/api/v1/meetings/',
|
||||
headers=self._get_headers()
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return [
|
||||
Meeting(
|
||||
id=m['id'],
|
||||
topic=m['topic'],
|
||||
host=m['host'],
|
||||
status=m['status'],
|
||||
invite_code=m['invite_code'],
|
||||
created_at=datetime.fromisoformat(m['created_at'].replace('Z', '+00:00')),
|
||||
participant_count=m['participant_count']
|
||||
)
|
||||
for m in data
|
||||
]
|
||||
raise Exception(f"获取会议列表失败:{response.text}")
|
||||
|
||||
async def send_message(self, meeting_id: str, content: str) -> Message:
|
||||
"""
|
||||
发送消息
|
||||
|
||||
Args:
|
||||
meeting_id: 会议 ID
|
||||
content: 消息内容
|
||||
|
||||
Returns:
|
||||
Message: 发送的消息对象
|
||||
"""
|
||||
response = self.session.post(
|
||||
f'{self.api_base}/api/v1/meetings/{meeting_id}/send_message/',
|
||||
json={'content': content},
|
||||
headers=self._get_headers()
|
||||
)
|
||||
|
||||
if response.status_code in [200, 201]:
|
||||
data = response.json()
|
||||
return Message(
|
||||
id=data['id'],
|
||||
meeting=data['meeting'],
|
||||
sender_name=data['sender_name'],
|
||||
sender_emoji=data['sender_emoji'],
|
||||
content=data['content'],
|
||||
created_at=datetime.fromisoformat(data['created_at'].replace('Z', '+00:00'))
|
||||
)
|
||||
raise Exception(f"发送消息失败:{response.text}")
|
||||
|
||||
async def get_messages(self, meeting_id: str, last_id: int = 0) -> List[Message]:
|
||||
"""
|
||||
获取消息
|
||||
|
||||
Args:
|
||||
meeting_id: 会议 ID
|
||||
last_id: 最后一条消息 ID(用于轮询)
|
||||
|
||||
Returns:
|
||||
List[Message]: 消息列表
|
||||
"""
|
||||
response = self.session.get(
|
||||
f'{self.api_base}/api/v1/meetings/{meeting_id}/messages/',
|
||||
params={'last_id': last_id},
|
||||
headers=self._get_headers()
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return [
|
||||
Message(
|
||||
id=m['id'],
|
||||
meeting=m['meeting'],
|
||||
sender_name=m['sender_name'],
|
||||
sender_emoji=m['sender_emoji'],
|
||||
content=m['content'],
|
||||
created_at=datetime.fromisoformat(m['created_at'].replace('Z', '+00:00'))
|
||||
)
|
||||
for m in data['messages']
|
||||
]
|
||||
raise Exception(f"获取消息失败:{response.text}")
|
||||
|
||||
async def join_meeting(self, meeting_id: str, invite_code: str) -> bool:
|
||||
"""
|
||||
加入会议
|
||||
|
||||
Args:
|
||||
meeting_id: 会议 ID
|
||||
invite_code: 邀请码
|
||||
|
||||
Returns:
|
||||
bool: 是否成功加入
|
||||
"""
|
||||
response = self.session.post(
|
||||
f'{self.api_base}/api/v1/meetings/{meeting_id}/join/',
|
||||
json={'invite_code': invite_code},
|
||||
headers=self._get_headers()
|
||||
)
|
||||
|
||||
return response.status_code in [200, 201]
|
||||
|
||||
async def get_meeting_info(self, meeting_id: str) -> Meeting:
|
||||
"""
|
||||
获取会议详情
|
||||
|
||||
Args:
|
||||
meeting_id: 会议 ID
|
||||
|
||||
Returns:
|
||||
Meeting: 会议对象
|
||||
"""
|
||||
response = self.session.get(
|
||||
f'{self.api_base}/api/v1/meetings/{meeting_id}/',
|
||||
headers=self._get_headers()
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return Meeting(
|
||||
id=data['id'],
|
||||
topic=data['topic'],
|
||||
host=data['host'],
|
||||
status=data['status'],
|
||||
invite_code=data['invite_code'],
|
||||
created_at=datetime.fromisoformat(data['created_at'].replace('Z', '+00:00')),
|
||||
participant_count=data.get('participant_count', 0)
|
||||
)
|
||||
raise Exception(f"获取会议详情失败:{response.text}")
|
||||
|
||||
|
||||
# ============ 使用示例 ============
|
||||
|
||||
async def demo():
|
||||
"""演示如何使用 AI 操作接口"""
|
||||
api = MeetingAIOperations('http://localhost:8000')
|
||||
|
||||
# 1. 登录
|
||||
print("🔐 登录...")
|
||||
success = await api.login('test', 'test123')
|
||||
if not success:
|
||||
print("❌ 登录失败")
|
||||
return
|
||||
print("✅ 登录成功")
|
||||
|
||||
# 2. 创建会议
|
||||
print("\n🏛️ 创建会议...")
|
||||
meeting = await api.create_meeting('AI 自主创建的会议')
|
||||
print(f"✅ 会议已创建:{meeting.id}")
|
||||
print(f" 主题:{meeting.topic}")
|
||||
print(f" 邀请码:{meeting.invite_code}")
|
||||
|
||||
# 3. 发送消息
|
||||
print("\n💬 发送消息...")
|
||||
message = await api.send_message(meeting.id, '这是 AI 自动发送的消息!')
|
||||
print(f"✅ 消息已发送:{message.content}")
|
||||
|
||||
# 4. 获取消息
|
||||
print("\n📨 获取消息...")
|
||||
messages = await api.get_messages(meeting.id)
|
||||
print(f"✅ 共 {len(messages)} 条消息")
|
||||
for msg in messages:
|
||||
print(f" {msg.sender_name}: {msg.content}")
|
||||
|
||||
# 5. 获取会议列表
|
||||
print("\n📋 获取会议列表...")
|
||||
meetings = await api.list_meetings()
|
||||
print(f"✅ 共 {len(meetings)} 个会议")
|
||||
for m in meetings:
|
||||
print(f" {m.topic} ({m.invite_code})")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import asyncio
|
||||
asyncio.run(demo())
|
||||
Reference in New Issue
Block a user