File size: 6,697 Bytes
c464284
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fd2196d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c464284
 
 
fd2196d
c464284
 
 
 
 
fd2196d
 
c464284
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fd2196d
c464284
 
 
 
 
 
 
 
c3bafdd
 
c464284
 
 
fd2196d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c464284
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
from __future__ import annotations

from functools import lru_cache
import json

import gradio as gr

from agent import Agent
from config import AppConfig, load_environment
from model import ModelRunner
from prompts import DEFAULT_SYSTEM_PROMPT
from tools import build_default_tool_registry


@lru_cache(maxsize=1)
def get_agent() -> Agent:
    api_key = load_environment()
    runner = ModelRunner.load(
        model_name=AppConfig.model_name,
        api_key=api_key,
        base_url=AppConfig.base_url,
    )
    tools = build_default_tool_registry()
    return Agent(runner=runner, tools=tools, system_prompt=DEFAULT_SYSTEM_PROMPT)


def run_agent(task: str, max_steps: int, temperature: float) -> tuple[str, str]:
    agent = get_agent()
    result, trace = agent.run(task, max_steps=int(max_steps), temperature=temperature, verbose=False)
    response = "" if result is None else str(result)
    trace_text = json.dumps(trace, indent=2, ensure_ascii=False)
    return response, trace_text


def build_demo() -> gr.Blocks:
    custom_css = """
    @import url('https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,300;14..32,400;14..32,500;14..32,600;14..32,700&display=swap');

    /* ========== BASE ========== */
    *, *::before, *::after {
        font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, sans-serif !important;
        box-sizing: border-box !important;
    }

    /* ========== TITLE ========== */
    #app-title {
        background: transparent !important;
        border: none !important;
        padding: 8px 0 !important;
    }

    /* ========== DISCLAIMER BANNER ========== */
    #disclaimer-banner {
        background-color: #3F3F46 !important;
        border: 2px solid #FF2717 !important;
        border-left: 6px solid #FEA12D !important;
        border-radius: 8px !important;
        padding: 16px 20px !important;
        margin-bottom: 12px !important;
    }
    #disclaimer-banner p {
        margin: 2px 0 !important;
        color: #E4E4E7 !important;
    }
    """

    with gr.Blocks(theme=gr.themes.Base(), title="Financial Agent", css=custom_css) as demo:
        
        gr.Markdown(
            """
            # Financial Agent
            Uses **LLaMA 3.3 70B** via NVIDIA NIM (OpenAI-compatible API).
            Ask for stock prices, company profiles, and more! The agent can use tools to fetch real-time data and provide accurate responses.
            """,
            elem_id="app-title",
        )

        with gr.Row():
            with gr.Column(scale=1):
                task_input = gr.Textbox(
                    label="User task",
                    value="",
                    lines=3,
                    placeholder="Ask for a stock price, e.g. Tesla, Apple, Nvidia...",
                )
                with gr.Row():
                    max_steps_slider = gr.Slider(
                        minimum=1,
                        maximum=20,
                        value=5,
                        step=1,
                        label="Max iterations",
                    )
                    temperature_slider = gr.Slider(
                        minimum=0.0,
                        maximum=1.0,
                        value=0.3,
                        step=0.05,
                        label="Temperature",
                    )
                run_button = gr.Button("Run agent", variant="primary")

            with gr.Column(scale=1):
                response_output = gr.Textbox(label="Final response", lines=3)
                trace_output = gr.Code(label="Tool trace", language="json", elem_id="trace_output")

        run_button.click(
            fn=run_agent,
            inputs=[task_input, max_steps_slider, temperature_slider],
            outputs=[response_output, trace_output],
        )

        gr.Markdown(
            """
            # Agent User Guide

            | If you want to... | Example prompt |
            |------------------|----------------|
            | Know the latest price of a stock | "What's the current price of Apple?" |
            | Get company information | "Tell me about Tesla's business sector and industry" |
            | Build a low-risk portfolio | "Create a minimum variance portfolio with Microsoft, Google, and Amazon" |
            | Maximize return for the risk taken | "Give me the best risk-return portfolio using Apple, Nvidia, and Meta" |
            | Reduce downside risk compared to the S&P500 | "Build a portfolio that minimizes losses relative to the S&P500 using these 5 stocks" |
            | Find economic data from the US (FRED) | "What was the unemployment rate in December 2024?" |
            | Check Mexican CETES rates | "What's the 28-day CETES rate today?" |
            | Know monthly inflation in Mexico | "What was Mexico's monthly inflation last month?" |
            | Know annual inflation in Mexico | "What's the current annual inflation rate in Mexico?" |
            | Get the UDI value in Mexico | "What is the UDI value today?" |
            | Check Mexican TIE interest rates | "Show me the 91-day TIE rate" |
            | Know Mexico's central bank interest rate | "What is Mexico's target interest rate right now?" |
            | Get cross-currency exchange rates | "What's the current exchange rate for EUR/USD?" |
            | Analyze news sentiment for a stock | "What is the market sentiment around Tesla right now?" |
            | Calculate the impact of inflation | "how much would inflation in mexico affect my 1000 pesos over 5 months?" |
            | Make a fundamental analysis of a stock | "What is the fundamental analysis of Microsoft?" |
            """
        )

        gr.Markdown(
            """
            ⚠️ **EDUCATIONAL PURPOSES ONLY — NOT FINANCIAL ADVICE**

            This agent is a student project built for a Deep Learning course. It is **not** a licensed financial advisor,
            broker, or investment service. All outputs — including stock prices, portfolio suggestions, economic indicators,
            and any other financial data — are provided **strictly for educational and demonstration purposes**.

            **Do not use this tool to make real investment, trading, or financial decisions.**
            The information may be inaccurate, delayed, or incomplete. Always consult a qualified financial professional
            before making any investment decision. The authors assume no liability for any actions taken based on
            the outputs of this agent.
            """,
            elem_id="disclaimer-banner",
        )

    return demo


demo = build_demo()

if __name__ == "__main__":
    demo.launch()