dsh-kenari-plugin 0.1.1
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 +21 -0
- package/README.en.md +281 -0
- package/README.md +283 -0
- package/assets/kenari-favicon-128.png +0 -0
- package/assets/kenari-favicon-256.png +0 -0
- package/client/index.js +1998 -0
- package/cordis.patch.yml +137 -0
- package/lib/billing.d.ts +120 -0
- package/lib/billing.d.ts.map +1 -0
- package/lib/billing.js +209 -0
- package/lib/billing.js.map +1 -0
- package/lib/catalog-view.d.ts +78 -0
- package/lib/catalog-view.d.ts.map +1 -0
- package/lib/catalog-view.js +113 -0
- package/lib/catalog-view.js.map +1 -0
- package/lib/catalog.d.ts +239 -0
- package/lib/catalog.d.ts.map +1 -0
- package/lib/catalog.js +445 -0
- package/lib/catalog.js.map +1 -0
- package/lib/default-route.d.ts +35 -0
- package/lib/default-route.d.ts.map +1 -0
- package/lib/default-route.js +111 -0
- package/lib/default-route.js.map +1 -0
- package/lib/errors.d.ts +29 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +74 -0
- package/lib/errors.js.map +1 -0
- package/lib/favicon.d.ts +24 -0
- package/lib/favicon.d.ts.map +1 -0
- package/lib/favicon.js +68 -0
- package/lib/favicon.js.map +1 -0
- package/lib/http.d.ts +104 -0
- package/lib/http.d.ts.map +1 -0
- package/lib/http.js +247 -0
- package/lib/http.js.map +1 -0
- package/lib/index.d.ts +83 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +285 -0
- package/lib/index.js.map +1 -0
- package/lib/llm/adapter.d.ts +78 -0
- package/lib/llm/adapter.d.ts.map +1 -0
- package/lib/llm/adapter.js +429 -0
- package/lib/llm/adapter.js.map +1 -0
- package/lib/llm/candidates.d.ts +57 -0
- package/lib/llm/candidates.d.ts.map +1 -0
- package/lib/llm/candidates.js +86 -0
- package/lib/llm/candidates.js.map +1 -0
- package/lib/llm/recovery.d.ts +48 -0
- package/lib/llm/recovery.d.ts.map +1 -0
- package/lib/llm/recovery.js +118 -0
- package/lib/llm/recovery.js.map +1 -0
- package/lib/llm/retry.d.ts +35 -0
- package/lib/llm/retry.d.ts.map +1 -0
- package/lib/llm/retry.js +53 -0
- package/lib/llm/retry.js.map +1 -0
- package/lib/plans.d.ts +59 -0
- package/lib/plans.d.ts.map +1 -0
- package/lib/plans.js +118 -0
- package/lib/plans.js.map +1 -0
- package/lib/session-title.d.ts +63 -0
- package/lib/session-title.d.ts.map +1 -0
- package/lib/session-title.js +280 -0
- package/lib/session-title.js.map +1 -0
- package/lib/settings.d.ts +35 -0
- package/lib/settings.d.ts.map +1 -0
- package/lib/settings.js +78 -0
- package/lib/settings.js.map +1 -0
- package/lib/tools/account.d.ts +11 -0
- package/lib/tools/account.d.ts.map +1 -0
- package/lib/tools/account.js +132 -0
- package/lib/tools/account.js.map +1 -0
- package/lib/tools/billing.d.ts +10 -0
- package/lib/tools/billing.d.ts.map +1 -0
- package/lib/tools/billing.js +100 -0
- package/lib/tools/billing.js.map +1 -0
- package/lib/tools/count-tokens.d.ts +11 -0
- package/lib/tools/count-tokens.d.ts.map +1 -0
- package/lib/tools/count-tokens.js +84 -0
- package/lib/tools/count-tokens.js.map +1 -0
- package/lib/tools/data.d.ts +12 -0
- package/lib/tools/data.d.ts.map +1 -0
- package/lib/tools/data.js +205 -0
- package/lib/tools/data.js.map +1 -0
- package/lib/tools/docs.d.ts +13 -0
- package/lib/tools/docs.d.ts.map +1 -0
- package/lib/tools/docs.js +209 -0
- package/lib/tools/docs.js.map +1 -0
- package/lib/tools/documents.d.ts +10 -0
- package/lib/tools/documents.d.ts.map +1 -0
- package/lib/tools/documents.js +118 -0
- package/lib/tools/documents.js.map +1 -0
- package/lib/tools/media.d.ts +28 -0
- package/lib/tools/media.d.ts.map +1 -0
- package/lib/tools/media.js +599 -0
- package/lib/tools/media.js.map +1 -0
- package/lib/tools/shared.d.ts +89 -0
- package/lib/tools/shared.d.ts.map +1 -0
- package/lib/tools/shared.js +128 -0
- package/lib/tools/shared.js.map +1 -0
- package/lib/tools/x-search.d.ts +11 -0
- package/lib/tools/x-search.d.ts.map +1 -0
- package/lib/tools/x-search.js +129 -0
- package/lib/tools/x-search.js.map +1 -0
- package/lib/web/fallback.d.ts +39 -0
- package/lib/web/fallback.d.ts.map +1 -0
- package/lib/web/fallback.js +79 -0
- package/lib/web/fallback.js.map +1 -0
- package/lib/web/fetch.d.ts +19 -0
- package/lib/web/fetch.d.ts.map +1 -0
- package/lib/web/fetch.js +41 -0
- package/lib/web/fetch.js.map +1 -0
- package/lib/web/search.d.ts +21 -0
- package/lib/web/search.d.ts.map +1 -0
- package/lib/web/search.js +47 -0
- package/lib/web/search.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 计费总览工具:一个地方看全「这个会话花了多少、还剩多少、缓存命中多少」。
|
|
3
|
+
* 数据来自 billing.ts 的账本(工具调用与 web provider 共用同一个账本)与余额监控。
|
|
4
|
+
* @module dsh-kenari-plugin/tools/billing
|
|
5
|
+
*/
|
|
6
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
7
|
+
import { GLOBAL_SCOPE, formatRupiah, scopeOf } from './shared.js';
|
|
8
|
+
/** 一分钟内的秒级时间戳 → 本地时间字符串。 */
|
|
9
|
+
function formatTime(epochMs) {
|
|
10
|
+
return new Date(epochMs).toLocaleTimeString('zh-CN', { hour12: false });
|
|
11
|
+
}
|
|
12
|
+
/** 注册 kenari_billing。 */
|
|
13
|
+
export function registerBillingTool(deps, register) {
|
|
14
|
+
register(defineTool({
|
|
15
|
+
name: 'kenari_billing',
|
|
16
|
+
description: 'Show Kenari spend for this session: actual vs estimated cost, per-tool and per-model breakdown, token usage with prompt-cache hit rate, remaining budget, and wallet balance. Use it before expensive generation to decide what you can afford.',
|
|
17
|
+
parameters: {
|
|
18
|
+
refresh_balance: { type: 'boolean', description: 'Force a fresh wallet balance query instead of the cached one (default false).' },
|
|
19
|
+
scope: { type: 'string', description: 'Session scope to report: "session" (this conversation, default) or "global" (whole dsh process, includes web search/fetch).', enum: ['session', 'global'] },
|
|
20
|
+
},
|
|
21
|
+
output: {
|
|
22
|
+
schema: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
additionalProperties: false,
|
|
25
|
+
properties: {
|
|
26
|
+
text: { type: 'string', required: true },
|
|
27
|
+
spent_micro_idr: { type: 'integer', required: true },
|
|
28
|
+
calls: { type: 'integer', required: true },
|
|
29
|
+
cache_hit_rate: { type: 'number' },
|
|
30
|
+
balance_rp: { type: 'number' },
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
render: (_args, value) => [{ type: 'text', text: value.text }],
|
|
34
|
+
},
|
|
35
|
+
timeoutMs: 30_000,
|
|
36
|
+
isConcurrencySafe: () => true,
|
|
37
|
+
async execute(args, exec) {
|
|
38
|
+
const scope = args.scope === 'global' ? GLOBAL_SCOPE : scopeOf(exec);
|
|
39
|
+
const label = args.scope === 'global' ? '本进程' : '本会话';
|
|
40
|
+
const totals = args.scope === 'global' ? deps.billing.globalSpendTotals() : deps.billing.spendTotals(scope);
|
|
41
|
+
const usage = deps.billing.usageTotals(scope);
|
|
42
|
+
const lines = [`Kenari 计费总览(${label})`];
|
|
43
|
+
lines.push(`- 花费:${formatRupiah(totals.microIdr)}(${totals.calls} 次调用;实际 ${formatRupiah(totals.actualMicroIdr)} + 预估 ${formatRupiah(totals.estimatedMicroIdr)})`);
|
|
44
|
+
const byTool = args.scope === 'global' ? undefined : deps.billing.byTool(scope);
|
|
45
|
+
if (byTool !== undefined && byTool.length > 0) {
|
|
46
|
+
lines.push('- 分工具:');
|
|
47
|
+
for (const row of byTool) {
|
|
48
|
+
lines.push(` - ${row.key}:${formatRupiah(row.totals.microIdr)} × ${row.totals.calls}${row.totals.estimatedMicroIdr > 0 ? '(含预估)' : ''}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (args.scope !== 'global') {
|
|
52
|
+
const byModel = deps.billing.byModel(scope).filter((row) => row.key !== '(无模型)');
|
|
53
|
+
if (byModel.length > 0) {
|
|
54
|
+
lines.push('- 分模型:');
|
|
55
|
+
for (const row of byModel)
|
|
56
|
+
lines.push(` - ${row.key}:${formatRupiah(row.totals.microIdr)} × ${row.totals.calls}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (usage.calls > 0) {
|
|
60
|
+
const hit = usage.hitRate === undefined ? '无缓存读数据' : `${(usage.hitRate * 100).toFixed(1)}%`;
|
|
61
|
+
lines.push(`- token:输入 ${usage.inputTokens} / 输出 ${usage.outputTokens} / 缓存读 ${usage.cacheReadTokens} / 缓存写 ${usage.cacheWriteTokens};命中率 ${hit}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
lines.push('- token:本次会话尚无模型调用计量(模型接入后由 Kenari 适配器记入;cached_tokens 命中率在此显示)');
|
|
65
|
+
}
|
|
66
|
+
const cap = deps.billing.capStatus(scope);
|
|
67
|
+
if (cap.capMicroIdr === undefined) {
|
|
68
|
+
lines.push('- 预算:未设封顶(cordis 配置 budgetCapRp 可设;达到上限会拒绝新的花费型调用)');
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
lines.push(`- 预算:上限 ${formatRupiah(cap.capMicroIdr)},已用 ${formatRupiah(cap.spentMicroIdr)},剩余 ${formatRupiah(cap.remainingMicroIdr ?? 0)}${cap.exceeded ? '(已用尽,花费型调用会被拒绝)' : ''}`);
|
|
72
|
+
}
|
|
73
|
+
if (args.refresh_balance === true)
|
|
74
|
+
deps.balance.invalidate();
|
|
75
|
+
const balance = await deps.balance.balanceRp();
|
|
76
|
+
if (balance === undefined) {
|
|
77
|
+
lines.push(`- 余额:查询失败(分享页 key 会 403;账户余额需自己账号的 key)`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const threshold = deps.config.lowBalanceAlertRp ?? 0;
|
|
81
|
+
const low = threshold > 0 && balance < threshold ? `(低于阈值 Rp ${threshold.toLocaleString('id-ID')},建议改免费模型或充值)` : '';
|
|
82
|
+
lines.push(`- 余额:Rp ${balance.toLocaleString('id-ID')}${low}`);
|
|
83
|
+
}
|
|
84
|
+
const scopes = deps.billing.scopes().filter((item) => item !== GLOBAL_SCOPE);
|
|
85
|
+
if (scopes.length > 1) {
|
|
86
|
+
lines.push(`- 另有 ${scopes.length - 1} 个会话有花费记录(用 scope=global 看总账)`);
|
|
87
|
+
}
|
|
88
|
+
lines.push(`- 说明:预估按目录 pricing_lines 单价 × 数量推算,最终以 Kenari 账单为准;失败调用不计费。`);
|
|
89
|
+
lines.push(`- 记录时间:${formatTime(Date.now())}`);
|
|
90
|
+
return {
|
|
91
|
+
text: lines.join('\n'),
|
|
92
|
+
spent_micro_idr: totals.microIdr,
|
|
93
|
+
calls: totals.calls,
|
|
94
|
+
...(usage.hitRate !== undefined ? { cache_hit_rate: Number(usage.hitRate.toFixed(4)) } : {}),
|
|
95
|
+
...(balance !== undefined ? { balance_rp: balance } : {}),
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* token 计数与窗口监控:POST /v1/messages/count_tokens(Anthropic 线,只读不计费)。
|
|
3
|
+
* 该端点在根 base(https://kenari.id)之下而非 /v1 线,路径拼接由 http 层归一化。
|
|
4
|
+
* 计数结果与目录里的上下文窗口比对,给出「还能放多少 / 是否该压缩」的可执行判断。
|
|
5
|
+
* @module dsh-kenari-plugin/tools/count-tokens
|
|
6
|
+
*/
|
|
7
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
8
|
+
import type { ToolsDeps } from './shared.js';
|
|
9
|
+
/** 注册 kenari_count_tokens(只读、不计费)。 */
|
|
10
|
+
export declare function registerCountTokensTool(deps: ToolsDeps, register: (tool: ReturnType<typeof defineTool>) => void): void;
|
|
11
|
+
//# sourceMappingURL=count-tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count-tokens.d.ts","sourceRoot":"","sources":["../../src/tools/count-tokens.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAO5C,sCAAsC;AACtC,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG,IAAI,CAkEtH"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* token 计数与窗口监控:POST /v1/messages/count_tokens(Anthropic 线,只读不计费)。
|
|
3
|
+
* 该端点在根 base(https://kenari.id)之下而非 /v1 线,路径拼接由 http 层归一化。
|
|
4
|
+
* 计数结果与目录里的上下文窗口比对,给出「还能放多少 / 是否该压缩」的可执行判断。
|
|
5
|
+
* @module dsh-kenari-plugin/tools/count-tokens
|
|
6
|
+
*/
|
|
7
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
8
|
+
import { kenariPost } from '../http.js';
|
|
9
|
+
import { toResolvedModelInfo } from '../catalog.js';
|
|
10
|
+
/** 窗口占用率告警阈值:超过就该考虑压缩历史。 */
|
|
11
|
+
const WINDOW_WARN_RATIO = 0.8;
|
|
12
|
+
/** 注册 kenari_count_tokens(只读、不计费)。 */
|
|
13
|
+
export function registerCountTokensTool(deps, register) {
|
|
14
|
+
register(defineTool({
|
|
15
|
+
name: 'kenari_count_tokens',
|
|
16
|
+
description: 'Count input tokens for a Kenari Anthropic-line request (POST /v1/messages/count_tokens), and compare against the model context window from the catalog. Read-only: no model dispatch, no billing, no model id validation. Use it to decide whether to compact context before a call.',
|
|
17
|
+
parameters: {
|
|
18
|
+
model: { type: 'string', required: true, description: 'Model id (not validated by the endpoint; the catalog lookup is best-effort).' },
|
|
19
|
+
text: { type: 'string', required: true, description: 'The user-turn text to count.' },
|
|
20
|
+
system: { type: 'string', description: 'Optional system prompt text to include in the count.' },
|
|
21
|
+
},
|
|
22
|
+
output: {
|
|
23
|
+
schema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
properties: {
|
|
27
|
+
input_tokens: { type: 'integer', required: true },
|
|
28
|
+
text: { type: 'string', required: true },
|
|
29
|
+
model_in_catalog: { type: 'boolean' },
|
|
30
|
+
context_window: { type: 'integer' },
|
|
31
|
+
window_usage_ratio: { type: 'number' },
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
render: (_args, value) => [{ type: 'text', text: value.text }],
|
|
35
|
+
},
|
|
36
|
+
timeoutMs: 30_000,
|
|
37
|
+
isConcurrencySafe: () => true,
|
|
38
|
+
async execute(args) {
|
|
39
|
+
const body = {
|
|
40
|
+
model: args.model,
|
|
41
|
+
messages: [{ role: 'user', content: args.text }],
|
|
42
|
+
};
|
|
43
|
+
if (args.system !== undefined)
|
|
44
|
+
body.system = args.system;
|
|
45
|
+
const result = await kenariPost(deps.http, '/messages/count_tokens', body);
|
|
46
|
+
const tokens = result.input_tokens;
|
|
47
|
+
if (tokens === undefined)
|
|
48
|
+
throw new Error('kenari: count_tokens 响应缺少 input_tokens');
|
|
49
|
+
const lines = [`输入 token:${tokens}`];
|
|
50
|
+
// 目录查询是增值信息:查不到不影响计数结果,也不新增网络失败面
|
|
51
|
+
const resolved = await deps.catalog.resolve(args.model).catch(() => undefined);
|
|
52
|
+
if (resolved === undefined) {
|
|
53
|
+
lines.push(`目录中未找到模型 ${args.model}:无法给出窗口占比。用 kenari_list_models 取确切 id(免费模型 id 带 :free)。`);
|
|
54
|
+
return { input_tokens: tokens, text: lines.join('\n'), model_in_catalog: false };
|
|
55
|
+
}
|
|
56
|
+
const info = toResolvedModelInfo(resolved.model, 'kenari');
|
|
57
|
+
const contextWindow = info.context?.contextWindow;
|
|
58
|
+
for (const warning of resolved.warnings)
|
|
59
|
+
lines.push(`⚠️ ${warning}`);
|
|
60
|
+
if (contextWindow === undefined) {
|
|
61
|
+
lines.push('该模型目录未公布 context_length:无法给出窗口占比。');
|
|
62
|
+
return { input_tokens: tokens, text: lines.join('\n'), model_in_catalog: true };
|
|
63
|
+
}
|
|
64
|
+
const ratio = tokens / contextWindow;
|
|
65
|
+
lines.push(`上下文窗口:${contextWindow},本次输入占 ${(ratio * 100).toFixed(1)}%`);
|
|
66
|
+
if (ratio >= 1) {
|
|
67
|
+
lines.push('⛔ 已超出窗口:这次请求会被网关拒绝。必须压缩历史、裁剪附件,或换更大窗口的模型。');
|
|
68
|
+
}
|
|
69
|
+
else if (ratio >= WINDOW_WARN_RATIO) {
|
|
70
|
+
lines.push(`⚠️ 已用 ${(ratio * 100).toFixed(1)}%(≥${WINDOW_WARN_RATIO * 100}%):建议先压缩/摘要历史或裁剪附件,再发起请求,避免中途失败。`);
|
|
71
|
+
}
|
|
72
|
+
if (resolved.free)
|
|
73
|
+
lines.push('该模型免费:即使重发也不产生余额消耗。');
|
|
74
|
+
return {
|
|
75
|
+
input_tokens: tokens,
|
|
76
|
+
text: lines.join('\n'),
|
|
77
|
+
model_in_catalog: true,
|
|
78
|
+
context_window: contextWindow,
|
|
79
|
+
window_usage_ratio: Number(ratio.toFixed(4)),
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=count-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../../src/tools/count-tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数据工具族:embeddings / rerank / moderations。
|
|
3
|
+
* 模型 id 是动态目录:提示模型先用 kenari_list_models?modality=… 查活动 id。
|
|
4
|
+
* 三者都按 token 计费,但响应回显程度不同:rerank 带 usage,embeddings 不带,
|
|
5
|
+
* 故后者的费用只能是粗估(按字符数折算 token),并在文案里明说。
|
|
6
|
+
* @module dsh-kenari-plugin/tools/data
|
|
7
|
+
*/
|
|
8
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
9
|
+
import type { ToolsDeps } from './shared.js';
|
|
10
|
+
/** 注册数据三工具。 */
|
|
11
|
+
export declare function registerDataTools(deps: ToolsDeps, register: (tool: ReturnType<typeof defineTool>) => void): void;
|
|
12
|
+
//# sourceMappingURL=data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/tools/data.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAY5C,eAAe;AACf,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG,IAAI,CA0LhH"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数据工具族:embeddings / rerank / moderations。
|
|
3
|
+
* 模型 id 是动态目录:提示模型先用 kenari_list_models?modality=… 查活动 id。
|
|
4
|
+
* 三者都按 token 计费,但响应回显程度不同:rerank 带 usage,embeddings 不带,
|
|
5
|
+
* 故后者的费用只能是粗估(按字符数折算 token),并在文案里明说。
|
|
6
|
+
* @module dsh-kenari-plugin/tools/data
|
|
7
|
+
*/
|
|
8
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
9
|
+
import { billSpend, estimateByUnit, spendGuard } from './shared.js';
|
|
10
|
+
import { kenariPost } from '../http.js';
|
|
11
|
+
/** 无 usage 回显时的 token 粗估系数(字符 → token),仅用于费用量级提示。 */
|
|
12
|
+
const CHARS_PER_TOKEN = 4;
|
|
13
|
+
/** 输入文本总字符数(string 或 string[])。 */
|
|
14
|
+
function inputChars(input) {
|
|
15
|
+
return (Array.isArray(input) ? input : [input]).reduce((sum, item) => sum + item.length, 0);
|
|
16
|
+
}
|
|
17
|
+
/** 注册数据三工具。 */
|
|
18
|
+
export function registerDataTools(deps, register) {
|
|
19
|
+
register(defineTool({
|
|
20
|
+
name: 'kenari_embed',
|
|
21
|
+
description: 'Create text embeddings with a Kenari embedding model (e.g. bge-m3). Embedding ids are dynamic — query kenari_list_models with modality=embedding for active ids. Free of charge by current pricing but ids change.',
|
|
22
|
+
parameters: {
|
|
23
|
+
model: { type: 'string', required: true, description: 'Embedding model id (query kenari_list_models?modality=embedding for active ids).' },
|
|
24
|
+
input: {
|
|
25
|
+
oneOf: [
|
|
26
|
+
{ type: 'string' },
|
|
27
|
+
{ type: 'array', items: { type: 'string' } },
|
|
28
|
+
],
|
|
29
|
+
required: true,
|
|
30
|
+
description: 'Text to embed: a single string or an array of strings.',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
output: {
|
|
34
|
+
schema: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
additionalProperties: false,
|
|
37
|
+
properties: {
|
|
38
|
+
vectors: {
|
|
39
|
+
type: 'array',
|
|
40
|
+
required: true,
|
|
41
|
+
items: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
additionalProperties: false,
|
|
44
|
+
properties: {
|
|
45
|
+
index: { type: 'integer', required: true },
|
|
46
|
+
dimensions: { type: 'integer', required: true },
|
|
47
|
+
preview: { type: 'array', items: { type: 'number' } },
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
text: { type: 'string', required: true },
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
render: (_args, value) => [{ type: 'text', text: value.text }],
|
|
55
|
+
},
|
|
56
|
+
timeoutMs: 60_000,
|
|
57
|
+
isConcurrencySafe: () => true,
|
|
58
|
+
async execute(args, exec) {
|
|
59
|
+
spendGuard(deps, exec, 'kenari_embed');
|
|
60
|
+
// 嵌入向量不进模型上下文(动辄上千维):只回显维度与头部预览
|
|
61
|
+
const result = await kenariPost(deps.http, '/embeddings', { model: args.model, input: args.input });
|
|
62
|
+
const rows = (result.data ?? []).map((item) => ({
|
|
63
|
+
index: item.index ?? 0,
|
|
64
|
+
dimensions: item.embedding?.length ?? 0,
|
|
65
|
+
preview: (item.embedding ?? []).slice(0, 5),
|
|
66
|
+
}));
|
|
67
|
+
const approxTokens = Math.ceil(inputChars(args.input) / CHARS_PER_TOKEN);
|
|
68
|
+
const estimate = await estimateByUnit(deps, args.model, 'embeddings', approxTokens / 1_000_000);
|
|
69
|
+
const billed = await billSpend(deps, exec, {
|
|
70
|
+
tool: 'kenari_embed',
|
|
71
|
+
model: args.model,
|
|
72
|
+
estimateMicroIdr: estimate.microIdr,
|
|
73
|
+
estimateNote: estimate.microIdr === undefined
|
|
74
|
+
? undefined
|
|
75
|
+
: `输入 ≈${approxTokens} tokens(按 ${CHARS_PER_TOKEN} 字符/token 粗估,接口未回显 usage)`,
|
|
76
|
+
});
|
|
77
|
+
const base = rows.length === 0
|
|
78
|
+
? 'kenari: embeddings 响应为空'
|
|
79
|
+
: `嵌入完成:${rows.length} 个向量,维度 ${rows[0].dimensions}。向量本体不回显(太大),需要时按 index 自行取用。`;
|
|
80
|
+
return { vectors: rows, text: `${base}${billed}` };
|
|
81
|
+
},
|
|
82
|
+
}));
|
|
83
|
+
register(defineTool({
|
|
84
|
+
name: 'kenari_rerank',
|
|
85
|
+
description: 'Rerank documents against a query with a Kenari rerank model (e.g. bge-reranker-base). Up to 100 documents, 8192 bytes each. Rerank ids are dynamic — query kenari_list_models with modality=rerank.',
|
|
86
|
+
parameters: {
|
|
87
|
+
model: { type: 'string', required: true, description: 'Rerank model id (query kenari_list_models?modality=rerank for active ids).' },
|
|
88
|
+
query: { type: 'string', required: true, description: 'The search query to rank documents against (up to 8192 bytes).' },
|
|
89
|
+
documents: { type: 'array', required: true, items: { type: 'string' }, description: 'Documents to rank, in order. Up to 100, 8192 bytes each, 512 KiB combined.' },
|
|
90
|
+
top_n: { type: 'integer', description: 'Return only the top N results (default all).' },
|
|
91
|
+
return_documents: { type: 'boolean', description: 'Include each result\'s document text (default false).' },
|
|
92
|
+
},
|
|
93
|
+
output: {
|
|
94
|
+
schema: {
|
|
95
|
+
type: 'object',
|
|
96
|
+
additionalProperties: false,
|
|
97
|
+
properties: {
|
|
98
|
+
results: {
|
|
99
|
+
type: 'array',
|
|
100
|
+
required: true,
|
|
101
|
+
items: {
|
|
102
|
+
type: 'object',
|
|
103
|
+
additionalProperties: false,
|
|
104
|
+
properties: {
|
|
105
|
+
index: { type: 'integer', required: true },
|
|
106
|
+
relevance_score: { type: 'number', required: true },
|
|
107
|
+
document_text: { type: 'string' },
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
usage_total_tokens: { type: 'integer' },
|
|
112
|
+
text: { type: 'string', required: true },
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
render: (_args, value) => [{ type: 'text', text: value.text }],
|
|
116
|
+
},
|
|
117
|
+
timeoutMs: 60_000,
|
|
118
|
+
isConcurrencySafe: () => true,
|
|
119
|
+
async execute(args, exec) {
|
|
120
|
+
spendGuard(deps, exec, 'kenari_rerank');
|
|
121
|
+
const body = { model: args.model, query: args.query, documents: args.documents };
|
|
122
|
+
if (args.top_n !== undefined)
|
|
123
|
+
body.top_n = args.top_n;
|
|
124
|
+
if (args.return_documents !== undefined)
|
|
125
|
+
body.return_documents = args.return_documents;
|
|
126
|
+
const result = await kenariPost(deps.http, '/rerank', body);
|
|
127
|
+
const results = (result.results ?? []).map((row) => ({
|
|
128
|
+
index: row.index ?? 0,
|
|
129
|
+
relevance_score: row.relevance_score ?? 0,
|
|
130
|
+
...(row.document?.text !== undefined ? { document_text: row.document.text } : {}),
|
|
131
|
+
}));
|
|
132
|
+
const lines = results.map((row) => `#${row.index}(${args.documents[row.index] ?? '?'})→ ${row.relevance_score}`);
|
|
133
|
+
const usage = result.usage?.total_tokens !== undefined ? `\n用量:${result.usage.total_tokens} tokens` : '';
|
|
134
|
+
// rerank 回显 usage.total_tokens:按目录 token 单价精确预估
|
|
135
|
+
const totalTokens = result.usage?.total_tokens;
|
|
136
|
+
const estimate = totalTokens === undefined
|
|
137
|
+
? {}
|
|
138
|
+
: await estimateByUnit(deps, args.model, 'rerank', totalTokens / 1_000_000);
|
|
139
|
+
const billed = await billSpend(deps, exec, {
|
|
140
|
+
tool: 'kenari_rerank',
|
|
141
|
+
model: args.model,
|
|
142
|
+
estimateMicroIdr: estimate.microIdr,
|
|
143
|
+
estimateNote: estimate.microIdr === undefined ? undefined : `${totalTokens} tokens(响应回显)`,
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
results,
|
|
147
|
+
...(result.usage?.total_tokens !== undefined ? { usage_total_tokens: result.usage.total_tokens } : {}),
|
|
148
|
+
text: `重排完成(best first):\n${lines.join('\n')}${usage}${billed}`,
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
}));
|
|
152
|
+
register(defineTool({
|
|
153
|
+
name: 'kenari_moderate',
|
|
154
|
+
description: 'Classify text against Kenari moderation categories. No moderation model is active in the public catalog right now — this call returns 400 until one appears; check kenari_list_models?modality=moderation.',
|
|
155
|
+
parameters: {
|
|
156
|
+
model: { type: 'string', required: true, description: 'Moderation model id (query kenari_list_models?modality=moderation for active ids).' },
|
|
157
|
+
input: {
|
|
158
|
+
oneOf: [
|
|
159
|
+
{ type: 'string' },
|
|
160
|
+
{ type: 'array', items: { type: 'string' } },
|
|
161
|
+
],
|
|
162
|
+
required: true,
|
|
163
|
+
description: 'Text to classify: a single string or an array of strings.',
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
output: {
|
|
167
|
+
schema: {
|
|
168
|
+
type: 'object',
|
|
169
|
+
additionalProperties: false,
|
|
170
|
+
properties: {
|
|
171
|
+
results: {
|
|
172
|
+
type: 'array',
|
|
173
|
+
required: true,
|
|
174
|
+
items: {
|
|
175
|
+
type: 'object',
|
|
176
|
+
additionalProperties: false,
|
|
177
|
+
properties: {
|
|
178
|
+
flagged: { type: 'boolean', required: true },
|
|
179
|
+
flagged_categories: { type: 'array', items: { type: 'string' } },
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
text: { type: 'string', required: true },
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
render: (_args, value) => [{ type: 'text', text: value.text }],
|
|
187
|
+
},
|
|
188
|
+
timeoutMs: 60_000,
|
|
189
|
+
isConcurrencySafe: () => true,
|
|
190
|
+
async execute(args, exec) {
|
|
191
|
+
// 公开目录暂无 moderation 模型,也没有可用的计价行:只做预算预检,不记费用
|
|
192
|
+
spendGuard(deps, exec, 'kenari_moderate');
|
|
193
|
+
const result = await kenariPost(deps.http, '/moderations', { model: args.model, input: args.input });
|
|
194
|
+
const results = (result.results ?? []).map((row) => ({
|
|
195
|
+
flagged: row.flagged ?? false,
|
|
196
|
+
...(row.categories !== undefined
|
|
197
|
+
? { flagged_categories: Object.entries(row.categories).filter(([, flagged]) => flagged === true).map(([category]) => category) }
|
|
198
|
+
: {}),
|
|
199
|
+
}));
|
|
200
|
+
const lines = results.map((row, index) => `输入 ${index + 1}:${row.flagged ? `命中 [${(row.flagged_categories ?? []).join(', ')}]` : '未命中任何类别'}`);
|
|
201
|
+
return { results, text: `审核完成:\n${lines.join('\n')}` };
|
|
202
|
+
},
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/tools/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文档与模型目录工具:kenari_search_docs(本地检索 /llms-full.txt,无需 key)
|
|
3
|
+
* 与 kenari_list_models(目录走 catalog.ts 的 TTL 缓存,公开端点)。
|
|
4
|
+
* @module dsh-kenari-plugin/tools/docs
|
|
5
|
+
*/
|
|
6
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
7
|
+
import type { ToolsDeps } from './shared.js';
|
|
8
|
+
import type { ResolvedModel } from '../catalog.js';
|
|
9
|
+
/** 模型条目 → 人读多行块(能力、上下文、价格、非 token 单价、告警)。 */
|
|
10
|
+
export declare function formatModelEntry(resolved: ResolvedModel): string;
|
|
11
|
+
/** 注册文档检索与模型目录两个公开工具(不消耗余额)。 */
|
|
12
|
+
export declare function registerDocsTools(deps: ToolsDeps, register: (tool: ReturnType<typeof defineTool>) => void): void;
|
|
13
|
+
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/tools/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAqElD,6CAA6C;AAC7C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAmBhE;AAKD,gCAAgC;AAChC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG,IAAI,CAoGhH"}
|