Monty132/CSF
0
1# 1. Use Python 3.10 explicitly2FROM python:3.10-slim3 4# 2. Install basic system tools and the critical libgomp1 for AI parallel processing5RUN apt-get update && apt-get install -y wget libgomp1 && rm -rf /var/lib/apt/lists/*6 7# 3. INSTANT INSTALL: Use the 2026 optimized pre-built wheel for HF Spaces (Free CPU)8RUN pip install --no-cache-dir \9 https://huggingface.co/Luigi/llama-cpp-python-wheels-hf-spaces-free-cpu/resolve/main/llama_cpp_python-0.3.22-cp310-cp310-linux_x86_64.whl \10 fastapi uvicorn pydantic huggingface_hub pandas requests11 12# 4. DOWNLOAD THE "INSANE" BRAIN (Qwen 2.5 3B Instruct)13RUN python -c 'from huggingface_hub import hf_hub_download; \14hf_hub_download(repo_id="Qwen/Qwen2.5-3B-Instruct-GGUF", \15filename="qwen2.5-3b-instruct-q4_k_m.gguf", \16local_dir=".")'17 18# 5. CREATE THE MASTER API (Now with Conversational Memory Support!)19RUN echo 'from fastapi import FastAPI, HTTPException, Header\n\20from pydantic import BaseModel\n\21from typing import List, Dict\n\22from llama_cpp import Llama\n\23import os\n\24import requests\n\25import pandas as pd\n\26\n\27app = FastAPI()\n\28# Set context to 16,384 to fit your game_rules.txt and CSVs plus chat history.\n\29llm = Llama(model_path="./qwen2.5-3b-instruct-q4_k_m.gguf", n_ctx=16384)\n\30PRIVATE_KEY = os.getenv("API_KEY")\n\31\n\32class Query(BaseModel):\n\33 messages: List[Dict[str, str]]\n\34 target_plane: str = ""\n\35\n\36@app.post("/ask")\n\37async def ask(data: Query, x_api_key: str = Header(None)):\n\38 if x_api_key != PRIVATE_KEY:\n\39 raise HTTPException(status_code=403, detail="Unauthorized")\n\40\n\41 # RE-READ RULES\n\42 rules = "No rules found."\n\43 if os.path.exists("game_rules.txt"):\n\44 with open("game_rules.txt", "r", encoding="utf-8") as f: rules = f.read()\n\45\n\46 # CSV DATA\n\47 planes_ctx = ""\n\48 if data.target_plane and os.path.exists("planes.csv"):\n\49 df = pd.read_csv("planes.csv")\n\50 match = df[df["name"].str.contains(data.target_plane, case=False, na=False)]\n\51 if not match.empty: planes_ctx = f"PLANE DATA:\\n{match.iloc[0].to_dict()}\\n"\n\52\n\53 cargo_ctx = ""\n\54 if os.path.exists("cargo.csv"):\n\55 cdf = pd.read_csv("cargo.csv")\n\56 cargo_ctx = f"CARGO DATA:\\n{cdf.head(20).to_string()}\\n"\n\57\n\58 # SYSTEM PROMPT\n\59 system_content = f"YOU ARE THE ELITE CODESHARE INC. AM4 EXPERT. Use the rules below. Formulas in the RULES are your absolute truth.\\n\\n[RULES]\\n{rules}\\n\\n{planes_ctx}{cargo_ctx}"\n\60 full_prompt = f"<|im_start|>system\\n{system_content}<|im_end|>\\n"\n\61\n\62 # LOOP THROUGH CHAT HISTORY\n\63 for msg in data.messages:\n\64 role = msg.get("role", "user")\n\65 content = msg.get("content", "")\n\66 full_prompt += f"<|im_start|>{role}\\n{content}<|im_end|>\\n"\n\67\n\68 full_prompt += "<|im_start|>assistant\\n"\n\69\n\70 output = llm(full_prompt, max_tokens=1024, stop=["<|im_end|>"])\n\71 return {"reply": output["choices"][0]["text"].strip()}\n\72' > /main.py73 74# 6. EXPOSE AND START75CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]