|
|
""" |
|
|
通讯API路由 |
|
|
""" |
|
|
|
|
|
from fastapi import APIRouter, HTTPException |
|
|
from pydantic import BaseModel |
|
|
from typing import List |
|
|
import uuid |
|
|
from datetime import datetime |
|
|
|
|
|
from ...core import EntityInfo, Message, RedisAdapter |
|
|
|
|
|
router = APIRouter() |
|
|
|
|
|
|
|
|
entities: dict[str, EntityInfo] = {} |
|
|
adapters: dict[str, RedisAdapter] = {} |
|
|
|
|
|
|
|
|
class EntityCreate(BaseModel): |
|
|
name: str |
|
|
redis_host: str = "localhost" |
|
|
redis_port: int = 6379 |
|
|
redis_db: int = 0 |
|
|
|
|
|
|
|
|
class MessageSend(BaseModel): |
|
|
sender_id: str |
|
|
receiver_id: str |
|
|
content: str |
|
|
|
|
|
|
|
|
class MessageResponse(BaseModel): |
|
|
sender_id: str |
|
|
receiver_id: str |
|
|
timestamp: str |
|
|
content: str |
|
|
|
|
|
|
|
|
@router.post("/entities", response_model=dict) |
|
|
async def create_entity(entity: EntityCreate): |
|
|
"""创建新实体""" |
|
|
entity_id = str(uuid.uuid4()) |
|
|
channel = entity_id |
|
|
|
|
|
entity_info = EntityInfo( |
|
|
id=entity_id, |
|
|
name=entity.name, |
|
|
redis_host=entity.redis_host, |
|
|
redis_port=entity.redis_port, |
|
|
redis_db=entity.redis_db, |
|
|
channel=channel |
|
|
) |
|
|
|
|
|
entities[entity_id] = entity_info |
|
|
|
|
|
return { |
|
|
"id": entity_id, |
|
|
"name": entity.name, |
|
|
"status": "created" |
|
|
} |
|
|
|
|
|
|
|
|
@router.get("/entities", response_model=List[dict]) |
|
|
async def list_entities(): |
|
|
"""获取所有实体列表""" |
|
|
return [ |
|
|
{ |
|
|
"id": entity_id, |
|
|
"name": entity.name, |
|
|
"redis_host": entity.redis_host, |
|
|
"redis_port": entity.redis_port, |
|
|
"redis_db": entity.redis_db |
|
|
} |
|
|
for entity_id, entity in entities.items() |
|
|
] |
|
|
|
|
|
|
|
|
@router.post("/entities/{entity_id}/start") |
|
|
async def start_entity(entity_id: str): |
|
|
"""启动实体通讯""" |
|
|
if entity_id not in entities: |
|
|
raise HTTPException(status_code=404, detail="Entity not found") |
|
|
|
|
|
if entity_id in adapters: |
|
|
raise HTTPException(status_code=400, detail="Entity already started") |
|
|
|
|
|
adapter = RedisAdapter(entities[entity_id]) |
|
|
if adapter.start(): |
|
|
adapters[entity_id] = adapter |
|
|
return {"status": "started"} |
|
|
else: |
|
|
raise HTTPException(status_code=500, detail="Failed to start entity") |
|
|
|
|
|
|
|
|
@router.post("/entities/{entity_id}/stop") |
|
|
async def stop_entity(entity_id: str): |
|
|
"""停止实体通讯""" |
|
|
if entity_id not in adapters: |
|
|
raise HTTPException(status_code=404, detail="Entity not started") |
|
|
|
|
|
adapters[entity_id].stop() |
|
|
del adapters[entity_id] |
|
|
|
|
|
return {"status": "stopped"} |
|
|
|
|
|
|
|
|
@router.post("/messages/send") |
|
|
async def send_message(message: MessageSend): |
|
|
"""发送消息""" |
|
|
if message.sender_id not in adapters: |
|
|
raise HTTPException(status_code=404, detail="Sender not started") |
|
|
|
|
|
if message.receiver_id not in entities: |
|
|
raise HTTPException(status_code=404, detail="Receiver not found") |
|
|
|
|
|
adapter = adapters[message.sender_id] |
|
|
success = adapter.send_message(message.receiver_id, message.content) |
|
|
|
|
|
if success: |
|
|
return {"status": "sent"} |
|
|
else: |
|
|
raise HTTPException(status_code=500, detail="Failed to send message") |
|
|
|
|
|
|
|
|
@router.get("/entities/{entity_id}/messages", response_model=List[MessageResponse]) |
|
|
async def get_entity_messages(entity_id: str): |
|
|
"""获取实体的消息历史(临时存储,演示用)""" |
|
|
|
|
|
return [] |