Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from peft import AutoPeftModelForCausalLM, PeftConfig | |
| from transformers import AutoTokenizer, AutoConfig | |
| from huggingface_hub import login, snapshot_download | |
| import torch | |
| import os | |
| import json | |
| # Login using secret (secure, no hardcode) | |
| login(os.environ["HF_TOKEN"]) | |
| # Model setup (loads once on Space startup) | |
| model_id = "agarkovv/CryptoTrader-LM" | |
| base_model_id = "mistralai/Ministral-8B-Instruct-2410" | |
| MAX_LENGTH = 32768 | |
| DEVICE = "cuda" if torch.cuda.is_available() else "cpu" # Use GPU if available (ZeroGPU on HF) | |
| # Download adapter files | |
| adapter_local_dir = snapshot_download(repo_id=model_id) | |
| config_path = os.path.join(adapter_local_dir, "adapter_config.json") | |
| with open(config_path, 'r') as f: | |
| adapter_config = json.load(f) | |
| if 'model_type' in adapter_config: | |
| del adapter_config['model_type'] | |
| with open(config_path, 'w') as f: | |
| json.dump(adapter_config, f) | |
| # Download base model config locally to avoid gated access issues | |
| base_local_dir = snapshot_download(repo_id=base_model_id, allow_patterns="config.json") | |
| base_config_path = os.path.join(base_local_dir, "config.json") | |
| base_config = AutoConfig.from_pretrained(base_config_path) | |
| # Load model with explicit base config | |
| token = os.environ["HF_TOKEN"] | |
| model = AutoPeftModelForCausalLM.from_pretrained( | |
| adapter_local_dir, | |
| config=base_config, | |
| token=token | |
| ) | |
| tokenizer = AutoTokenizer.from_pretrained(base_model_id, token=token) | |
| model = model.to(DEVICE) | |
| model.eval() | |
| def predict_trading_decision(prompt: str) -> str: | |
| """Predict daily trading decision (buy, sell, or hold) for BTC or ETH based on news and historical prices. | |
| Args: | |
| prompt: Input prompt containing cryptocurrency news and historical price data (format: [INST]YOUR PROMPT HERE[/INST]). | |
| Returns: | |
| Generated trading decision as text (e.g., 'Buy BTC at $62k'). | |
| """ | |
| # Format prompt as required | |
| formatted_prompt = f"[INST]{prompt}[/INST]" | |
| inputs = tokenizer( | |
| formatted_prompt, return_tensors="pt", padding=False, max_length=MAX_LENGTH, truncation=True | |
| ) | |
| inputs = {key: value.to(model.device) for key, value in inputs.items()} | |
| res = model.generate( | |
| **inputs, | |
| use_cache=True, | |
| max_new_tokens=MAX_LENGTH, | |
| ) | |
| output = tokenizer.decode(res[0], skip_special_tokens=True) | |
| return output | |
| # Gradio Interface | |
| demo = gr.Interface( | |
| fn=predict_trading_decision, | |
| inputs=gr.Textbox(label="Input Prompt (News + Prices)"), | |
| outputs=gr.Textbox(label="Trading Decision"), | |
| title="CryptoTrader-LM MCP Tool", | |
| description="Predict buy/sell/hold for BTC/ETH." | |
| ) | |
| # Launch with MCP support | |
| demo.launch(mcp_server=True) |