fmp-ai-tools 0.2.0-beta.1 → 0.2.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -31
- package/dist/providers/openai/index.js +74 -114
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/openai/index.mjs +74 -93
- package/dist/providers/openai/index.mjs.map +1 -1
- package/dist/providers/vercel-ai/index.js +72 -38
- package/dist/providers/vercel-ai/index.js.map +1 -1
- package/dist/providers/vercel-ai/index.mjs +72 -38
- package/dist/providers/vercel-ai/index.mjs.map +1 -1
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -7,44 +7,39 @@ This package provides pre-built AI tools that can be used with various AI framew
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install fmp-ai-tools
|
|
11
|
-
# or
|
|
12
|
-
pnpm add fmp-ai-tools
|
|
13
|
-
# or
|
|
14
|
-
yarn add fmp-ai-tools
|
|
10
|
+
pnpm add fmp-ai-tools # or: npm install fmp-ai-tools / yarn add fmp-ai-tools
|
|
15
11
|
```
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
`fmp-ai-tools` has two entry points. `ai` and `@openai/agents` are **optional peer dependencies**, so install only the SDK for the entry point you use, plus `zod`.
|
|
18
14
|
|
|
19
|
-
|
|
15
|
+
### Vercel AI SDK — `fmp-ai-tools/vercel-ai`
|
|
20
16
|
|
|
21
17
|
```bash
|
|
22
|
-
# For Vercel AI SDK
|
|
23
|
-
npm install ai zod
|
|
24
|
-
# or
|
|
25
18
|
pnpm add ai zod
|
|
26
|
-
# or
|
|
27
|
-
yarn add ai zod
|
|
28
19
|
```
|
|
29
20
|
|
|
30
|
-
|
|
21
|
+
- `ai`: `>=6.0.0`
|
|
22
|
+
- `zod`: `^4.0.0`
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
- `zod`: ^3.25.76
|
|
24
|
+
### OpenAI Agents — `fmp-ai-tools/openai`
|
|
34
25
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
```bash
|
|
27
|
+
pnpm add @openai/agents zod
|
|
28
|
+
```
|
|
38
29
|
|
|
39
|
-
|
|
30
|
+
- `@openai/agents`: `>=0.11.0`
|
|
31
|
+
- `zod`: `^4.0.0`
|
|
40
32
|
|
|
41
|
-
|
|
33
|
+
Both entry points are imported with a normal static `import` — no `serverExternalPackages`, `createRequire`, or other bundler workarounds are needed (Next.js App Router and Turbopack included).
|
|
42
34
|
|
|
43
35
|
## Quick Start
|
|
44
36
|
|
|
45
37
|
### Vercel AI SDK (Recommended)
|
|
46
38
|
|
|
39
|
+
`convertToModelMessages` is **async in `ai` v6** — be sure to `await` it.
|
|
40
|
+
|
|
47
41
|
```typescript
|
|
42
|
+
// app/api/chat/route.ts
|
|
48
43
|
import { openai } from '@ai-sdk/openai';
|
|
49
44
|
import { streamText, convertToModelMessages, stepCountIs } from 'ai';
|
|
50
45
|
import { fmpTools } from 'fmp-ai-tools/vercel-ai';
|
|
@@ -54,9 +49,12 @@ export async function POST(req: Request) {
|
|
|
54
49
|
|
|
55
50
|
const result = streamText({
|
|
56
51
|
model: openai('gpt-4o-mini'),
|
|
57
|
-
messages: convertToModelMessages(messages),
|
|
52
|
+
messages: await convertToModelMessages(messages),
|
|
58
53
|
tools: fmpTools,
|
|
59
54
|
stopWhen: stepCountIs(5),
|
|
55
|
+
// FMP tools have optional params; relax strict JSON schema so the model
|
|
56
|
+
// can omit them (@ai-sdk/openai v3 defaults strictJsonSchema: true).
|
|
57
|
+
providerOptions: { openai: { strictJsonSchema: false } },
|
|
60
58
|
});
|
|
61
59
|
|
|
62
60
|
return result.toUIMessageStreamResponse();
|
|
@@ -66,19 +64,24 @@ export async function POST(req: Request) {
|
|
|
66
64
|
### OpenAI Agents
|
|
67
65
|
|
|
68
66
|
```typescript
|
|
67
|
+
// app/api/chat/route.ts
|
|
69
68
|
import { Agent, run } from '@openai/agents';
|
|
70
69
|
import { fmpTools } from 'fmp-ai-tools/openai';
|
|
71
70
|
|
|
72
71
|
const agent = new Agent({
|
|
73
72
|
name: 'Financial Analyst',
|
|
73
|
+
model: 'gpt-4o-mini',
|
|
74
74
|
instructions: 'You are a financial analyst with access to real-time market data.',
|
|
75
75
|
tools: fmpTools,
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
);
|
|
78
|
+
export async function POST(req: Request) {
|
|
79
|
+
const { message } = await req.json();
|
|
80
|
+
|
|
81
|
+
const result = await run(agent, message);
|
|
82
|
+
|
|
83
|
+
return Response.json({ output: result.finalOutput });
|
|
84
|
+
}
|
|
82
85
|
```
|
|
83
86
|
|
|
84
87
|
## Configuration
|
|
@@ -222,7 +225,7 @@ const selectedTools = {
|
|
|
222
225
|
// Use with Vercel AI SDK
|
|
223
226
|
const result = streamText({
|
|
224
227
|
model: openai('gpt-4o-mini'),
|
|
225
|
-
messages: convertToModelMessages(messages),
|
|
228
|
+
messages: await convertToModelMessages(messages),
|
|
226
229
|
tools: selectedTools,
|
|
227
230
|
});
|
|
228
231
|
```
|
|
@@ -299,12 +302,25 @@ Each tool accepts specific parameters. Here are some common ones:
|
|
|
299
302
|
|
|
300
303
|
## Error Handling
|
|
301
304
|
|
|
302
|
-
|
|
305
|
+
When a request fails, a tool returns a structured JSON error (instead of `null`) so the model can explain *why* to the user:
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{ "error": true, "type": "plan-restricted", "message": "This endpoint is not available on your current FMP plan. (403: ...)", "status": 403 }
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
The `type` field classifies the failure so your agent can react appropriately:
|
|
312
|
+
|
|
313
|
+
| `type` | Meaning |
|
|
314
|
+
| ----------------- | ------------------------------------------------------------ |
|
|
315
|
+
| `plan-restricted` | Endpoint isn't included in your FMP subscription (402/403) |
|
|
316
|
+
| `rate-limit` | FMP quota / rate limit reached (429) |
|
|
317
|
+
| `auth` | Invalid or missing `FMP_API_KEY` (401) |
|
|
318
|
+
| `not-found` | Resource does not exist (404) |
|
|
319
|
+
| `bad-request` | Invalid parameters (400) |
|
|
320
|
+
| `network` | No response from FMP (timeout / offline) |
|
|
321
|
+
| `unknown` | Anything else |
|
|
303
322
|
|
|
304
|
-
-
|
|
305
|
-
- The requested data is not available
|
|
306
|
-
- Rate limits are exceeded
|
|
307
|
-
- Invalid parameters are provided
|
|
323
|
+
This is especially useful on lower FMP tiers: an agent calling an endpoint your plan doesn't cover now gets a clear `plan-restricted` message it can relay, rather than empty data. (Direct `fmp-node-api` callers get the same classification via `response.errorType`.)
|
|
308
324
|
|
|
309
325
|
## Testing Tools
|
|
310
326
|
|
|
@@ -1,83 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var fs = require('fs');
|
|
4
|
-
var path = require('path');
|
|
5
3
|
var zod = require('zod');
|
|
6
4
|
var agents = require('@openai/agents');
|
|
7
5
|
var fmpNodeApi = require('fmp-node-api');
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
if (e && e.__esModule) return e;
|
|
11
|
-
var n = Object.create(null);
|
|
12
|
-
if (e) {
|
|
13
|
-
Object.keys(e).forEach(function (k) {
|
|
14
|
-
if (k !== 'default') {
|
|
15
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
get: function () { return e[k]; }
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
n.default = e;
|
|
24
|
-
return Object.freeze(n);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
|
28
|
-
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
29
|
-
|
|
30
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
31
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
32
|
-
}) : x)(function(x) {
|
|
33
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
34
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
35
|
-
});
|
|
36
|
-
var REQUIRED_VERSION = "0.11.0";
|
|
37
|
-
function getInstalledPackageVersion(packageName) {
|
|
38
|
-
try {
|
|
39
|
-
const packagePath = path__namespace.dirname(__require.resolve(packageName));
|
|
40
|
-
const packageJsonPath = path__namespace.join(packagePath, "..", "package.json");
|
|
41
|
-
if (fs__namespace.existsSync(packageJsonPath)) {
|
|
42
|
-
const packageJson = JSON.parse(fs__namespace.readFileSync(packageJsonPath, "utf8"));
|
|
43
|
-
return packageJson.version;
|
|
44
|
-
}
|
|
45
|
-
} catch (_error) {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
function compareVersions(v1, v2) {
|
|
51
|
-
const parseVersion = (version) => {
|
|
52
|
-
return version.split(".").map((num) => parseInt(num, 10) || 0);
|
|
53
|
-
};
|
|
54
|
-
const v1Parts = parseVersion(v1);
|
|
55
|
-
const v2Parts = parseVersion(v2);
|
|
56
|
-
const maxLength = Math.max(v1Parts.length, v2Parts.length);
|
|
57
|
-
for (let i = 0; i < maxLength; i++) {
|
|
58
|
-
const v1Part = v1Parts[i] || 0;
|
|
59
|
-
const v2Part = v2Parts[i] || 0;
|
|
60
|
-
if (v1Part < v2Part) return -1;
|
|
61
|
-
if (v1Part > v2Part) return 1;
|
|
62
|
-
}
|
|
63
|
-
return 0;
|
|
64
|
-
}
|
|
65
|
-
function isVersionLessThan(installedVersion, requiredVersion) {
|
|
66
|
-
return compareVersions(installedVersion, requiredVersion) < 0;
|
|
67
|
-
}
|
|
68
|
-
function checkOpenAIAgentsVersion() {
|
|
69
|
-
const installedVersion = getInstalledPackageVersion("@openai/agents");
|
|
70
|
-
if (!installedVersion) {
|
|
71
|
-
throw new Error(
|
|
72
|
-
`@openai/agents package not found. This package requires @openai/agents to be installed. Please install with: npm install @openai/agents`
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
if (isVersionLessThan(installedVersion, REQUIRED_VERSION)) {
|
|
76
|
-
console.warn(
|
|
77
|
-
`Incompatible @openai/agents version detected. Installed version: ${installedVersion}, Required: ${REQUIRED_VERSION} or higher.`
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
7
|
+
// src/providers/openai/company.ts
|
|
81
8
|
|
|
82
9
|
// src/utils/logger.ts
|
|
83
10
|
function isApiLoggingEnabled() {
|
|
@@ -250,6 +177,36 @@ async function logApiExecutionWithTiming(toolName, input, executeFn) {
|
|
|
250
177
|
}
|
|
251
178
|
}
|
|
252
179
|
|
|
180
|
+
// src/utils/format-response.ts
|
|
181
|
+
function toToolResponse(res) {
|
|
182
|
+
if (res.success === false) {
|
|
183
|
+
return JSON.stringify({
|
|
184
|
+
error: true,
|
|
185
|
+
type: res.errorType ?? "unknown",
|
|
186
|
+
message: res.error ?? "The request failed.",
|
|
187
|
+
status: res.status
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (isEmpty(res.data)) {
|
|
191
|
+
return JSON.stringify({ data: [], note: "No data was returned for this request." });
|
|
192
|
+
}
|
|
193
|
+
return JSON.stringify(res.data, null, 2);
|
|
194
|
+
}
|
|
195
|
+
function toToolError(error) {
|
|
196
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
197
|
+
let type = "unknown";
|
|
198
|
+
if (/api[\s_-]?key/i.test(message)) {
|
|
199
|
+
type = "auth";
|
|
200
|
+
}
|
|
201
|
+
return JSON.stringify({ error: true, type, message, status: 0 });
|
|
202
|
+
}
|
|
203
|
+
function isEmpty(data) {
|
|
204
|
+
if (data == null) return true;
|
|
205
|
+
if (Array.isArray(data)) return data.length === 0;
|
|
206
|
+
if (typeof data === "object") return Object.keys(data).length === 0;
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
|
|
253
210
|
// src/utils/openai-tool-wrapper.ts
|
|
254
211
|
function createOpenAITool(config) {
|
|
255
212
|
const { name, description, inputSchema, execute } = config;
|
|
@@ -258,8 +215,12 @@ function createOpenAITool(config) {
|
|
|
258
215
|
description,
|
|
259
216
|
parameters: inputSchema,
|
|
260
217
|
execute: async (input) => {
|
|
261
|
-
|
|
262
|
-
|
|
218
|
+
try {
|
|
219
|
+
const args = inputSchema.parse(input);
|
|
220
|
+
return await logApiExecutionWithTiming(name, args, () => execute(args));
|
|
221
|
+
} catch (error) {
|
|
222
|
+
return toToolError(error);
|
|
223
|
+
}
|
|
263
224
|
}
|
|
264
225
|
});
|
|
265
226
|
}
|
|
@@ -277,7 +238,7 @@ var getCompanyProfile = createOpenAITool({
|
|
|
277
238
|
execute: async ({ symbol }) => {
|
|
278
239
|
const fmp = getFMPClient();
|
|
279
240
|
const companyProfile = await fmp.company.getCompanyProfile(symbol);
|
|
280
|
-
return
|
|
241
|
+
return toToolResponse(companyProfile);
|
|
281
242
|
}
|
|
282
243
|
});
|
|
283
244
|
var getCompanySharesFloat = createOpenAITool({
|
|
@@ -289,7 +250,7 @@ var getCompanySharesFloat = createOpenAITool({
|
|
|
289
250
|
execute: async ({ symbol }) => {
|
|
290
251
|
const fmp = getFMPClient();
|
|
291
252
|
const companySharesFloat = await fmp.company.getSharesFloat(symbol);
|
|
292
|
-
return
|
|
253
|
+
return toToolResponse(companySharesFloat);
|
|
293
254
|
}
|
|
294
255
|
});
|
|
295
256
|
var getCompanyExecutiveCompensation = createOpenAITool({
|
|
@@ -301,7 +262,7 @@ var getCompanyExecutiveCompensation = createOpenAITool({
|
|
|
301
262
|
execute: async ({ symbol }) => {
|
|
302
263
|
const fmp = getFMPClient();
|
|
303
264
|
const companyExecutiveCompensation = await fmp.company.getExecutiveCompensation(symbol);
|
|
304
|
-
return
|
|
265
|
+
return toToolResponse(companyExecutiveCompensation);
|
|
305
266
|
}
|
|
306
267
|
});
|
|
307
268
|
var calendarInputSchema = zod.z.object({
|
|
@@ -318,7 +279,7 @@ var getEarningsCalendar = createOpenAITool({
|
|
|
318
279
|
from: from ?? void 0,
|
|
319
280
|
to: to ?? void 0
|
|
320
281
|
});
|
|
321
|
-
return
|
|
282
|
+
return toToolResponse(earningsCalendar);
|
|
322
283
|
}
|
|
323
284
|
});
|
|
324
285
|
var getEconomicCalendar = createOpenAITool({
|
|
@@ -331,7 +292,7 @@ var getEconomicCalendar = createOpenAITool({
|
|
|
331
292
|
from: from ?? void 0,
|
|
332
293
|
to: to ?? void 0
|
|
333
294
|
});
|
|
334
|
-
return
|
|
295
|
+
return toToolResponse(economicCalendar);
|
|
335
296
|
}
|
|
336
297
|
});
|
|
337
298
|
var treasuryRatesInputSchema = zod.z.object({
|
|
@@ -378,7 +339,7 @@ var getTreasuryRates = createOpenAITool({
|
|
|
378
339
|
from: from ?? void 0,
|
|
379
340
|
to: to ?? void 0
|
|
380
341
|
});
|
|
381
|
-
return
|
|
342
|
+
return toToolResponse(treasuryRates);
|
|
382
343
|
}
|
|
383
344
|
});
|
|
384
345
|
var getEconomicIndicators = createOpenAITool({
|
|
@@ -392,7 +353,7 @@ var getEconomicIndicators = createOpenAITool({
|
|
|
392
353
|
from: from ?? void 0,
|
|
393
354
|
to: to ?? void 0
|
|
394
355
|
});
|
|
395
|
-
return
|
|
356
|
+
return toToolResponse(economicIndicators);
|
|
396
357
|
}
|
|
397
358
|
});
|
|
398
359
|
var etfHoldingsInputSchema = zod.z.object({
|
|
@@ -413,7 +374,7 @@ var getETFHoldings = createOpenAITool({
|
|
|
413
374
|
params.date = date;
|
|
414
375
|
}
|
|
415
376
|
const etfHoldings = await fmp.etf.getHoldings(params);
|
|
416
|
-
return
|
|
377
|
+
return toToolResponse(etfHoldings);
|
|
417
378
|
}
|
|
418
379
|
});
|
|
419
380
|
var getETFProfile = createOpenAITool({
|
|
@@ -423,7 +384,7 @@ var getETFProfile = createOpenAITool({
|
|
|
423
384
|
execute: async ({ symbol }) => {
|
|
424
385
|
const fmp = getFMPClient();
|
|
425
386
|
const etfProfile = await fmp.etf.getProfile(symbol);
|
|
426
|
-
return
|
|
387
|
+
return toToolResponse(etfProfile);
|
|
427
388
|
}
|
|
428
389
|
});
|
|
429
390
|
var getBalanceSheet = createOpenAITool({
|
|
@@ -441,7 +402,7 @@ var getBalanceSheet = createOpenAITool({
|
|
|
441
402
|
period,
|
|
442
403
|
limit: Number(limit)
|
|
443
404
|
});
|
|
444
|
-
return
|
|
405
|
+
return toToolResponse(balanceSheet);
|
|
445
406
|
}
|
|
446
407
|
});
|
|
447
408
|
var getIncomeStatement = createOpenAITool({
|
|
@@ -459,7 +420,7 @@ var getIncomeStatement = createOpenAITool({
|
|
|
459
420
|
period,
|
|
460
421
|
limit: Number(limit)
|
|
461
422
|
});
|
|
462
|
-
return
|
|
423
|
+
return toToolResponse(incomeStatement);
|
|
463
424
|
}
|
|
464
425
|
});
|
|
465
426
|
var getCashFlowStatement = createOpenAITool({
|
|
@@ -477,7 +438,7 @@ var getCashFlowStatement = createOpenAITool({
|
|
|
477
438
|
period,
|
|
478
439
|
limit: Number(limit)
|
|
479
440
|
});
|
|
480
|
-
return
|
|
441
|
+
return toToolResponse(cashFlowStatement);
|
|
481
442
|
}
|
|
482
443
|
});
|
|
483
444
|
var getKeyMetrics = createOpenAITool({
|
|
@@ -491,7 +452,7 @@ var getKeyMetrics = createOpenAITool({
|
|
|
491
452
|
execute: async ({ symbol, period, limit }) => {
|
|
492
453
|
const fmp = getFMPClient();
|
|
493
454
|
const keyMetrics = await fmp.financial.getKeyMetrics({ symbol, period, limit: Number(limit) });
|
|
494
|
-
return
|
|
455
|
+
return toToolResponse(keyMetrics);
|
|
495
456
|
}
|
|
496
457
|
});
|
|
497
458
|
var getFinancialRatios = createOpenAITool({
|
|
@@ -509,7 +470,7 @@ var getFinancialRatios = createOpenAITool({
|
|
|
509
470
|
period,
|
|
510
471
|
limit: Number(limit)
|
|
511
472
|
});
|
|
512
|
-
return
|
|
473
|
+
return toToolResponse(financialRatios);
|
|
513
474
|
}
|
|
514
475
|
});
|
|
515
476
|
var getEnterpriseValue = createOpenAITool({
|
|
@@ -527,7 +488,7 @@ var getEnterpriseValue = createOpenAITool({
|
|
|
527
488
|
period,
|
|
528
489
|
limit: Number(limit)
|
|
529
490
|
});
|
|
530
|
-
return
|
|
491
|
+
return toToolResponse(enterpriseValue);
|
|
531
492
|
}
|
|
532
493
|
});
|
|
533
494
|
var getCashflowGrowth = createOpenAITool({
|
|
@@ -545,7 +506,7 @@ var getCashflowGrowth = createOpenAITool({
|
|
|
545
506
|
period,
|
|
546
507
|
limit: Number(limit)
|
|
547
508
|
});
|
|
548
|
-
return
|
|
509
|
+
return toToolResponse(cashflowGrowth);
|
|
549
510
|
}
|
|
550
511
|
});
|
|
551
512
|
var getIncomeGrowth = createOpenAITool({
|
|
@@ -563,7 +524,7 @@ var getIncomeGrowth = createOpenAITool({
|
|
|
563
524
|
period,
|
|
564
525
|
limit: Number(limit)
|
|
565
526
|
});
|
|
566
|
-
return
|
|
527
|
+
return toToolResponse(incomeGrowth);
|
|
567
528
|
}
|
|
568
529
|
});
|
|
569
530
|
var getBalanceSheetGrowth = createOpenAITool({
|
|
@@ -581,7 +542,7 @@ var getBalanceSheetGrowth = createOpenAITool({
|
|
|
581
542
|
period,
|
|
582
543
|
limit: Number(limit)
|
|
583
544
|
});
|
|
584
|
-
return
|
|
545
|
+
return toToolResponse(balanceSheetGrowth);
|
|
585
546
|
}
|
|
586
547
|
});
|
|
587
548
|
var getFinancialGrowth = createOpenAITool({
|
|
@@ -599,7 +560,7 @@ var getFinancialGrowth = createOpenAITool({
|
|
|
599
560
|
period,
|
|
600
561
|
limit: Number(limit)
|
|
601
562
|
});
|
|
602
|
-
return
|
|
563
|
+
return toToolResponse(financialGrowth);
|
|
603
564
|
}
|
|
604
565
|
});
|
|
605
566
|
var getEarningsHistorical = createOpenAITool({
|
|
@@ -615,7 +576,7 @@ var getEarningsHistorical = createOpenAITool({
|
|
|
615
576
|
symbol,
|
|
616
577
|
limit: Number(limit)
|
|
617
578
|
});
|
|
618
|
-
return
|
|
579
|
+
return toToolResponse(earningsHistorical);
|
|
619
580
|
}
|
|
620
581
|
});
|
|
621
582
|
var insiderTradingInputSchema = zod.z.object({
|
|
@@ -629,7 +590,7 @@ var getInsiderTrading = createOpenAITool({
|
|
|
629
590
|
execute: async ({ symbol, page }) => {
|
|
630
591
|
const fmp = getFMPClient();
|
|
631
592
|
const insiderTrading = await fmp.insider.getInsiderTradesBySymbol(symbol, page);
|
|
632
|
-
return
|
|
593
|
+
return toToolResponse(insiderTrading);
|
|
633
594
|
}
|
|
634
595
|
});
|
|
635
596
|
var institutionalHoldersInputSchema = zod.z.object({
|
|
@@ -642,7 +603,7 @@ var getInstitutionalHolders = createOpenAITool({
|
|
|
642
603
|
execute: async ({ symbol }) => {
|
|
643
604
|
const fmp = getFMPClient();
|
|
644
605
|
const institutionalHolders = await fmp.institutional.getInstitutionalHolders({ symbol });
|
|
645
|
-
return
|
|
606
|
+
return toToolResponse(institutionalHolders);
|
|
646
607
|
}
|
|
647
608
|
});
|
|
648
609
|
var emptyInputSchema = zod.z.object({});
|
|
@@ -653,7 +614,7 @@ var getMarketPerformance = createOpenAITool({
|
|
|
653
614
|
execute: async () => {
|
|
654
615
|
const fmp = getFMPClient();
|
|
655
616
|
const marketPerformance = await fmp.market.getMarketPerformance();
|
|
656
|
-
return
|
|
617
|
+
return toToolResponse(marketPerformance);
|
|
657
618
|
}
|
|
658
619
|
});
|
|
659
620
|
var getSectorPerformance = createOpenAITool({
|
|
@@ -663,7 +624,7 @@ var getSectorPerformance = createOpenAITool({
|
|
|
663
624
|
execute: async () => {
|
|
664
625
|
const fmp = getFMPClient();
|
|
665
626
|
const sectorPerformance = await fmp.market.getSectorPerformance();
|
|
666
|
-
return
|
|
627
|
+
return toToolResponse(sectorPerformance);
|
|
667
628
|
}
|
|
668
629
|
});
|
|
669
630
|
var getGainers = createOpenAITool({
|
|
@@ -673,7 +634,7 @@ var getGainers = createOpenAITool({
|
|
|
673
634
|
execute: async () => {
|
|
674
635
|
const fmp = getFMPClient();
|
|
675
636
|
const gainers = await fmp.market.getGainers();
|
|
676
|
-
return
|
|
637
|
+
return toToolResponse(gainers);
|
|
677
638
|
}
|
|
678
639
|
});
|
|
679
640
|
var getLosers = createOpenAITool({
|
|
@@ -683,7 +644,7 @@ var getLosers = createOpenAITool({
|
|
|
683
644
|
execute: async () => {
|
|
684
645
|
const fmp = getFMPClient();
|
|
685
646
|
const losers = await fmp.market.getLosers();
|
|
686
|
-
return
|
|
647
|
+
return toToolResponse(losers);
|
|
687
648
|
}
|
|
688
649
|
});
|
|
689
650
|
var getMostActive = createOpenAITool({
|
|
@@ -693,7 +654,7 @@ var getMostActive = createOpenAITool({
|
|
|
693
654
|
execute: async () => {
|
|
694
655
|
const fmp = getFMPClient();
|
|
695
656
|
const mostActive = await fmp.market.getMostActive();
|
|
696
|
-
return
|
|
657
|
+
return toToolResponse(mostActive);
|
|
697
658
|
}
|
|
698
659
|
});
|
|
699
660
|
var stockQuoteInputSchema = zod.z.object({
|
|
@@ -706,7 +667,7 @@ var getStockQuote = createOpenAITool({
|
|
|
706
667
|
execute: async ({ symbol }) => {
|
|
707
668
|
const fmp = getFMPClient();
|
|
708
669
|
const stockQuote = await fmp.quote.getQuote(symbol);
|
|
709
|
-
return
|
|
670
|
+
return toToolResponse(stockQuote);
|
|
710
671
|
}
|
|
711
672
|
});
|
|
712
673
|
var symbolInputSchema = zod.z.object({
|
|
@@ -725,7 +686,7 @@ var getSenateTrading = createOpenAITool({
|
|
|
725
686
|
execute: async ({ symbol }) => {
|
|
726
687
|
const fmp = getFMPClient();
|
|
727
688
|
const senateTrading = await fmp.senateHouse.getSenateTrading({ symbol });
|
|
728
|
-
return
|
|
689
|
+
return toToolResponse(senateTrading);
|
|
729
690
|
}
|
|
730
691
|
});
|
|
731
692
|
var getHouseTrading = createOpenAITool({
|
|
@@ -735,7 +696,7 @@ var getHouseTrading = createOpenAITool({
|
|
|
735
696
|
execute: async ({ symbol }) => {
|
|
736
697
|
const fmp = getFMPClient();
|
|
737
698
|
const houseTrading = await fmp.senateHouse.getHouseTrading({ symbol });
|
|
738
|
-
return
|
|
699
|
+
return toToolResponse(houseTrading);
|
|
739
700
|
}
|
|
740
701
|
});
|
|
741
702
|
var getSenateTradingByName = createOpenAITool({
|
|
@@ -745,7 +706,7 @@ var getSenateTradingByName = createOpenAITool({
|
|
|
745
706
|
execute: async ({ name }) => {
|
|
746
707
|
const fmp = getFMPClient();
|
|
747
708
|
const senateTradingByName = await fmp.senateHouse.getSenateTradingByName({ name });
|
|
748
|
-
return
|
|
709
|
+
return toToolResponse(senateTradingByName);
|
|
749
710
|
}
|
|
750
711
|
});
|
|
751
712
|
var getHouseTradingByName = createOpenAITool({
|
|
@@ -755,7 +716,7 @@ var getHouseTradingByName = createOpenAITool({
|
|
|
755
716
|
execute: async ({ name }) => {
|
|
756
717
|
const fmp = getFMPClient();
|
|
757
718
|
const houseTradingByName = await fmp.senateHouse.getHouseTradingByName({ name });
|
|
758
|
-
return
|
|
719
|
+
return toToolResponse(houseTradingByName);
|
|
759
720
|
}
|
|
760
721
|
});
|
|
761
722
|
var getSenateTradingRSSFeed = createOpenAITool({
|
|
@@ -765,7 +726,7 @@ var getSenateTradingRSSFeed = createOpenAITool({
|
|
|
765
726
|
execute: async ({ page }) => {
|
|
766
727
|
const fmp = getFMPClient();
|
|
767
728
|
const senateTradingRSSFeed = await fmp.senateHouse.getSenateTradingRSSFeed({ page });
|
|
768
|
-
return
|
|
729
|
+
return toToolResponse(senateTradingRSSFeed);
|
|
769
730
|
}
|
|
770
731
|
});
|
|
771
732
|
var getHouseTradingRSSFeed = createOpenAITool({
|
|
@@ -775,7 +736,7 @@ var getHouseTradingRSSFeed = createOpenAITool({
|
|
|
775
736
|
execute: async ({ page }) => {
|
|
776
737
|
const fmp = getFMPClient();
|
|
777
738
|
const houseTradingRSSFeed = await fmp.senateHouse.getHouseTradingRSSFeed({ page });
|
|
778
|
-
return
|
|
739
|
+
return toToolResponse(houseTradingRSSFeed);
|
|
779
740
|
}
|
|
780
741
|
});
|
|
781
742
|
var symbolInputSchema2 = zod.z.object({
|
|
@@ -788,7 +749,7 @@ var getMarketCap = createOpenAITool({
|
|
|
788
749
|
execute: async ({ symbol }) => {
|
|
789
750
|
const fmp = getFMPClient();
|
|
790
751
|
const marketCap = await fmp.stock.getMarketCap(symbol);
|
|
791
|
-
return
|
|
752
|
+
return toToolResponse(marketCap);
|
|
792
753
|
}
|
|
793
754
|
});
|
|
794
755
|
var getStockSplits = createOpenAITool({
|
|
@@ -798,7 +759,7 @@ var getStockSplits = createOpenAITool({
|
|
|
798
759
|
execute: async ({ symbol }) => {
|
|
799
760
|
const fmp = getFMPClient();
|
|
800
761
|
const stockSplits = await fmp.stock.getStockSplits(symbol);
|
|
801
|
-
return
|
|
762
|
+
return toToolResponse(stockSplits);
|
|
802
763
|
}
|
|
803
764
|
});
|
|
804
765
|
var getDividendHistory = createOpenAITool({
|
|
@@ -808,7 +769,7 @@ var getDividendHistory = createOpenAITool({
|
|
|
808
769
|
execute: async ({ symbol }) => {
|
|
809
770
|
const fmp = getFMPClient();
|
|
810
771
|
const dividendHistory = await fmp.stock.getDividendHistory(symbol);
|
|
811
|
-
return
|
|
772
|
+
return toToolResponse(dividendHistory);
|
|
812
773
|
}
|
|
813
774
|
});
|
|
814
775
|
|
|
@@ -892,7 +853,6 @@ var fmpTools = [
|
|
|
892
853
|
getStockSplits,
|
|
893
854
|
getDividendHistory
|
|
894
855
|
];
|
|
895
|
-
checkOpenAIAgentsVersion();
|
|
896
856
|
|
|
897
857
|
exports.calendarTools = calendarTools;
|
|
898
858
|
exports.companyTools = companyTools;
|