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