@skillfm/local 2.6.3 → 2.7.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/README.md +50 -1
- package/dist/_signers/aliyun-v3.d.ts +21 -0
- package/dist/_signers/aliyun-v3.d.ts.map +1 -0
- package/dist/_signers/aliyun-v3.js +47 -0
- package/dist/_signers/aliyun-v3.js.map +1 -0
- package/dist/_signers/canonical.d.ts +29 -0
- package/dist/_signers/canonical.d.ts.map +1 -0
- package/dist/_signers/canonical.js +59 -0
- package/dist/_signers/canonical.js.map +1 -0
- package/dist/_signers/index.d.ts +9 -0
- package/dist/_signers/index.d.ts.map +1 -0
- package/dist/_signers/index.js +6 -0
- package/dist/_signers/index.js.map +1 -0
- package/dist/_signers/tencent-tc3.d.ts +21 -0
- package/dist/_signers/tencent-tc3.d.ts.map +1 -0
- package/dist/_signers/tencent-tc3.js +48 -0
- package/dist/_signers/tencent-tc3.js.map +1 -0
- package/dist/_signers/volc-v4.d.ts +18 -0
- package/dist/_signers/volc-v4.d.ts.map +1 -0
- package/dist/_signers/volc-v4.js +43 -0
- package/dist/_signers/volc-v4.js.map +1 -0
- package/dist/asset-connectors/aliyun-ecs.d.ts +18 -0
- package/dist/asset-connectors/aliyun-ecs.d.ts.map +1 -0
- package/dist/asset-connectors/aliyun-ecs.js +99 -0
- package/dist/asset-connectors/aliyun-ecs.js.map +1 -0
- package/dist/asset-connectors/base.d.ts +15 -0
- package/dist/asset-connectors/base.d.ts.map +1 -0
- package/dist/asset-connectors/base.js +19 -0
- package/dist/asset-connectors/base.js.map +1 -0
- package/dist/asset-connectors/cloudflare.d.ts +18 -0
- package/dist/asset-connectors/cloudflare.d.ts.map +1 -0
- package/dist/asset-connectors/cloudflare.js +94 -0
- package/dist/asset-connectors/cloudflare.js.map +1 -0
- package/dist/asset-connectors/digitalocean.d.ts +18 -0
- package/dist/asset-connectors/digitalocean.d.ts.map +1 -0
- package/dist/asset-connectors/digitalocean.js +79 -0
- package/dist/asset-connectors/digitalocean.js.map +1 -0
- package/dist/asset-connectors/godaddy.d.ts +18 -0
- package/dist/asset-connectors/godaddy.d.ts.map +1 -0
- package/dist/asset-connectors/godaddy.js +62 -0
- package/dist/asset-connectors/godaddy.js.map +1 -0
- package/dist/asset-connectors/hetzner.d.ts +18 -0
- package/dist/asset-connectors/hetzner.d.ts.map +1 -0
- package/dist/asset-connectors/hetzner.js +52 -0
- package/dist/asset-connectors/hetzner.js.map +1 -0
- package/dist/asset-connectors/index.d.ts +18 -0
- package/dist/asset-connectors/index.d.ts.map +1 -0
- package/dist/asset-connectors/index.js +52 -0
- package/dist/asset-connectors/index.js.map +1 -0
- package/dist/asset-connectors/namecheap.d.ts +34 -0
- package/dist/asset-connectors/namecheap.d.ts.map +1 -0
- package/dist/asset-connectors/namecheap.js +178 -0
- package/dist/asset-connectors/namecheap.js.map +1 -0
- package/dist/asset-connectors/ssl-labs.d.ts +22 -0
- package/dist/asset-connectors/ssl-labs.d.ts.map +1 -0
- package/dist/asset-connectors/ssl-labs.js +79 -0
- package/dist/asset-connectors/ssl-labs.js.map +1 -0
- package/dist/asset-connectors/tencent-cvm.d.ts +18 -0
- package/dist/asset-connectors/tencent-cvm.d.ts.map +1 -0
- package/dist/asset-connectors/tencent-cvm.js +145 -0
- package/dist/asset-connectors/tencent-cvm.js.map +1 -0
- package/dist/asset-connectors/types.d.ts +45 -0
- package/dist/asset-connectors/types.d.ts.map +1 -0
- package/dist/asset-connectors/types.js +26 -0
- package/dist/asset-connectors/types.js.map +1 -0
- package/dist/asset-connectors/vultr.d.ts +18 -0
- package/dist/asset-connectors/vultr.d.ts.map +1 -0
- package/dist/asset-connectors/vultr.js +73 -0
- package/dist/asset-connectors/vultr.js.map +1 -0
- package/dist/connectors/anthropic.d.ts +10 -0
- package/dist/connectors/anthropic.d.ts.map +1 -0
- package/dist/connectors/anthropic.js +103 -0
- package/dist/connectors/anthropic.js.map +1 -0
- package/dist/connectors/base.d.ts +11 -0
- package/dist/connectors/base.d.ts.map +1 -0
- package/dist/connectors/base.js +19 -0
- package/dist/connectors/base.js.map +1 -0
- package/dist/connectors/deepseek.d.ts +14 -0
- package/dist/connectors/deepseek.d.ts.map +1 -0
- package/dist/connectors/deepseek.js +77 -0
- package/dist/connectors/deepseek.js.map +1 -0
- package/dist/connectors/doubao.d.ts +10 -0
- package/dist/connectors/doubao.d.ts.map +1 -0
- package/dist/connectors/doubao.js +64 -0
- package/dist/connectors/doubao.js.map +1 -0
- package/dist/connectors/index.d.ts +14 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +42 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/kimi.d.ts +10 -0
- package/dist/connectors/kimi.d.ts.map +1 -0
- package/dist/connectors/kimi.js +67 -0
- package/dist/connectors/kimi.js.map +1 -0
- package/dist/connectors/openai.d.ts +10 -0
- package/dist/connectors/openai.d.ts.map +1 -0
- package/dist/connectors/openai.js +101 -0
- package/dist/connectors/openai.js.map +1 -0
- package/dist/connectors/qwen.d.ts +10 -0
- package/dist/connectors/qwen.d.ts.map +1 -0
- package/dist/connectors/qwen.js +66 -0
- package/dist/connectors/qwen.js.map +1 -0
- package/dist/connectors/types.d.ts +47 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +24 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/guard/bin.js +0 -0
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js +128 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
- package/dist/mcp/brain-client.d.ts +96 -0
- package/dist/mcp/brain-client.d.ts.map +1 -0
- package/dist/mcp/brain-client.js +214 -0
- package/dist/mcp/brain-client.js.map +1 -0
- package/dist/mcp/cache.d.ts +55 -0
- package/dist/mcp/cache.d.ts.map +1 -0
- package/dist/mcp/cache.js +109 -0
- package/dist/mcp/cache.js.map +1 -0
- package/dist/mcp/config.d.ts +29 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +69 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/decision-engine.d.ts +54 -0
- package/dist/mcp/decision-engine.d.ts.map +1 -0
- package/dist/mcp/decision-engine.js +107 -0
- package/dist/mcp/decision-engine.js.map +1 -0
- package/dist/mcp/errors.d.ts +66 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +127 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +40 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +98 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/_placeholder.d.ts +24 -0
- package/dist/mcp/tools/_placeholder.d.ts.map +1 -0
- package/dist/mcp/tools/_placeholder.js +29 -0
- package/dist/mcp/tools/_placeholder.js.map +1 -0
- package/dist/mcp/tools/avatar-market.d.ts +22 -0
- package/dist/mcp/tools/avatar-market.d.ts.map +1 -0
- package/dist/mcp/tools/avatar-market.js +33 -0
- package/dist/mcp/tools/avatar-market.js.map +1 -0
- package/dist/mcp/tools/check-expiry.d.ts +23 -0
- package/dist/mcp/tools/check-expiry.d.ts.map +1 -0
- package/dist/mcp/tools/check-expiry.js +29 -0
- package/dist/mcp/tools/check-expiry.js.map +1 -0
- package/dist/mcp/tools/check-usage.d.ts +25 -0
- package/dist/mcp/tools/check-usage.d.ts.map +1 -0
- package/dist/mcp/tools/check-usage.js +33 -0
- package/dist/mcp/tools/check-usage.js.map +1 -0
- package/dist/mcp/tools/get-monthly-picks.d.ts +25 -0
- package/dist/mcp/tools/get-monthly-picks.d.ts.map +1 -0
- package/dist/mcp/tools/get-monthly-picks.js +35 -0
- package/dist/mcp/tools/get-monthly-picks.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +41 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +139 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/memory-recent.d.ts +17 -0
- package/dist/mcp/tools/memory-recent.d.ts.map +1 -0
- package/dist/mcp/tools/memory-recent.js +46 -0
- package/dist/mcp/tools/memory-recent.js.map +1 -0
- package/dist/mcp/tools/memory-save.d.ts +15 -0
- package/dist/mcp/tools/memory-save.d.ts.map +1 -0
- package/dist/mcp/tools/memory-save.js +53 -0
- package/dist/mcp/tools/memory-save.js.map +1 -0
- package/dist/mcp/tools/memory-search.d.ts +24 -0
- package/dist/mcp/tools/memory-search.d.ts.map +1 -0
- package/dist/mcp/tools/memory-search.js +64 -0
- package/dist/mcp/tools/memory-search.js.map +1 -0
- package/dist/mcp/tools/record-acceptance.d.ts +22 -0
- package/dist/mcp/tools/record-acceptance.d.ts.map +1 -0
- package/dist/mcp/tools/record-acceptance.js +33 -0
- package/dist/mcp/tools/record-acceptance.js.map +1 -0
- package/dist/mcp/tools/record-rejection.d.ts +23 -0
- package/dist/mcp/tools/record-rejection.d.ts.map +1 -0
- package/dist/mcp/tools/record-rejection.js +34 -0
- package/dist/mcp/tools/record-rejection.js.map +1 -0
- package/dist/mcp/tools/suggest-route.d.ts +26 -0
- package/dist/mcp/tools/suggest-route.d.ts.map +1 -0
- package/dist/mcp/tools/suggest-route.js +56 -0
- package/dist/mcp/tools/suggest-route.js.map +1 -0
- package/dist/mcp/tools/user-preferences.d.ts +22 -0
- package/dist/mcp/tools/user-preferences.d.ts.map +1 -0
- package/dist/mcp/tools/user-preferences.js +63 -0
- package/dist/mcp/tools/user-preferences.js.map +1 -0
- package/dist/mcp-stdio/bin.js +0 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +4 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/mem0-client.d.ts +32 -0
- package/dist/memory/mem0-client.d.ts.map +1 -0
- package/dist/memory/mem0-client.js +161 -0
- package/dist/memory/mem0-client.js.map +1 -0
- package/dist/memory/types.d.ts +47 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +20 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/router/catalog.d.ts +4 -0
- package/dist/router/catalog.d.ts.map +1 -0
- package/dist/router/catalog.js +103 -0
- package/dist/router/catalog.js.map +1 -0
- package/dist/router/classifier.d.ts +5 -0
- package/dist/router/classifier.d.ts.map +1 -0
- package/dist/router/classifier.js +43 -0
- package/dist/router/classifier.js.map +1 -0
- package/dist/router/index.d.ts +7 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +6 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/litellm-config.d.ts +34 -0
- package/dist/router/litellm-config.d.ts.map +1 -0
- package/dist/router/litellm-config.js +78 -0
- package/dist/router/litellm-config.js.map +1 -0
- package/dist/router/route.d.ts +3 -0
- package/dist/router/route.d.ts.map +1 -0
- package/dist/router/route.js +63 -0
- package/dist/router/route.js.map +1 -0
- package/dist/router/types.d.ts +36 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/saas-connectors/base.d.ts +16 -0
- package/dist/saas-connectors/base.d.ts.map +1 -0
- package/dist/saas-connectors/base.js +16 -0
- package/dist/saas-connectors/base.js.map +1 -0
- package/dist/saas-connectors/brave.d.ts +19 -0
- package/dist/saas-connectors/brave.d.ts.map +1 -0
- package/dist/saas-connectors/brave.js +50 -0
- package/dist/saas-connectors/brave.js.map +1 -0
- package/dist/saas-connectors/fal.d.ts +15 -0
- package/dist/saas-connectors/fal.d.ts.map +1 -0
- package/dist/saas-connectors/fal.js +35 -0
- package/dist/saas-connectors/fal.js.map +1 -0
- package/dist/saas-connectors/index.d.ts +11 -0
- package/dist/saas-connectors/index.d.ts.map +1 -0
- package/dist/saas-connectors/index.js +32 -0
- package/dist/saas-connectors/index.js.map +1 -0
- package/dist/saas-connectors/replicate.d.ts +19 -0
- package/dist/saas-connectors/replicate.d.ts.map +1 -0
- package/dist/saas-connectors/replicate.js +43 -0
- package/dist/saas-connectors/replicate.js.map +1 -0
- package/dist/saas-connectors/serper.d.ts +19 -0
- package/dist/saas-connectors/serper.d.ts.map +1 -0
- package/dist/saas-connectors/serper.js +47 -0
- package/dist/saas-connectors/serper.js.map +1 -0
- package/dist/saas-connectors/types.d.ts +31 -0
- package/dist/saas-connectors/types.d.ts.map +1 -0
- package/dist/saas-connectors/types.js +6 -0
- package/dist/saas-connectors/types.js.map +1 -0
- package/dist/scheduler/index.d.ts +4 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +4 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/poll.d.ts +4 -0
- package/dist/scheduler/poll.d.ts.map +1 -0
- package/dist/scheduler/poll.js +170 -0
- package/dist/scheduler/poll.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +18 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/scheduler.js +67 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/types.d.ts +49 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +14 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/skill-installer/npm-installer.d.ts +11 -1
- package/dist/skill-installer/npm-installer.d.ts.map +1 -1
- package/dist/skill-installer/npm-installer.js +13 -3
- package/dist/skill-installer/npm-installer.js.map +1 -1
- package/dist/vault/cli.d.ts +2 -0
- package/dist/vault/cli.d.ts.map +1 -0
- package/dist/vault/cli.js +170 -0
- package/dist/vault/cli.js.map +1 -0
- package/dist/vault/crypto.d.ts +9 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +54 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +6 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +5 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/types.d.ts +28 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +22 -0
- package/dist/vault/types.js.map +1 -0
- package/dist/vault/vault.d.ts +34 -0
- package/dist/vault/vault.d.ts.map +1 -0
- package/dist/vault/vault.js +149 -0
- package/dist/vault/vault.js.map +1 -0
- package/package.json +17 -5
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/asset-connectors/vultr.ts
|
|
2
|
+
//
|
|
3
|
+
// Vultr connector — Instances + 余额 (Day 2 真实现)
|
|
4
|
+
// Doc: https://www.vultr.com/api/
|
|
5
|
+
// Endpoints:
|
|
6
|
+
// - GET /v2/instances
|
|
7
|
+
// - GET /v2/account
|
|
8
|
+
// Auth: Authorization: Bearer <api-key>
|
|
9
|
+
import { AssetBaseConnector } from './base.js';
|
|
10
|
+
import { sanitizeError } from '../connectors/types.js';
|
|
11
|
+
const BASE_URL = 'https://api.vultr.com/v2';
|
|
12
|
+
export class VultrConnector extends AssetBaseConnector {
|
|
13
|
+
id = 'vultr';
|
|
14
|
+
name = 'Vultr';
|
|
15
|
+
is_real = true;
|
|
16
|
+
async fetchAssets(byok_key, opts) {
|
|
17
|
+
const headers = { authorization: `Bearer ${byok_key}` };
|
|
18
|
+
const assets = [];
|
|
19
|
+
try {
|
|
20
|
+
const ar = await this.safeFetch(`${BASE_URL}/account`, { method: 'GET', headers }, byok_key);
|
|
21
|
+
if (ar.ok) {
|
|
22
|
+
const ad = (await ar.json());
|
|
23
|
+
assets.push({
|
|
24
|
+
asset_type: 'api_credit',
|
|
25
|
+
identifier: 'vultr-account-balance',
|
|
26
|
+
display_name: `Vultr (${ad.account.email ?? 'account'})`,
|
|
27
|
+
expires_at: null,
|
|
28
|
+
days_left: null,
|
|
29
|
+
provider: this.id,
|
|
30
|
+
balance_usd: ad.account.balance,
|
|
31
|
+
status: 'active',
|
|
32
|
+
raw: { pending_charges: ad.account.pending_charges },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
/* tolerate */
|
|
38
|
+
}
|
|
39
|
+
const r = await this.safeFetch(`${BASE_URL}/instances?per_page=${opts?.limit ?? 50}`, { method: 'GET', headers }, byok_key);
|
|
40
|
+
if (!r.ok) {
|
|
41
|
+
const text = await r.text().catch(() => '');
|
|
42
|
+
throw new Error(sanitizeError(`Vultr ${r.status}: ${text}`, byok_key));
|
|
43
|
+
}
|
|
44
|
+
const data = (await r.json());
|
|
45
|
+
for (const i of data.instances ?? []) {
|
|
46
|
+
assets.push({
|
|
47
|
+
asset_type: 'vps',
|
|
48
|
+
identifier: i.id,
|
|
49
|
+
display_name: i.label || i.hostname,
|
|
50
|
+
expires_at: null,
|
|
51
|
+
days_left: null,
|
|
52
|
+
provider: this.id,
|
|
53
|
+
status: i.power_status,
|
|
54
|
+
raw: { plan: i.plan, region: i.region, date_created: i.date_created },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return assets;
|
|
58
|
+
}
|
|
59
|
+
async ping(byok_key) {
|
|
60
|
+
const fp = this.fingerprint(byok_key);
|
|
61
|
+
try {
|
|
62
|
+
const r = await this.safeFetch(`${BASE_URL}/account`, { method: 'GET', headers: { authorization: `Bearer ${byok_key}` } }, byok_key);
|
|
63
|
+
if (r.ok)
|
|
64
|
+
return { ok: true, key_fingerprint: fp };
|
|
65
|
+
const text = await r.text().catch(() => '');
|
|
66
|
+
return { ok: false, error: `HTTP ${r.status}: ${sanitizeError(text, byok_key)}`, key_fingerprint: fp };
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
return { ok: false, error: sanitizeError(e, byok_key), key_fingerprint: fp };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=vultr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vultr.js","sourceRoot":"","sources":["../../src/asset-connectors/vultr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseConnector } from './base.js';
|
|
2
|
+
import type { ConnectorId, FetchUsageOptions, PingResult, UsageRecord } from './types.js';
|
|
3
|
+
export declare class AnthropicConnector extends BaseConnector {
|
|
4
|
+
id: ConnectorId;
|
|
5
|
+
name: string;
|
|
6
|
+
is_real: boolean;
|
|
7
|
+
fetchUsage(byok_key: string, opts: FetchUsageOptions): Promise<UsageRecord[]>;
|
|
8
|
+
ping(byok_key: string): Promise<PingResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/connectors/anthropic.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuC1F,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,EAAE,EAAE,WAAW,CAAe;IAC9B,IAAI,SAAsB;IAC1B,OAAO,UAAQ;IAET,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAkD7E,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CA8BlD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/connectors/anthropic.ts
|
|
2
|
+
//
|
|
3
|
+
// Anthropic Admin API connector — 真实现
|
|
4
|
+
// Doc: https://docs.anthropic.com/en/api/admin-api/usage
|
|
5
|
+
// Endpoint: GET /v1/organizations/usage_report/messages
|
|
6
|
+
// Auth: x-api-key (admin-level key, sk-ant-admin-*)
|
|
7
|
+
// Header: anthropic-version: 2023-06-01
|
|
8
|
+
//
|
|
9
|
+
// 注意: 用户必须使用 admin-level key 才能调 admin API。普通 user key 调会 401。
|
|
10
|
+
// UI 应该明确提示用户去 console.anthropic.com 创建 admin key。
|
|
11
|
+
import { BaseConnector } from './base.js';
|
|
12
|
+
import { sanitizeError } from './types.js';
|
|
13
|
+
const BASE_URL = 'https://api.anthropic.com';
|
|
14
|
+
const VERSION = '2023-06-01';
|
|
15
|
+
// 价格估算 (USD per 1M tokens, 2026-04 公开价目, 仅近似)
|
|
16
|
+
const PRICE_TABLE = {
|
|
17
|
+
'claude-opus-4': { in: 15, out: 75 },
|
|
18
|
+
'claude-sonnet-4': { in: 3, out: 15 },
|
|
19
|
+
'claude-3-5-sonnet': { in: 3, out: 15 },
|
|
20
|
+
'claude-3-5-haiku': { in: 0.8, out: 4 },
|
|
21
|
+
'claude-3-opus': { in: 15, out: 75 },
|
|
22
|
+
};
|
|
23
|
+
function estimateUsd(model, in_tok, out_tok) {
|
|
24
|
+
const key = Object.keys(PRICE_TABLE).find((k) => model.toLowerCase().includes(k));
|
|
25
|
+
const p = key ? PRICE_TABLE[key] : { in: 3, out: 15 }; // 兜底用 sonnet 价
|
|
26
|
+
return (in_tok / 1_000_000) * p.in + (out_tok / 1_000_000) * p.out;
|
|
27
|
+
}
|
|
28
|
+
export class AnthropicConnector extends BaseConnector {
|
|
29
|
+
id = 'anthropic';
|
|
30
|
+
name = 'Anthropic Claude';
|
|
31
|
+
is_real = true;
|
|
32
|
+
async fetchUsage(byok_key, opts) {
|
|
33
|
+
const params = new URLSearchParams({
|
|
34
|
+
starting_at: opts.start_date.toISOString(),
|
|
35
|
+
ending_at: opts.end_date.toISOString(),
|
|
36
|
+
bucket_width: '1d',
|
|
37
|
+
limit: String(opts.limit ?? 100),
|
|
38
|
+
});
|
|
39
|
+
let url = `${BASE_URL}/v1/organizations/usage_report/messages?${params}`;
|
|
40
|
+
const records = [];
|
|
41
|
+
while (url) {
|
|
42
|
+
const r = await this.safeFetch(url, {
|
|
43
|
+
method: 'GET',
|
|
44
|
+
headers: {
|
|
45
|
+
'x-api-key': byok_key,
|
|
46
|
+
'anthropic-version': VERSION,
|
|
47
|
+
'content-type': 'application/json',
|
|
48
|
+
},
|
|
49
|
+
}, byok_key);
|
|
50
|
+
if (!r.ok) {
|
|
51
|
+
const text = await r.text().catch(() => '<no body>');
|
|
52
|
+
throw new Error(sanitizeError(`Anthropic ${r.status}: ${text}`, byok_key));
|
|
53
|
+
}
|
|
54
|
+
const data = (await r.json());
|
|
55
|
+
for (const bucket of data.data ?? []) {
|
|
56
|
+
for (const item of bucket.results ?? []) {
|
|
57
|
+
const in_tok = item.input_tokens + (item.cache_creation_input_tokens ?? 0);
|
|
58
|
+
const out_tok = item.output_tokens;
|
|
59
|
+
records.push({
|
|
60
|
+
provider: 'anthropic',
|
|
61
|
+
model: item.model,
|
|
62
|
+
timestamp: bucket.starting_at,
|
|
63
|
+
input_tokens: in_tok,
|
|
64
|
+
output_tokens: out_tok,
|
|
65
|
+
estimated_usd: estimateUsd(item.model, in_tok, out_tok),
|
|
66
|
+
calls: 1,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
url = data.has_more && data.next_page ? `${BASE_URL}${data.next_page}` : null;
|
|
71
|
+
}
|
|
72
|
+
return records;
|
|
73
|
+
}
|
|
74
|
+
async ping(byok_key) {
|
|
75
|
+
const fp = this.fingerprint(byok_key);
|
|
76
|
+
try {
|
|
77
|
+
// 拉一个最短窗口 (近 1 天) 验 key
|
|
78
|
+
const end = new Date();
|
|
79
|
+
const start = new Date(end.getTime() - 24 * 3600 * 1000);
|
|
80
|
+
const params = new URLSearchParams({
|
|
81
|
+
starting_at: start.toISOString(),
|
|
82
|
+
ending_at: end.toISOString(),
|
|
83
|
+
bucket_width: '1d',
|
|
84
|
+
limit: '1',
|
|
85
|
+
});
|
|
86
|
+
const r = await this.safeFetch(`${BASE_URL}/v1/organizations/usage_report/messages?${params}`, {
|
|
87
|
+
method: 'GET',
|
|
88
|
+
headers: {
|
|
89
|
+
'x-api-key': byok_key,
|
|
90
|
+
'anthropic-version': VERSION,
|
|
91
|
+
},
|
|
92
|
+
}, byok_key);
|
|
93
|
+
if (r.ok)
|
|
94
|
+
return { ok: true, key_fingerprint: fp };
|
|
95
|
+
const text = await r.text().catch(() => '');
|
|
96
|
+
return { ok: false, error: `HTTP ${r.status}: ${sanitizeError(text, byok_key)}`, key_fingerprint: fp };
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
return { ok: false, error: sanitizeError(e, byok_key), key_fingerprint: fp };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/connectors/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Connector, ConnectorId, FetchUsageOptions, UsageRecord, PingResult } from './types.js';
|
|
2
|
+
export declare abstract class BaseConnector implements Connector {
|
|
3
|
+
abstract id: ConnectorId;
|
|
4
|
+
abstract name: string;
|
|
5
|
+
abstract is_real: boolean;
|
|
6
|
+
protected safeFetch(url: string, init: RequestInit, byok_key: string): Promise<Response>;
|
|
7
|
+
protected fingerprint(key: string): string;
|
|
8
|
+
abstract fetchUsage(byok_key: string, opts: FetchUsageOptions): Promise<UsageRecord[]>;
|
|
9
|
+
abstract ping(byok_key: string): Promise<PingResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/connectors/base.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGrG,8BAAsB,aAAc,YAAW,SAAS;IACtD,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;cAEV,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC;IASpB,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI1C,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACtF,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CACrD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/connectors/base.ts
|
|
2
|
+
//
|
|
3
|
+
// BaseConnector — 共用 fetch / retry / error 脱敏
|
|
4
|
+
import { maskKey, sanitizeError } from './types.js';
|
|
5
|
+
export class BaseConnector {
|
|
6
|
+
async safeFetch(url, init, byok_key) {
|
|
7
|
+
try {
|
|
8
|
+
const r = await fetch(url, init);
|
|
9
|
+
return r;
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
throw new Error(sanitizeError(e, byok_key));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
fingerprint(key) {
|
|
16
|
+
return maskKey(key);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/connectors/base.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,8CAA8C;AAG9C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,OAAgB,aAAa;IAKvB,KAAK,CAAC,SAAS,CACvB,GAAW,EACX,IAAiB,EACjB,QAAgB;QAEhB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjC,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAES,WAAW,CAAC,GAAW;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;CAIF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BaseConnector } from './base.js';
|
|
2
|
+
import type { ConnectorId, FetchUsageOptions, PingResult, UsageRecord } from './types.js';
|
|
3
|
+
export declare class DeepSeekConnector extends BaseConnector {
|
|
4
|
+
id: ConnectorId;
|
|
5
|
+
name: string;
|
|
6
|
+
is_real: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* DeepSeek 没公开 usage 时序 API, 此方法返当前 balance 作为单点 record。
|
|
9
|
+
* sidecar 内由 cron 每 15min 调用一次, brain 端做差量计算反推 usage。
|
|
10
|
+
*/
|
|
11
|
+
fetchUsage(byok_key: string, opts: FetchUsageOptions): Promise<UsageRecord[]>;
|
|
12
|
+
ping(byok_key: string): Promise<PingResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=deepseek.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../src/connectors/deepseek.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe1F,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,EAAE,EAAE,WAAW,CAAc;IAC7B,IAAI,SAAc;IAClB,OAAO,UAAQ;IAEf;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAsC7E,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAsBlD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/connectors/deepseek.ts
|
|
2
|
+
//
|
|
3
|
+
// DeepSeek connector — 真实现 (Day 2 D2-1)
|
|
4
|
+
// Doc: https://api-docs.deepseek.com/api/get-user-balance
|
|
5
|
+
// Endpoint: GET /user/balance
|
|
6
|
+
// Auth: Authorization: Bearer <api-key>
|
|
7
|
+
//
|
|
8
|
+
// 注意:
|
|
9
|
+
// - DeepSeek 当前**没有**公开 admin-level usage 时序 API (2026-04 现状)
|
|
10
|
+
// - 我们用 balance API 间接追踪: 跟时间序列 diff 推算 token 消耗
|
|
11
|
+
// - sidecar 内 cron 定期 poll (15 min/次), brain 端做差量计算
|
|
12
|
+
// - Day 3+ 关注 DeepSeek 是否开放 admin usage API, 一旦开放切换
|
|
13
|
+
import { BaseConnector } from './base.js';
|
|
14
|
+
import { sanitizeError } from './types.js';
|
|
15
|
+
const BASE_URL = 'https://api.deepseek.com';
|
|
16
|
+
export class DeepSeekConnector extends BaseConnector {
|
|
17
|
+
id = 'deepseek';
|
|
18
|
+
name = 'DeepSeek';
|
|
19
|
+
is_real = true;
|
|
20
|
+
/**
|
|
21
|
+
* DeepSeek 没公开 usage 时序 API, 此方法返当前 balance 作为单点 record。
|
|
22
|
+
* sidecar 内由 cron 每 15min 调用一次, brain 端做差量计算反推 usage。
|
|
23
|
+
*/
|
|
24
|
+
async fetchUsage(byok_key, opts) {
|
|
25
|
+
const r = await this.safeFetch(`${BASE_URL}/user/balance`, {
|
|
26
|
+
method: 'GET',
|
|
27
|
+
headers: {
|
|
28
|
+
authorization: `Bearer ${byok_key}`,
|
|
29
|
+
'content-type': 'application/json',
|
|
30
|
+
},
|
|
31
|
+
}, byok_key);
|
|
32
|
+
if (!r.ok) {
|
|
33
|
+
const text = await r.text().catch(() => '<no body>');
|
|
34
|
+
throw new Error(sanitizeError(`DeepSeek ${r.status}: ${text}`, byok_key));
|
|
35
|
+
}
|
|
36
|
+
const data = (await r.json());
|
|
37
|
+
// Convert balance snapshot to a synthetic UsageRecord (balance 当前值, 不含历史)
|
|
38
|
+
// 真用量需 sidecar 缓存上一次 balance 做 diff
|
|
39
|
+
const usd_balance = (data.balance_infos ?? []).find((b) => b.currency === 'USD');
|
|
40
|
+
const cny_balance = (data.balance_infos ?? []).find((b) => b.currency === 'CNY');
|
|
41
|
+
const usd = usd_balance ? parseFloat(usd_balance.total_balance) : 0;
|
|
42
|
+
const cny = cny_balance ? parseFloat(cny_balance.total_balance) : 0;
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
provider: 'deepseek',
|
|
46
|
+
model: 'balance-snapshot', // 特殊 marker, 表示这不是真 usage
|
|
47
|
+
timestamp: opts.end_date.toISOString(),
|
|
48
|
+
input_tokens: 0,
|
|
49
|
+
output_tokens: 0,
|
|
50
|
+
// estimated_usd 字段复用为"当前剩余余额 USD" (sidecar 解析时处理)
|
|
51
|
+
estimated_usd: usd > 0 ? usd : cny / 7.3,
|
|
52
|
+
calls: 0,
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
async ping(byok_key) {
|
|
57
|
+
const fp = this.fingerprint(byok_key);
|
|
58
|
+
try {
|
|
59
|
+
const r = await this.safeFetch(`${BASE_URL}/user/balance`, {
|
|
60
|
+
method: 'GET',
|
|
61
|
+
headers: { authorization: `Bearer ${byok_key}` },
|
|
62
|
+
}, byok_key);
|
|
63
|
+
if (r.ok)
|
|
64
|
+
return { ok: true, key_fingerprint: fp };
|
|
65
|
+
const text = await r.text().catch(() => '');
|
|
66
|
+
return {
|
|
67
|
+
ok: false,
|
|
68
|
+
error: `HTTP ${r.status}: ${sanitizeError(text, byok_key)}`,
|
|
69
|
+
key_fingerprint: fp,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
return { ok: false, error: sanitizeError(e, byok_key), key_fingerprint: fp };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=deepseek.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/connectors/deepseek.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseConnector } from './base.js';
|
|
2
|
+
import type { ConnectorId, FetchUsageOptions, PingResult, UsageRecord } from './types.js';
|
|
3
|
+
export declare class DoubaoConnector extends BaseConnector {
|
|
4
|
+
id: ConnectorId;
|
|
5
|
+
name: string;
|
|
6
|
+
is_real: boolean;
|
|
7
|
+
fetchUsage(byok_key: string, opts: FetchUsageOptions): Promise<UsageRecord[]>;
|
|
8
|
+
ping(byok_key: string): Promise<PingResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=doubao.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao.d.ts","sourceRoot":"","sources":["../../src/connectors/doubao.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAc1F,qBAAa,eAAgB,SAAQ,aAAa;IAChD,EAAE,EAAE,WAAW,CAAY;IAC3B,IAAI,SAAU;IACd,OAAO,UAAQ;IAET,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgC7E,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAmBlD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/connectors/doubao.ts
|
|
2
|
+
//
|
|
3
|
+
// Doubao (字节火山方舟 Ark) connector — Day 4 真实现
|
|
4
|
+
// Doc: https://www.volcengine.com/docs/82379
|
|
5
|
+
// Endpoint: Ark API https://ark.cn-beijing.volces.com (Bearer + Ark API Key)
|
|
6
|
+
//
|
|
7
|
+
// 调研校准 (2026-04):
|
|
8
|
+
// - 火山方舟 (Ark) 调 Doubao 模型走简单 Bearer + Ark API key
|
|
9
|
+
// - 真账单 / 时序 usage 走火山引擎账单 OpenAPI (需要 V4 SignerV4)
|
|
10
|
+
// - 简化: Ark 暴露 endpoint /endpoints 列表 + sidecar 自统计
|
|
11
|
+
// - Day 5+ 真账单走 volc-v4 signer (火山 V4 signer 已就位)
|
|
12
|
+
import { BaseConnector } from './base.js';
|
|
13
|
+
import { sanitizeError } from './types.js';
|
|
14
|
+
const BASE_URL = 'https://ark.cn-beijing.volces.com';
|
|
15
|
+
export class DoubaoConnector extends BaseConnector {
|
|
16
|
+
id = 'doubao';
|
|
17
|
+
name = '字节豆包';
|
|
18
|
+
is_real = true;
|
|
19
|
+
async fetchUsage(byok_key, opts) {
|
|
20
|
+
// Ark 没公开时序 usage. ping-style 拉 endpoint list + 计 endpoint 数
|
|
21
|
+
// 真用量由 sidecar 跟踪每次调用 + Day 5+ 接火山 V4 signer 拉账单
|
|
22
|
+
const r = await this.safeFetch(`${BASE_URL}/api/v3/endpoints?PageNumber=1&PageSize=10`, {
|
|
23
|
+
method: 'GET',
|
|
24
|
+
headers: {
|
|
25
|
+
authorization: `Bearer ${byok_key}`,
|
|
26
|
+
'content-type': 'application/json',
|
|
27
|
+
},
|
|
28
|
+
}, byok_key);
|
|
29
|
+
if (!r.ok) {
|
|
30
|
+
const text = await r.text().catch(() => '');
|
|
31
|
+
throw new Error(sanitizeError(`Doubao Ark ${r.status}: ${text}`, byok_key));
|
|
32
|
+
}
|
|
33
|
+
const data = (await r.json());
|
|
34
|
+
return [
|
|
35
|
+
{
|
|
36
|
+
provider: 'doubao',
|
|
37
|
+
model: 'endpoint-snapshot',
|
|
38
|
+
timestamp: opts.end_date.toISOString(),
|
|
39
|
+
input_tokens: 0,
|
|
40
|
+
output_tokens: 0,
|
|
41
|
+
estimated_usd: 0,
|
|
42
|
+
calls: data.Items?.length ?? 0, // endpoint 数
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
async ping(byok_key) {
|
|
47
|
+
const fp = this.fingerprint(byok_key);
|
|
48
|
+
try {
|
|
49
|
+
const r = await this.safeFetch(`${BASE_URL}/api/v3/endpoints?PageNumber=1&PageSize=1`, { method: 'GET', headers: { authorization: `Bearer ${byok_key}` } }, byok_key);
|
|
50
|
+
if (r.ok)
|
|
51
|
+
return { ok: true, key_fingerprint: fp };
|
|
52
|
+
const text = await r.text().catch(() => '');
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
error: `HTTP ${r.status}: ${sanitizeError(text, byok_key)}`,
|
|
56
|
+
key_fingerprint: fp,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
return { ok: false, error: sanitizeError(e, byok_key), key_fingerprint: fp };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=doubao.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao.js","sourceRoot":"","sources":["../../src/connectors/doubao.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,4CAA4C;AAC5C,6CAA6C;AAC7C,6EAA6E;AAC7E,EAAE;AACF,kBAAkB;AAClB,qDAAqD;AACrD,sDAAsD;AACtD,sDAAsD;AACtD,oDAAoD;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,QAAQ,GAAG,mCAAmC,CAAC;AAWrD,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAChD,EAAE,GAAgB,QAAQ,CAAC;IAC3B,IAAI,GAAG,MAAM,CAAC;IACd,OAAO,GAAG,IAAI,CAAC;IAEf,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,IAAuB;QACxD,6DAA6D;QAC7D,iDAAiD;QACjD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAC5B,GAAG,QAAQ,4CAA4C,EACvD;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,QAAQ,EAAE;gBACnC,cAAc,EAAE,kBAAkB;aACnC;SACF,EACD,QAAQ,CACT,CAAC;QACF,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAyB,CAAC;QACtD,OAAO;YACL;gBACE,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,mBAAmB;gBAC1B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;gBACtC,YAAY,EAAE,CAAC;gBACf,aAAa,EAAE,CAAC;gBAChB,aAAa,EAAE,CAAC;gBAChB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,aAAa;aAC9C;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAC5B,GAAG,QAAQ,2CAA2C,EACtD,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE,EAAE,EACnE,QAAQ,CACT,CAAC;YACF,IAAI,CAAC,CAAC,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;gBAC3D,eAAe,EAAE,EAAE;aACpB,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QAC/E,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Connector, ConnectorId } from './types.js';
|
|
2
|
+
export type { Connector, ConnectorId, UsageRecord, FetchUsageOptions, PingResult } from './types.js';
|
|
3
|
+
export { maskKey, sanitizeError } from './types.js';
|
|
4
|
+
export { BaseConnector } from './base.js';
|
|
5
|
+
export { AnthropicConnector } from './anthropic.js';
|
|
6
|
+
export { OpenAIConnector } from './openai.js';
|
|
7
|
+
export { DeepSeekConnector } from './deepseek.js';
|
|
8
|
+
export { KimiConnector } from './kimi.js';
|
|
9
|
+
export { QwenConnector } from './qwen.js';
|
|
10
|
+
export { DoubaoConnector } from './doubao.js';
|
|
11
|
+
export declare function getConnector(id: ConnectorId): Connector;
|
|
12
|
+
export declare function listConnectors(): Connector[];
|
|
13
|
+
export declare function listRealConnectors(): Connector[];
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACrG,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAW9C,wBAAgB,YAAY,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,CAIvD;AAED,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAE5C;AAED,wBAAgB,kBAAkB,IAAI,SAAS,EAAE,CAEhD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/connectors/index.ts
|
|
2
|
+
//
|
|
3
|
+
// Connector registry — 6 LLM 统一入口
|
|
4
|
+
// 通过 package.json exports 暴露为 ./connectors subpath; 用户代码侧用法:
|
|
5
|
+
// const c = getConnector('anthropic');
|
|
6
|
+
// const records = await c.fetchUsage(byok_key, { start_date, end_date });
|
|
7
|
+
// (具体 import 语法见 README; 此文件不写示例避免 verify-no-bare-workspace-imports 误报)
|
|
8
|
+
import { AnthropicConnector } from './anthropic.js';
|
|
9
|
+
import { OpenAIConnector } from './openai.js';
|
|
10
|
+
import { DeepSeekConnector } from './deepseek.js';
|
|
11
|
+
import { KimiConnector } from './kimi.js';
|
|
12
|
+
import { QwenConnector } from './qwen.js';
|
|
13
|
+
import { DoubaoConnector } from './doubao.js';
|
|
14
|
+
export { maskKey, sanitizeError } from './types.js';
|
|
15
|
+
export { BaseConnector } from './base.js';
|
|
16
|
+
export { AnthropicConnector } from './anthropic.js';
|
|
17
|
+
export { OpenAIConnector } from './openai.js';
|
|
18
|
+
export { DeepSeekConnector } from './deepseek.js';
|
|
19
|
+
export { KimiConnector } from './kimi.js';
|
|
20
|
+
export { QwenConnector } from './qwen.js';
|
|
21
|
+
export { DoubaoConnector } from './doubao.js';
|
|
22
|
+
const REGISTRY = {
|
|
23
|
+
anthropic: new AnthropicConnector(),
|
|
24
|
+
openai: new OpenAIConnector(),
|
|
25
|
+
deepseek: new DeepSeekConnector(),
|
|
26
|
+
qwen: new QwenConnector(),
|
|
27
|
+
doubao: new DoubaoConnector(),
|
|
28
|
+
kimi: new KimiConnector(),
|
|
29
|
+
};
|
|
30
|
+
export function getConnector(id) {
|
|
31
|
+
const c = REGISTRY[id];
|
|
32
|
+
if (!c)
|
|
33
|
+
throw new Error(`unknown connector: ${id}`);
|
|
34
|
+
return c;
|
|
35
|
+
}
|
|
36
|
+
export function listConnectors() {
|
|
37
|
+
return Object.values(REGISTRY);
|
|
38
|
+
}
|
|
39
|
+
export function listRealConnectors() {
|
|
40
|
+
return Object.values(REGISTRY).filter((c) => c.is_real);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,kCAAkC;AAClC,6DAA6D;AAC7D,yCAAyC;AACzC,4EAA4E;AAC5E,wEAAwE;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,QAAQ,GAAmC;IAC/C,SAAS,EAAE,IAAI,kBAAkB,EAAE;IACnC,MAAM,EAAE,IAAI,eAAe,EAAE;IAC7B,QAAQ,EAAE,IAAI,iBAAiB,EAAE;IACjC,IAAI,EAAE,IAAI,aAAa,EAAE;IACzB,MAAM,EAAE,IAAI,eAAe,EAAE;IAC7B,IAAI,EAAE,IAAI,aAAa,EAAE;CAC1B,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,EAAe;IAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvB,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseConnector } from './base.js';
|
|
2
|
+
import type { ConnectorId, FetchUsageOptions, PingResult, UsageRecord } from './types.js';
|
|
3
|
+
export declare class KimiConnector extends BaseConnector {
|
|
4
|
+
id: ConnectorId;
|
|
5
|
+
name: string;
|
|
6
|
+
is_real: boolean;
|
|
7
|
+
fetchUsage(byok_key: string, opts: FetchUsageOptions): Promise<UsageRecord[]>;
|
|
8
|
+
ping(byok_key: string): Promise<PingResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=kimi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.d.ts","sourceRoot":"","sources":["../../src/connectors/kimi.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe1F,qBAAa,aAAc,SAAQ,aAAa;IAC9C,EAAE,EAAE,WAAW,CAAU;IACzB,IAAI,SAAe;IACnB,OAAO,UAAQ;IAET,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmC7E,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAsBlD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/connectors/kimi.ts
|
|
2
|
+
//
|
|
3
|
+
// Kimi (Moonshot) connector — 真实现 (Day 2 D2-1)
|
|
4
|
+
// Doc: https://platform.moonshot.cn/docs/api/misc#查询账户余额
|
|
5
|
+
// Endpoint: GET /v1/users/me/balance
|
|
6
|
+
// Auth: Authorization: Bearer <api-key>
|
|
7
|
+
//
|
|
8
|
+
// 同 DeepSeek: Kimi 也没公开 admin usage 时序 API (2026-04 现状)。
|
|
9
|
+
// 用 balance API + sidecar 端 cron poll + brain 端差量计算反推 usage。
|
|
10
|
+
import { BaseConnector } from './base.js';
|
|
11
|
+
import { sanitizeError } from './types.js';
|
|
12
|
+
const BASE_URL = 'https://api.moonshot.cn';
|
|
13
|
+
export class KimiConnector extends BaseConnector {
|
|
14
|
+
id = 'kimi';
|
|
15
|
+
name = '月之暗面 Kimi';
|
|
16
|
+
is_real = true;
|
|
17
|
+
async fetchUsage(byok_key, opts) {
|
|
18
|
+
const r = await this.safeFetch(`${BASE_URL}/v1/users/me/balance`, {
|
|
19
|
+
method: 'GET',
|
|
20
|
+
headers: {
|
|
21
|
+
authorization: `Bearer ${byok_key}`,
|
|
22
|
+
'content-type': 'application/json',
|
|
23
|
+
},
|
|
24
|
+
}, byok_key);
|
|
25
|
+
if (!r.ok) {
|
|
26
|
+
const text = await r.text().catch(() => '<no body>');
|
|
27
|
+
throw new Error(sanitizeError(`Kimi ${r.status}: ${text}`, byok_key));
|
|
28
|
+
}
|
|
29
|
+
const data = (await r.json());
|
|
30
|
+
if (!data.status) {
|
|
31
|
+
throw new Error(`Kimi balance API status=false (code=${data.code})`);
|
|
32
|
+
}
|
|
33
|
+
const cny_balance = data.data?.available_balance ?? 0;
|
|
34
|
+
return [
|
|
35
|
+
{
|
|
36
|
+
provider: 'kimi',
|
|
37
|
+
model: 'balance-snapshot',
|
|
38
|
+
timestamp: opts.end_date.toISOString(),
|
|
39
|
+
input_tokens: 0,
|
|
40
|
+
output_tokens: 0,
|
|
41
|
+
estimated_usd: cny_balance / 7.3, // CNY → USD approx
|
|
42
|
+
calls: 0,
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
async ping(byok_key) {
|
|
47
|
+
const fp = this.fingerprint(byok_key);
|
|
48
|
+
try {
|
|
49
|
+
const r = await this.safeFetch(`${BASE_URL}/v1/users/me/balance`, {
|
|
50
|
+
method: 'GET',
|
|
51
|
+
headers: { authorization: `Bearer ${byok_key}` },
|
|
52
|
+
}, byok_key);
|
|
53
|
+
if (r.ok)
|
|
54
|
+
return { ok: true, key_fingerprint: fp };
|
|
55
|
+
const text = await r.text().catch(() => '');
|
|
56
|
+
return {
|
|
57
|
+
ok: false,
|
|
58
|
+
error: `HTTP ${r.status}: ${sanitizeError(text, byok_key)}`,
|
|
59
|
+
key_fingerprint: fp,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
return { ok: false, error: sanitizeError(e, byok_key), key_fingerprint: fp };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=kimi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.js","sourceRoot":"","sources":["../../src/connectors/kimi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseConnector } from './base.js';
|
|
2
|
+
import type { ConnectorId, FetchUsageOptions, PingResult, UsageRecord } from './types.js';
|
|
3
|
+
export declare class OpenAIConnector extends BaseConnector {
|
|
4
|
+
id: ConnectorId;
|
|
5
|
+
name: string;
|
|
6
|
+
is_real: boolean;
|
|
7
|
+
fetchUsage(byok_key: string, opts: FetchUsageOptions): Promise<UsageRecord[]>;
|
|
8
|
+
ping(byok_key: string): Promise<PingResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/connectors/openai.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwC1F,qBAAa,eAAgB,SAAQ,aAAa;IAChD,EAAE,EAAE,WAAW,CAAY;IAC3B,IAAI,SAAgB;IACpB,OAAO,UAAQ;IAET,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAkD7E,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CA2BlD"}
|