@tradejs/infra 2.0.21 → 3.0.0
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/dist/{chunk-YVIHTUV5.mjs → chunk-OLB6NQRG.mjs} +1 -1
- package/dist/{chunk-I2J6YDBD.mjs → chunk-ZXU7OYFU.mjs} +65 -38
- package/dist/internal-BuHqoCCV.d.mts +9 -0
- package/dist/internal-q48Torp4.d.ts +9 -0
- package/dist/ml.mjs +3 -3
- package/dist/query-tkHVD4Xo.d.mts +12 -0
- package/dist/query-tkHVD4Xo.d.ts +12 -0
- package/dist/timescale/candles.js +6 -4
- package/dist/timescale/candles.mjs +2 -2
- package/dist/timescale/client.d.mts +3 -2
- package/dist/timescale/client.d.ts +3 -2
- package/dist/timescale/client.js +40 -15
- package/dist/timescale/client.mjs +2 -2
- package/dist/timescale/derivatives.d.mts +4 -2
- package/dist/timescale/derivatives.d.ts +4 -2
- package/dist/timescale/derivatives.js +20 -12
- package/dist/timescale/derivatives.mjs +479 -13
- package/dist/timescale/hyperliquidWhales.d.mts +29 -25
- package/dist/timescale/hyperliquidWhales.d.ts +29 -25
- package/dist/timescale/hyperliquidWhales.js +84 -71
- package/dist/timescale/hyperliquidWhales.mjs +1103 -14
- package/dist/timescale/marketContext.d.mts +15 -11
- package/dist/timescale/marketContext.d.ts +15 -11
- package/dist/timescale/marketContext.js +67 -57
- package/dist/timescale/marketContext.mjs +1259 -28
- package/dist/timescale/spread.js +6 -4
- package/dist/timescale/spread.mjs +105 -5
- package/dist/userSettings.js +3 -316
- package/dist/userSettings.mjs +3 -21
- package/package.json +2 -22
- package/dist/aiEndpoints.d.mts +0 -10
- package/dist/aiEndpoints.d.ts +0 -10
- package/dist/aiEndpoints.js +0 -159
- package/dist/aiEndpoints.mjs +0 -12
- package/dist/aiLanguages.d.mts +0 -11
- package/dist/aiLanguages.d.ts +0 -11
- package/dist/aiLanguages.js +0 -71
- package/dist/aiLanguages.mjs +0 -12
- package/dist/aiModels.d.mts +0 -12
- package/dist/aiModels.d.ts +0 -12
- package/dist/aiModels.js +0 -272
- package/dist/aiModels.mjs +0 -17
- package/dist/chunk-2CZREG43.mjs +0 -112
- package/dist/chunk-CCC7DX2T.mjs +0 -44
- package/dist/chunk-DFMKDB2R.mjs +0 -1285
- package/dist/chunk-DTCLZIBM.mjs +0 -163
- package/dist/chunk-NWXFWTWU.mjs +0 -1114
- package/dist/chunk-SZQB7ER5.mjs +0 -492
- package/dist/chunk-XQ3YBULV.mjs +0 -132
- package/dist/internal-2coHaaos.d.mts +0 -26
- package/dist/internal-2coHaaos.d.ts +0 -26
- package/dist/timescale.d.mts +0 -9
- package/dist/timescale.d.ts +0 -9
- package/dist/timescale.js +0 -4228
- package/dist/timescale.mjs +0 -138
package/dist/timescale/spread.js
CHANGED
|
@@ -48,10 +48,7 @@ var getPool = () => {
|
|
|
48
48
|
return global.__pgPool__;
|
|
49
49
|
};
|
|
50
50
|
|
|
51
|
-
// src/timescale/
|
|
52
|
-
var spreadSchemaReady = false;
|
|
53
|
-
var spreadSchemaReadyPromise = null;
|
|
54
|
-
var SPREAD_SCHEMA_LOCK_KEY = 610002;
|
|
51
|
+
// src/timescale/schema/lifecycle.ts
|
|
55
52
|
var withSchemaLock = async (lockKey, work) => {
|
|
56
53
|
const pool = getPool();
|
|
57
54
|
await pool.query("SELECT pg_advisory_lock($1)", [lockKey]);
|
|
@@ -61,6 +58,11 @@ var withSchemaLock = async (lockKey, work) => {
|
|
|
61
58
|
await pool.query("SELECT pg_advisory_unlock($1)", [lockKey]);
|
|
62
59
|
}
|
|
63
60
|
};
|
|
61
|
+
|
|
62
|
+
// src/timescale/schema/spread.ts
|
|
63
|
+
var spreadSchemaReady = false;
|
|
64
|
+
var spreadSchemaReadyPromise = null;
|
|
65
|
+
var SPREAD_SCHEMA_LOCK_KEY = 610002;
|
|
64
66
|
var ensureSpreadSchema = async () => {
|
|
65
67
|
if (spreadSchemaReady) return;
|
|
66
68
|
if (spreadSchemaReadyPromise) {
|
|
@@ -1,9 +1,109 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
ensureSpreadSchema,
|
|
3
|
+
getPool
|
|
4
|
+
} from "../chunk-ZXU7OYFU.mjs";
|
|
5
|
+
|
|
6
|
+
// src/timescale/spread.ts
|
|
7
|
+
async function upsertSpreadRows(rows) {
|
|
8
|
+
if (!rows.length) return;
|
|
9
|
+
await ensureSpreadSchema();
|
|
10
|
+
const pool = getPool();
|
|
11
|
+
const cols = [
|
|
12
|
+
"symbol",
|
|
13
|
+
"interval",
|
|
14
|
+
"ts",
|
|
15
|
+
"binance_price",
|
|
16
|
+
"coinbase_price",
|
|
17
|
+
"spread",
|
|
18
|
+
"source"
|
|
19
|
+
];
|
|
20
|
+
const maxRows = Math.floor(65535 / cols.length);
|
|
21
|
+
if (rows.length > maxRows) {
|
|
22
|
+
for (let i = 0; i < rows.length; i += maxRows) {
|
|
23
|
+
await upsertSpreadRows(rows.slice(i, i + maxRows));
|
|
24
|
+
}
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const valuesSql = rows.map(
|
|
28
|
+
(_, i) => `(${cols.map((__, j) => `$${i * cols.length + j + 1}`).join(",")})`
|
|
29
|
+
).join(",");
|
|
30
|
+
const flat = rows.flatMap((row) => [
|
|
31
|
+
row.symbol,
|
|
32
|
+
row.interval,
|
|
33
|
+
row.ts,
|
|
34
|
+
row.binancePrice ?? null,
|
|
35
|
+
row.coinbasePrice ?? null,
|
|
36
|
+
row.spread ?? null,
|
|
37
|
+
row.source ?? null
|
|
38
|
+
]);
|
|
39
|
+
const sql = `
|
|
40
|
+
INSERT INTO market_spread (${cols.join(",")})
|
|
41
|
+
VALUES ${valuesSql}
|
|
42
|
+
ON CONFLICT (symbol, interval, ts) DO UPDATE SET
|
|
43
|
+
binance_price = COALESCE(EXCLUDED.binance_price, market_spread.binance_price),
|
|
44
|
+
coinbase_price = COALESCE(EXCLUDED.coinbase_price, market_spread.coinbase_price),
|
|
45
|
+
spread = COALESCE(EXCLUDED.spread, market_spread.spread),
|
|
46
|
+
source = COALESCE(EXCLUDED.source, market_spread.source),
|
|
47
|
+
ingested_at = now()
|
|
48
|
+
`;
|
|
49
|
+
await pool.query(sql, flat);
|
|
50
|
+
}
|
|
51
|
+
async function getSpreadRangeForSymbols(symbols, interval, startMs, endMs) {
|
|
52
|
+
if (!symbols.length) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
await ensureSpreadSchema();
|
|
56
|
+
const pool = getPool();
|
|
57
|
+
const sql = `
|
|
58
|
+
SELECT symbol, interval, ts, binance_price, coinbase_price, spread
|
|
59
|
+
FROM market_spread
|
|
60
|
+
WHERE symbol = ANY($1)
|
|
61
|
+
AND interval = $2
|
|
62
|
+
AND ts >= to_timestamp($3/1000.0)
|
|
63
|
+
AND ts <= to_timestamp($4/1000.0)
|
|
64
|
+
ORDER BY symbol ASC, ts ASC
|
|
65
|
+
`;
|
|
66
|
+
const res = await pool.query(sql, [symbols, interval, startMs, endMs]);
|
|
67
|
+
return res.rows;
|
|
68
|
+
}
|
|
69
|
+
async function getSpreadSummary(hours = 24, limit = 500) {
|
|
70
|
+
await ensureSpreadSchema();
|
|
71
|
+
const pool = getPool();
|
|
72
|
+
const cappedHours = Math.max(1, Math.min(24 * 30, hours));
|
|
73
|
+
const cappedLimit = Math.max(50, Math.min(5e3, limit));
|
|
74
|
+
const rowsQ = await pool.query(
|
|
75
|
+
`
|
|
76
|
+
SELECT symbol, interval, ts, binance_price, coinbase_price, spread
|
|
77
|
+
FROM market_spread
|
|
78
|
+
WHERE ts >= now() - ($1 || ' hours')::interval
|
|
79
|
+
ORDER BY ts DESC
|
|
80
|
+
LIMIT $2
|
|
81
|
+
`,
|
|
82
|
+
[String(cappedHours), cappedLimit]
|
|
83
|
+
);
|
|
84
|
+
const aggQ = await pool.query(
|
|
85
|
+
`
|
|
86
|
+
SELECT
|
|
87
|
+
symbol,
|
|
88
|
+
interval,
|
|
89
|
+
COUNT(*)::int AS points,
|
|
90
|
+
MAX(ts) AS last_ts,
|
|
91
|
+
AVG(spread) AS avg_spread,
|
|
92
|
+
STDDEV_POP(spread) AS std_spread
|
|
93
|
+
FROM market_spread
|
|
94
|
+
WHERE ts >= now() - ($1 || ' hours')::interval
|
|
95
|
+
GROUP BY symbol, interval
|
|
96
|
+
ORDER BY points DESC, symbol ASC
|
|
97
|
+
LIMIT 500
|
|
98
|
+
`,
|
|
99
|
+
[String(cappedHours)]
|
|
100
|
+
);
|
|
101
|
+
return {
|
|
102
|
+
rows: rowsQ.rows,
|
|
103
|
+
aggregates: aggQ.rows,
|
|
104
|
+
hours: cappedHours
|
|
105
|
+
};
|
|
106
|
+
}
|
|
7
107
|
export {
|
|
8
108
|
getSpreadRangeForSymbols,
|
|
9
109
|
getSpreadSummary,
|
package/dist/userSettings.js
CHANGED
|
@@ -36,311 +36,6 @@ __export(userSettings_exports, {
|
|
|
36
36
|
});
|
|
37
37
|
module.exports = __toCommonJS(userSettings_exports);
|
|
38
38
|
|
|
39
|
-
// src/aiLanguages.ts
|
|
40
|
-
var AI_RESPONSE_LANGUAGE_OPTIONS = [
|
|
41
|
-
{ label: "English", value: "en", promptName: "English" },
|
|
42
|
-
{ label: "Chinese", value: "zh", promptName: "Chinese" },
|
|
43
|
-
{ label: "Hindi", value: "hi", promptName: "Hindi" },
|
|
44
|
-
{ label: "Spanish", value: "es", promptName: "Spanish" },
|
|
45
|
-
{ label: "French", value: "fr", promptName: "French" },
|
|
46
|
-
{ label: "Arabic", value: "ar", promptName: "Arabic" },
|
|
47
|
-
{ label: "Bengali", value: "bn", promptName: "Bengali" },
|
|
48
|
-
{ label: "Portuguese", value: "pt", promptName: "Portuguese" },
|
|
49
|
-
{ label: "Russian", value: "ru", promptName: "Russian" },
|
|
50
|
-
{ label: "Urdu", value: "ur", promptName: "Urdu" },
|
|
51
|
-
{ label: "Indonesian", value: "id", promptName: "Indonesian" },
|
|
52
|
-
{ label: "German", value: "de", promptName: "German" },
|
|
53
|
-
{ label: "Japanese", value: "ja", promptName: "Japanese" },
|
|
54
|
-
{ label: "Swahili", value: "sw", promptName: "Swahili" },
|
|
55
|
-
{ label: "Marathi", value: "mr", promptName: "Marathi" },
|
|
56
|
-
{ label: "Telugu", value: "te", promptName: "Telugu" },
|
|
57
|
-
{ label: "Turkish", value: "tr", promptName: "Turkish" },
|
|
58
|
-
{ label: "Tamil", value: "ta", promptName: "Tamil" },
|
|
59
|
-
{ label: "Vietnamese", value: "vi", promptName: "Vietnamese" },
|
|
60
|
-
{ label: "Korean", value: "ko", promptName: "Korean" }
|
|
61
|
-
];
|
|
62
|
-
var KNOWN_AI_RESPONSE_LANGUAGES = new Set(
|
|
63
|
-
AI_RESPONSE_LANGUAGE_OPTIONS.map((option) => option.value)
|
|
64
|
-
);
|
|
65
|
-
var DEFAULT_AI_RESPONSE_LANGUAGE = AI_RESPONSE_LANGUAGE_OPTIONS[0].value;
|
|
66
|
-
var normalizeAiResponseLanguage = (value) => {
|
|
67
|
-
if (typeof value !== "string") {
|
|
68
|
-
return DEFAULT_AI_RESPONSE_LANGUAGE;
|
|
69
|
-
}
|
|
70
|
-
const trimmed = value.trim().toLowerCase();
|
|
71
|
-
return KNOWN_AI_RESPONSE_LANGUAGES.has(trimmed) ? trimmed : DEFAULT_AI_RESPONSE_LANGUAGE;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// src/aiEndpoints.ts
|
|
75
|
-
var AI_CUSTOM_ENDPOINT_VALUE = "__custom__";
|
|
76
|
-
var AI_ENDPOINT_OPTIONS = [
|
|
77
|
-
{
|
|
78
|
-
label: "OpenAI",
|
|
79
|
-
value: "https://api.openai.com/v1"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
label: "Claude",
|
|
83
|
-
value: "https://api.anthropic.com/v1"
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
label: "OpenRouter",
|
|
87
|
-
value: "https://openrouter.ai/api/v1"
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
label: "Gemini",
|
|
91
|
-
value: "https://generativelanguage.googleapis.com/v1beta/openai"
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
label: "Together AI",
|
|
95
|
-
value: "https://api.together.xyz/v1"
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
label: "Groq",
|
|
99
|
-
value: "https://api.groq.com/openai/v1"
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
label: "DeepInfra",
|
|
103
|
-
value: "https://api.deepinfra.com/v1/openai"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
label: "xAI",
|
|
107
|
-
value: "https://api.x.ai/v1"
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
label: "Qwen (DashScope Intl)",
|
|
111
|
-
value: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
label: "Qwen (DashScope CN)",
|
|
115
|
-
value: "https://dashscope.aliyuncs.com/compatible-mode/v1"
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
label: "Qwen (DashScope US)",
|
|
119
|
-
value: "https://dashscope-us.aliyuncs.com/compatible-mode/v1"
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
label: "Perplexity",
|
|
123
|
-
value: "https://api.perplexity.ai"
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
label: "Fireworks",
|
|
127
|
-
value: "https://api.fireworks.ai/inference/v1"
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
label: "SambaNova",
|
|
131
|
-
value: "https://api.sambanova.ai/v1"
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
label: "Hyperbolic",
|
|
135
|
-
value: "https://api.hyperbolic.xyz/v1"
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
label: "Kimi",
|
|
139
|
-
value: "https://api.moonshot.ai/v1"
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
label: "ProxyAPI",
|
|
143
|
-
value: "https://openai.api.proxyapi.ru/v1"
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
label: "Custom",
|
|
147
|
-
value: AI_CUSTOM_ENDPOINT_VALUE
|
|
148
|
-
}
|
|
149
|
-
];
|
|
150
|
-
var KNOWN_AI_ENDPOINTS = new Set(
|
|
151
|
-
AI_ENDPOINT_OPTIONS.map((option) => option.value).filter(
|
|
152
|
-
(value) => value !== AI_CUSTOM_ENDPOINT_VALUE
|
|
153
|
-
)
|
|
154
|
-
);
|
|
155
|
-
var normalizeUrl = (value) => value.replace(/\/+$/, "");
|
|
156
|
-
var isIpv4Address = (value) => /^(?:\d{1,3}\.){3}\d{1,3}$/.test(value.trim());
|
|
157
|
-
var parseIpv4Address = (value) => value.trim().split(".").map((part) => Number(part));
|
|
158
|
-
var isPrivateIpv4Address = (value) => {
|
|
159
|
-
if (!isIpv4Address(value)) {
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
const [a, b, c, d] = parseIpv4Address(value);
|
|
163
|
-
if ([a, b, c, d].some(
|
|
164
|
-
(part) => !Number.isInteger(part) || part < 0 || part > 255
|
|
165
|
-
)) {
|
|
166
|
-
return false;
|
|
167
|
-
}
|
|
168
|
-
return a === 10 || a === 127 || a === 0 || a === 169 && b === 254 || a === 172 && b >= 16 && b <= 31 || a === 192 && b === 168;
|
|
169
|
-
};
|
|
170
|
-
var isPrivateHostname = (hostname) => {
|
|
171
|
-
const normalized = hostname.trim().toLowerCase();
|
|
172
|
-
if (!normalized) {
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
return normalized === "localhost" || normalized.endsWith(".localhost") || normalized.endsWith(".local") || normalized.endsWith(".internal") || normalized.endsWith(".lan") || normalized === "::1" || normalized === "[::1]" || isPrivateIpv4Address(normalized);
|
|
176
|
-
};
|
|
177
|
-
var isValidAiEndpointUrl = (value) => {
|
|
178
|
-
try {
|
|
179
|
-
const url = new URL(value);
|
|
180
|
-
return url.protocol === "https:" && !isPrivateHostname(url.hostname);
|
|
181
|
-
} catch {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
var normalizeAiEndpoint = (value) => {
|
|
186
|
-
if (typeof value !== "string") {
|
|
187
|
-
return "";
|
|
188
|
-
}
|
|
189
|
-
const trimmed = normalizeUrl(value.trim());
|
|
190
|
-
if (!trimmed) {
|
|
191
|
-
return "";
|
|
192
|
-
}
|
|
193
|
-
if (KNOWN_AI_ENDPOINTS.has(trimmed)) {
|
|
194
|
-
return trimmed;
|
|
195
|
-
}
|
|
196
|
-
return isValidAiEndpointUrl(trimmed) ? trimmed : "";
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
// src/aiModels.ts
|
|
200
|
-
var OPENAI_ENDPOINT = "https://api.openai.com/v1";
|
|
201
|
-
var ANTHROPIC_ENDPOINT = "https://api.anthropic.com/v1";
|
|
202
|
-
var OPENROUTER_ENDPOINT = "https://openrouter.ai/api/v1";
|
|
203
|
-
var GEMINI_ENDPOINT = "https://generativelanguage.googleapis.com/v1beta/openai";
|
|
204
|
-
var TOGETHER_ENDPOINT = "https://api.together.xyz/v1";
|
|
205
|
-
var GROQ_ENDPOINT = "https://api.groq.com/openai/v1";
|
|
206
|
-
var XAI_ENDPOINT = "https://api.x.ai/v1";
|
|
207
|
-
var QWEN_INTL_ENDPOINT = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
|
|
208
|
-
var QWEN_CN_ENDPOINT = "https://dashscope.aliyuncs.com/compatible-mode/v1";
|
|
209
|
-
var QWEN_US_ENDPOINT = "https://dashscope-us.aliyuncs.com/compatible-mode/v1";
|
|
210
|
-
var PERPLEXITY_ENDPOINT = "https://api.perplexity.ai";
|
|
211
|
-
var KIMI_ENDPOINT = "https://api.moonshot.ai/v1";
|
|
212
|
-
var PROXY_API_ENDPOINT = "https://openai.api.proxyapi.ru/v1";
|
|
213
|
-
var AI_MODEL_OPTIONS_BY_ENDPOINT = {
|
|
214
|
-
[OPENAI_ENDPOINT]: [
|
|
215
|
-
{ label: "GPT-5 mini", value: "gpt-5-mini" },
|
|
216
|
-
{ label: "GPT-5", value: "gpt-5" },
|
|
217
|
-
{ label: "GPT-5.2", value: "gpt-5.2" },
|
|
218
|
-
{ label: "GPT-4.1", value: "gpt-4.1" },
|
|
219
|
-
{ label: "GPT-4o", value: "gpt-4o" }
|
|
220
|
-
],
|
|
221
|
-
[ANTHROPIC_ENDPOINT]: [
|
|
222
|
-
{ label: "Claude Sonnet 4", value: "claude-sonnet-4-20250514" },
|
|
223
|
-
{ label: "Claude Opus 4.1", value: "claude-opus-4-1-20250805" },
|
|
224
|
-
{ label: "Claude Opus 4", value: "claude-opus-4-20250514" },
|
|
225
|
-
{ label: "Claude 3.7 Sonnet", value: "claude-3-7-sonnet-20250219" },
|
|
226
|
-
{ label: "Claude 3.5 Haiku", value: "claude-3-5-haiku-20241022" }
|
|
227
|
-
],
|
|
228
|
-
[OPENROUTER_ENDPOINT]: [
|
|
229
|
-
{ label: "OpenAI GPT-5", value: "openai/gpt-5" },
|
|
230
|
-
{ label: "Anthropic Claude Sonnet 4", value: "anthropic/claude-sonnet-4" },
|
|
231
|
-
{ label: "Google Gemini 2.5 Pro", value: "google/gemini-2.5-pro" },
|
|
232
|
-
{ label: "OpenAI GPT-5 mini", value: "openai/gpt-5-mini" },
|
|
233
|
-
{
|
|
234
|
-
label: "DeepSeek V3.1",
|
|
235
|
-
value: "deepseek/deepseek-chat-v3.1"
|
|
236
|
-
}
|
|
237
|
-
],
|
|
238
|
-
[GEMINI_ENDPOINT]: [
|
|
239
|
-
{ label: "Gemini 2.5 Pro", value: "gemini-2.5-pro" },
|
|
240
|
-
{ label: "Gemini 2.5 Flash", value: "gemini-2.5-flash" },
|
|
241
|
-
{ label: "Gemini 2.5 Flash-Lite", value: "gemini-2.5-flash-lite" },
|
|
242
|
-
{ label: "Gemini 2.0 Flash", value: "gemini-2.0-flash" },
|
|
243
|
-
{ label: "Gemini 2.0 Flash-Lite", value: "gemini-2.0-flash-lite" }
|
|
244
|
-
],
|
|
245
|
-
[TOGETHER_ENDPOINT]: [
|
|
246
|
-
{ label: "DeepSeek V3.1", value: "deepseek-ai/DeepSeek-V3.1" },
|
|
247
|
-
{
|
|
248
|
-
label: "Qwen3 Coder 480B",
|
|
249
|
-
value: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8"
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
label: "Llama 4 Maverick",
|
|
253
|
-
value: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8"
|
|
254
|
-
},
|
|
255
|
-
{ label: "DeepSeek V3", value: "deepseek-ai/DeepSeek-V3" },
|
|
256
|
-
{
|
|
257
|
-
label: "Llama 3.3 70B Turbo",
|
|
258
|
-
value: "meta-llama/Llama-3.3-70B-Instruct-Turbo"
|
|
259
|
-
}
|
|
260
|
-
],
|
|
261
|
-
[GROQ_ENDPOINT]: [
|
|
262
|
-
{ label: "GPT-OSS 120B", value: "openai/gpt-oss-120b" },
|
|
263
|
-
{
|
|
264
|
-
label: "Llama 4 Scout",
|
|
265
|
-
value: "meta-llama/llama-4-scout-17b-16e-instruct"
|
|
266
|
-
},
|
|
267
|
-
{ label: "Qwen3 32B", value: "qwen/qwen3-32b" },
|
|
268
|
-
{ label: "Llama 3.3 70B", value: "llama-3.3-70b-versatile" },
|
|
269
|
-
{ label: "Llama 3.1 8B Instant", value: "llama-3.1-8b-instant" }
|
|
270
|
-
],
|
|
271
|
-
[XAI_ENDPOINT]: [
|
|
272
|
-
{ label: "Grok 4 Fast Reasoning", value: "grok-4-fast-reasoning" },
|
|
273
|
-
{ label: "Grok 4 Fast Non-Reasoning", value: "grok-4-fast-non-reasoning" },
|
|
274
|
-
{ label: "Grok Code Fast 1", value: "grok-code-fast-1" },
|
|
275
|
-
{ label: "Grok 4", value: "grok-4-0709" },
|
|
276
|
-
{ label: "Grok 3 Mini", value: "grok-3-mini" }
|
|
277
|
-
],
|
|
278
|
-
[QWEN_INTL_ENDPOINT]: [
|
|
279
|
-
{ label: "Qwen Plus Latest", value: "qwen-plus-latest" },
|
|
280
|
-
{ label: "Qwen Turbo Latest", value: "qwen-turbo-latest" },
|
|
281
|
-
{ label: "Qwen Max Latest", value: "qwen-max-latest" },
|
|
282
|
-
{ label: "Qwen3 Coder Plus", value: "qwen3-coder-plus" },
|
|
283
|
-
{ label: "Qwen3 Coder Next", value: "qwen3-coder-next" }
|
|
284
|
-
],
|
|
285
|
-
[QWEN_CN_ENDPOINT]: [
|
|
286
|
-
{ label: "Qwen Plus Latest", value: "qwen-plus-latest" },
|
|
287
|
-
{ label: "Qwen Turbo Latest", value: "qwen-turbo-latest" },
|
|
288
|
-
{ label: "Qwen Max Latest", value: "qwen-max-latest" },
|
|
289
|
-
{ label: "Qwen3 Coder Plus", value: "qwen3-coder-plus" },
|
|
290
|
-
{ label: "Qwen3 Coder Next", value: "qwen3-coder-next" }
|
|
291
|
-
],
|
|
292
|
-
[QWEN_US_ENDPOINT]: [
|
|
293
|
-
{ label: "Qwen Plus Latest", value: "qwen-plus-latest" },
|
|
294
|
-
{ label: "Qwen Turbo Latest", value: "qwen-turbo-latest" },
|
|
295
|
-
{ label: "Qwen Max Latest", value: "qwen-max-latest" },
|
|
296
|
-
{ label: "Qwen3 Coder Plus", value: "qwen3-coder-plus" },
|
|
297
|
-
{ label: "Qwen3 Coder Next", value: "qwen3-coder-next" }
|
|
298
|
-
],
|
|
299
|
-
[PERPLEXITY_ENDPOINT]: [
|
|
300
|
-
{ label: "Sonar Pro", value: "sonar-pro" },
|
|
301
|
-
{ label: "Sonar", value: "sonar" },
|
|
302
|
-
{ label: "Sonar Reasoning Pro", value: "sonar-reasoning-pro" },
|
|
303
|
-
{ label: "Sonar Deep Research", value: "sonar-deep-research" }
|
|
304
|
-
],
|
|
305
|
-
[KIMI_ENDPOINT]: [
|
|
306
|
-
{ label: "Kimi K2.5", value: "kimi-k2.5" },
|
|
307
|
-
{ label: "Kimi K2 Thinking", value: "kimi-k2-thinking" },
|
|
308
|
-
{ label: "Kimi K2 Turbo Preview", value: "kimi-k2-turbo-preview" },
|
|
309
|
-
{ label: "Kimi K2 0905 Preview", value: "kimi-k2-0905-preview" },
|
|
310
|
-
{ label: "Kimi K2", value: "kimi-k2" }
|
|
311
|
-
],
|
|
312
|
-
[PROXY_API_ENDPOINT]: [
|
|
313
|
-
{
|
|
314
|
-
label: "Anthropic Claude Sonnet 4",
|
|
315
|
-
value: "anthropic/claude-sonnet-4-20250514"
|
|
316
|
-
},
|
|
317
|
-
{ label: "Gemini 2.5 Flash", value: "gemini/gemini-2.5-flash" },
|
|
318
|
-
{ label: "OpenAI GPT-5 mini", value: "openai/gpt-5-mini" },
|
|
319
|
-
{ label: "OpenAI GPT-4o", value: "openai/gpt-4o" },
|
|
320
|
-
{
|
|
321
|
-
label: "OpenRouter DeepSeek Chat V3.1",
|
|
322
|
-
value: "openrouter/deepseek/deepseek-chat-v3.1"
|
|
323
|
-
}
|
|
324
|
-
]
|
|
325
|
-
};
|
|
326
|
-
var DEFAULT_AI_MODEL_BY_ENDPOINT = Object.fromEntries(
|
|
327
|
-
Object.entries(AI_MODEL_OPTIONS_BY_ENDPOINT).map(([endpoint, options]) => [
|
|
328
|
-
endpoint,
|
|
329
|
-
options[0]?.value ?? ""
|
|
330
|
-
])
|
|
331
|
-
);
|
|
332
|
-
var normalizeModel = (value) => value.trim();
|
|
333
|
-
var getDefaultAiModelForEndpoint = (endpoint) => DEFAULT_AI_MODEL_BY_ENDPOINT[endpoint] ?? "";
|
|
334
|
-
var normalizeAiModel = (value, endpoint) => {
|
|
335
|
-
if (typeof value === "string") {
|
|
336
|
-
const trimmed = normalizeModel(value);
|
|
337
|
-
if (trimmed) {
|
|
338
|
-
return trimmed;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
return getDefaultAiModelForEndpoint(endpoint);
|
|
342
|
-
};
|
|
343
|
-
|
|
344
39
|
// src/redis.ts
|
|
345
40
|
var import_ioredis = __toESM(require("ioredis"));
|
|
346
41
|
var TTL_1D = 86400;
|
|
@@ -620,9 +315,6 @@ var getUserRecord = async (userName) => {
|
|
|
620
315
|
};
|
|
621
316
|
var getUserSettings = async (userName) => {
|
|
622
317
|
const record = await getUserRecord(userName);
|
|
623
|
-
const aiApiEndpoint = normalizeAiEndpoint(
|
|
624
|
-
readUserString(record, "AI_API_ENDPOINT")
|
|
625
|
-
);
|
|
626
318
|
return {
|
|
627
319
|
userName,
|
|
628
320
|
BYBIT_API_KEY: readUserString(record, "BYBIT_API_KEY"),
|
|
@@ -630,14 +322,9 @@ var getUserSettings = async (userName) => {
|
|
|
630
322
|
COINALYZE_API_KEY: readUserString(record, "COINALYZE_API_KEY"),
|
|
631
323
|
COINMARKETCAP_API_KEY: readUserString(record, "COINMARKETCAP_API_KEY"),
|
|
632
324
|
AI_API_KEY: readUserString(record, "AI_API_KEY"),
|
|
633
|
-
AI_API_ENDPOINT:
|
|
634
|
-
AI_MODEL:
|
|
635
|
-
|
|
636
|
-
aiApiEndpoint
|
|
637
|
-
),
|
|
638
|
-
AI_RESPONSE_LANGUAGE: normalizeAiResponseLanguage(
|
|
639
|
-
readUserString(record, "AI_RESPONSE_LANGUAGE")
|
|
640
|
-
) || DEFAULT_AI_RESPONSE_LANGUAGE,
|
|
325
|
+
AI_API_ENDPOINT: readUserString(record, "AI_API_ENDPOINT"),
|
|
326
|
+
AI_MODEL: readUserString(record, "AI_MODEL"),
|
|
327
|
+
AI_RESPONSE_LANGUAGE: readUserString(record, "AI_RESPONSE_LANGUAGE"),
|
|
641
328
|
TG_BOT_TOKEN: readUserString(record, "TG_BOT_TOKEN"),
|
|
642
329
|
TG_CHAT_ID: readUserString(record, "TG_CHAT_ID")
|
|
643
330
|
};
|
package/dist/userSettings.mjs
CHANGED
|
@@ -3,16 +3,6 @@ import {
|
|
|
3
3
|
redisKeys,
|
|
4
4
|
setData
|
|
5
5
|
} from "./chunk-6ZKAUA4Q.mjs";
|
|
6
|
-
import {
|
|
7
|
-
DEFAULT_AI_RESPONSE_LANGUAGE,
|
|
8
|
-
normalizeAiResponseLanguage
|
|
9
|
-
} from "./chunk-CCC7DX2T.mjs";
|
|
10
|
-
import {
|
|
11
|
-
normalizeAiModel
|
|
12
|
-
} from "./chunk-DTCLZIBM.mjs";
|
|
13
|
-
import {
|
|
14
|
-
normalizeAiEndpoint
|
|
15
|
-
} from "./chunk-XQ3YBULV.mjs";
|
|
16
6
|
|
|
17
7
|
// src/userSettings.ts
|
|
18
8
|
var readString = (value) => typeof value === "string" ? value.trim() : "";
|
|
@@ -26,9 +16,6 @@ var getUserRecord = async (userName) => {
|
|
|
26
16
|
};
|
|
27
17
|
var getUserSettings = async (userName) => {
|
|
28
18
|
const record = await getUserRecord(userName);
|
|
29
|
-
const aiApiEndpoint = normalizeAiEndpoint(
|
|
30
|
-
readUserString(record, "AI_API_ENDPOINT")
|
|
31
|
-
);
|
|
32
19
|
return {
|
|
33
20
|
userName,
|
|
34
21
|
BYBIT_API_KEY: readUserString(record, "BYBIT_API_KEY"),
|
|
@@ -36,14 +23,9 @@ var getUserSettings = async (userName) => {
|
|
|
36
23
|
COINALYZE_API_KEY: readUserString(record, "COINALYZE_API_KEY"),
|
|
37
24
|
COINMARKETCAP_API_KEY: readUserString(record, "COINMARKETCAP_API_KEY"),
|
|
38
25
|
AI_API_KEY: readUserString(record, "AI_API_KEY"),
|
|
39
|
-
AI_API_ENDPOINT:
|
|
40
|
-
AI_MODEL:
|
|
41
|
-
|
|
42
|
-
aiApiEndpoint
|
|
43
|
-
),
|
|
44
|
-
AI_RESPONSE_LANGUAGE: normalizeAiResponseLanguage(
|
|
45
|
-
readUserString(record, "AI_RESPONSE_LANGUAGE")
|
|
46
|
-
) || DEFAULT_AI_RESPONSE_LANGUAGE,
|
|
26
|
+
AI_API_ENDPOINT: readUserString(record, "AI_API_ENDPOINT"),
|
|
27
|
+
AI_MODEL: readUserString(record, "AI_MODEL"),
|
|
28
|
+
AI_RESPONSE_LANGUAGE: readUserString(record, "AI_RESPONSE_LANGUAGE"),
|
|
47
29
|
TG_BOT_TOKEN: readUserString(record, "TG_BOT_TOKEN"),
|
|
48
30
|
TG_CHAT_ID: readUserString(record, "TG_CHAT_ID")
|
|
49
31
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tradejs/infra",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "MIT-licensed server infrastructure adapters for TradeJS: Redis, Timescale, ML, logging, and IO.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tradejs",
|
|
@@ -29,21 +29,6 @@
|
|
|
29
29
|
"import": "./dist/ai.mjs",
|
|
30
30
|
"require": "./dist/ai.js"
|
|
31
31
|
},
|
|
32
|
-
"./aiEndpoints": {
|
|
33
|
-
"types": "./dist/aiEndpoints.d.ts",
|
|
34
|
-
"import": "./dist/aiEndpoints.mjs",
|
|
35
|
-
"require": "./dist/aiEndpoints.js"
|
|
36
|
-
},
|
|
37
|
-
"./aiLanguages": {
|
|
38
|
-
"types": "./dist/aiLanguages.d.ts",
|
|
39
|
-
"import": "./dist/aiLanguages.mjs",
|
|
40
|
-
"require": "./dist/aiLanguages.js"
|
|
41
|
-
},
|
|
42
|
-
"./aiModels": {
|
|
43
|
-
"types": "./dist/aiModels.d.ts",
|
|
44
|
-
"import": "./dist/aiModels.mjs",
|
|
45
|
-
"require": "./dist/aiModels.js"
|
|
46
|
-
},
|
|
47
32
|
"./backtestArtifacts": {
|
|
48
33
|
"types": "./dist/backtestArtifacts.d.ts",
|
|
49
34
|
"import": "./dist/backtestArtifacts.mjs",
|
|
@@ -99,11 +84,6 @@
|
|
|
99
84
|
"import": "./dist/userSettings.mjs",
|
|
100
85
|
"require": "./dist/userSettings.js"
|
|
101
86
|
},
|
|
102
|
-
"./timescale": {
|
|
103
|
-
"types": "./dist/timescale.d.ts",
|
|
104
|
-
"import": "./dist/timescale.mjs",
|
|
105
|
-
"require": "./dist/timescale.js"
|
|
106
|
-
},
|
|
107
87
|
"./timescale/client": {
|
|
108
88
|
"types": "./dist/timescale/client.d.ts",
|
|
109
89
|
"import": "./dist/timescale/client.mjs",
|
|
@@ -143,7 +123,7 @@
|
|
|
143
123
|
"dependencies": {
|
|
144
124
|
"@grpc/grpc-js": "^1.14.4",
|
|
145
125
|
"@grpc/proto-loader": "^0.8.1",
|
|
146
|
-
"@tradejs/types": "^
|
|
126
|
+
"@tradejs/types": "^3.0.0",
|
|
147
127
|
"chalk": "4.1.2",
|
|
148
128
|
"date-fns": "^3.6.0",
|
|
149
129
|
"ioredis": "5.11.1",
|
package/dist/aiEndpoints.d.mts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
type AiEndpointOption = {
|
|
2
|
-
label: string;
|
|
3
|
-
value: string;
|
|
4
|
-
};
|
|
5
|
-
declare const AI_CUSTOM_ENDPOINT_VALUE = "__custom__";
|
|
6
|
-
declare const AI_ENDPOINT_OPTIONS: AiEndpointOption[];
|
|
7
|
-
declare const normalizeAiEndpoint: (value: unknown) => string;
|
|
8
|
-
declare const isKnownAiEndpoint: (value: unknown) => value is string;
|
|
9
|
-
|
|
10
|
-
export { AI_CUSTOM_ENDPOINT_VALUE, AI_ENDPOINT_OPTIONS, type AiEndpointOption, isKnownAiEndpoint, normalizeAiEndpoint };
|
package/dist/aiEndpoints.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
type AiEndpointOption = {
|
|
2
|
-
label: string;
|
|
3
|
-
value: string;
|
|
4
|
-
};
|
|
5
|
-
declare const AI_CUSTOM_ENDPOINT_VALUE = "__custom__";
|
|
6
|
-
declare const AI_ENDPOINT_OPTIONS: AiEndpointOption[];
|
|
7
|
-
declare const normalizeAiEndpoint: (value: unknown) => string;
|
|
8
|
-
declare const isKnownAiEndpoint: (value: unknown) => value is string;
|
|
9
|
-
|
|
10
|
-
export { AI_CUSTOM_ENDPOINT_VALUE, AI_ENDPOINT_OPTIONS, type AiEndpointOption, isKnownAiEndpoint, normalizeAiEndpoint };
|