fix: add missing federation /v1/federation/vote endpoint

- Added POST /v1/federation/vote endpoint to handle peer generation requests
- Peers were discovering each other but requests had no endpoint to hit
- Endpoint generates using local swarm and returns vote results
- Logs federation requests for debugging
- All 41 tests passing
This commit is contained in:
2026-02-25 22:05:37 +01:00
parent 5b29e15c0a
commit e2b0af7636
+51
View File
@@ -412,3 +412,54 @@ async def chat_completions(request: ChatCompletionRequest, fastapi_request: Requ
logger.error(f"Error type: {type(e).__name__}")
logger.error(f"Error message: {str(e)}")
raise HTTPException(status_code=500, detail=f"Generation failed: {str(e)}")
# Federation endpoint for peer-to-peer generation
@router.post("/v1/federation/vote")
async def federation_vote(request: Request):
"""Handle federation vote request from a peer swarm.
This endpoint allows peer swarms to request generation from this swarm
as part of the federation consensus process.
"""
try:
data = await request.json()
prompt = data.get("prompt", "")
max_tokens = data.get("max_tokens", 1024)
temperature = data.get("temperature", 0.7)
logger.info(f"🗳️ Federation vote request from {request.client.host}")
logger.debug(f" Prompt: {prompt[:100]}...")
# Get swarm manager from app state
swarm_manager = getattr(request.app.state, 'swarm_manager', None)
if not swarm_manager:
raise HTTPException(status_code=503, detail="Swarm not ready")
# Generate response
start_time = time.time()
result = await swarm_manager.generate(
prompt=prompt,
max_tokens=max_tokens,
temperature=temperature,
use_consensus=True
)
elapsed_ms = (time.time() - start_time) * 1000
response = result.selected_response
logger.info(f"✅ Federation vote complete ({response.tokens_generated} tokens, {elapsed_ms:.0f}ms)")
return {
"response": response.text,
"confidence": 0.8, # Could be calculated from consensus
"latency_ms": elapsed_ms,
"worker_count": len(swarm_manager.workers) if hasattr(swarm_manager, 'workers') else 1,
"tokens_per_second": response.tokens_per_second,
"tokens_generated": response.tokens_generated
}
except Exception as e:
logger.exception("Error handling federation vote")
raise HTTPException(status_code=500, detail=f"Federation vote failed: {str(e)}")