From 653812a4800eb2ff70a02164750c2941c19ccdd3 Mon Sep 17 00:00:00 2001 From: xucheng Date: Mon, 19 Jan 2026 19:39:27 +0800 Subject: [PATCH] feat: Standardize on Bloomberg as the default data source, update search UI with editable symbols, and enable web search capabilities. --- .claude/settings.local.json | 3 ++- backend/app/main.py | 19 ++++++++++++--- frontend/src/app/page.tsx | 6 ++--- frontend/src/components/nav-header.tsx | 5 ---- frontend/src/components/search-stock.tsx | 31 ++++++++++++++---------- 5 files changed, 38 insertions(+), 26 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index eca6f89..cb2d364 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,7 +1,8 @@ { "permissions": { "allow": [ - "mcp__zai-web-reader__webReader" + "mcp__zai-web-reader__webReader", + "mcp__zai-web-search__webSearchPrime" ] } } diff --git a/backend/app/main.py b/backend/app/main.py index e801280..997468e 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -213,14 +213,25 @@ async def search_stock(request: StockSearchRequest): prompt = f"""请利用Google搜索查找 "{request.query}" 对应的上市股票信息。 返回最匹配的股票,优先返回准确匹配的公司。 - + +**关键要求:Symbol 必须遵循 Bloomberg 终端专用代码格式 (Ticker Only)。** +请注意区分不同市场的代码后缀(用于确定market字段),以及某些市场的特殊代码规则(例如印度股票通常以 IN 结尾,代码可能是缩写也可能是全称,请仔细核对 Bloomberg 标准)。 + 返回格式必须是 JSON 数组,每个元素包含: -- market: 市场代码(CH/HK/US/JP/VN),例如:腾讯是 HK,茅台是 CH,英伟达是 US。 -- symbol: 股票代码(如果是CH,通常是6位数字;HK是5位;US是字母)。 +- market: 市场代码(CH/HK/US/JP/VN/IN/EU等)。 +- symbol: **Bloomberg标准代码** (仅Ticker,不要包含后缀)。 + - 香港: "700" (不要写00700) + - 中国: "600519" + - 美国: "NVDA" + - 日本: "7203" + - 印度: "UBBL" (例如 United Breweries,不要只写 UBL) + - 欧洲: "NESN" - company_name: 公司简称。 示例: -[{{"market": "HK", "symbol": "00700", "company_name": "腾讯控股"}}] +[{{"market": "HK", "symbol": "700", "company_name": "腾讯控股"}}, + {{"market": "US", "symbol": "NVDA", "company_name": "英伟达"}}, + {{"market": "IN", "symbol": "UBBL", "company_name": "United Breweries"}}] 请直接返回 JSON,不要添加任何其他文字。最多返回5个结果。""" diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 1d2f9fa..1796853 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -54,8 +54,8 @@ function HomeInner() { // Close right sidebar on new selection setIsRightSidebarOpen(false) - // 如果没有传入数据源,则根据市场设置默认值 - const targetDataSource = dataSource || (company.market === 'CN' ? 'Tushare' : 'iFinD') + // 默认数据源强制为 Bloomberg + const targetDataSource = dataSource || 'Bloomberg' setSelectedDataSource(targetDataSource) } @@ -122,7 +122,7 @@ function HomeInner() {

股票分析

- 输入公司名称或股票代码,开始全面的AI驱动的分析。支持中国、香港、美国、日本、越南的公司分析。 + 输入公司名称或股票代码,开始全面的AI驱动的分析。支持 Bloomberg 覆盖的全球市场所有标的。

diff --git a/frontend/src/components/nav-header.tsx b/frontend/src/components/nav-header.tsx index 1beff06..f9188c8 100644 --- a/frontend/src/components/nav-header.tsx +++ b/frontend/src/components/nav-header.tsx @@ -3,7 +3,6 @@ import Link from "next/link" import { MonitorPlay } from "lucide-react" import { useRouter, useSearchParams } from "next/navigation" -import { HeaderSearch } from "@/components/header-search" import { useEffect, useState, Suspense } from "react" import { Select, @@ -255,10 +254,6 @@ function NavHeaderInner() { -
- -
- {/* Portal Target for Dynamic Content */}
diff --git a/frontend/src/components/search-stock.tsx b/frontend/src/components/search-stock.tsx index 902332e..f2b6aa7 100644 --- a/frontend/src/components/search-stock.tsx +++ b/frontend/src/components/search-stock.tsx @@ -17,20 +17,21 @@ interface SearchStockProps { const DATA_SOURCES = { CN: [ + { value: "Bloomberg", label: "Bloomberg" }, { value: "Tushare", label: "Tushare (CN)" }, - { value: "iFinD", label: "iFinD" }, - { value: "Bloomberg", label: "Bloomberg" } + { value: "iFinD", label: "iFinD" } ], GLOBAL: [ - { value: "iFinD", label: "iFinD" }, - { value: "Bloomberg", label: "Bloomberg" } + { value: "Bloomberg", label: "Bloomberg" }, + { value: "iFinD", label: "iFinD" } ] } function SearchResultItem({ result, onSelect }: { result: SearchResult, onSelect: (r: SearchResult, ds: string) => void }) { - // 默认数据源逻辑:CN -> Tushare, 其他 -> iFinD - const defaultSource = result.market === "CN" ? "Tushare" : "iFinD" + // 默认数据源逻辑:Bloomberg + const defaultSource = "Bloomberg" const [source, setSource] = useState(defaultSource) + const [symbol, setSymbol] = useState(result.symbol) // Editable symbol state // 根据市场获取可用数据源列表 const availableSources = result.market === "CN" ? DATA_SOURCES.CN : DATA_SOURCES.GLOBAL @@ -41,15 +42,19 @@ function SearchResultItem({ result, onSelect }: { result: SearchResult, onSelect {/* 顶部:公司信息 */}
-
+

{result.company_name}

-

- {result.symbol} -

+
+ setSymbol(e.target.value)} + className="h-7 text-xs font-mono bg-background/50 border-input/60" + /> +
- + {result.market}
@@ -73,7 +78,7 @@ function SearchResultItem({ result, onSelect }: { result: SearchResult, onSelect