companyPerformance_us.ts•6.13 kB
import { TUSHARE_CONFIG } from '../config.js';
import { formatUsIncomeData } from './companyPerformanceDetail_us/usIncomeFormatters.js';
import { formatUsBalanceData } from './companyPerformanceDetail_us/usBalanceFormatters.js';
import { formatUsCashflowData } from './companyPerformanceDetail_us/usCashflowFormatters.js';
import { formatUsIndicatorData } from './companyPerformanceDetail_us/usIndicatorFormatters.js';
export const companyPerformance_us = {
name: "company_performance_us",
description: "获取美股上市公司综合表现数据,包括利润表、资产负债表、现金流量表和财务指标数据",
parameters: {
type: "object",
properties: {
ts_code: {
type: "string",
description: "美股代码,如'NVDA'表示英伟达,'AAPL'表示苹果,'TSLA'表示特斯拉"
},
data_type: {
type: "string",
description: "数据类型:income(利润表)、balance(资产负债表)、cashflow(现金流量表)、indicator(财务指标)",
enum: ["income", "balance", "cashflow", "indicator"]
},
start_date: {
type: "string",
description: "起始日期,格式为YYYYMMDD,如'20230101'"
},
end_date: {
type: "string",
description: "结束日期,格式为YYYYMMDD,如'20231231'"
},
period: {
type: "string",
description: "特定报告期,格式为YYYYMMDD,如'20231231'表示2023年年报。指定此参数时将忽略start_date和end_date"
}
},
required: ["ts_code", "data_type", "start_date", "end_date"]
},
async run(args: {
ts_code: string;
data_type: string;
start_date: string;
end_date: string;
period?: string;
}) {
try {
console.log('美股公司综合表现查询参数:', args);
const TUSHARE_API_KEY = TUSHARE_CONFIG.API_TOKEN;
const TUSHARE_API_URL = TUSHARE_CONFIG.API_URL;
if (!TUSHARE_API_KEY) {
throw new Error('请配置TUSHARE_TOKEN环境变量');
}
// 根据data_type选择对应的接口
let apiInterface = '';
let formatFunction: any = null;
switch (args.data_type) {
case 'income':
apiInterface = 'us_income';
formatFunction = formatUsIncomeData;
break;
case 'balance':
apiInterface = 'us_balancesheet';
formatFunction = formatUsBalanceData;
break;
case 'cashflow':
apiInterface = 'us_cashflow';
formatFunction = formatUsCashflowData;
break;
case 'indicator':
apiInterface = 'us_fina_indicator';
formatFunction = formatUsIndicatorData;
break;
default:
throw new Error(`不支持的数据类型: ${args.data_type}`);
}
const result = await fetchUsFinancialData(
apiInterface,
args.ts_code,
args.period,
args.start_date,
args.end_date,
TUSHARE_API_KEY,
TUSHARE_API_URL
);
if (!result.data || result.data.length === 0) {
return {
content: [
{
type: "text",
text: `# ${args.ts_code} 美股${getDataTypeName(args.data_type)}数据\n\n❌ 未找到相关数据,请检查股票代码或日期范围`
}
]
};
}
// 使用对应的格式化函数
if (formatFunction) {
const formattedResult = formatFunction(result.data, args.ts_code, args.data_type);
return formattedResult;
} else {
// 如果没有实现格式化器,返回原始数据
return {
content: [
{
type: "text",
text: `# ${args.ts_code} 美股${getDataTypeName(args.data_type)}数据\n\n⚠️ 格式化器待实现,以下为原始数据:\n\n${JSON.stringify(result.data, null, 2)}`
}
]
};
}
} catch (error) {
console.error('美股公司业绩查询错误:', error);
return {
content: [
{
type: "text",
text: `❌ 美股公司业绩查询失败: ${error instanceof Error ? error.message : String(error)}`
}
],
isError: true
};
}
}
};
// 获取数据类型中文名称
function getDataTypeName(dataType: string): string {
const names: { [key: string]: string } = {
'income': '利润表',
'balance': '资产负债表',
'cashflow': '现金流量表',
'indicator': '财务指标'
};
return names[dataType] || dataType;
}
// 通用的美股财务数据获取函数
async function fetchUsFinancialData(
apiInterface: string,
ts_code: string,
period?: string,
start_date?: string,
end_date?: string,
apiKey?: string,
apiUrl?: string
): Promise<any> {
const requestData: any = {
api_name: apiInterface,
token: apiKey,
params: {
ts_code: ts_code
}
};
// 根据是否指定period来设置参数
if (period) {
requestData.params.period = period;
} else if (start_date && end_date) {
requestData.params.start_date = start_date;
requestData.params.end_date = end_date;
}
const response = await fetch(apiUrl!, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData),
signal: AbortSignal.timeout(TUSHARE_CONFIG.TIMEOUT)
});
if (!response.ok) {
throw new Error(`Tushare API请求失败: ${response.status} ${response.statusText}`);
}
const data = await response.json();
if (data.code !== 0) {
throw new Error(`Tushare API错误: ${data.msg || '未知错误'}`);
}
// 将返回的数组格式转换为对象数组
const items: any[] = [];
if (data.data && data.data.items && data.data.items.length > 0) {
const fields = data.data.fields;
for (const item of data.data.items) {
const obj: any = {};
fields.forEach((field: string, index: number) => {
obj[field] = item[index];
});
items.push(obj);
}
}
return { data: items };
}