71 lines
1.7 KiB
Python
71 lines
1.7 KiB
Python
"""PhoneWork entry point: FastAPI app + Feishu long-connection client."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import logging
|
|
|
|
import uvicorn
|
|
from fastapi import FastAPI
|
|
from rich.logging import RichHandler
|
|
|
|
from agent.manager import manager
|
|
from bot.handler import start_websocket_client
|
|
|
|
logging.basicConfig(
|
|
level=logging.DEBUG,
|
|
format="%(name)-20s %(message)s",
|
|
datefmt="[%X]",
|
|
handlers=[RichHandler(
|
|
rich_tracebacks=True,
|
|
markup=True,
|
|
show_path=False,
|
|
omit_repeated_times=False,
|
|
)],
|
|
)
|
|
# Suppress noisy third-party debug output
|
|
for _noisy in ("httpcore", "httpx", "openai._base_client", "urllib3", "lark_oapi", "websockets"):
|
|
logging.getLogger(_noisy).setLevel(logging.WARNING)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
app = FastAPI(title="PhoneWork", version="0.1.0")
|
|
|
|
|
|
@app.get("/health")
|
|
async def health() -> dict:
|
|
sessions = manager.list_sessions()
|
|
return {"status": "ok", "active_sessions": len(sessions)}
|
|
|
|
|
|
@app.get("/sessions")
|
|
async def list_sessions() -> list:
|
|
return manager.list_sessions()
|
|
|
|
|
|
@app.on_event("startup")
|
|
async def startup_event() -> None:
|
|
# Start the session manager's idle-reaper
|
|
await manager.start()
|
|
|
|
# Start the Feishu WebSocket client in a background thread,
|
|
# passing the running event loop so async work can be scheduled
|
|
loop = asyncio.get_event_loop()
|
|
start_websocket_client(loop)
|
|
logger.info("PhoneWork started")
|
|
|
|
|
|
@app.on_event("shutdown")
|
|
async def shutdown_event() -> None:
|
|
await manager.stop()
|
|
logger.info("PhoneWork shut down")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
uvicorn.run(
|
|
"main:app",
|
|
host="0.0.0.0",
|
|
port=8000,
|
|
reload=False,
|
|
log_level="info",
|
|
)
|