@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.
Files changed (294) hide show
  1. package/README.md +50 -1
  2. package/dist/_signers/aliyun-v3.d.ts +21 -0
  3. package/dist/_signers/aliyun-v3.d.ts.map +1 -0
  4. package/dist/_signers/aliyun-v3.js +47 -0
  5. package/dist/_signers/aliyun-v3.js.map +1 -0
  6. package/dist/_signers/canonical.d.ts +29 -0
  7. package/dist/_signers/canonical.d.ts.map +1 -0
  8. package/dist/_signers/canonical.js +59 -0
  9. package/dist/_signers/canonical.js.map +1 -0
  10. package/dist/_signers/index.d.ts +9 -0
  11. package/dist/_signers/index.d.ts.map +1 -0
  12. package/dist/_signers/index.js +6 -0
  13. package/dist/_signers/index.js.map +1 -0
  14. package/dist/_signers/tencent-tc3.d.ts +21 -0
  15. package/dist/_signers/tencent-tc3.d.ts.map +1 -0
  16. package/dist/_signers/tencent-tc3.js +48 -0
  17. package/dist/_signers/tencent-tc3.js.map +1 -0
  18. package/dist/_signers/volc-v4.d.ts +18 -0
  19. package/dist/_signers/volc-v4.d.ts.map +1 -0
  20. package/dist/_signers/volc-v4.js +43 -0
  21. package/dist/_signers/volc-v4.js.map +1 -0
  22. package/dist/asset-connectors/aliyun-ecs.d.ts +18 -0
  23. package/dist/asset-connectors/aliyun-ecs.d.ts.map +1 -0
  24. package/dist/asset-connectors/aliyun-ecs.js +99 -0
  25. package/dist/asset-connectors/aliyun-ecs.js.map +1 -0
  26. package/dist/asset-connectors/base.d.ts +15 -0
  27. package/dist/asset-connectors/base.d.ts.map +1 -0
  28. package/dist/asset-connectors/base.js +19 -0
  29. package/dist/asset-connectors/base.js.map +1 -0
  30. package/dist/asset-connectors/cloudflare.d.ts +18 -0
  31. package/dist/asset-connectors/cloudflare.d.ts.map +1 -0
  32. package/dist/asset-connectors/cloudflare.js +94 -0
  33. package/dist/asset-connectors/cloudflare.js.map +1 -0
  34. package/dist/asset-connectors/digitalocean.d.ts +18 -0
  35. package/dist/asset-connectors/digitalocean.d.ts.map +1 -0
  36. package/dist/asset-connectors/digitalocean.js +79 -0
  37. package/dist/asset-connectors/digitalocean.js.map +1 -0
  38. package/dist/asset-connectors/godaddy.d.ts +18 -0
  39. package/dist/asset-connectors/godaddy.d.ts.map +1 -0
  40. package/dist/asset-connectors/godaddy.js +62 -0
  41. package/dist/asset-connectors/godaddy.js.map +1 -0
  42. package/dist/asset-connectors/hetzner.d.ts +18 -0
  43. package/dist/asset-connectors/hetzner.d.ts.map +1 -0
  44. package/dist/asset-connectors/hetzner.js +52 -0
  45. package/dist/asset-connectors/hetzner.js.map +1 -0
  46. package/dist/asset-connectors/index.d.ts +18 -0
  47. package/dist/asset-connectors/index.d.ts.map +1 -0
  48. package/dist/asset-connectors/index.js +52 -0
  49. package/dist/asset-connectors/index.js.map +1 -0
  50. package/dist/asset-connectors/namecheap.d.ts +34 -0
  51. package/dist/asset-connectors/namecheap.d.ts.map +1 -0
  52. package/dist/asset-connectors/namecheap.js +178 -0
  53. package/dist/asset-connectors/namecheap.js.map +1 -0
  54. package/dist/asset-connectors/ssl-labs.d.ts +22 -0
  55. package/dist/asset-connectors/ssl-labs.d.ts.map +1 -0
  56. package/dist/asset-connectors/ssl-labs.js +79 -0
  57. package/dist/asset-connectors/ssl-labs.js.map +1 -0
  58. package/dist/asset-connectors/tencent-cvm.d.ts +18 -0
  59. package/dist/asset-connectors/tencent-cvm.d.ts.map +1 -0
  60. package/dist/asset-connectors/tencent-cvm.js +145 -0
  61. package/dist/asset-connectors/tencent-cvm.js.map +1 -0
  62. package/dist/asset-connectors/types.d.ts +45 -0
  63. package/dist/asset-connectors/types.d.ts.map +1 -0
  64. package/dist/asset-connectors/types.js +26 -0
  65. package/dist/asset-connectors/types.js.map +1 -0
  66. package/dist/asset-connectors/vultr.d.ts +18 -0
  67. package/dist/asset-connectors/vultr.d.ts.map +1 -0
  68. package/dist/asset-connectors/vultr.js +73 -0
  69. package/dist/asset-connectors/vultr.js.map +1 -0
  70. package/dist/connectors/anthropic.d.ts +10 -0
  71. package/dist/connectors/anthropic.d.ts.map +1 -0
  72. package/dist/connectors/anthropic.js +103 -0
  73. package/dist/connectors/anthropic.js.map +1 -0
  74. package/dist/connectors/base.d.ts +11 -0
  75. package/dist/connectors/base.d.ts.map +1 -0
  76. package/dist/connectors/base.js +19 -0
  77. package/dist/connectors/base.js.map +1 -0
  78. package/dist/connectors/deepseek.d.ts +14 -0
  79. package/dist/connectors/deepseek.d.ts.map +1 -0
  80. package/dist/connectors/deepseek.js +77 -0
  81. package/dist/connectors/deepseek.js.map +1 -0
  82. package/dist/connectors/doubao.d.ts +10 -0
  83. package/dist/connectors/doubao.d.ts.map +1 -0
  84. package/dist/connectors/doubao.js +64 -0
  85. package/dist/connectors/doubao.js.map +1 -0
  86. package/dist/connectors/index.d.ts +14 -0
  87. package/dist/connectors/index.d.ts.map +1 -0
  88. package/dist/connectors/index.js +42 -0
  89. package/dist/connectors/index.js.map +1 -0
  90. package/dist/connectors/kimi.d.ts +10 -0
  91. package/dist/connectors/kimi.d.ts.map +1 -0
  92. package/dist/connectors/kimi.js +67 -0
  93. package/dist/connectors/kimi.js.map +1 -0
  94. package/dist/connectors/openai.d.ts +10 -0
  95. package/dist/connectors/openai.d.ts.map +1 -0
  96. package/dist/connectors/openai.js +101 -0
  97. package/dist/connectors/openai.js.map +1 -0
  98. package/dist/connectors/qwen.d.ts +10 -0
  99. package/dist/connectors/qwen.d.ts.map +1 -0
  100. package/dist/connectors/qwen.js +66 -0
  101. package/dist/connectors/qwen.js.map +1 -0
  102. package/dist/connectors/types.d.ts +47 -0
  103. package/dist/connectors/types.d.ts.map +1 -0
  104. package/dist/connectors/types.js +24 -0
  105. package/dist/connectors/types.js.map +1 -0
  106. package/dist/guard/bin.js +0 -0
  107. package/dist/index.js +50 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
  110. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
  111. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js +128 -0
  112. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
  113. package/dist/mcp/brain-client.d.ts +96 -0
  114. package/dist/mcp/brain-client.d.ts.map +1 -0
  115. package/dist/mcp/brain-client.js +214 -0
  116. package/dist/mcp/brain-client.js.map +1 -0
  117. package/dist/mcp/cache.d.ts +55 -0
  118. package/dist/mcp/cache.d.ts.map +1 -0
  119. package/dist/mcp/cache.js +109 -0
  120. package/dist/mcp/cache.js.map +1 -0
  121. package/dist/mcp/config.d.ts +29 -0
  122. package/dist/mcp/config.d.ts.map +1 -0
  123. package/dist/mcp/config.js +69 -0
  124. package/dist/mcp/config.js.map +1 -0
  125. package/dist/mcp/decision-engine.d.ts +54 -0
  126. package/dist/mcp/decision-engine.d.ts.map +1 -0
  127. package/dist/mcp/decision-engine.js +107 -0
  128. package/dist/mcp/decision-engine.js.map +1 -0
  129. package/dist/mcp/errors.d.ts +66 -0
  130. package/dist/mcp/errors.d.ts.map +1 -0
  131. package/dist/mcp/errors.js +127 -0
  132. package/dist/mcp/errors.js.map +1 -0
  133. package/dist/mcp/index.d.ts +40 -0
  134. package/dist/mcp/index.d.ts.map +1 -0
  135. package/dist/mcp/index.js +98 -0
  136. package/dist/mcp/index.js.map +1 -0
  137. package/dist/mcp/tools/_placeholder.d.ts +24 -0
  138. package/dist/mcp/tools/_placeholder.d.ts.map +1 -0
  139. package/dist/mcp/tools/_placeholder.js +29 -0
  140. package/dist/mcp/tools/_placeholder.js.map +1 -0
  141. package/dist/mcp/tools/avatar-market.d.ts +22 -0
  142. package/dist/mcp/tools/avatar-market.d.ts.map +1 -0
  143. package/dist/mcp/tools/avatar-market.js +33 -0
  144. package/dist/mcp/tools/avatar-market.js.map +1 -0
  145. package/dist/mcp/tools/check-expiry.d.ts +23 -0
  146. package/dist/mcp/tools/check-expiry.d.ts.map +1 -0
  147. package/dist/mcp/tools/check-expiry.js +29 -0
  148. package/dist/mcp/tools/check-expiry.js.map +1 -0
  149. package/dist/mcp/tools/check-usage.d.ts +25 -0
  150. package/dist/mcp/tools/check-usage.d.ts.map +1 -0
  151. package/dist/mcp/tools/check-usage.js +33 -0
  152. package/dist/mcp/tools/check-usage.js.map +1 -0
  153. package/dist/mcp/tools/get-monthly-picks.d.ts +25 -0
  154. package/dist/mcp/tools/get-monthly-picks.d.ts.map +1 -0
  155. package/dist/mcp/tools/get-monthly-picks.js +35 -0
  156. package/dist/mcp/tools/get-monthly-picks.js.map +1 -0
  157. package/dist/mcp/tools/index.d.ts +41 -0
  158. package/dist/mcp/tools/index.d.ts.map +1 -0
  159. package/dist/mcp/tools/index.js +139 -0
  160. package/dist/mcp/tools/index.js.map +1 -0
  161. package/dist/mcp/tools/memory-recent.d.ts +17 -0
  162. package/dist/mcp/tools/memory-recent.d.ts.map +1 -0
  163. package/dist/mcp/tools/memory-recent.js +46 -0
  164. package/dist/mcp/tools/memory-recent.js.map +1 -0
  165. package/dist/mcp/tools/memory-save.d.ts +15 -0
  166. package/dist/mcp/tools/memory-save.d.ts.map +1 -0
  167. package/dist/mcp/tools/memory-save.js +53 -0
  168. package/dist/mcp/tools/memory-save.js.map +1 -0
  169. package/dist/mcp/tools/memory-search.d.ts +24 -0
  170. package/dist/mcp/tools/memory-search.d.ts.map +1 -0
  171. package/dist/mcp/tools/memory-search.js +64 -0
  172. package/dist/mcp/tools/memory-search.js.map +1 -0
  173. package/dist/mcp/tools/record-acceptance.d.ts +22 -0
  174. package/dist/mcp/tools/record-acceptance.d.ts.map +1 -0
  175. package/dist/mcp/tools/record-acceptance.js +33 -0
  176. package/dist/mcp/tools/record-acceptance.js.map +1 -0
  177. package/dist/mcp/tools/record-rejection.d.ts +23 -0
  178. package/dist/mcp/tools/record-rejection.d.ts.map +1 -0
  179. package/dist/mcp/tools/record-rejection.js +34 -0
  180. package/dist/mcp/tools/record-rejection.js.map +1 -0
  181. package/dist/mcp/tools/suggest-route.d.ts +26 -0
  182. package/dist/mcp/tools/suggest-route.d.ts.map +1 -0
  183. package/dist/mcp/tools/suggest-route.js +56 -0
  184. package/dist/mcp/tools/suggest-route.js.map +1 -0
  185. package/dist/mcp/tools/user-preferences.d.ts +22 -0
  186. package/dist/mcp/tools/user-preferences.d.ts.map +1 -0
  187. package/dist/mcp/tools/user-preferences.js +63 -0
  188. package/dist/mcp/tools/user-preferences.js.map +1 -0
  189. package/dist/mcp-stdio/bin.js +0 -0
  190. package/dist/memory/index.d.ts +5 -0
  191. package/dist/memory/index.d.ts.map +1 -0
  192. package/dist/memory/index.js +4 -0
  193. package/dist/memory/index.js.map +1 -0
  194. package/dist/memory/mem0-client.d.ts +32 -0
  195. package/dist/memory/mem0-client.d.ts.map +1 -0
  196. package/dist/memory/mem0-client.js +161 -0
  197. package/dist/memory/mem0-client.js.map +1 -0
  198. package/dist/memory/types.d.ts +47 -0
  199. package/dist/memory/types.d.ts.map +1 -0
  200. package/dist/memory/types.js +20 -0
  201. package/dist/memory/types.js.map +1 -0
  202. package/dist/router/catalog.d.ts +4 -0
  203. package/dist/router/catalog.d.ts.map +1 -0
  204. package/dist/router/catalog.js +103 -0
  205. package/dist/router/catalog.js.map +1 -0
  206. package/dist/router/classifier.d.ts +5 -0
  207. package/dist/router/classifier.d.ts.map +1 -0
  208. package/dist/router/classifier.js +43 -0
  209. package/dist/router/classifier.js.map +1 -0
  210. package/dist/router/index.d.ts +7 -0
  211. package/dist/router/index.d.ts.map +1 -0
  212. package/dist/router/index.js +6 -0
  213. package/dist/router/index.js.map +1 -0
  214. package/dist/router/litellm-config.d.ts +34 -0
  215. package/dist/router/litellm-config.d.ts.map +1 -0
  216. package/dist/router/litellm-config.js +78 -0
  217. package/dist/router/litellm-config.js.map +1 -0
  218. package/dist/router/route.d.ts +3 -0
  219. package/dist/router/route.d.ts.map +1 -0
  220. package/dist/router/route.js +63 -0
  221. package/dist/router/route.js.map +1 -0
  222. package/dist/router/types.d.ts +36 -0
  223. package/dist/router/types.d.ts.map +1 -0
  224. package/dist/router/types.js +7 -0
  225. package/dist/router/types.js.map +1 -0
  226. package/dist/saas-connectors/base.d.ts +16 -0
  227. package/dist/saas-connectors/base.d.ts.map +1 -0
  228. package/dist/saas-connectors/base.js +16 -0
  229. package/dist/saas-connectors/base.js.map +1 -0
  230. package/dist/saas-connectors/brave.d.ts +19 -0
  231. package/dist/saas-connectors/brave.d.ts.map +1 -0
  232. package/dist/saas-connectors/brave.js +50 -0
  233. package/dist/saas-connectors/brave.js.map +1 -0
  234. package/dist/saas-connectors/fal.d.ts +15 -0
  235. package/dist/saas-connectors/fal.d.ts.map +1 -0
  236. package/dist/saas-connectors/fal.js +35 -0
  237. package/dist/saas-connectors/fal.js.map +1 -0
  238. package/dist/saas-connectors/index.d.ts +11 -0
  239. package/dist/saas-connectors/index.d.ts.map +1 -0
  240. package/dist/saas-connectors/index.js +32 -0
  241. package/dist/saas-connectors/index.js.map +1 -0
  242. package/dist/saas-connectors/replicate.d.ts +19 -0
  243. package/dist/saas-connectors/replicate.d.ts.map +1 -0
  244. package/dist/saas-connectors/replicate.js +43 -0
  245. package/dist/saas-connectors/replicate.js.map +1 -0
  246. package/dist/saas-connectors/serper.d.ts +19 -0
  247. package/dist/saas-connectors/serper.d.ts.map +1 -0
  248. package/dist/saas-connectors/serper.js +47 -0
  249. package/dist/saas-connectors/serper.js.map +1 -0
  250. package/dist/saas-connectors/types.d.ts +31 -0
  251. package/dist/saas-connectors/types.d.ts.map +1 -0
  252. package/dist/saas-connectors/types.js +6 -0
  253. package/dist/saas-connectors/types.js.map +1 -0
  254. package/dist/scheduler/index.d.ts +4 -0
  255. package/dist/scheduler/index.d.ts.map +1 -0
  256. package/dist/scheduler/index.js +4 -0
  257. package/dist/scheduler/index.js.map +1 -0
  258. package/dist/scheduler/poll.d.ts +4 -0
  259. package/dist/scheduler/poll.d.ts.map +1 -0
  260. package/dist/scheduler/poll.js +170 -0
  261. package/dist/scheduler/poll.js.map +1 -0
  262. package/dist/scheduler/scheduler.d.ts +18 -0
  263. package/dist/scheduler/scheduler.d.ts.map +1 -0
  264. package/dist/scheduler/scheduler.js +67 -0
  265. package/dist/scheduler/scheduler.js.map +1 -0
  266. package/dist/scheduler/types.d.ts +49 -0
  267. package/dist/scheduler/types.d.ts.map +1 -0
  268. package/dist/scheduler/types.js +14 -0
  269. package/dist/scheduler/types.js.map +1 -0
  270. package/dist/skill-installer/npm-installer.d.ts +11 -1
  271. package/dist/skill-installer/npm-installer.d.ts.map +1 -1
  272. package/dist/skill-installer/npm-installer.js +13 -3
  273. package/dist/skill-installer/npm-installer.js.map +1 -1
  274. package/dist/vault/cli.d.ts +2 -0
  275. package/dist/vault/cli.d.ts.map +1 -0
  276. package/dist/vault/cli.js +170 -0
  277. package/dist/vault/cli.js.map +1 -0
  278. package/dist/vault/crypto.d.ts +9 -0
  279. package/dist/vault/crypto.d.ts.map +1 -0
  280. package/dist/vault/crypto.js +54 -0
  281. package/dist/vault/crypto.js.map +1 -0
  282. package/dist/vault/index.d.ts +6 -0
  283. package/dist/vault/index.d.ts.map +1 -0
  284. package/dist/vault/index.js +5 -0
  285. package/dist/vault/index.js.map +1 -0
  286. package/dist/vault/types.d.ts +28 -0
  287. package/dist/vault/types.d.ts.map +1 -0
  288. package/dist/vault/types.js +22 -0
  289. package/dist/vault/types.js.map +1 -0
  290. package/dist/vault/vault.d.ts +34 -0
  291. package/dist/vault/vault.d.ts.map +1 -0
  292. package/dist/vault/vault.js +149 -0
  293. package/dist/vault/vault.js.map +1 -0
  294. 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"}