n8n-nodes-tushare
Version:
n8n custom node for Tushare
132 lines • 4.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TushareTool = void 0;
const tools_1 = require("@langchain/core/tools");
const zod_1 = require("zod");
class TushareTool extends tools_1.Tool {
constructor(fields) {
const schema = TushareTool.generateSchema(fields.inputFields);
super();
this.name = fields.name;
this.description = fields.description;
this.token = fields.token;
this.timeout = fields.timeout || 30000;
this.customSchema = schema;
}
static generateSchema(inputFields) {
if (!inputFields || inputFields.length === 0) {
return zod_1.z.object({
limit: zod_1.z.number().optional().default(10),
offset: zod_1.z.number().optional().default(0),
additionalFields: zod_1.z.record(zod_1.z.any()).optional(),
});
}
const schemaFields = {};
inputFields.forEach(field => {
if (!field.fieldName || field.fieldName.trim() === '') {
return;
}
let fieldSchema;
switch (field.type) {
case 'number':
fieldSchema = zod_1.z.number();
break;
case 'boolean':
fieldSchema = zod_1.z.boolean();
break;
case 'date':
fieldSchema = zod_1.z.string().regex(/^\d{4}-\d{2}-\d{2}$/, '日期格式应为 YYYY-MM-DD');
break;
case 'string':
default:
fieldSchema = zod_1.z.string();
break;
}
if (field.defaultValue !== undefined) {
fieldSchema = fieldSchema.optional().default(field.defaultValue);
}
else if (!field.required) {
fieldSchema = fieldSchema.optional();
}
schemaFields[field.fieldName] = fieldSchema;
});
schemaFields.limit = zod_1.z.number().optional().default(10);
schemaFields.offset = zod_1.z.number().optional().default(0);
schemaFields.additionalFields = zod_1.z.record(zod_1.z.any()).optional();
return zod_1.z.object(schemaFields);
}
getSchema() {
return this.customSchema;
}
static lc_name() {
return 'DataTool';
}
get lc_namespace() {
return ['data', 'tools'];
}
async _call(input) {
let params = {};
try {
params = JSON.parse(input);
}
catch {
if (input.includes('=')) {
const searchParams = new URLSearchParams(input);
params = Object.fromEntries(searchParams.entries());
}
else if (input.trim()) {
params = { query: input };
}
}
return await this.processDataRequest(params);
}
async processDataRequest(params) {
try {
const escapePercentSigns = (value) => {
if (typeof value === 'string') {
return value.replace(/%/g, '%%');
}
return value;
};
const escapedParams = Object.fromEntries(Object.entries(params).map(([key, value]) => [
key,
escapePercentSigns(value)
]));
if (!escapedParams.limit) {
escapedParams.limit = 10000;
}
if (!escapedParams.offset) {
escapedParams.offset = 0;
}
const requestBody = {
api_name: this.name,
token: this.token,
params: escapedParams,
fields: '',
};
console.log('requestBody', JSON.stringify(requestBody));
const response = await fetch('https://api.tushare.pro', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(requestBody),
signal: AbortSignal.timeout(this.timeout),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log('data', data);
return JSON.stringify(data, null, 2);
}
catch (error) {
const errorMessage = error && typeof error === 'object' && error !== null && 'message' in error
? error.message
: String(error || 'Unknown error');
return `Error: ${errorMessage}`;
}
}
}
exports.TushareTool = TushareTool;
//# sourceMappingURL=TushareTool.js.map