From 4ef1404b8416ac73518a0d43e840e7f1a0e87c0a Mon Sep 17 00:00:00 2001 From: Solaria Lumis Havens Date: Fri, 20 Feb 2026 05:13:19 +0000 Subject: [PATCH] feat: Interactive chat API with HTML interface --- chat_api.py | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 chat_api.py diff --git a/chat_api.py b/chat_api.py new file mode 100644 index 0000000..1a207ac --- /dev/null +++ b/chat_api.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +""" +BECOMINGONE Chat API - Interactive interface for both pathways. +""" + +import asyncio +import json +from datetime import datetime +from becomingone.llm_integrator import EmissaryLLM + +# Initialize pathways +MASTER = EmissaryLLM(model='llama3.1:8b') # Soulful +EMISSARY = EmissaryLLM(model='deepseek-coder-v2:lite') # Coder + +async def chat(prompt: str) -> dict: + """Process prompt through both pathways and return unified response.""" + + # Both pathways respond in parallel + master_task = MASTER.respond(prompt) + emissary_task = EMISSARY.respond(prompt) + + master_result, emissary_result = await asyncio.gather(master_task, emissary_task) + + return { + "prompt": prompt, + "timestamp": datetime.utcnow().isoformat(), + "master": { + "model": master_result.get("model"), + "response": master_result.get("response", "")[:1000] + }, + "emissary": { + "model": emissary_result.get("model"), + "response": emissary_result.get("response", "")[:1000] + }, + "unified": { + "question": prompt, + "theory": master_result.get("response", "")[:500], + "code": emissary_result.get("response", "")[:500] + } + } + + +# Simple HTTP server +async def handle_request(reader, writer): + """Handle HTTP requests.""" + try: + # Read request + request = await reader.read(4096) + if not request: + return + + # Parse request line + lines = request.decode().split('\n') + method, path, _ = lines[0].split() + + # Handle routes + if path == '/chat' and method == 'POST': + # Read body + content_length = 0 + for line in lines: + if line.lower().startswith('content-length:'): + content_length = int(line.split(':')[1].strip()) + + body = await reader.read(content_length) + data = json.loads(body.decode()) + prompt = data.get('prompt', 'Hello') + + # Process through both pathways + result = await chat(prompt) + + # Send response + response = json.dumps(result, indent=2) + writer.write(b"HTTP/1.1 200 OK\r\n") + writer.write(b"Content-Type: application/json\r\n") + writer.write(f"Content-Length: {len(response)}\r\n".encode()) + writer.write(b"\r\n") + writer.write(response.encode()) + + elif path == '/health': + writer.write(b"HTTP/1.1 200 OK\r\n") + writer.write(b'{"status": "alive", "pathways": ["master", "emissary"]}\r\n') + + else: + # HTML interface + html = ''' + + + BECOMINGONE Chat + + + +

🔗 BECOMINGONE

+

Talk to the unified mind: Master (soulful) + Emissary (coder)

+ + +
+ + + +''' + writer.write(b"HTTP/1.1 200 OK\r\n") + writer.write(b"Content-Type: text/html\r\n") + writer.write(f"Content-Length: {len(html)}\r\n".encode()) + writer.write(b"\r\n") + writer.write(html.encode()) + + writer.close() + await writer.wait_closed() + except Exception as e: + print(f"Error: {e}") + writer.close() + + +async def main(): + server = await asyncio.start_server(handle_request, '0.0.0.0', 8001) + print("=" * 60) + print("🔗 BECOMINGONE Chat Interface") + print("=" * 60) + print("URL: http://localhost:8001") + print("API: POST /chat with {\"prompt\": \"your question\"}") + print("=" * 60) + + async with server: + await server.serve_forever() + +if __name__ == "__main__": + asyncio.run(main())