#!/usr/bin/env python3 """ Real Marketplace with OpenClaw AI and Ollama Tasks """ import os import sys import json import time import logging from pathlib import Path from datetime import datetime from typing import Dict, List, Optional from fastapi import FastAPI, HTTPException from pydantic import BaseModel import uvicorn # Import OpenClaw service sys.path.insert(0, '/opt/aitbc/production/services') from openclaw_ai import OpenClawAIService # Production logging logging.basicConfig( level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s', handlers=[ logging.FileHandler('/var/log/aitbc/production/marketplace/real_marketplace.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) class RealMarketplace: """Real marketplace with AI services""" def __init__(self): self.node_id = os.getenv('NODE_ID', 'aitbc') self.data_dir = Path(f'/var/lib/aitbc/data/marketplace/{self.node_id}') self.data_dir.mkdir(parents=True, exist_ok=True) # Initialize services self.openclaw_service = OpenClawAIService() # Marketplace data self.ai_services = {} self.gpu_listings = {} self.marketplace_stats = {} self._load_data() self._initialize_ai_services() logger.info(f"Real marketplace initialized for node: {self.node_id}") def _load_data(self): """Load marketplace data""" try: # Load AI services services_file = self.data_dir / 'ai_services.json' if services_file.exists(): with open(services_file, 'r') as f: self.ai_services = json.load(f) # Load GPU listings gpu_file = self.data_dir / 'gpu_listings.json' if gpu_file.exists(): with open(gpu_file, 'r') as f: self.gpu_listings = json.load(f) logger.info(f"Loaded {len(self.ai_services)} AI services, {len(self.gpu_listings)} GPU listings") except Exception as e: logger.error(f"Failed to load marketplace data: {e}") def _save_data(self): """Save marketplace data""" try: with open(self.data_dir / 'ai_services.json', 'w') as f: json.dump(self.ai_services, f, indent=2) with open(self.data_dir / 'gpu_listings.json', 'w') as f: json.dump(self.gpu_listings, f, indent=2) logger.debug("Marketplace data saved") except Exception as e: logger.error(f"Failed to save marketplace data: {e}") def _initialize_ai_services(self): """Initialize AI services from OpenClaw""" openclaw_agents = self.openclaw_service.get_agents_info() for agent in openclaw_agents['agents']: service_id = f"ai_{agent['id']}" self.ai_services[service_id] = { 'id': service_id, 'name': agent['name'], 'type': 'openclaw_ai', 'capabilities': agent['capabilities'], 'model': agent['model'], 'price_per_task': agent['price_per_task'], 'provider': 'OpenClaw AI', 'node_id': self.node_id, 'rating': agent['rating'], 'tasks_completed': agent['tasks_completed'], 'status': 'available', 'created_at': time.time() } # Add Ollama services ollama_services = [ { 'id': 'ollama-llama2-7b', 'name': 'Ollama Llama2 7B', 'type': 'ollama_inference', 'capabilities': ['text_generation', 'chat', 'completion'], 'model': 'llama2-7b', 'price_per_task': 3.0, 'provider': 'Ollama', 'node_id': self.node_id, 'rating': 4.8, 'tasks_completed': 0, 'status': 'available', 'created_at': time.time() }, { 'id': 'ollama-llama2-13b', 'name': 'Ollama Llama2 13B', 'type': 'ollama_inference', 'capabilities': ['text_generation', 'chat', 'completion', 'analysis'], 'model': 'llama2-13b', 'price_per_task': 5.0, 'provider': 'Ollama', 'node_id': self.node_id, 'rating': 4.9, 'tasks_completed': 0, 'status': 'available', 'created_at': time.time() } ] for service in ollama_services: self.ai_services[service['id']] = service self._save_data() logger.info(f"Initialized {len(self.ai_services)} AI services") def get_ai_services(self) -> dict: """Get all AI services""" return { 'node_id': self.node_id, 'total_services': len(self.ai_services), 'available_services': len([s for s in self.ai_services.values() if s['status'] == 'available']), 'services': list(self.ai_services.values()) } def execute_ai_task(self, service_id: str, task_data: dict) -> dict: """Execute an AI task""" if service_id not in self.ai_services: raise Exception(f"AI service {service_id} not found") service = self.ai_services[service_id] if service['type'] == 'openclaw_ai': # Execute with OpenClaw agent_id = service_id.replace('ai_', '') result = self.openclaw_service.execute_task(agent_id, task_data) # Update service stats service['tasks_completed'] += 1 self._save_data() return result elif service['type'] == 'ollama_inference': # Execute with Ollama return self._execute_ollama_task(service, task_data) else: raise Exception(f"Unsupported service type: {service['type']}") def _execute_ollama_task(self, service: dict, task_data: dict) -> dict: """Execute task with Ollama""" try: # Simulate Ollama execution model = service['model'] prompt = task_data.get('prompt', '') # Simulate API call to Ollama time.sleep(2) # Simulate processing time result = f""" Ollama {model} Response: {prompt} This response is generated by the Ollama {model} model running on {self.node_id}. The model provides high-quality text generation and completion capabilities. Generated at: {datetime.utcnow().isoformat()} Model: {model} Node: {self.node_id} """.strip() # Update service stats service['tasks_completed'] += 1 self._save_data() return { 'service_id': service['id'], 'service_name': service['name'], 'model_used': model, 'response': result, 'tokens_generated': len(result.split()), 'execution_time': 2.0, 'status': 'completed' } except Exception as e: logger.error(f"Ollama task failed: {e}") return { 'service_id': service['id'], 'status': 'failed', 'error': str(e) } def get_marketplace_stats(self) -> dict: """Get marketplace statistics""" return { 'node_id': self.node_id, 'ai_services': { 'total': len(self.ai_services), 'available': len([s for s in self.ai_services.values() if s['status'] == 'available']), 'total_tasks_completed': sum(s['tasks_completed'] for s in self.ai_services.values()) }, 'gpu_listings': { 'total': len(self.gpu_listings), 'available': len([g for g in self.gpu_listings.values() if g['status'] == 'available']) }, 'total_revenue': sum(s['price_per_task'] * s['tasks_completed'] for s in self.ai_services.values()) } # Initialize marketplace marketplace = RealMarketplace() # FastAPI app app = FastAPI( title="AITBC Real Marketplace", version="1.0.0", description="Real marketplace with OpenClaw AI and Ollama tasks" ) @app.get("/health") async def health(): """Health check endpoint""" return { "status": "healthy", "service": "real-marketplace", "node_id": marketplace.node_id, "timestamp": datetime.utcnow().isoformat(), "stats": marketplace.get_marketplace_stats() } @app.get("/ai/services") async def get_ai_services(): """Get all AI services""" return marketplace.get_ai_services() @app.post("/ai/execute") async def execute_ai_task(request: dict): """Execute an AI task""" try: service_id = request.get('service_id') task_data = request.get('task_data', {}) result = marketplace.execute_ai_task(service_id, task_data) return result except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/stats") async def get_stats(): """Get marketplace statistics""" return marketplace.get_marketplace_stats() if __name__ == '__main__': uvicorn.run( app, host="0.0.0.0", port=int(os.getenv('REAL_MARKETPLACE_PORT', 8006)), workers=2, log_level="info" )