Initial commit: Egregore db service
PostgreSQL message storage API with asyncpg connection pooling and full-text search. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
commit
291d664051
5 changed files with 686 additions and 0 deletions
116
main.py
Normal file
116
main.py
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Egregore DB Service - Message storage API
|
||||
|
||||
Provides HTTP API for message storage and retrieval.
|
||||
Runs on port 8082.
|
||||
"""
|
||||
|
||||
import os
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import FastAPI, Query
|
||||
from pydantic import BaseModel
|
||||
|
||||
from messages import (
|
||||
init_db,
|
||||
save_message,
|
||||
save_response_blocks,
|
||||
get_messages,
|
||||
get_conversation_history,
|
||||
search_messages,
|
||||
close_pool,
|
||||
)
|
||||
|
||||
app = FastAPI(title="Egregore DB Service", docs_url="/docs")
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await init_db()
|
||||
|
||||
|
||||
@app.on_event("shutdown")
|
||||
async def shutdown():
|
||||
await close_pool()
|
||||
|
||||
|
||||
# Request models
|
||||
class SaveMessageRequest(BaseModel):
|
||||
role: str
|
||||
content: str
|
||||
msg_type: str = "text"
|
||||
group_id: Optional[str] = None
|
||||
metadata: Optional[dict] = None
|
||||
priority: Optional[int] = None
|
||||
|
||||
|
||||
class SaveBlocksRequest(BaseModel):
|
||||
blocks: list
|
||||
group_id: str
|
||||
|
||||
|
||||
# Endpoints
|
||||
@app.post("/messages")
|
||||
async def api_save_message(req: SaveMessageRequest):
|
||||
"""Save a single message"""
|
||||
msg_id = await save_message(
|
||||
role=req.role,
|
||||
content=req.content,
|
||||
msg_type=req.msg_type,
|
||||
group_id=req.group_id,
|
||||
metadata=req.metadata,
|
||||
priority=req.priority
|
||||
)
|
||||
return {"id": msg_id}
|
||||
|
||||
|
||||
@app.post("/messages/blocks")
|
||||
async def api_save_blocks(req: SaveBlocksRequest):
|
||||
"""Save multiple response blocks"""
|
||||
saved = await save_response_blocks(req.blocks, req.group_id)
|
||||
return {"messages": saved}
|
||||
|
||||
|
||||
@app.get("/messages")
|
||||
async def api_get_messages(
|
||||
limit: int = 50,
|
||||
before: Optional[int] = None,
|
||||
msg_type: Optional[str] = Query(None, alias="type")
|
||||
):
|
||||
"""Get messages with pagination"""
|
||||
messages, has_more = await get_messages(
|
||||
limit=min(limit, 100),
|
||||
before_id=before,
|
||||
msg_type=msg_type
|
||||
)
|
||||
return {"messages": messages, "has_more": has_more}
|
||||
|
||||
|
||||
@app.get("/messages/history")
|
||||
async def api_get_history(limit: int = 100):
|
||||
"""Get conversation history in Claude API format"""
|
||||
history = await get_conversation_history(limit=limit)
|
||||
return {"history": history}
|
||||
|
||||
|
||||
@app.get("/messages/search")
|
||||
async def api_search(
|
||||
q: str,
|
||||
limit: int = 20,
|
||||
msg_type: Optional[str] = Query(None, alias="type")
|
||||
):
|
||||
"""Search messages by content"""
|
||||
results = await search_messages(q, limit=limit, msg_type=msg_type)
|
||||
return {"results": results}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
async def health():
|
||||
"""Health check endpoint"""
|
||||
return {"status": "ok", "service": "db"}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="127.0.0.1", port=8082)
|
||||
Loading…
Add table
Add a link
Reference in a new issue