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) |