Files
aitbc/apps/agent-services/agent-registry/src/app.py
aitbc 5ee4f07140 refactor: move Agent Registry and AI Service to AI/Agent/GPU section
Agent Services Reorganization - Complete:
 AGENT SERVICES MOVED: Moved Agent Registry and AI Service to appropriate section
- apps/agent-services/agent-registry/src/app.py: Changed port from 8003 to 8012
- setup.sh: Moved Agent Registry from Core Services to AI/Agent/GPU Services
- setup.sh: Moved AI Service from Core Services to AI/Agent/GPU Services
- setup.sh: Updated health check to use port 8012 for Agent Registry
- Reason: Agent services belong in AI/Agent/GPU category

 UPDATED PORT ALLOCATION:
🔧 Core Services (8000-8009):
  8000: Coordinator API 
  8001: Exchange API 
  8003: Wallet API  (conflict resolved)
  8004: Modality Optimization 
  8005: Explorer 
  8008: Now available (was Agent Registry)
  8009: Now available (was AI Service)

🚀 AI/Agent/GPU Services (8010-8019):
  8010: GPU Service + Learning Service (conflict) ⚠️
  8011: Agent Coordinator 
  8012: Agent Registry  (MOVED from 8003)
  8009: AI Service  (MOVED from Core, but stays on 8009)
  8016: Web UI 

📊 Other Services (8020-8029):
  8020: Multimodal Service 
  8007: OpenClaw Service (out of range)
  8021: Marketplace API 

 PORT CONFLICTS RESOLVED:
 Port 8003: Now free for Wallet API only
 Port 8012: Assigned to Agent Registry (AI/Agent range)
 Port 8009: AI Service stays, now properly categorized

 SERVICE CATEGORIZATION IMPROVED:
🔧 Core Services: Truly core blockchain/API services (6 services)
🚀 AI/Agent/GPU: All AI, agent, and GPU services (6 services)
📊 Other Services: Specialized services (3 services)

 LOGICAL GROUPING BENEFITS:
 Agent Services Together: Agent Coordinator, Agent Registry, AI Service
 Core Services Focused: Essential blockchain and API services only
 Better Organization: Services grouped by actual function
 Port Range Compliance: Services follow port allocation strategy

 REMAINING ISSUES:
⚠️ Port 8010 Conflict: GPU Service and Learning Service both use port 8010
⚠️ Port 8007 Out of Range: OpenClaw Service should be moved to 8010-8019 range
⚠️ Port 8008 Available: Could be used for new core service

 HEALTH CHECK ORGANIZATION:
🔧 Core Services (6): Coordinator, Exchange, Wallet, Modality Opt, Explorer
🚀 AI/Agent/GPU Services (6): GPU, Learning, Agent Coord, Agent Registry, AI, Web UI
📊 Other Services (3): Multimodal, OpenClaw, Marketplace

RESULT: Successfully moved Agent Registry and AI Service to AI/Agent/GPU Services section. This improves logical organization and resolves the port 8003 conflict. Port 8008 is now available in Core Services range. The AI/Agent/GPU section now contains all agent-related services together.
2026-03-30 18:16:57 +02:00

146 lines
3.9 KiB
Python

#!/usr/bin/env python3
"""
AITBC Agent Registry Service
Central agent discovery and registration system
"""
from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel
from typing import List, Optional, Dict, Any
import json
import time
import uuid
from datetime import datetime, timedelta
import sqlite3
from contextlib import contextmanager
app = FastAPI(title="AITBC Agent Registry API", version="1.0.0")
# Database setup
def get_db():
conn = sqlite3.connect('agent_registry.db')
conn.row_factory = sqlite3.Row
return conn
@contextmanager
def get_db_connection():
conn = get_db()
try:
yield conn
finally:
conn.close()
# Initialize database
def init_db():
with get_db_connection() as conn:
conn.execute('''
CREATE TABLE IF NOT EXISTS agents (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
type TEXT NOT NULL,
capabilities TEXT NOT NULL,
chain_id TEXT NOT NULL,
endpoint TEXT NOT NULL,
status TEXT DEFAULT 'active',
last_heartbeat TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
metadata TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
# Models
class Agent(BaseModel):
id: str
name: str
type: str
capabilities: List[str]
chain_id: str
endpoint: str
metadata: Optional[Dict[str, Any]] = {}
class AgentRegistration(BaseModel):
name: str
type: str
capabilities: List[str]
chain_id: str
endpoint: str
metadata: Optional[Dict[str, Any]] = {}
# API Endpoints
@app.on_event("startup")
async def startup_event():
init_db()
@app.post("/api/agents/register", response_model=Agent)
async def register_agent(agent: AgentRegistration):
"""Register a new agent"""
agent_id = str(uuid.uuid4())
with get_db_connection() as conn:
conn.execute('''
INSERT INTO agents (id, name, type, capabilities, chain_id, endpoint, metadata)
VALUES (?, ?, ?, ?, ?, ?, ?)
''', (
agent_id, agent.name, agent.type,
json.dumps(agent.capabilities), agent.chain_id,
agent.endpoint, json.dumps(agent.metadata)
))
conn.commit()
return Agent(
id=agent_id,
name=agent.name,
type=agent.type,
capabilities=agent.capabilities,
chain_id=agent.chain_id,
endpoint=agent.endpoint,
metadata=agent.metadata
)
@app.get("/api/agents", response_model=List[Agent])
async def list_agents(
agent_type: Optional[str] = None,
chain_id: Optional[str] = None,
capability: Optional[str] = None
):
"""List registered agents with optional filters"""
with get_db_connection() as conn:
query = "SELECT * FROM agents WHERE status = 'active'"
params = []
if agent_type:
query += " AND type = ?"
params.append(agent_type)
if chain_id:
query += " AND chain_id = ?"
params.append(chain_id)
if capability:
query += " AND capabilities LIKE ?"
params.append(f'%{capability}%')
agents = conn.execute(query, params).fetchall()
return [
Agent(
id=agent["id"],
name=agent["name"],
type=agent["type"],
capabilities=json.loads(agent["capabilities"]),
chain_id=agent["chain_id"],
endpoint=agent["endpoint"],
metadata=json.loads(agent["metadata"] or "{}")
)
for agent in agents
]
@app.get("/api/health")
async def health_check():
"""Health check endpoint"""
return {"status": "ok", "timestamp": datetime.utcnow()}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8012)