import os import gradio as gr from llama_cpp import Llama # ----------------------------- # FinGPT Crypto - Local GGUF # ----------------------------- BASE_DIR = os.path.dirname(os.path.abspath(__file__)) MODEL_PATH = os.path.join( BASE_DIR, "models", "fingpt-crypto-v5-full-test.q8_0.gguf" ) if not os.path.isfile(MODEL_PATH): raise FileNotFoundError( f"Model bulunamadı: {MODEL_PATH}\n" "GGUF dosyasını models klasörüne koy." ) print("FinGPT Crypto modeli yükleniyor...") llm = Llama( model_path=MODEL_PATH, n_ctx=4096, n_threads=max(1, (os.cpu_count() or 4) - 1), n_batch=256, n_gpu_layers=0, # CPU modu verbose=False ) SYSTEM_PROMPT = """ You are FinGPT Crypto, a cryptocurrency market analysis assistant. Analyze crypto markets using only information provided by the user or available in the conversation. When appropriate, structure your analysis as: 1. Market regime 2. Bullish and bearish factors 3. Risk analysis 4. Alternative scenarios 5. What evidence would invalidate the thesis Never invent live prices, news, whale transactions or volume data. Clearly distinguish facts, assumptions and speculation. Do not claim guaranteed profits or fabricate prediction accuracy. Explain that sentiment alone is not a reliable trading signal. Answer in the user's language. """ def respond(message, history): if not message or not message.strip(): return "Lütfen analiz etmek istediğin soruyu yaz." messages = [{"role": "system", "content": SYSTEM_PROMPT}] # Son mesajları bağlam olarak kullan for item in (history or [])[-8:]: if isinstance(item, dict): role = item.get("role") content = item.get("content") if role in ("user", "assistant") and isinstance(content, str): messages.append({ "role": role, "content": content }) elif isinstance(item, (tuple, list)) and len(item) == 2: user_msg, assistant_msg = item if user_msg: messages.append({ "role": "user", "content": str(user_msg) }) if assistant_msg: messages.append({ "role": "assistant", "content": str(assistant_msg) }) messages.append({"role": "user", "content": message}) try: result = llm.create_chat_completion( messages=messages, max_tokens=700, temperature=0.2, top_p=0.9, repeat_penalty=1.1 ) answer = result["choices"][0]["message"]["content"] return answer.strip() if answer else "Model boş yanıt üretti." except Exception as exc: return f"Model hatası: {type(exc).__name__}: {exc}" demo = gr.ChatInterface( fn=respond, title="FinGPT Crypto v5", description=( "Yerel GGUF modeliyle kripto para analizi. " "Canlı piyasa verisi otomatik olarak alınmaz." ), examples=[ "BTC için yükseliş ve düşüş senaryolarını analiz et.", "Whale sentiment score nasıl hesaplanır?", "Finansal haberlerde fiyatlanmamış bilgi nasıl test edilir?", "Bir trading stratejisinde overfitting nasıl tespit edilir?" ] ) if __name__ == "__main__": demo.launch()