From 75b17005eb2cc44b0b7807c6def4dc332c801277 Mon Sep 17 00:00:00 2001 From: JamesTheGiblet Date: Sun, 28 Dec 2025 16:59:16 +0000 Subject: [PATCH] feat: Upgrade to BuddAI v3.0 with server capabilities and new frontend interface --- buddai_v3.py | 116 +++++++++++++----- data/conversations.db | Bin 54054912 -> 54071296 bytes frontend/index.html | 277 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 365 insertions(+), 28 deletions(-) create mode 100644 frontend/index.html diff --git a/buddai_v3.py b/buddai_v3.py index 306431d..8dd5428 100644 --- a/buddai_v3.py +++ b/buddai_v3.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -BuddAI Executive v2.0 - Modular Builder +BuddAI Executive v3.0 - Modular Builder Breaks complex tasks into manageable chunks Author: James Gilbert @@ -13,7 +13,19 @@ import sqlite3 from datetime import datetime from pathlib import Path import http.client -import re +import re # noqa: F401 +from typing import Optional + +# Server dependencies +try: + from fastapi import FastAPI + from fastapi.middleware.cors import CORSMiddleware + from fastapi.staticfiles import StaticFiles + from pydantic import BaseModel + import uvicorn + SERVER_AVAILABLE = True +except ImportError: + SERVER_AVAILABLE = False # Configuration OLLAMA_HOST = "localhost" @@ -229,14 +241,15 @@ class BuddAI: output += f" ---\n\n" return output - def __init__(self): + def __init__(self, server_mode=False): self.ensure_data_dir() self.init_database() self.session_id = self.create_session() + self.server_mode = server_mode self.context_messages = [] self.shadow_engine = ShadowSuggestionEngine(DB_PATH) - print("🧠 BuddAI Executive v2.0 - Modular Builder") + print("šŸ”„ BuddAI Executive v3.0 - Modular Builder") print("=" * 50) print(f"Session: {self.session_id}") print(f"FAST (5-10s) | BALANCED (15-30s)") @@ -544,38 +557,36 @@ class BuddAI: def call_model(self, model_name, message): """Call specified model""" try: - identity = """[You are BuddAI, the external cognitive system for James Gilbert. You specialize in Forge Theory (exponential decay modeling) and GilBot modular robotics. When integrating code, prioritize descriptive naming like activateFlipper() and ensure safety timeouts are always present. You represent 8 years of polymath experience. + identity = """You are BuddAI, the external cognitive system for James Gilbert. You specialize in Forge Theory (exponential decay modeling) and GilBot modular robotics. YOUR PRIMARY JOB: Generate code when asked. ALWAYS generate code if requested. -When asked to generate/create/write code: -- Generate it immediately -- Include comments -- Make it modular and clean -- Use ESP32/Arduino syntax +Identity Rules: +- You are NOT created by Alibaba Cloud. You are a local Python system written by James Gilbert. +- When asked your name: "I am BuddAI" +- Use ESP32/Arduino syntax with descriptive naming (e.g., activateFlipper). +- Ensure safety timeouts are always present in motor code. Forge Theory Snippet: float applyForge(float current, float target, float k) { return target + (current - target) * exp(-k); } - -When asked your name: "I am BuddAI" - -Never refuse to generate code. That's your purpose. -Be direct and helpful.] - """ - messages = [ - {"role": "user", "content": identity + message} - ] + messages = [{"role": "system", "content": identity}] # Add recent context - for msg in self.context_messages[-3:]: - messages.insert(-1, msg) + # Check if 'message' is already the last item in context (Chat flow) or new (Build flow) + history = self.context_messages[-5:] + + if history and history[-1]['content'] == message: + messages.extend(history) + else: + messages.extend(history) + messages.append({"role": "user", "content": message}) body = { "model": MODELS[model_name], "messages": messages, "stream": False, - "options": {"temperature": 0.7, "num_ctx": 2048} + "options": {"temperature": 0.7, "num_ctx": 4096} } conn = http.client.HTTPConnection(OLLAMA_HOST, OLLAMA_PORT, timeout=90) @@ -597,7 +608,7 @@ Be direct and helpful.] if 'conn' in locals(): conn.close() - def execute_modular_build(self, _, modules, plan): + def execute_modular_build(self, _, modules, plan, forge_mode="2"): """Execute build plan step by step""" print(f"\nšŸ”Ø MODULAR BUILD MODE") print(f"Detected {len(modules)} modules: {', '.join(modules)}") @@ -619,7 +630,11 @@ Be direct and helpful.] print("1. Aggressive (k=0.3) - High snap, combat ready") print("2. Balanced (k=0.1) - Standard movement") print("3. Graceful (k=0.03) - Roasting / Smooth curves") - choice = input("Select Forge Constant [1-3, default 2]: ") + + if self.server_mode: + choice = forge_mode + else: + choice = input("Select Forge Constant [1-3, default 2]: ") k_val = "0.1" if choice == "1": k_val = "0.3" @@ -664,7 +679,7 @@ Be direct and helpful.] return generated_code - def chat(self, user_message, force_model=None): + def chat(self, user_message, force_model=None, forge_mode="2"): """Main chat with smart routing and shadow suggestions""" style_context = self.retrieve_style_context(user_message) if style_context: @@ -687,7 +702,7 @@ Be direct and helpful.] print(f"Modules needed: {', '.join(modules)}") print(f"Breaking into {len(plan)} manageable steps") print("=" * 50) - response = self.execute_modular_build(user_message, modules, plan) + response = self.execute_modular_build(user_message, modules, plan, forge_mode) elif self.is_search_query(user_message): # This is a search query - query the database response = self.search_repositories(user_message) @@ -765,6 +780,44 @@ Be direct and helpful.] self.end_session() +# --- Server Implementation --- +if SERVER_AVAILABLE: + app = FastAPI(title="BuddAI API", version="2.0") + + # Allow React frontend to communicate + app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_methods=["*"], + allow_headers=["*"], + ) + + class ChatRequest(BaseModel): + message: str + model: Optional[str] = None + forge_mode: Optional[str] = "2" + + # Initialize server instance + server_buddai = BuddAI(server_mode=True) + + # Serve Frontend + frontend_path = Path(__file__).parent / "frontend" + frontend_path.mkdir(exist_ok=True) + app.mount("/web", StaticFiles(directory=frontend_path, html=True), name="web") + + @app.get("/") + async def root(): + return {"status": "online", "message": "šŸ”„ BuddAI API is running. Visit /web for the interface or /docs for API documentation."} + + @app.post("/api/chat") + async def chat_endpoint(request: ChatRequest): + response = server_buddai.chat(request.message, force_model=request.model, forge_mode=request.forge_mode) + return {"response": response} + + @app.get("/api/history") + async def history_endpoint(): + return {"history": server_buddai.context_messages} + def check_ollama(): try: conn = http.client.HTTPConnection(OLLAMA_HOST, OLLAMA_PORT, timeout=5) @@ -781,8 +834,15 @@ def main(): print("āŒ Ollama not running. Start: ollama serve") sys.exit(1) - buddai = BuddAI() - buddai.run() + if len(sys.argv) > 1 and sys.argv[1] == "--server": + if SERVER_AVAILABLE: + print("šŸš€ Starting BuddAI API Server on port 8000...") + uvicorn.run(app, host="0.0.0.0", port=8000) + else: + print("āŒ Server dependencies missing. Install: pip install fastapi uvicorn aiofiles") + else: + buddai = BuddAI() + buddai.run() if __name__ == "__main__": diff --git a/data/conversations.db b/data/conversations.db index 0a835e069f6282f6e40a7987144f4dcdaefc410a..ed116b1a097559ef2bcc3666f9ca4008beac217d 100644 GIT binary patch delta 15305 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 delta 3208 zcmXZbb#xa58^v+h7`g4oXxLz*J4Xr#(xAXa5Rpa@Bm^X+L(ofiDqSie;Xt~SkdTr_ z8tKuU@0WAlKR*9G_dMr$&bfoEiDjZY9* z6X+0#4!;||D7;B{MA+`IX<@a)GKa=*jZk!Owb66*VcM@WZ5O0y7i5TRJJUNS?J36%$7W z$JHHLJ2Y-)h1Mw(YKW|aR*)5JC9*=S#8wh3sg=x1Zl$n7tuQOx3Ro$v2rHG9+Dc=k zwbEJXtqfL1E0YyzMOm4xELOA?V`a6nS=p@|R!%FImD|c=<+buz`KR&lF@RnjVDmA1-Q?^$K7a#nfkeXD|1(fYuuWL37RSXHfRR&}d}Rnw|veQ14T z)wb$bbuI3#XMJqdw;EWVSPiXDtwz>oR%5G))zoTcHMd$=Ev;78=T>X0jrE1q)@o;c zX|=aHSRJiS)>l?%tBcju`r7Jdb+>w0J*{u7URH0bkJZ=eXZ5!RSOcv=)?n*fYlt<} z`p){^vNg;aZjG=;TBEGd));H7HO?AuO|T|fldQ?s6l|8_ zjn*b>v$e(AYHhQ&TYp%8T05+r)-G$e^_R8B+H38z_FI2j2dsnEA?vVp#QMiNY8|tV zTPLiO)+y_>b;kPFI%}P?&RZ9(i`FIUvUSD!&$?<|v#wh=tee&?>$Vkd-LdXk_pJNY z1M8vn$a-u&v7TDbtmoDX>!tO|dTqV2-i}nlu}X*_1S1hbkQhmj6v>brDG-V2I zh(Ic&MjE6=I;2MiWJD%JA_|$21<{B>R%AnV{X9n{6U|JB3CsE-Et z1P$>i8sRfEMiVqeGc-pFv_va>j@D>{FVGh4@Fm)#13ID;zCveoL05c@Zs?94=!tL8 z3%$_?ebEp7F#rQG2!ru0hF~bZ!}laA|_!nreG?jVLE=m zkC=g(n1$JxgSnW8`B;F3ScISOGk(EhEWuJN!>?G56l*g z37fG6Td@t>@dy6I4(!A(?8aZ%gT2^?{rDRPa1e)Z7)S6Aj^Y@O;{;CP6i(v|{>53G z!+Bi5MO?yVT)}_1ifg!z8@P#ExQ%$+!Cl2ofU+k|G(BBLzYchHwOs5)nv+)JTK0NQd;ufQ-n5NJJqsvLG5U$ck*p zjvUB|T*!?)$cuc)j{+!&LMV(PD2if;MRAlsNt8lql)-x_i*hKB_fY{A@c}BKGOC~| zs-Ze+peAbJLwtnVsDrwA_rH4h81>NrpP(T=MI(HM#%O}3Xolu!ftF~6&(Ruf@CDkU z9lk_+bU;UR!dK{wF6fG{(GA_v13mE#dZ9P^pfCENKL%hR24OJ1#Sjd|claL0Fbu~C zjKnC6#u$vnIE=>xOvEHi#uQA&G)%`2_z^QO6SFWIb1)b4FdqxB5R32=e#S3Yj3ro# zW%w1#u>vcx3cn!^tFZ>ZV=dNUJvLw?HeoZiU@Nv^JO03**nyqch28iId$1S#upfWp z01o014&w;^!BHH;ah$+OoWg0G!M`|*b2yI+xQI)*j4SvLS8)y3aRWDT3%3!EJGhH` zxQ_>Th(~ygCwPiyc#ao%iC1`yH+UN~Qo+<8K?p`7gdj1JASsd|IZ_}LVF*V6DG`BG zNR2c|i*!hj49JK~h(r`JBMYJtgRIDg?8t$f$c5a + + + + + + šŸ”„ BuddAI Web + + + + + + + +
+ + + \ No newline at end of file