#!/usr/bin/env python3 """ Test the AITBC Ollama Plugin """ import asyncio import subprocess import time from client_plugin import OllamaClient def test_ollama_service(): """Test Ollama service directly""" print("šŸ” Testing Ollama Service...") # Test Ollama is running result = subprocess.run( ["curl", "-s", "http://localhost:11434/api/tags"], capture_output=True, text=True ) if result.returncode == 0: import json data = json.loads(result.stdout) print(f"āœ… Ollama is running with {len(data['models'])} models") return True else: print("āŒ Ollama is not running") return False def test_plugin_service(): """Test the plugin service""" print("\nšŸ”Œ Testing Plugin Service...") from service import handle_request async def test(): # Test list models result = await handle_request({"action": "list_models"}) if result["success"]: print(f"āœ… Plugin found {len(result['models'])} models") else: print(f"āŒ Failed to list models: {result}") return False # Test generation result = await handle_request({ "action": "generate", "model": "llama3.2:latest", "prompt": "What is AITBC in one sentence?", "max_tokens": 50 }) if result["success"]: print(f"āœ… Generated text:") print(f" {result['text'][:100]}...") print(f" Cost: {result['cost']} AITBC") else: print(f"āŒ Generation failed: {result}") return False return True return asyncio.run(test()) def test_client_miner_flow(): """Test client submits job, miner processes it""" print("\nšŸ”„ Testing Client-Miner Flow...") # Create client client = OllamaClient("http://localhost:8001", "${CLIENT_API_KEY}") # Submit a job print("1. Submitting inference job...") job_id = client.submit_generation( model="llama3.2:latest", prompt="Explain blockchain in simple terms", max_tokens=100 ) if not job_id: print("āŒ Failed to submit job") return False print(f"āœ… Job submitted: {job_id}") # Start miner in background (simplified) print("\n2. Starting Ollama miner...") miner_cmd = [ "python3", "miner_plugin.py", "http://localhost:8001", "${MINER_API_KEY}", "ollama-miner-test" ] miner_process = subprocess.Popen( miner_cmd, cwd="/home/oib/windsurf/aitbc/plugins/ollama", stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # Wait a bit for miner to process time.sleep(10) # Check job status print("\n3. Checking job status...") status = client.get_job_status(job_id) if status: print(f" State: {status['state']}") print(f" Miner: {status.get('assigned_miner_id', 'None')}") if status['state'] == 'completed': print(f"āœ… Job completed!") result = status.get('result', {}) print(f" Output: {result.get('output', '')[:200]}...") print(f" Cost: {result.get('cost', 0)} AITBC") # Stop miner miner_process.terminate() miner_process.wait() return True def main(): print("šŸš€ AITBC Ollama Plugin Test Suite") print("=" * 60) # Test 1: Ollama service if not test_ollama_service(): print("\nāŒ Please start Ollama first: ollama serve") return # Test 2: Plugin service if not test_plugin_service(): print("\nāŒ Plugin service test failed") return # Test 3: Client-miner flow if not test_client_miner_flow(): print("\nāŒ Client-miner flow test failed") return print("\nāœ… All tests passed!") print("\nšŸ’” To use the Ollama plugin:") print(" 1. Start mining: python3 plugins/ollama/miner_plugin.py") print(" 2. Submit jobs: python3 plugins/ollama/client_plugin.py generate llama3.2:latest 'Your prompt'") print(" 3. Check earnings: cd home/miner && python3 wallet.py balance") if __name__ == "__main__": main()