Spaces:
Sleeping
Sleeping
| import os | |
| import logging | |
| from fastapi import FastAPI, Request | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from fastapi.responses import JSONResponse | |
| from llama_cpp import Llama | |
| # 1. Setup Logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| # 2. Model Configuration | |
| MODEL_PATH = "./models/gpt-oss-20b-Q3_K_M.gguf" | |
| llm = None | |
| # 3. Memory Storage | |
| sessions = {} | |
| MAX_HISTORY = 6 # Keep last 3 full turns | |
| def load_model(): | |
| global llm | |
| if llm is None: | |
| logger.info("π₯ Initializing 20B Harmony Engine...") | |
| try: | |
| llm = Llama( | |
| model_path=MODEL_PATH, | |
| n_ctx=2048, | |
| n_threads=2, | |
| use_mmap=False, | |
| verbose=True | |
| ) | |
| logger.info("β Brain Linked! System Online.") | |
| except Exception as e: | |
| logger.error(f"β Initialization failed: {e}") | |
| app = FastAPI(title="ChatGPT Open-Source 1.0 API") | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| async def startup_event(): | |
| load_model() | |
| async def root(): | |
| return {"status": "online", "message": "Connect to /chat"} | |
| async def chat(request: Request): | |
| if llm is None: | |
| return JSONResponse({"response": "I'm still waking up..."}, status_code=503) | |
| try: | |
| data = await request.json() | |
| user_message = data.get("message") | |
| session_id = data.get("session_id", "default_user") | |
| if not user_message: | |
| return JSONResponse({"response": "No message received."}, status_code=400) | |
| # --- 4. Memory Logic --- | |
| if session_id not in sessions: | |
| sessions[session_id] = [] | |
| history_str = "" | |
| for msg in sessions[session_id]: | |
| role = msg["role"] | |
| content = msg["content"] | |
| history_str += f"<|start|>{role}<|message|>{content}<|end|>\n" | |
| # --- 5. THE IRONCLAD PROMPT (Harmony Format) --- | |
| # We use 'developer' instructions because they override 'system' defaults. | |
| prompt = ( | |
| f"<|start|>system<|message|>Knowledge cutoff: 2024-06. Current date: 2026-02-05. Reasoning: low.<|end|>\n" | |
| f"You are an independent AI assistant running on a high-performance cloud server. " | |
| f"{history_str}" | |
| f"<|start|>user<|message|>{user_message}<|end|>\n" | |
| f"<|start|>assistant<|channel|>final<|message|>" | |
| ) | |
| output = llm( | |
| prompt, | |
| max_tokens=256, | |
| stop=["<|end|>", "<|return|>", "<|start|>", "user:", "assistant:", "Note:"], | |
| temperature=0.4 # Lower temperature = less hallucination/rambling | |
| ) | |
| reply = output["choices"][0]["text"].strip() | |
| # Update Session Memory | |
| sessions[session_id].append({"role": "user", "content": user_message}) | |
| sessions[session_id].append({"role": "assistant", "content": reply}) | |
| if len(sessions[session_id]) > MAX_HISTORY: | |
| sessions[session_id] = sessions[session_id][-MAX_HISTORY:] | |
| return {"response": reply} | |
| except Exception as e: | |
| logger.error(f"β Error: {e}") | |
| return JSONResponse({"response": "error. Try shortening your message."}, status_code=500) | |
| if __name__ == "__main__": | |
| import uvicorn | |
| uvicorn.run(app, host="0.0.0.0", port=7860) |