""" This is a Hugging Face Spaces demo for Fin-RWKV-1B5 attention free financial expert modal. Author: Umut (Hope) YILDIRIM """ import gradio as gr from transformers import AutoTokenizer, AutoModelForCausalLM, StoppingCriteria, StoppingCriteriaList, TextIteratorStreamer from threading import Thread import torch # from openbb import obb # Login to OpenBB # obb.account.login() tokenizer = AutoTokenizer.from_pretrained("umuthopeyildirim/fin-rwkv-1b5") model = AutoModelForCausalLM.from_pretrained("umuthopeyildirim/fin-rwkv-1b5") products = [ {"name": "Red Bull", "description": "Energy Drink", "symbol": "ALI", "image": "https://i.pinimg.com/originals/f9/68/e3/f968e3a1d474e1c19a91b508231a88c8.png"}, {"name": "iPhone 15", "description": "Latest Apple Smartphone", "symbol": "PL", "image": "https://www.apple.com/newsroom/images/2023/09/apple-unveils-iphone-15-pro-and-iphone-15-pro-max/tile/Apple-iPhone-15-Pro-lineup-hero-230912.jpg.news_app_ed.jpg"}, {"name": "Pencil", "description": "Wooden Writing Tool", "symbol": "CL", "image": "https://m.media-amazon.com/images/I/41IQfWzTojL._AC_UF1000,1000_QL80_.jpg"}, {"name": "LG Monitor", "description": "High-Resolution Computer Monitor", "symbol": "NG", "image": "https://media.us.lg.com/transform/ecomm-PDPGallery-1100x730/a330bb92-bc33-435a-aa1b-07795eedbc10/md08003490-DZ-03"}, ] examples_openbb = [ "x,Aluminum Futures\n 2024-01-02T00:00:00,2278.75\n 2024-01-03T00:00:00,2251\n 2024-01-04T00:00:00,2218.25\n 2024-01-05T00:00:00,2203\n 2024-01-08T00:00:00,2168.5\n 2024-01-09T00:00:00,2182.5\n 2024-01-10T00:00:00,2178.5\n 2024-01-11T00:00:00,2179.75\n 2024-01-12T00:00:00,2167.5\n 2024-01-16T00:00:00,2161.75\n 2024-01-17T00:00:00,2148.75\n 2024-01-18T00:00:00,2136.5\n 2024-01-19T00:00:00,2127.5\n 2024-01-22T00:00:00,2127.5\n 2024-01-23T00:00:00,2184.25\n 2024-01-24T00:00:00,2186.25\n 2024-01-25T00:00:00,2194.5\n 2024-01-26T00:00:00,2246.25\n Here is the historical data for Aluminum Futures. Did it appreciated over time or depreciated?\n", "x,Platinum Futures\n 2024-01-02T00:00:00,985.5\n 2024-01-03T00:00:00,974.4000244140624\n 2024-01-04T00:00:00,953.9000244140624\n 2024-01-05T00:00:00,959.2999877929688\n 2024-01-08T00:00:00,946.7000122070312\n 2024-01-09T00:00:00,931\n 2024-01-10T00:00:00,918.7999877929688\n 2024-01-11T00:00:00,909\n 2024-01-12T00:00:00,910.0999755859376\n 2024-01-16T00:00:00,895.0999755859375\n 2024-01-17T00:00:00,882.7999877929688\n 2024-01-18T00:00:00,903.2999877929688\n 2024-01-19T00:00:00,897.2999877929688\n 2024-01-22T00:00:00,894.4000244140625\n 2024-01-23T00:00:00,896.2000122070312\n 2024-01-24T00:00:00,905.5999755859376\n 2024-01-25T00:00:00,887.4000244140625\n 2024-01-26T00:00:00,921.7000122070312\n Here is the historical data for Platinum Futures. Did it appreciated over time or depreciated?\n", "x,Natural Gas Futures\n 2024-01-02T00:00:00,2.568000078201294\n 2024-01-03T00:00:00,2.6679999828338623\n 2024-01-04T00:00:00,2.821000099182129\n 2024-01-05T00:00:00,2.8929998874664307\n 2024-01-08T00:00:00,2.9800000190734863\n 2024-01-09T00:00:00,3.190000057220459\n 2024-01-10T00:00:00,3.0390000343322754\n 2024-01-11T00:00:00,3.0969998836517334\n 2024-01-12T00:00:00,3.312999963760376\n 2024-01-15T00:00:00,3.1059999465942383\n 2024-01-16T00:00:00,2.9000000953674316\n 2024-01-17T00:00:00,2.869999885559082\n 2024-01-18T00:00:00,2.697000026702881\n 2024-01-19T00:00:00,2.5190000534057617\n 2024-01-22T00:00:00,2.4189999103546143\n 2024-01-23T00:00:00,2.450000047683716\n 2024-01-24T00:00:00,2.6410000324249268\n 2024-01-25T00:00:00,2.571000099182129\n 2024-01-26T00:00:00,2.7190001010894775 Here is the historical data for Natural Gas Futures. Did it appreciated over time or depreciated?\n", "x,WTI Crude Oil Futures\n 2024-01-02T00:00:00,70.37999725341797\n 2024-01-03T00:00:00,72.69999694824219\n 2024-01-04T00:00:00,72.19000244140625\n 2024-01-05T00:00:00,73.80999755859375\n 2024-01-08T00:00:00,70.7699966430664\n 2024-01-09T00:00:00,72.23999786376953\n 2024-01-10T00:00:00,71.37000274658203\n 2024-01-11T00:00:00,72.0199966430664\n 2024-01-12T00:00:00,72.68000030517578\n 2024-01-15T00:00:00,72.5\n 2024-01-16T00:00:00,72.4000015258789\n 2024-01-17T00:00:00,72.55999755859375\n 2024-01-18T00:00:00,74.08000183105469\n 2024-01-19T00:00:00,73.41000366210938\n 2024-01-22T00:00:00,75.19000244140625\n 2024-01-23T00:00:00,74.37000274658203\n 2024-01-24T00:00:00,75.08999633789062\n 2024-01-25T00:00:00,77.36000061035156\n 2024-01-26T00:00:00,78.2300033569336 Here is the historical data for WTI Crude Oil Futures. Did it appreciated over time or depreciated?\n", ] openbb_inputbox = "" openbb_chatbox = "" class StopOnTokens(StoppingCriteria): def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool: stop_ids = [29, 0] for stop_id in stop_ids: if input_ids[0][-1] == stop_id: return True return False def predict(message, history): history_transformer_format = history + [[message, ""]] stop = StopOnTokens() messages = "".join(["".join(["\nuser :"+item[0], "\nbot:"+item[1]]) # curr_system_message + for item in history_transformer_format]) print(messages) model_inputs = tokenizer([messages], return_tensors="pt") streamer = TextIteratorStreamer( tokenizer, timeout=10., skip_prompt=True, skip_special_tokens=True) generate_kwargs = dict( model_inputs, streamer=streamer, max_new_tokens=1024, do_sample=True, top_p=0.95, top_k=1000, temperature=0.5, num_beams=1, stopping_criteria=StoppingCriteriaList([stop]) ) t = Thread(target=model.generate, kwargs=generate_kwargs) t.start() partial_message = "" for new_token in streamer: if new_token != '<': partial_message += new_token yield partial_message def predict2(message, history): history_transformer_format = history + [[message, ""]] stop = StopOnTokens() messages = "".join(["".join(["\nuser :"+item[0], "\nbot:"+item[1]]) # curr_system_message + for item in history_transformer_format]) print(messages) model_inputs = tokenizer([messages], return_tensors="pt") streamer = TextIteratorStreamer( tokenizer, timeout=10., skip_prompt=True, skip_special_tokens=True) generate_kwargs = dict( model_inputs, streamer=streamer, max_new_tokens=1024, do_sample=True, top_p=0.95, top_k=1000, temperature=0.5, num_beams=1, stopping_criteria=StoppingCriteriaList([stop]) ) t = Thread(target=model.generate, kwargs=generate_kwargs) t.start() partial_message = "" for new_token in streamer: if new_token != '<': partial_message += new_token yield partial_message def generate_text(prompt, tokenizer, model): # Tokenize the input input_ids = tokenizer.encode(prompt, return_tensors="pt") # Generate a response output = model.generate(input_ids, max_length=333, num_return_sequences=1) # Decode the output generated_text = tokenizer.decode(output[0], skip_special_tokens=True) return generated_text # def fetch_historical_data(symbol): # # Replace with actual OpenBB method to fetch historical data # data = obb.derivatives.futures.historical( # symbol, # start_date="2024-01-01", # interval="1wk", # ).to_df()["close"].rename(symbol) # return data title = "# Fin-RWKV: Attention Free Financial Expert (WIP)" description = """Demo for **Fin-RWKV: Attention Free Financial Expert (WIP)**. To download the model, please visit [Fin-RWKV: Attention Free Financial Expert (WIP)](https://huggingface.co/umuthopeyildirim/fin-rwkv-1b5). [Google Presentation](https://docs.google.com/presentation/d/1vNQ8Y5wwR0WXlO60fsXjkru5R9I0ZgykTmgag0B3Ato/edit?usp=sharing)""" css = """ #img-display-container { max-height: 100vh; } #img-display-input { max-height: 80vh; } #img-display-output { max-height: 80vh; } """ with gr.Blocks(css=css) as demo: gr.Markdown(title) gr.Markdown(description) with gr.Tab("Chatbot"): gr.ChatInterface(predict) # with gr.Tab("E-Commerce"): # e_commerce_interface() with gr.Tab("OpenBB"): gr.ChatInterface(predict2, examples=[ examples_openbb[0], examples_openbb[1], examples_openbb[2], examples_openbb[3]]) if __name__ == '__main__': demo.queue().launch(share=False)