Initial commit: Egregore brain service
AI logic with Claude API integration, tool execution, and system prompts. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
commit
5710c44821
6 changed files with 906 additions and 0 deletions
90
main.py
Normal file
90
main.py
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Egregore Brain Service - AI reasoning API
|
||||
|
||||
Provides HTTP API for conversation processing with Claude.
|
||||
Runs on port 8081.
|
||||
"""
|
||||
|
||||
import os
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from dotenv import load_dotenv
|
||||
import anthropic
|
||||
|
||||
from tools import TOOLS, execute_tool
|
||||
from prompts import get_system_prompt
|
||||
from conversation import process_conversation
|
||||
|
||||
# Load environment
|
||||
load_dotenv("/home/admin/.env")
|
||||
|
||||
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
|
||||
if not ANTHROPIC_API_KEY:
|
||||
raise ValueError("ANTHROPIC_API_KEY not set")
|
||||
|
||||
app = FastAPI(title="Egregore Brain Service", docs_url="/docs")
|
||||
|
||||
# Initialize Anthropic client
|
||||
client = anthropic.AsyncAnthropic(api_key=ANTHROPIC_API_KEY)
|
||||
|
||||
|
||||
# Request models
|
||||
class ProcessRequest(BaseModel):
|
||||
model: str = "claude-sonnet-4-20250514"
|
||||
history: list # Conversation history in Claude API format
|
||||
max_iterations: int = 10
|
||||
|
||||
|
||||
class ToolRequest(BaseModel):
|
||||
name: str
|
||||
input: dict
|
||||
|
||||
|
||||
# Endpoints
|
||||
@app.post("/process")
|
||||
async def api_process(req: ProcessRequest):
|
||||
"""Process a conversation with tool use loop"""
|
||||
try:
|
||||
response_blocks = await process_conversation(
|
||||
client=client,
|
||||
model=req.model,
|
||||
history=req.history,
|
||||
max_iterations=req.max_iterations
|
||||
)
|
||||
return {"blocks": response_blocks}
|
||||
except anthropic.APIError as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@app.post("/tool")
|
||||
async def api_execute_tool(req: ToolRequest):
|
||||
"""Execute a single tool directly"""
|
||||
result = await execute_tool(req.name, req.input)
|
||||
return {"result": result}
|
||||
|
||||
|
||||
@app.get("/tools")
|
||||
async def api_get_tools():
|
||||
"""Get available tool definitions"""
|
||||
return {"tools": TOOLS}
|
||||
|
||||
|
||||
@app.get("/prompt")
|
||||
async def api_get_prompt():
|
||||
"""Get current system prompt with context"""
|
||||
prompt = await get_system_prompt()
|
||||
return {"prompt": prompt}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
async def health():
|
||||
"""Health check endpoint"""
|
||||
return {"status": "ok", "service": "brain"}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
uvicorn.run(app, host="127.0.0.1", port=8081)
|
||||
Loading…
Add table
Add a link
Reference in a new issue