JC321 commited on
Commit
fc525f2
·
verified ·
1 Parent(s): 05bacf6

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +40 -76
  2. requirements.txt +2 -1
app.py CHANGED
@@ -1,5 +1,6 @@
1
  import gradio as gr
2
  import requests
 
3
 
4
  MCP_URL = "https://jc321-easyreportdatemcp.hf.space"
5
 
@@ -9,96 +10,69 @@ HEADERS = {
9
  "User-Agent": "SEC-Query-Assistant/1.0 (jtyxabc@gmail.com)"
10
  }
11
 
 
 
 
 
 
 
 
12
  def query_financial_data(company_name, query_type):
13
  """查询财务数据的主函数"""
14
 
15
  if not company_name:
16
  return "请输入公司名称或股票代码"
17
 
 
 
 
18
  try:
19
- # Gradio Space API 调用方式
20
  # 先搜索公司
21
- search_resp = requests.post(
22
- f"{MCP_URL}/call/advanced_search",
23
- json={"data": [company_name]},
24
- headers=HEADERS,
25
- timeout=30
26
  )
27
 
28
- # 检查响应状态
29
- if search_resp.status_code != 200:
30
- return f"❌ Server Error: HTTP {search_resp.status_code}\n\nResponse: {search_resp.text[:500]}"
31
-
32
- try:
33
- resp_data = search_resp.json()
34
- # Gradio API 返回格式: {"data": [result]}
35
- if isinstance(resp_data, dict) and "data" in resp_data:
36
- company = resp_data["data"][0] if resp_data["data"] else {}
37
- else:
38
- company = resp_data
39
- except ValueError as e:
40
- return f"❌ JSON Parse Error: {str(e)}\n\nResponse Text: {search_resp.text[:500]}"
41
-
42
- if company.get("error"):
43
  return f"❌ 错误: {company['error']}"
44
 
45
- result = f"# {company['name']}\n\n"
46
  result += f"**股票代码**: {company.get('tickers', ['N/A'])[0] if company.get('tickers') else 'N/A'}\n"
47
  result += f"**行业**: {company.get('sic_description', 'N/A')}\n\n---\n\n"
48
 
49
- cik = company['cik']
50
 
51
  # 根据查询类型获取数据
52
  if query_type == "最新财务数据":
53
- data_resp = requests.post(
54
- f"{MCP_URL}/call/get_latest_financial_data",
55
- json={"data": [cik]},
56
- headers=HEADERS,
57
- timeout=30
58
  )
59
 
60
- if data_resp.status_code != 200:
61
- return result + f"❌ Server Error: HTTP {data_resp.status_code}\n\n{data_resp.text[:500]}"
62
-
63
- try:
64
- resp_data = data_resp.json()
65
- data = resp_data["data"][0] if isinstance(resp_data, dict) and "data" in resp_data else resp_data
66
- except ValueError as e:
67
- return result + f"❌ JSON Parse Error: {str(e)}\n\n{data_resp.text[:500]}"
68
-
69
- if data.get("error"):
70
  return result + f"❌ {data['error']}"
71
 
72
- result += f"## 财年 {data['period']}\n\n"
73
- result += f"- **总收入**: ${data['total_revenue']:,.0f} (${data['total_revenue']/1e9:.2f}B)\n"
74
- result += f"- **净利润**: ${data['net_income']:,.0f} (${data['net_income']/1e9:.2f}B)\n"
75
- result += f"- **每股收益**: ${data['earnings_per_share']:.2f}\n"
76
- result += f"- **来源**: {data['source_form']}\n"
77
 
78
  elif query_type == "3年趋势":
79
- metrics_resp = requests.post(
80
- f"{MCP_URL}/call/extract_financial_metrics",
81
- json={"data": [cik, 3]},
82
- headers=HEADERS,
83
- timeout=60
84
  )
85
 
86
- if metrics_resp.status_code != 200:
87
- return result + f"❌ Server Error: HTTP {metrics_resp.status_code}\n\n{metrics_resp.text[:500]}"
88
-
89
- try:
90
- resp_data = metrics_resp.json()
91
- metrics = resp_data["data"][0] if isinstance(resp_data, dict) and "data" in resp_data else resp_data
92
- except ValueError as e:
93
- return result + f"❌ JSON Parse Error: {str(e)}\n\n{metrics_resp.text[:500]}"
94
-
95
- if metrics.get("error"):
96
  return result + f"❌ {metrics['error']}"
97
 
98
- result += f"## 财务趋势 (共 {metrics['count']} 个期间)\n\n"
99
 
100
  # 只显示年度数据
101
- annual_data = [m for m in metrics['metrics'] if 'Q' not in m['period']][:3]
102
 
103
  result += "| 期间 | 收入(十亿) | 净利润(十亿) | EPS |\n"
104
  result += "|------|-----------|------------|-----|\n"
@@ -111,26 +85,16 @@ def query_financial_data(company_name, query_type):
111
  result += f"| FY{period} | ${rev:.2f}B | ${inc:.2f}B | ${eps:.2f} |\n"
112
 
113
  elif query_type == "5年趋势":
114
- metrics_resp = requests.post(
115
- f"{MCP_URL}/call/extract_financial_metrics",
116
- json={"data": [cik, 5]},
117
- headers=HEADERS,
118
- timeout=60
119
  )
120
 
121
- if metrics_resp.status_code != 200:
122
- return result + f"❌ Server Error: HTTP {metrics_resp.status_code}\n\n{metrics_resp.text[:500]}"
123
-
124
- try:
125
- resp_data = metrics_resp.json()
126
- metrics = resp_data["data"][0] if isinstance(resp_data, dict) and "data" in resp_data else resp_data
127
- except ValueError as e:
128
- return result + f"❌ JSON Parse Error: {str(e)}\n\n{metrics_resp.text[:500]}"
129
-
130
- if metrics.get("error"):
131
  return result + f"❌ {metrics['error']}"
132
 
133
- annual_data = [m for m in metrics['metrics'] if 'Q' not in m['period']][:5]
134
 
135
  result += f"## 5年财务趋势\n\n"
136
  result += "| 期间 | 收入 | 净利润 | EPS |\n"
 
1
  import gradio as gr
2
  import requests
3
+ from gradio_client import Client
4
 
5
  MCP_URL = "https://jc321-easyreportdatemcp.hf.space"
6
 
 
10
  "User-Agent": "SEC-Query-Assistant/1.0 (jtyxabc@gmail.com)"
11
  }
12
 
13
+ # 初始化 Gradio Client
14
+ try:
15
+ client = Client(MCP_URL)
16
+ except Exception as e:
17
+ client = None
18
+ print(f"Warning: Failed to initialize Gradio Client: {e}")
19
+
20
  def query_financial_data(company_name, query_type):
21
  """查询财务数据的主函数"""
22
 
23
  if not company_name:
24
  return "请输入公司名称或股票代码"
25
 
26
+ if client is None:
27
+ return "❌ Gradio Client 未初始化,无法连接到 MCP 服务"
28
+
29
  try:
30
+ # 使用 Gradio Client 调用 MCP 服务
31
  # 先搜索公司
32
+ company = client.predict(
33
+ company_input=company_name,
34
+ api_name="/advanced_search"
 
 
35
  )
36
 
37
+ if isinstance(company, dict) and company.get("error"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  return f"❌ 错误: {company['error']}"
39
 
40
+ result = f"# {company.get('name', 'Unknown')}\n\n"
41
  result += f"**股票代码**: {company.get('tickers', ['N/A'])[0] if company.get('tickers') else 'N/A'}\n"
42
  result += f"**行业**: {company.get('sic_description', 'N/A')}\n\n---\n\n"
43
 
44
+ cik = company.get('cik')
45
 
46
  # 根据查询类型获取数据
47
  if query_type == "最新财务数据":
48
+ data = client.predict(
49
+ cik=cik,
50
+ api_name="/get_latest_financial_data"
 
 
51
  )
52
 
53
+ if isinstance(data, dict) and data.get("error"):
 
 
 
 
 
 
 
 
 
54
  return result + f"❌ {data['error']}"
55
 
56
+ result += f"## 财年 {data.get('period', 'N/A')}\n\n"
57
+ result += f"- **总收入**: ${data.get('total_revenue', 0):,.0f} (${data.get('total_revenue', 0)/1e9:.2f}B)\n"
58
+ result += f"- **净利润**: ${data.get('net_income', 0):,.0f} (${data.get('net_income', 0)/1e9:.2f}B)\n"
59
+ result += f"- **每股收益**: ${data.get('earnings_per_share', 0):.2f}\n"
60
+ result += f"- **来源**: {data.get('source_form', 'N/A')}\n"
61
 
62
  elif query_type == "3年趋势":
63
+ metrics = client.predict(
64
+ cik=cik,
65
+ years=3,
66
+ api_name="/extract_financial_metrics"
 
67
  )
68
 
69
+ if isinstance(metrics, dict) and metrics.get("error"):
 
 
 
 
 
 
 
 
 
70
  return result + f"❌ {metrics['error']}"
71
 
72
+ result += f"## 财务趋势 (共 {metrics.get('count', 0)} 个期间)\n\n"
73
 
74
  # 只显示年度数据
75
+ annual_data = [m for m in metrics.get('metrics', []) if 'Q' not in m.get('period', '')][:3]
76
 
77
  result += "| 期间 | 收入(十亿) | 净利润(十亿) | EPS |\n"
78
  result += "|------|-----------|------------|-----|\n"
 
85
  result += f"| FY{period} | ${rev:.2f}B | ${inc:.2f}B | ${eps:.2f} |\n"
86
 
87
  elif query_type == "5年趋势":
88
+ metrics = client.predict(
89
+ cik=cik,
90
+ years=5,
91
+ api_name="/extract_financial_metrics"
 
92
  )
93
 
94
+ if isinstance(metrics, dict) and metrics.get("error"):
 
 
 
 
 
 
 
 
 
95
  return result + f"❌ {metrics['error']}"
96
 
97
+ annual_data = [m for m in metrics.get('metrics', []) if 'Q' not in m.get('period', '')][:5]
98
 
99
  result += f"## 5年财务趋势\n\n"
100
  result += "| 期间 | 收入 | 净利润 | EPS |\n"
requirements.txt CHANGED
@@ -1,2 +1,3 @@
1
  gradio>=4.0.0
2
- requests
 
 
1
  gradio>=4.0.0
2
+ requests
3
+ gradio_client