dskcode 0.1.12 → 0.1.14
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 +1 -0
- package/dist/{chunk-DIZMSV5H.js → chunk-7QS2XBBX.js} +2 -4
- package/dist/{chunk-DIZMSV5H.js.map → chunk-7QS2XBBX.js.map} +1 -1
- package/dist/{chunk-FODNQIT4.js → chunk-HWZZJB6I.js} +2 -2
- package/dist/deepseek-OUOEENTK.js +8 -0
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/{models-NQGNKB4T.js → models-OL7DHYGK.js} +2 -2
- package/package.json +1 -1
- package/dist/deepseek-OIJOG3N5.js +0 -8
- /package/dist/{chunk-FODNQIT4.js.map → chunk-HWZZJB6I.js.map} +0 -0
- /package/dist/{deepseek-OIJOG3N5.js.map → deepseek-OUOEENTK.js.map} +0 -0
- /package/dist/{models-NQGNKB4T.js.map → models-OL7DHYGK.js.map} +0 -0
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
[](https://nodejs.org)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
|
+

|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
## 特性
|
|
@@ -68,9 +68,7 @@ function calculateCost(usage, model) {
|
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
function formatCost(cost) {
|
|
71
|
-
|
|
72
|
-
const formatted = total < 0.01 ? total.toFixed(6) : total.toFixed(4);
|
|
73
|
-
return `\u2248\xA5${formatted}`;
|
|
71
|
+
return `\u2248\xA5${cost.totalCost.toFixed(4)}`;
|
|
74
72
|
}
|
|
75
73
|
|
|
76
74
|
export {
|
|
@@ -82,4 +80,4 @@ export {
|
|
|
82
80
|
calculateCost,
|
|
83
81
|
formatCost
|
|
84
82
|
};
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
83
|
+
//# sourceMappingURL=chunk-7QS2XBBX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/models.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\r\n// 模型定义与校验\r\n// ---------------------------------------------------------------------------\r\n\r\nimport type { ModelId, ModelMeta } from \"./types.js\";\r\n\r\n/** 支持的模型及其元数据 */\r\nexport const SUPPORTED_MODELS: Record<ModelId, ModelMeta> = {\r\n \"deepseek-v4-flash\": {\r\n id: \"deepseek-v4-flash\",\r\n displayName: \"DeepSeek V4 Flash\",\r\n /** 上下文窗口大小(token) */\r\n contextWindow: 1_000_000,\r\n /** 输入价格(元 / 百万 token,缓存未命中) */\r\n inputPricePerMillion: 1,\r\n /** 输出价格(元 / 百万 token) */\r\n outputPricePerMillion: 2,\r\n /** 输入价格(元 / 百万 token,缓存命中) */\r\n cacheHitPricePerMillion: 0.02,\r\n },\r\n \"deepseek-v4-pro\": {\r\n id: \"deepseek-v4-pro\",\r\n displayName: \"DeepSeek V4 Pro\",\r\n /** 上下文窗口大小(token) */\r\n contextWindow: 1_000_000,\r\n /** 输入价格(元 / 百万 token,缓存未命中) */\r\n inputPricePerMillion: 3,\r\n /** 输出价格(元 / 百万 token) */\r\n outputPricePerMillion: 6,\r\n /** 输入价格(元 / 百万 token,缓存命中) */\r\n cacheHitPricePerMillion: 0.025,\r\n },\r\n};\r\n\r\n/** 支持的模型 ID 列表 */\r\nexport const SUPPORTED_MODEL_IDS: string[] = Object.keys(SUPPORTED_MODELS);\r\n\r\n/**\r\n * 判断模型标识是否受支持。\r\n * dskcode 仅支持 deepseek-v4-flash 和 deepseek-v4-pro 两个模型。\r\n */\r\nexport function isSupportedModel(model: string): model is ModelId {\r\n return model in SUPPORTED_MODELS;\r\n}\r\n\r\n/** 获取模型元数据(已校验) */\r\nexport function getModelMeta(model: ModelId): ModelMeta {\r\n return SUPPORTED_MODELS[model];\r\n}\r\n\r\n/**\r\n * CJK 字符 Unicode 范围检测。\r\n * 覆盖 CJK 统一汉字、扩展 A/B、兼容汉字等。\r\n */\r\nfunction isCJK(char: string): boolean {\r\n const code = char.codePointAt(0)!;\r\n // CJK 统一汉字\r\n return (\r\n (code >= 0x4e00 && code <= 0x9fff) ||\r\n // CJK 扩展 A\r\n (code >= 0x3400 && code <= 0x4dbf) ||\r\n // CJK 扩展 B 及其他\r\n (code >= 0x20000 && code <= 0x2a6df) ||\r\n // CJK 兼容汉字\r\n (code >= 0xf900 && code <= 0xfaff) ||\r\n // 全角字符\r\n (code >= 0xff01 && code <= 0xff60)\r\n );\r\n}\r\n\r\n/**\r\n * 估算文本的 token 数量。\r\n *\r\n * 根据 DeepSeek 官方文档的换算比例:\r\n * - 1 个英文字符 ≈ 0.3 个 token(即约 3.3 个字符 ≈ 1 token)\r\n * - 1 个中文字符 ≈ 0.6 个 token(即约 1.7 个字符 ≈ 1 token)\r\n *\r\n * 对文本中的 CJK 和非 CJK 字符分别估算后求和。\r\n */\r\nexport function estimateTokens(text: string): number {\r\n let cjkCount = 0;\r\n let otherCount = 0;\r\n for (const char of text) {\r\n if (isCJK(char)) {\r\n cjkCount++;\r\n } else {\r\n otherCount++;\r\n }\r\n }\r\n // CJK: 1 字符 ≈ 0.6 token → token 数 ≈ cjkCount × 0.6\r\n // 其他: 1 字符 ≈ 0.3 token → token 数 ≈ otherCount × 0.3\r\n const tokens = cjkCount * 0.6 + otherCount * 0.3;\r\n return Math.max(1, Math.ceil(tokens));\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// 费用计算\r\n// ---------------------------------------------------------------------------\r\n\r\nimport type { UsageInfo, CostInfo } from \"./types.js\";\r\n\r\n/**\r\n * 根据模型和 Token 使用量计算费用。\r\n *\r\n * 计费公式:\r\n * 输入费用(缓存未命中) = (promptTokens - cachedPromptTokens) × inputPrice / 1,000,000\r\n * 缓存命中费用 = cachedPromptTokens × cacheHitPrice / 1,000,000\r\n * 输出费用 = completionTokens × outputPrice / 1,000,000\r\n * 总费用 = 输入费用 + 缓存命中费用 + 输出费用\r\n *\r\n * @param usage Token 使用统计\r\n * @param model 模型标识\r\n * @returns 费用明细(单位:元)\r\n */\r\nexport function calculateCost(usage: UsageInfo, model: ModelId): CostInfo {\r\n const meta = SUPPORTED_MODELS[model];\r\n const cached = usage.cachedPromptTokens ?? 0;\r\n const nonCached = usage.promptTokens - cached;\r\n\r\n const inputCost = (nonCached * meta.inputPricePerMillion) / 1_000_000;\r\n const cacheHitCost = (cached * meta.cacheHitPricePerMillion) / 1_000_000;\r\n const outputCost = (usage.completionTokens * meta.outputPricePerMillion) / 1_000_000;\r\n\r\n return {\r\n inputCost,\r\n cacheHitCost,\r\n outputCost,\r\n totalCost: inputCost + cacheHitCost + outputCost,\r\n };\r\n}\r\n\r\n/**\r\n *
|
|
1
|
+
{"version":3,"sources":["../src/provider/models.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\r\n// 模型定义与校验\r\n// ---------------------------------------------------------------------------\r\n\r\nimport type { ModelId, ModelMeta } from \"./types.js\";\r\n\r\n/** 支持的模型及其元数据 */\r\nexport const SUPPORTED_MODELS: Record<ModelId, ModelMeta> = {\r\n \"deepseek-v4-flash\": {\r\n id: \"deepseek-v4-flash\",\r\n displayName: \"DeepSeek V4 Flash\",\r\n /** 上下文窗口大小(token) */\r\n contextWindow: 1_000_000,\r\n /** 输入价格(元 / 百万 token,缓存未命中) */\r\n inputPricePerMillion: 1,\r\n /** 输出价格(元 / 百万 token) */\r\n outputPricePerMillion: 2,\r\n /** 输入价格(元 / 百万 token,缓存命中) */\r\n cacheHitPricePerMillion: 0.02,\r\n },\r\n \"deepseek-v4-pro\": {\r\n id: \"deepseek-v4-pro\",\r\n displayName: \"DeepSeek V4 Pro\",\r\n /** 上下文窗口大小(token) */\r\n contextWindow: 1_000_000,\r\n /** 输入价格(元 / 百万 token,缓存未命中) */\r\n inputPricePerMillion: 3,\r\n /** 输出价格(元 / 百万 token) */\r\n outputPricePerMillion: 6,\r\n /** 输入价格(元 / 百万 token,缓存命中) */\r\n cacheHitPricePerMillion: 0.025,\r\n },\r\n};\r\n\r\n/** 支持的模型 ID 列表 */\r\nexport const SUPPORTED_MODEL_IDS: string[] = Object.keys(SUPPORTED_MODELS);\r\n\r\n/**\r\n * 判断模型标识是否受支持。\r\n * dskcode 仅支持 deepseek-v4-flash 和 deepseek-v4-pro 两个模型。\r\n */\r\nexport function isSupportedModel(model: string): model is ModelId {\r\n return model in SUPPORTED_MODELS;\r\n}\r\n\r\n/** 获取模型元数据(已校验) */\r\nexport function getModelMeta(model: ModelId): ModelMeta {\r\n return SUPPORTED_MODELS[model];\r\n}\r\n\r\n/**\r\n * CJK 字符 Unicode 范围检测。\r\n * 覆盖 CJK 统一汉字、扩展 A/B、兼容汉字等。\r\n */\r\nfunction isCJK(char: string): boolean {\r\n const code = char.codePointAt(0)!;\r\n // CJK 统一汉字\r\n return (\r\n (code >= 0x4e00 && code <= 0x9fff) ||\r\n // CJK 扩展 A\r\n (code >= 0x3400 && code <= 0x4dbf) ||\r\n // CJK 扩展 B 及其他\r\n (code >= 0x20000 && code <= 0x2a6df) ||\r\n // CJK 兼容汉字\r\n (code >= 0xf900 && code <= 0xfaff) ||\r\n // 全角字符\r\n (code >= 0xff01 && code <= 0xff60)\r\n );\r\n}\r\n\r\n/**\r\n * 估算文本的 token 数量。\r\n *\r\n * 根据 DeepSeek 官方文档的换算比例:\r\n * - 1 个英文字符 ≈ 0.3 个 token(即约 3.3 个字符 ≈ 1 token)\r\n * - 1 个中文字符 ≈ 0.6 个 token(即约 1.7 个字符 ≈ 1 token)\r\n *\r\n * 对文本中的 CJK 和非 CJK 字符分别估算后求和。\r\n */\r\nexport function estimateTokens(text: string): number {\r\n let cjkCount = 0;\r\n let otherCount = 0;\r\n for (const char of text) {\r\n if (isCJK(char)) {\r\n cjkCount++;\r\n } else {\r\n otherCount++;\r\n }\r\n }\r\n // CJK: 1 字符 ≈ 0.6 token → token 数 ≈ cjkCount × 0.6\r\n // 其他: 1 字符 ≈ 0.3 token → token 数 ≈ otherCount × 0.3\r\n const tokens = cjkCount * 0.6 + otherCount * 0.3;\r\n return Math.max(1, Math.ceil(tokens));\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// 费用计算\r\n// ---------------------------------------------------------------------------\r\n\r\nimport type { UsageInfo, CostInfo } from \"./types.js\";\r\n\r\n/**\r\n * 根据模型和 Token 使用量计算费用。\r\n *\r\n * 计费公式:\r\n * 输入费用(缓存未命中) = (promptTokens - cachedPromptTokens) × inputPrice / 1,000,000\r\n * 缓存命中费用 = cachedPromptTokens × cacheHitPrice / 1,000,000\r\n * 输出费用 = completionTokens × outputPrice / 1,000,000\r\n * 总费用 = 输入费用 + 缓存命中费用 + 输出费用\r\n *\r\n * @param usage Token 使用统计\r\n * @param model 模型标识\r\n * @returns 费用明细(单位:元)\r\n */\r\nexport function calculateCost(usage: UsageInfo, model: ModelId): CostInfo {\r\n const meta = SUPPORTED_MODELS[model];\r\n const cached = usage.cachedPromptTokens ?? 0;\r\n const nonCached = usage.promptTokens - cached;\r\n\r\n const inputCost = (nonCached * meta.inputPricePerMillion) / 1_000_000;\r\n const cacheHitCost = (cached * meta.cacheHitPricePerMillion) / 1_000_000;\r\n const outputCost = (usage.completionTokens * meta.outputPricePerMillion) / 1_000_000;\r\n\r\n return {\r\n inputCost,\r\n cacheHitCost,\r\n outputCost,\r\n totalCost: inputCost + cacheHitCost + outputCost,\r\n };\r\n}\r\n\r\n/**\r\n * 将费用格式化为易读的字符串,保留4位小数。\r\n */\r\nexport function formatCost(cost: CostInfo): string {\r\n return `≈¥${cost.totalCost.toFixed(4)}`;\r\n}"],"mappings":";AAOO,IAAM,mBAA+C;AAAA,EAC1D,qBAAqB;AAAA,IACnB,IAAI;AAAA,IACJ,aAAa;AAAA;AAAA,IAEb,eAAe;AAAA;AAAA,IAEf,sBAAsB;AAAA;AAAA,IAEtB,uBAAuB;AAAA;AAAA,IAEvB,yBAAyB;AAAA,EAC3B;AAAA,EACA,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,aAAa;AAAA;AAAA,IAEb,eAAe;AAAA;AAAA,IAEf,sBAAsB;AAAA;AAAA,IAEtB,uBAAuB;AAAA;AAAA,IAEvB,yBAAyB;AAAA,EAC3B;AACF;AAGO,IAAM,sBAAgC,OAAO,KAAK,gBAAgB;AAMlE,SAAS,iBAAiB,OAAiC;AAChE,SAAO,SAAS;AAClB;AAGO,SAAS,aAAa,OAA2B;AACtD,SAAO,iBAAiB,KAAK;AAC/B;AAMA,SAAS,MAAM,MAAuB;AACpC,QAAM,OAAO,KAAK,YAAY,CAAC;AAE/B,SACG,QAAQ,SAAU,QAAQ;AAAA,EAE1B,QAAQ,SAAU,QAAQ;AAAA,EAE1B,QAAQ,UAAW,QAAQ;AAAA,EAE3B,QAAQ,SAAU,QAAQ;AAAA,EAE1B,QAAQ,SAAU,QAAQ;AAE/B;AAWO,SAAS,eAAe,MAAsB;AACnD,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,aAAW,QAAQ,MAAM;AACvB,QAAI,MAAM,IAAI,GAAG;AACf;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAS,WAAW,MAAM,aAAa;AAC7C,SAAO,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC;AACtC;AAqBO,SAAS,cAAc,OAAkB,OAA0B;AACxE,QAAM,OAAO,iBAAiB,KAAK;AACnC,QAAM,SAAS,MAAM,sBAAsB;AAC3C,QAAM,YAAY,MAAM,eAAe;AAEvC,QAAM,YAAa,YAAY,KAAK,uBAAwB;AAC5D,QAAM,eAAgB,SAAS,KAAK,0BAA2B;AAC/D,QAAM,aAAc,MAAM,mBAAmB,KAAK,wBAAyB;AAE3E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,YAAY,eAAe;AAAA,EACxC;AACF;AAKO,SAAS,WAAW,MAAwB;AACjD,SAAO,aAAK,KAAK,UAAU,QAAQ,CAAC,CAAC;AACvC;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
estimateTokens,
|
|
3
3
|
getModelMeta
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7QS2XBBX.js";
|
|
5
5
|
|
|
6
6
|
// src/provider/errors.ts
|
|
7
7
|
var ProviderError = class extends Error {
|
|
@@ -623,4 +623,4 @@ export {
|
|
|
623
623
|
ModelNotSupportedError,
|
|
624
624
|
DeepSeekProvider
|
|
625
625
|
};
|
|
626
|
-
//# sourceMappingURL=chunk-
|
|
626
|
+
//# sourceMappingURL=chunk-HWZZJB6I.js.map
|
package/dist/index.js
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
DeepSeekProvider,
|
|
4
4
|
ModelNotSupportedError
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HWZZJB6I.js";
|
|
6
6
|
import {
|
|
7
7
|
SUPPORTED_MODELS,
|
|
8
8
|
calculateCost,
|
|
9
9
|
estimateTokens,
|
|
10
10
|
getModelMeta,
|
|
11
11
|
isSupportedModel
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-7QS2XBBX.js";
|
|
13
13
|
|
|
14
14
|
// src/cli/index.tsx
|
|
15
15
|
import { Command } from "commander";
|
|
@@ -849,10 +849,7 @@ function createEmptyDailySummary(date) {
|
|
|
849
849
|
};
|
|
850
850
|
}
|
|
851
851
|
function formatMoney(yuan) {
|
|
852
|
-
|
|
853
|
-
if (yuan < 0.01) return `\xA5${yuan.toFixed(6)}`;
|
|
854
|
-
if (yuan < 1) return `\xA5${yuan.toFixed(4)}`;
|
|
855
|
-
return `\xA5${yuan.toFixed(2)}`;
|
|
852
|
+
return `\xA5${yuan.toFixed(4)}`;
|
|
856
853
|
}
|
|
857
854
|
|
|
858
855
|
// src/ui/ToolCallBlock.tsx
|
|
@@ -1452,6 +1449,7 @@ function ChatSession({
|
|
|
1452
1449
|
const dividerWidth = Math.max(termWidth - 2, 1);
|
|
1453
1450
|
const [offset, setOffset] = useState3(0);
|
|
1454
1451
|
const [displayMessages, setDisplayMessages] = useState3([]);
|
|
1452
|
+
const [staticKey, setStaticKey] = useState3(0);
|
|
1455
1453
|
const [input, setInput] = useState3("");
|
|
1456
1454
|
const [balance, setBalance] = useState3(null);
|
|
1457
1455
|
const [balanceLoading, setBalanceLoading] = useState3(false);
|
|
@@ -1585,7 +1583,7 @@ function ChatSession({
|
|
|
1585
1583
|
if (!apiKey || !baseUrl) return;
|
|
1586
1584
|
let cancelled = false;
|
|
1587
1585
|
setBalanceLoading(true);
|
|
1588
|
-
import("./deepseek-
|
|
1586
|
+
import("./deepseek-OUOEENTK.js").then(({ DeepSeekProvider: DeepSeekProvider2 }) => {
|
|
1589
1587
|
const provider = new DeepSeekProvider2({
|
|
1590
1588
|
apiKey,
|
|
1591
1589
|
baseUrl,
|
|
@@ -1670,7 +1668,10 @@ function ChatSession({
|
|
|
1670
1668
|
return;
|
|
1671
1669
|
case "clear":
|
|
1672
1670
|
setDisplayMessages([]);
|
|
1671
|
+
setStaticKey((prev) => prev + 1);
|
|
1673
1672
|
setInput("");
|
|
1673
|
+
setStreamError(void 0);
|
|
1674
|
+
process.stdout.write("\x1B[2J\x1B[H\x1B[3J");
|
|
1674
1675
|
sessionRef.current?.reset();
|
|
1675
1676
|
return;
|
|
1676
1677
|
case "navigate":
|
|
@@ -1804,7 +1805,7 @@ function ChatSession({
|
|
|
1804
1805
|
}, [isStreaming, externalCostTracker]);
|
|
1805
1806
|
useEffect3(() => {
|
|
1806
1807
|
if (currentUsage && streamingModel && !currentCost) {
|
|
1807
|
-
import("./models-
|
|
1808
|
+
import("./models-OL7DHYGK.js").then(({ calculateCost: calculateCost2 }) => {
|
|
1808
1809
|
const cost = calculateCost2(currentUsage, streamingModel);
|
|
1809
1810
|
setCurrentCost(cost.totalCost);
|
|
1810
1811
|
currentCostRef.current = cost.totalCost;
|
|
@@ -1857,7 +1858,7 @@ function ChatSession({
|
|
|
1857
1858
|
/* @__PURE__ */ jsx5(Text6, { color: "cyan", children: "\u{1F4CA} " }),
|
|
1858
1859
|
/* @__PURE__ */ jsxs5(Text6, { color: "cyan", children: [
|
|
1859
1860
|
"\u4ECA\u65E5 \xA5",
|
|
1860
|
-
|
|
1861
|
+
todayCost.toFixed(2)
|
|
1861
1862
|
] })
|
|
1862
1863
|
] }) : null
|
|
1863
1864
|
] })
|
|
@@ -1884,7 +1885,7 @@ function ChatSession({
|
|
|
1884
1885
|
},
|
|
1885
1886
|
i
|
|
1886
1887
|
);
|
|
1887
|
-
} }),
|
|
1888
|
+
} }, staticKey),
|
|
1888
1889
|
isStreaming && /* @__PURE__ */ jsx5(
|
|
1889
1890
|
AssistantMessage,
|
|
1890
1891
|
{
|