dsh-session-fee 0.0.0-stage → 0.4.3

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fujingzhai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/PRICES.md ADDED
@@ -0,0 +1,79 @@
1
+ # 价格维护记录
2
+
3
+ 核对日期:**2026-11-05**。口径:模型的**市面 token 刊例价**,不是订阅或额度的实际扣费。单位:每 100 万 token。
4
+
5
+ ## 原则
6
+
7
+ - 只收**当前主流在线模型**;旧型号不收。新模型发布后手动加一条。
8
+ - 国产模型用 CNY,美国模型用 USD,不做换算。
9
+ - 表里没有的模型,按 DSH 自带的 pi-ai 模型目录兜底(美元刊例价);DSH 0.2.1-rc.5 附带的是较旧的 pi-ai 1.1.0,缺 gpt-6.1-terra、gemini-4-argon、claude-haiku-5.5 等新型号,所以主流模型都直接写进本表。兜底也没有的显示 `--`。
10
+
11
+ ## 国产模型(CNY)
12
+
13
+ 数值按各厂商官方人民币刊例价核定(与 Pi 的模型配置交叉核对)。
14
+
15
+ | 模型 | 路由 | 输入 | 缓存读取 | 缓存写入 | 输出 |
16
+ |---|---|---:|---:|---:|---:|
17
+ | DeepSeek-V4.1-Flash 闲时 | Qoder `dfmodel`、任意 `deepseek-flash` / `deepseek-v4.1-flash` | 1 | 0.02 | 0 | 4 |
18
+ | DeepSeek-V4-Pro 闲时 | Qoder `dmodel`、任意 `deepseek-v4-pro` | 4.5 | 0.15 | 0 | 13.5 |
19
+ | Kimi-K3.1-Pro | Qoder `kmodel_latest`、任意 `kimi-k3.1-pro` | 13 | 1.3 | 13 | 68 |
20
+ | Kimi-K3 | 任意 `kimi-k3` | 20 | 2 | 20 | 100 |
21
+ | Kimi-K2.8-Preview | Qoder `kmodel`、任意 `kimi-k2.8-preview` | 6.5 | 1.3 | 0 | 27 |
22
+ | GLM-5.3 | Qoder `gmodel`、任意 `glm-5.3` | 8 | 2 | 0 | 28 |
23
+ | GLM-5.3-Flash | Qoder `gfmodel`、任意 `glm-5.3-flash` | 0.8 | 0.23 | 0 | 2.8 |
24
+ | Qwen3.8-Max | Qoder `qmodel_38max`、任意 `qwen3.8-max` | 12 | 1.5 | 0 | 36 |
25
+ | Qwen3.8-Flash | Qoder `qfmodel`、任意 `qwen3.8-flash` | 1 | 0.1 | 0 | 3 |
26
+ | MiniMax-M3.1-Flash | Qoder `mmodel`、任意 `minimax-m3.1-flash` | 1 | 0.1 | 0 | 4 |
27
+ | Step-5-Preview | Qoder `jmodel`、任意 `step-5-preview` | 7 | 0.35 | 7 | 20 |
28
+ | MiMo-V2.6-Pro | 任意 `mimo-v2.6-pro` | 3 | 0.025 | 0 | 6 |
29
+ | MiMo-V2.6-Flash | 任意 `mimo-v2.6-flash` | 1 | 0.02 | 0 | 2 |
30
+ | Hy4(腾讯混元 4) | 任意 `hy4-preview`、`hy4` | 6 | 0.3 | 0 | 18 |
31
+
32
+ Qoder(经 [dsh-provider-qoder](https://www.npmjs.com/package/dsh-provider-qoder) 接入,中国区)内部代号与模型名的对应取自 Qoder 的模型目录接口。Qoder 的 Auto、Fast 是路由,没有市面价,不写。
33
+
34
+ ## 分时与限时
35
+
36
+ - **DeepSeek 官方错峰**:北京时间周一至周五 9:00–12:00、14:00–18:00 为高峰,价格 ×2;周末、法定节假日全天为闲时;调休上班的周末仍算周末。按模型匹配、不分服务商,所以经 Qoder 或其他中转调用的 DeepSeek 也按此计。节假日表在 `dateSets.cn-holidays`,**目前只录到 2026 年**;2027 年安排发布后(往年在 11 月)补上。
37
+ - **Gemini 4 Argon**:首发价 $2 / 缓存 $0.10 / $10 至 2026-11-30;2026-12-01 起标准价 $4 / $0.20 / $20。
38
+
39
+ ## 美国模型(USD)
40
+
41
+ 数值取自 pi-ai 1.5.0 模型目录(2026-11-05,当时最新版),Grok 按 xAI 官方模型页核对。路由一律写 `*/模型ID`,Claude 同时兼容点号写法(如 `claude-opus-5.5`)与带后缀的变体。
42
+
43
+ | 模型 | 输入 | 缓存读取 | 缓存写入 | 输出 | 长上下文 |
44
+ |---|---:|---:|---:|---:|---|
45
+ | GPT-6 Astra | 10 | 1 | 12.5 | 50 | >272K:20 / 2 / 25 / 75 |
46
+ | GPT-6.1 Sol | 2 | 0.1 | 2.5 | 10 | >272K:4 / 0.2 / 5 / 15 |
47
+ | GPT-6.1 Terra | 1 | 0.05 | 1.25 | 5 | >272K:2 / 0.1 / 2.5 / 7.5 |
48
+ | GPT-6 Luna | 0.1 | 0.01 | 0.125 | 0.5 | >272K:0.2 / 0.02 / 0.25 / 0.75 |
49
+ | Claude Fable 5.1 | 10 | 0.25 | 12.5 | 50 | — |
50
+ | Claude Opus 5.5 | 4 | 0.2 | 5 | 20 | — |
51
+ | Claude Sonnet 5.5 | 2 | 0.1 | 2.5 | 10 | — |
52
+ | Claude Haiku 5.5 | 0.1 | 0.01 | 0.125 | 0.5 | >100K:0.5 / 0.05 / 0.625 / 2.5 |
53
+ | Gemini 4 Argon | 2(12-01 起 4) | 0.1(0.2) | 0 | 10(20) | — |
54
+ | Gemini 3.8 Flash | 0.75 | 0.075 | 0 | 3.75 | — |
55
+ | Grok 4.7 | 2 | 0.5 | 0 | 6 | ≥200K:4 / 1 / 0 / 12 |
56
+ | Grok Build 0.1(别名 grok-code-fast-1) | 1 | 0.2 | 0 | 2 | ≥200K:2 / 0.4 / 0 / 4 |
57
+
58
+ 长上下文一栏依次为输入 / 缓存读取 / 缓存写入 / 输出。xAI 规定提示词**满 200K** 即整次按高价,故阈值写 `"above": 199999`。
59
+
60
+ ## 计价口径
61
+
62
+ - **长上下文阶梯**:本次提示(未缓存输入+缓存读取+缓存写入)超过阈值时,整次调用各桶都按高价计(与 pi-ai 算法一致)。
63
+ - **推理 token**:多数来源上报的输出已含推理;antigravity(Gemini 接口)上报的输出不含思考 token,插件按配置 `addReasoningToOutput` 把它补进输出计费。
64
+ - Anthropic 1 小时缓存写入的加价、批量(Batch)折扣、工具/搜索附加费不在计算范围内。
65
+
66
+ ## 缓存口径
67
+
68
+ - Kimi 的缓存写入采用 **5 分钟 TTL** 价格;若显式使用 1 小时缓存,K3.1 Pro/K3 应分别改为 26/40 CNY。
69
+ - Qwen 的 `cacheWrite: 0` 沿用隐式缓存口径;显式缓存(创建 15、读取 1)未混入此表。
70
+ - 其他 `cacheWrite: 0` 表示该厂商隐式缓存不单独收写入费。
71
+
72
+ ## 参考
73
+
74
+ - [DeepSeek 价格与错峰](https://api-docs.deepseek.com/zh-cn/quick_start/pricing)
75
+ - [xAI Grok 4.7](https://docs.x.ai/developers/models/grok-4.7)、[Grok Build 0.1](https://docs.x.ai/developers/models/grok-build-0.1)
76
+ - [Gemini 4 Argon on Google Cloud](https://cloud.google.com/blog/products/ai-machine-learning/gemini-4-argon-available-on-google-cloud)
77
+ - [Moonshot 模型推理价格](https://platform.kimi.com/docs/pricing/chat)、[阿里云 Qwen3.8-Max](https://help.aliyun.com/zh/model-studio/qwen3-8-max)
78
+
79
+ 修改 `prices.json` 并保存即可,立即生效;校验失败的文件不会替换上一份有效价格(错误写进 DSH 数据目录下的 `plugins/session-cost/status.json`)。
package/README.md CHANGED
@@ -1,3 +1,206 @@
1
- # Temporary Holding Version
1
+ # dsh-session-fee
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ 在 DeepSeek Harness(DSH)输入框下方的统计条里,显示当前会话按市面 token 价折算的**等值费用**。
4
+
5
+ - 按每次模型调用实际上报的 token 记账:未缓存输入、缓存读取、缓存写入、输出(含推理)分别计价,长上下文阶梯价按每次调用的提示规模判定。
6
+ - 换模型分段相加:`¥0.3862 + $0.0418 + ¥0.0951`;各币种分开,不做汇率换算。
7
+ - 子代理(含多层)计入总数:`¥137.04 (¥30.62)` 表示一共 ¥137.04,其中子代理 ¥30.62。换过模型时,子代理并进它被派出时所在的那一段(币种不同则并进最近的同币种段,没有就在末尾另加一项),括号外各段之和就是总数;括号里的 `+` 只分隔币种。
8
+ - 价格随插件分发:[prices.json](prices.json) 收当前中美主流在线模型(国产用人民币价,含 DeepSeek 峰闲时与节假日、限时价、长上下文阶梯)。表里没有的模型按 DSH 自带的 pi-ai 模型目录兜底;再没有就显示 `--`,提示缺价格,不按零计。
9
+ - 点击费用一项(和 DSH 自带的用时、用量两项一样)弹出明细:总数,以及主会话和每个子代理各自的费用与所用模型(提供商/模型 ID,括号里是价格表中的名称)。
10
+
11
+ > 这是按 token 刊例价算的**等值费用**,不是实际扣款;订阅、免费额度、折扣与真实账单不在范围内。
12
+
13
+ 纯 JavaScript,零 npm 依赖,不改 DSH 本体。已在 macOS 版 DSH 0.2.1-rc.5 实测;其他平台未实测。
14
+
15
+ ## 安装
16
+
17
+ 桌面版「插件」→「添加插件」,粘贴:
18
+
19
+ ```text
20
+ git+https://github.com/fujingzhai/youxia-dsh-plugins.git#dsh-session-cost@0.4.3&path:/dsh-session-cost
21
+ ```
22
+
23
+ 或用命令行(Web 版将 `desktop` 换成 `web`):
24
+
25
+ ```sh
26
+ dsh plugin --profile desktop add "git+https://github.com/fujingzhai/youxia-dsh-plugins.git#dsh-session-cost@0.4.3&path:/dsh-session-cost"
27
+ ```
28
+
29
+ 若终端找不到 `dsh`,macOS 官方桌面版可用 `"/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh"` 替代命令名。也可参照[仓库首页](../README.md)克隆后安装本子目录。
30
+
31
+ 连不上 GitHub 时填 npm 包名 `dsh-session-fee`。不要填 `dsh-session-cost`,那是别人的包。目录和 Git 地址里的 `path:` 仍是 `dsh-session-cost`。已装旧包名的,先卸载再装新包名。
32
+
33
+ 安装后重启 DSH。有 token 用量的会话,会在统计条的用时、用量两项之后显示费用。版本更新与卸载见[仓库首页](../README.md)。
34
+
35
+ ## 价格放在哪里
36
+
37
+ - 自带的 [prices.json](prices.json) 只收当前主流在线模型,随插件更新;来源与口径见 [PRICES.md](PRICES.md)。
38
+ - **出了新模型、或看到某段显示 `--`**:在价格表里加一条即可(写法见下文)。`--` 表示这个模型既不在价格表里,DSH 自带目录也没有它的价格。
39
+ - **要自己改价或加模型**:把 `prices.json` 复制到自己的目录,在 DSH profile 的 `cordis.patch.yml` 里指过去(文件里若只有一行 `[]`,先删掉它);这份文件不会被插件更新覆盖,保存即生效:
40
+
41
+ ```yaml
42
+ - id: session-cost
43
+ name: dsh-session-fee
44
+ config:
45
+ priceBook: /你的目录/prices.json
46
+ ```
47
+
48
+ - 用克隆目录链接安装(`link:`)时,也可以直接改目录里的 `prices.json`;有通用价值的改动欢迎提 PR。
49
+
50
+ ### 什么时候生效
51
+
52
+ | 改了什么 | 何时生效 | 要不要重启 |
53
+ |---|---|---|
54
+ | 价格表 | 保存后约 0.2 秒,历史调用按新价重算;正在看的会话在它下一次有新事件(模型或工具调用)时刷新显示,其他会话打开即为新价 | 不用 |
55
+ | profile 补丁里的插件配置 | DSH 约 2 秒后重新组合 | 不用 |
56
+ | 插件代码 | 下一次重新组合时换上:改一下补丁、在插件页开关一次插件,或重启 | 不必 |
57
+
58
+ 金额在每次模型调用结束、拿到用量后更新,不在流式输出中途估算。价格表写坏或校验失败时保留上一份有效价格。每次加载结果(价格表条数、目录来源与版本、最近错误)写在 DSH 数据目录(默认 `~/.dsh`)下的 `plugins/session-cost/status.json`,排查用。
59
+
60
+ ## 配置参考
61
+
62
+ ### 价格表写法
63
+
64
+ ```json
65
+ {
66
+ "version": 2,
67
+ "timeZone": "Asia/Shanghai",
68
+ "models": [
69
+ {
70
+ "name": "DeepSeek-V4.1-Flash",
71
+ "match": ["my-relay/deepseek-flash", "*/deepseek-v4.1-flash"],
72
+ "rules": [
73
+ { "name": "常规价格", "currency": "CNY", "input": 1, "cacheRead": 0.02, "cacheWrite": 0, "output": 4 }
74
+ ]
75
+ }
76
+ ]
77
+ }
78
+ ```
79
+
80
+ `match` 里写 Session 事件中的实际路由 `provider/model`,不是界面显示名称;原生每轮 Token 用量详情或本插件的明细里可查看。比较时不分大小写;`provider` 可写 `*` 表示任意服务商,`model` 可用 `*` 通配(如 `*/claude-opus-5-5*`)。精确路由优先于通配路由;通配之间按文件顺序。同一路由不能被两条模型重复声明。
81
+
82
+ 价格默认按 **100 万 Token** 计,也可在规则里设 `unit`。
83
+
84
+ ### 模型条目
85
+
86
+ | 字段 | 含义 |
87
+ |---|---|
88
+ | `name` | 显示名,可选 |
89
+ | `match` | 路由列表,至少一个 |
90
+ | `rules` | 有序价格规则,**从上到下首个命中生效** |
91
+ | `catalog` | 与 `rules` 二选一:借用 pi-ai 目录里某个模型的价格,如 `"google/gemini-3.1-pro-preview"`,用于名字对不上目录的路由 |
92
+ | `note` | 备注,不参与计算 |
93
+
94
+ ### 价格规则
95
+
96
+ | 字段 | 含义 |
97
+ |---|---|
98
+ | `name` | 规则名称,费用明细中显示 |
99
+ | `currency` | 三位 ISO 币种,如 `CNY`、`USD` |
100
+ | `input` / `cacheRead` / `cacheWrite` / `output` | 未缓存输入、缓存读取、缓存写入、输出单价;输出已含推理 |
101
+ | `tiers` | 可选长上下文阶梯:`[{ "above": 272000, "input": 4, "output": 15, ... }]`,本次提示(输入+缓存读写)超过 `above` 时整次调用改用该档;没写的单价沿用基础价 |
102
+ | `unit` | 可选,默认 `1000000` |
103
+ | `when` | 可选生效条件;省略则为兜底规则 |
104
+
105
+ 只要某次调用实际用到了某个非零 Token 桶,就必须有对应单价,否则该次记为未定价。`0` 是有效的免费价格,与缺失不同。
106
+
107
+ ### 分时、节假日与限时
108
+
109
+ ```json
110
+ {
111
+ "dateSets": { "cn-holidays": ["2026-10-01..2026-10-07"] },
112
+ "models": [{
113
+ "match": ["*/deepseek-flash"],
114
+ "rules": [
115
+ {
116
+ "name": "工作日高峰", "currency": "CNY", "input": 2, "cacheRead": 0.04, "output": 8,
117
+ "when": {
118
+ "weekdays": [1, 2, 3, 4, 5],
119
+ "excludeDates": ["@cn-holidays"],
120
+ "intervals": [{ "start": "09:00", "end": "12:00" }, { "start": "14:00", "end": "18:00" }]
121
+ }
122
+ },
123
+ { "name": "闲时", "currency": "CNY", "input": 1, "cacheRead": 0.02, "output": 4 }
124
+ ]
125
+ }]
126
+ }
127
+ ```
128
+
129
+ | 条件 | 规则 |
130
+ |---|---|
131
+ | `timeZone` | IANA 时区;省略时继承价格表顶层 `timeZone` |
132
+ | `from` / `to` | 带 `Z` 或明确时区偏移的 ISO 时间;`from` 包含,`to` 不包含 |
133
+ | `dates` / `excludeDates` | 本地日期白名单/排除名单;元素可为 `YYYY-MM-DD`、`YYYY-MM-DD..YYYY-MM-DD` 或 `@集合名`(引用顶层 `dateSets`) |
134
+ | `weekdays` | ISO 星期,1 为周一,7 为周日 |
135
+ | `intervals` | 每日本地时间区间,开始包含、结束不包含;支持跨午夜 |
136
+
137
+ 不同条件之间是 AND,多个 `intervals` 之间是 OR。跨午夜时段的日期条件归属于**时段开始日**。
138
+
139
+ 价格优先按实际请求前最后一条 `request/context` 或 `request/header` 事件的时间匹配;若没有这些事件,则用步骤/重试的开始时间。相同路由与上下文的后续请求可能省略前两类事件,此时跨越价格边界的少量调用只能采用步骤开始时间,属于日志信息所允许的近似口径。
140
+
141
+ ### 兜底与其他配置
142
+
143
+ 价格按以下顺序查找,先找到的为准:
144
+
145
+ 1. 价格表 `prices.json`(或 `priceBook` 指定的文件);
146
+ 2. `catalog.sources` 里指定的 pi-ai 安装(可选,比如本机 pi 自带的更新版目录);
147
+ 3. DSH 自带的 pi-ai 模型目录(美元刊例价;DSH 附带的版本通常较旧,缺新模型);
148
+ 4. 都没有:显示 `--`。
149
+
150
+ 插件配置写在 DSH profile 的 `cordis.patch.yml`(文件里若只有一行 `[]`,先删掉它),都可省略:
151
+
152
+ ```yaml
153
+ - id: session-cost
154
+ name: dsh-session-fee
155
+ config:
156
+ priceBook: /你的目录/prices.json # 自己维护的价格表
157
+ catalog:
158
+ sources: # 额外的 pi-ai 目录,先列的优先
159
+ - /path/to/pi-ai
160
+ # includeHost: false # 不用 DSH 自带目录兜底
161
+ # enabled: false # 只用价格表
162
+ # providers: [...] # 查哪些厂商目录,默认 OpenAI/Codex、Anthropic、Google、xAI、Mistral、Copilot
163
+ # hints: { codex: [openai-codex, openai] } # DSH 服务商 → 先查哪个目录
164
+ addReasoningToOutput: [antigravity] # 输出不含推理的服务商,推理按输出计费
165
+ ```
166
+
167
+ 兜底时模型 ID 按小写比对,并兼容 `厂商/模型` 前缀、`-thinking` 后缀和 Claude 版本号的点/横线写法。目录价一律视为 USD;国产厂商的目录不参与(应以人民币价写进价格表)。
168
+
169
+ ## 账目与显示口径
170
+
171
+ - Host 投影回放完整持久 Session 日志,历史分页和上下文压缩不会改变既有账目。
172
+ - 上下文压缩时那次摘要本身也是一次模型调用,按它上报的用量如实计入(计价时间取压缩开始时刻 `compaction/start`,路由取摘要事件里的 `provider/model`)。因此压缩较多的会话,金额会高于只算主对话时的读数。
173
+ - 同一次尝试的最终用量替换其流式样本,避免重复计费。
174
+ - `llm/retry-started` 后的新尝试单独计入;如果提供方上报了失败或重试尝试的用量,也会计入费用。
175
+ - 连续相同 `provider/model` 合并为一个显示段;路由变化另起一段。
176
+ - 每段保留自己的币种。一个 Session 不会把不同币种换算后相加。
177
+ - 若一段中只有部分调用未定价,会显示“已知金额 + --”,提示该段账目不完整。
178
+ - 提供方尚未上报有效用量时不产生费用;响应结束后收到用量即更新,不自行按字符数估算流式费用。
179
+ - 子代理在各自的子 Session 里记账;父 Session 的统计条再把全部后代(子代理的子代理也算)计入底栏总数,括号里注明其中子代理的部分。运行中的子代理实时更新;没打开过的冷子 Session 由界面读取一次后显示,读取前显示 `(…)`。外部子代理没有本地日志,不计入。
180
+ - 分叉(对话分支、fork 子代理)开头复制的父 Session 历史不再计入新 Session,因为那部分已经在父 Session 里算过;否则父 Session 汇总子代理时会重复计费。DSH 原生 Token 统计会把这段继承历史算进去,两者在分叉 Session 上会不一致。
181
+ - Session 标题生成那次小调用没有用量记录,不计入。
182
+
183
+ 只算标准文本 Token 刊例价(含长上下文阶梯价)。图片/音频附加费、搜索或工具调用费、批量折扣、Anthropic 1 小时缓存写入加价、提供方最低扣费单位等未计入。
184
+
185
+ ## 开发
186
+
187
+ ```sh
188
+ npm test # 本目录的单元测试
189
+ npm run check # 在合集根目录:清单、文档、语法、测试与打包检查
190
+ ```
191
+
192
+ ```text
193
+ index.js Host 入口:加载价格与目录、注册 sessionCost 投影
194
+ client.js 统计条里的费用项与明细框
195
+ lib/projection.js 逐次调用的账本(只存日志事实,金额在出视图时按当前价格算)
196
+ lib/pricing.js 价格表校验、路由匹配、时段与阶梯计价
197
+ lib/catalog.js 兜底:读取 pi-ai 模型目录
198
+ lib/config.js 插件配置校验
199
+ lib/reload.js 价格表监听与热更新
200
+ ```
201
+
202
+ Host 用 `sessionProjections` 注册 `sessionCost` 投影;Client 注册 `conversation.composer.dock` 的 `cost` 项,沿 DSH 自带的 `subagentCatalog` 投影遍历后代会话,经 `sessions.refreshProjections()` 读取未加载的子会话。
203
+
204
+ ## 许可
205
+
206
+ MIT