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
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-kenari-plugin: Kenari (kenari.id) as a first-class citizen of dsh.
|
|
3
|
+
*
|
|
4
|
+
* Registers the Kenari-first web search/fetch provider pair into `ctx.web`,
|
|
5
|
+
* pinned by the bundle's patch layer (`searchProvider`/`fetchProvider` both
|
|
6
|
+
* `kenari-fallback`). Later phases add REST capability tools and settings.
|
|
7
|
+
* @module dsh-kenari-plugin
|
|
8
|
+
*/
|
|
9
|
+
import { Context } from '@deepseek-ai/cordis';
|
|
10
|
+
import z from '@deepseek-ai/schemastery';
|
|
11
|
+
/** Plugin config. Every field a deployment may want to tune is a config field. */
|
|
12
|
+
export interface Config {
|
|
13
|
+
/** Credential reference holding the Kenari API key (`kn-...`). */
|
|
14
|
+
apiKeyEnv?: string;
|
|
15
|
+
/** Kenari API base URL. */
|
|
16
|
+
baseURL?: string;
|
|
17
|
+
/** Per-request timeout for Kenari REST calls in milliseconds. */
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
/** Per-attempt timeout for generation calls (image/audio/music/OCR) in milliseconds. */
|
|
20
|
+
generationTimeoutMs?: number;
|
|
21
|
+
/** Retry count for transient Kenari REST failures. */
|
|
22
|
+
maxRetries?: number;
|
|
23
|
+
/** Register the Kenari search provider. */
|
|
24
|
+
searchEnabled?: boolean;
|
|
25
|
+
/** Register the Kenari fetch provider. */
|
|
26
|
+
fetchEnabled?: boolean;
|
|
27
|
+
/** Fall back to the dsh defaults when a Kenari call fails. */
|
|
28
|
+
fallbackEnabled?: boolean;
|
|
29
|
+
/** TTL for the in-memory cache of Kenari's /llms-full.txt documentation. */
|
|
30
|
+
docsCacheTtlMs?: number;
|
|
31
|
+
/** TTL for the in-memory cache of Kenari's /v1/models catalog. */
|
|
32
|
+
catalogCacheTtlMs?: number;
|
|
33
|
+
/** Register the Kenari REST capability tools. */
|
|
34
|
+
toolsEnabled?: boolean;
|
|
35
|
+
/** Extra model aliases: `{ alias: 'exact-model-id' }`, usable wherever a model id is accepted. */
|
|
36
|
+
modelAliases?: Record<string, string>;
|
|
37
|
+
/** Warn after a billed call when the wallet drops below this many Rupiah; 0 disables the check. */
|
|
38
|
+
lowBalanceAlertRp?: number;
|
|
39
|
+
/** TTL for the cached wallet balance used by the low-balance alert. */
|
|
40
|
+
balanceCacheTtlMs?: number;
|
|
41
|
+
/** Per-session spend ceiling in Rupiah; 0 leaves spending uncapped. */
|
|
42
|
+
budgetCapRp?: number;
|
|
43
|
+
/** Register the plugin's own Kenari LlmAdapter (phase 5); off keeps the llm-pi-ai preset route. */
|
|
44
|
+
nativeAdapterEnabled?: boolean;
|
|
45
|
+
/** Provider route id for the plugin's own LlmAdapter. */
|
|
46
|
+
nativeProviderId?: string;
|
|
47
|
+
/** 模型调用失败时自动恢复(重试 → 换模型 → 回退默认 provider)。 */
|
|
48
|
+
modelRecoveryEnabled?: boolean;
|
|
49
|
+
/** 参与恢复的 provider 路由;范围外的路由行为完全不变。 */
|
|
50
|
+
modelRecoveryProviders?: string[];
|
|
51
|
+
/** 首次请求之后的额外重试次数(kenari-direct 路由;llm-pi-ai 路由见 cordis.patch.yml)。 */
|
|
52
|
+
modelRetryMaxRetries?: number;
|
|
53
|
+
/** 每次重试前的固定等待毫秒数(同上传导范围)。 */
|
|
54
|
+
modelRetryDelayMs?: number;
|
|
55
|
+
/** 允许重试的失败码;不能为空。 */
|
|
56
|
+
modelRetryableCodes?: string[];
|
|
57
|
+
/** 是否允许换模型(关掉则只重试)。 */
|
|
58
|
+
modelSwitchEnabled?: boolean;
|
|
59
|
+
/** 换模型/回退默认 provider 前的等待毫秒数。 */
|
|
60
|
+
modelSwitchDelayMs?: number;
|
|
61
|
+
/** 跳过「同 provider 换模型」直接回退 provider 的失败码。 */
|
|
62
|
+
modelSwitchSkipCodes?: string[];
|
|
63
|
+
/** 换模型时是否往会话注入一条切换通知。 */
|
|
64
|
+
modelSwitchNoticeEnabled?: boolean;
|
|
65
|
+
/** 会话标题前缀开关:开启后新标题写入前缀(默认开启)。已有会话不回溯。 */
|
|
66
|
+
sessionTitlePrefixEnabled?: boolean;
|
|
67
|
+
/** 会话标题前缀模板:token `yyyy/MM/dd/HH/mm/ss`(本机时区),其余字符原样。 */
|
|
68
|
+
sessionTitlePrefix?: string;
|
|
69
|
+
/** 会话标题(前缀 + 正文)的 UTF-8 字节上限;需与 patch 里 session-title 的 maxTitleBytes 一致。 */
|
|
70
|
+
sessionTitleMaxBytes?: number;
|
|
71
|
+
}
|
|
72
|
+
export declare const Config: z<Config>;
|
|
73
|
+
/** Cordis plugin name used by loader diagnostics. */
|
|
74
|
+
export declare const name = "kenari";
|
|
75
|
+
/** 需要 web seam 与工具注册表;settings 是可选 seam(缺失时退化为 composition 配置)。 */
|
|
76
|
+
export declare const inject: string[];
|
|
77
|
+
/**
|
|
78
|
+
* Register the Kenari capability into the harness.
|
|
79
|
+
* 第 1 期 web fallback;第 2 期 REST 工具;第 3 期目录 / 计费账本 / 窗口监控;
|
|
80
|
+
* 第 4 期设置节(Host 半边)。
|
|
81
|
+
*/
|
|
82
|
+
export declare function apply(ctx: Context, config: Config): void;
|
|
83
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAkCxC,kFAAkF;AAClF,MAAM,WAAW,MAAM;IACrB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kGAAkG;IAClG,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mGAAmG;IACnG,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,6CAA6C;IAC7C,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,sCAAsC;IACtC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAA;IACjC,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,6BAA6B;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB;IACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,uBAAuB;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iCAAiC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,yBAAyB;IACzB,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,yCAAyC;IACzC,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAkC3B,CAAA;AAEF,qDAAqD;AACrD,eAAO,MAAM,IAAI,WAAW,CAAA;AAE5B,mEAAmE;AACnE,eAAO,MAAM,MAAM,UAAmB,CAAA;AA4CtC;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAqLxD"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-kenari-plugin: Kenari (kenari.id) as a first-class citizen of dsh.
|
|
3
|
+
*
|
|
4
|
+
* Registers the Kenari-first web search/fetch provider pair into `ctx.web`,
|
|
5
|
+
* pinned by the bundle's patch layer (`searchProvider`/`fetchProvider` both
|
|
6
|
+
* `kenari-fallback`). Later phases add REST capability tools and settings.
|
|
7
|
+
* @module dsh-kenari-plugin
|
|
8
|
+
*/
|
|
9
|
+
import { Context } from '@deepseek-ai/cordis';
|
|
10
|
+
import z from '@deepseek-ai/schemastery';
|
|
11
|
+
import { launchEnvironmentOf } from '@deepseek-ai/dsh-launch-environment';
|
|
12
|
+
import { DeepSeekSearchProvider } from '@deepseek-ai/dsh-web-search-deepseek';
|
|
13
|
+
import { HttpFetchProvider, DEFAULT_USER_AGENT } from '@deepseek-ai/dsh-web-fetch-http';
|
|
14
|
+
import { credentialRef } from '@deepseek-ai/dsh-credentials';
|
|
15
|
+
import { KenariSearchProvider } from './web/search.js';
|
|
16
|
+
import { KenariFetchProvider } from './web/fetch.js';
|
|
17
|
+
import { KenariFirstSearch, KenariFirstFetch } from './web/fallback.js';
|
|
18
|
+
import { KenariCatalog } from './catalog.js';
|
|
19
|
+
import { KenariPlans } from './plans.js';
|
|
20
|
+
import { registerCatalogView } from './catalog-view.js';
|
|
21
|
+
import { registerFaviconRoute } from './favicon.js';
|
|
22
|
+
import { applyPlanDefaultRoute } from './default-route.js';
|
|
23
|
+
import { BalanceMonitor, BillingLedger } from './billing.js';
|
|
24
|
+
import { installKenariSettings, KENARI_SETTINGS_NAMESPACE } from './settings.js';
|
|
25
|
+
import { KenariLlmAdapter } from './llm/adapter.js';
|
|
26
|
+
import { ModelCandidates } from './llm/candidates.js';
|
|
27
|
+
import { installModelRecovery } from './llm/recovery.js';
|
|
28
|
+
import { kenariRetryPolicy } from './llm/retry.js';
|
|
29
|
+
import { installSessionTitlePrefix } from './session-title.js';
|
|
30
|
+
import { registerDocsTools } from './tools/docs.js';
|
|
31
|
+
import { registerAccountTools } from './tools/account.js';
|
|
32
|
+
import { registerXSearchTool } from './tools/x-search.js';
|
|
33
|
+
import { registerOcrTool } from './tools/documents.js';
|
|
34
|
+
import { registerMediaTools } from './tools/media.js';
|
|
35
|
+
import { registerDataTools } from './tools/data.js';
|
|
36
|
+
import { registerCountTokensTool } from './tools/count-tokens.js';
|
|
37
|
+
import { registerBillingTool } from './tools/billing.js';
|
|
38
|
+
export const Config = z.object({
|
|
39
|
+
apiKeyEnv: z.string().role('credential-ref').default('KENARI_API_KEY'),
|
|
40
|
+
baseURL: z.string().default('https://kenari.id'),
|
|
41
|
+
timeoutMs: z.number().step(1).min(1).default(30_000),
|
|
42
|
+
generationTimeoutMs: z.number().step(1).min(1).default(180_000),
|
|
43
|
+
maxRetries: z.number().step(1).min(0).default(2),
|
|
44
|
+
searchEnabled: z.boolean().default(true),
|
|
45
|
+
fetchEnabled: z.boolean().default(true),
|
|
46
|
+
fallbackEnabled: z.boolean().default(true),
|
|
47
|
+
docsCacheTtlMs: z.number().step(1).min(0).default(3_600_000),
|
|
48
|
+
catalogCacheTtlMs: z.number().step(1).min(0).default(3_600_000),
|
|
49
|
+
toolsEnabled: z.boolean().default(true),
|
|
50
|
+
modelAliases: z.dict(z.string()).default({}),
|
|
51
|
+
lowBalanceAlertRp: z.number().step(1).min(0).default(5_000),
|
|
52
|
+
balanceCacheTtlMs: z.number().step(1).min(0).default(300_000),
|
|
53
|
+
budgetCapRp: z.number().step(1).min(0).default(0),
|
|
54
|
+
nativeAdapterEnabled: z.boolean().default(false),
|
|
55
|
+
nativeProviderId: z.string().default('kenari-direct'),
|
|
56
|
+
modelRecoveryEnabled: z.boolean().default(true),
|
|
57
|
+
modelRecoveryProviders: z.array(z.string()).default(['kenari', 'kenari-direct']),
|
|
58
|
+
modelRetryMaxRetries: z.number().step(1).min(0).default(5),
|
|
59
|
+
modelRetryDelayMs: z.number().step(1).min(0).default(5_000),
|
|
60
|
+
modelRetryableCodes: z.array(z.string()).default([
|
|
61
|
+
'EMPTY_RESPONSE', 'RATE_LIMIT', 'SERVER', 'TIMEOUT', 'TRANSPORT',
|
|
62
|
+
]),
|
|
63
|
+
modelSwitchEnabled: z.boolean().default(true),
|
|
64
|
+
modelSwitchDelayMs: z.number().step(1).min(0).default(5_000),
|
|
65
|
+
modelSwitchSkipCodes: z.array(z.string()).default([
|
|
66
|
+
'AUTH', 'INVALID_CREDENTIAL', 'MISSING_CREDENTIAL', 'QUOTA',
|
|
67
|
+
]),
|
|
68
|
+
modelSwitchNoticeEnabled: z.boolean().default(true),
|
|
69
|
+
sessionTitlePrefixEnabled: z.boolean().default(true),
|
|
70
|
+
sessionTitlePrefix: z.string().default('yyyyMMddHHmmss-'),
|
|
71
|
+
sessionTitleMaxBytes: z.number().step(1).min(1).default(96),
|
|
72
|
+
});
|
|
73
|
+
/** Cordis plugin name used by loader diagnostics. */
|
|
74
|
+
export const name = 'kenari';
|
|
75
|
+
/** 需要 web seam 与工具注册表;settings 是可选 seam(缺失时退化为 composition 配置)。 */
|
|
76
|
+
export const inject = ['web', 'tools'];
|
|
77
|
+
/**
|
|
78
|
+
* key 读取照抄官方 provider 模式(dsh-source-verified.md §11):
|
|
79
|
+
* 优先 credentials seam,缺 seam 回退 launchEnvironment;每次现场解析(热轮换)。
|
|
80
|
+
* 引用名取自实时配置视图,所以设置页改 `apiKeyEnv` 后下一次操作就换引用。
|
|
81
|
+
*/
|
|
82
|
+
function resolveApiKeyOf(ctx, refOf) {
|
|
83
|
+
return async () => {
|
|
84
|
+
const ref = refOf();
|
|
85
|
+
const credentials = ctx.get('credentials');
|
|
86
|
+
if (credentials !== undefined)
|
|
87
|
+
return (await credentials.resolve(ref))?.value;
|
|
88
|
+
// 无 seam 时回退到启动环境快照
|
|
89
|
+
const ambient = launchEnvironmentOf(ctx).get(ref);
|
|
90
|
+
return ambient !== undefined && ambient.value.length > 0 ? ambient.value : undefined;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function defaultSelectionOf(ctx) {
|
|
94
|
+
const service = ctx.get('agentDefaultModel');
|
|
95
|
+
if (service === undefined || typeof service.currentSelection !== 'function')
|
|
96
|
+
return () => undefined;
|
|
97
|
+
return () => {
|
|
98
|
+
const selection = service.currentSelection();
|
|
99
|
+
if (typeof selection?.provider !== 'string' || typeof selection?.model !== 'string')
|
|
100
|
+
return undefined;
|
|
101
|
+
return {
|
|
102
|
+
provider: selection.provider,
|
|
103
|
+
model: selection.model,
|
|
104
|
+
...(typeof selection.reasoningEffort === 'string' ? { reasoningEffort: selection.reasoningEffort } : {}),
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Register the Kenari capability into the harness.
|
|
110
|
+
* 第 1 期 web fallback;第 2 期 REST 工具;第 3 期目录 / 计费账本 / 窗口监控;
|
|
111
|
+
* 第 4 期设置节(Host 半边)。
|
|
112
|
+
*/
|
|
113
|
+
export function apply(ctx, config) {
|
|
114
|
+
// 设置节:用户层提交后 current() 立即返回新值,插件各处读实时视图
|
|
115
|
+
const live = installKenariSettings(ctx, Config, config);
|
|
116
|
+
const liveConfig = live.view;
|
|
117
|
+
const refOf = () => credentialRef(liveConfig.apiKeyEnv ?? 'KENARI_API_KEY');
|
|
118
|
+
const logger = ctx.logger;
|
|
119
|
+
const deps = {
|
|
120
|
+
config: liveConfig,
|
|
121
|
+
resolveApiKey: resolveApiKeyOf(ctx, refOf),
|
|
122
|
+
logger,
|
|
123
|
+
};
|
|
124
|
+
// 目录与账本是跨工具共享的进程级单例:目录带 TTL 缓存,账本按会话作用域累计。
|
|
125
|
+
// 先于 provider 建立,web 搜索/抓取的按次扣费也记进同一本账(global 作用域)。
|
|
126
|
+
const catalog = new KenariCatalog(deps);
|
|
127
|
+
const plans = new KenariPlans(deps);
|
|
128
|
+
const budgetCapRp = config.budgetCapRp ?? 0;
|
|
129
|
+
const billing = new BillingLedger(budgetCapRp > 0 ? budgetCapRp * 1_000_000 : undefined);
|
|
130
|
+
const balance = new BalanceMonitor(deps);
|
|
131
|
+
const recordWebSpend = (microIdr, kind) => {
|
|
132
|
+
// web 工具没有会话归属,落 global 作用域;金额来自响应回显,非预估
|
|
133
|
+
billing.recordSpend('global', { tool: `web_${kind}`, microIdr, estimated: false });
|
|
134
|
+
};
|
|
135
|
+
if (config.searchEnabled ?? true) {
|
|
136
|
+
const kenariSearch = new KenariSearchProvider(deps, recordWebSpend);
|
|
137
|
+
if (config.fallbackEnabled ?? true) {
|
|
138
|
+
// 兜底实例:传 resolveApiKey thunk(每次现场解析),否则 available() 判不可用。
|
|
139
|
+
// 绝不能注册进 seam(id `deepseek-official` 冲突 → WEB_DUPLICATE_PROVIDER)。
|
|
140
|
+
const officialSearch = new DeepSeekSearchProvider(() => ({
|
|
141
|
+
resolveApiKey: async () => {
|
|
142
|
+
const credentials = ctx.get('credentials');
|
|
143
|
+
if (credentials !== undefined)
|
|
144
|
+
return (await credentials.resolve(credentialRef('DEEPSEEK_API_KEY')))?.value;
|
|
145
|
+
const ambient = launchEnvironmentOf(ctx).get('DEEPSEEK_API_KEY');
|
|
146
|
+
return ambient !== undefined && ambient.value.length > 0 ? ambient.value : undefined;
|
|
147
|
+
},
|
|
148
|
+
baseURL: 'https://api.deepseek.com/anthropic/v1',
|
|
149
|
+
model: 'deepseek-v4-flash',
|
|
150
|
+
apiVersion: '2023-06-01',
|
|
151
|
+
maxTokens: 4096,
|
|
152
|
+
maxUses: 5,
|
|
153
|
+
}));
|
|
154
|
+
ctx.web.registerSearchProvider(new KenariFirstSearch(kenariSearch, officialSearch, logger));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
ctx.web.registerSearchProvider(kenariSearch);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (config.fetchEnabled ?? true) {
|
|
161
|
+
const kenariFetch = new KenariFetchProvider(deps, recordWebSpend);
|
|
162
|
+
if (config.fallbackEnabled ?? true) {
|
|
163
|
+
// 第二参 resolveAddresses 有默认值,只传 limits(5 字段,0.1.5-rc.1)。
|
|
164
|
+
// 同样绝不注册(id `http` 冲突)。
|
|
165
|
+
const localFetch = new HttpFetchProvider({
|
|
166
|
+
maxResponseBytes: 5_000_000,
|
|
167
|
+
maxBodyChars: 100_000,
|
|
168
|
+
timeoutMs: 30_000,
|
|
169
|
+
maxRedirects: 5,
|
|
170
|
+
userAgent: DEFAULT_USER_AGENT,
|
|
171
|
+
});
|
|
172
|
+
ctx.web.registerFetchProvider(new KenariFirstFetch(kenariFetch, localFetch, logger));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
ctx.web.registerFetchProvider(kenariFetch);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// REST 工具族:defineTool + ctx.tools.register(disposer 挂 fiber,卸载自动回收)
|
|
179
|
+
if (config.toolsEnabled ?? true) {
|
|
180
|
+
const toolsDeps = {
|
|
181
|
+
http: deps,
|
|
182
|
+
ctx,
|
|
183
|
+
config: liveConfig,
|
|
184
|
+
catalog,
|
|
185
|
+
billing,
|
|
186
|
+
balance,
|
|
187
|
+
};
|
|
188
|
+
const register = (tool) => {
|
|
189
|
+
ctx.tools.register(tool);
|
|
190
|
+
};
|
|
191
|
+
registerDocsTools(toolsDeps, register);
|
|
192
|
+
registerAccountTools(toolsDeps, register);
|
|
193
|
+
registerXSearchTool(toolsDeps, register);
|
|
194
|
+
registerOcrTool(toolsDeps, register);
|
|
195
|
+
registerMediaTools(toolsDeps, register);
|
|
196
|
+
registerDataTools(toolsDeps, register);
|
|
197
|
+
registerCountTokensTool(toolsDeps, register);
|
|
198
|
+
registerBillingTool(toolsDeps, register);
|
|
199
|
+
logger?.info('kenari: web providers, REST tools, catalog and billing ledger registered');
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
logger?.info('kenari: web providers registered (tools disabled by config)');
|
|
203
|
+
}
|
|
204
|
+
// 浏览器侧「可选模型」面板的数据端点(能力标签 + 套餐归属)。
|
|
205
|
+
// 只在挂载了 connection 的 web profile 生效;数据与目录/套餐缓存同源,
|
|
206
|
+
// 所以设置页看到的标签与 kenari_list_models 说的是同一件事。
|
|
207
|
+
registerCatalogView(ctx, { http: deps, catalog, plans });
|
|
208
|
+
// 设置导航栏的 Kenari 图标(`/api/kenari.favicon`)。图标由浏览器半边贴进
|
|
209
|
+
// dsh 画的导航行,这里只负责把 `assets/` 里的 PNG 递出去。
|
|
210
|
+
registerFaviconRoute(ctx);
|
|
211
|
+
// 默认路由:按当前 key 的套餐把「免缓存额度」模型填进 `kenari` 路由。
|
|
212
|
+
// 预设是静态 YAML,算不出套餐相关的东西,所以要在设置节挂上之后补一次
|
|
213
|
+
// (用户层已经自己写过 models 时一律不动,详见 src/default-route.ts)。
|
|
214
|
+
ctx.inject(['settings'], (settingsCtx) => {
|
|
215
|
+
void applyPlanDefaultRoute(settingsCtx, { http: deps, catalog, plans });
|
|
216
|
+
});
|
|
217
|
+
// 第 5 期(可选):自带 LlmAdapter。默认关闭,且路由名与 llm-pi-ai 预设不同,
|
|
218
|
+
// 所以两条路可以并存、可以回退;开启后模型的 usage 与费用也进同一本账。
|
|
219
|
+
if (config.nativeAdapterEnabled === true) {
|
|
220
|
+
const providerId = config.nativeProviderId ?? 'kenari-direct';
|
|
221
|
+
const adapter = new KenariLlmAdapter({
|
|
222
|
+
http: deps,
|
|
223
|
+
catalog,
|
|
224
|
+
billing,
|
|
225
|
+
logger,
|
|
226
|
+
retryPolicy: kenariRetryPolicy({
|
|
227
|
+
maxRetries: liveConfig.modelRetryMaxRetries ?? 5,
|
|
228
|
+
delayMs: liveConfig.modelRetryDelayMs ?? 5_000,
|
|
229
|
+
retryableCodes: liveConfig.modelRetryableCodes,
|
|
230
|
+
}),
|
|
231
|
+
}, (imageRef) => {
|
|
232
|
+
const attachments = ctx.get('attachments');
|
|
233
|
+
if (attachments === undefined)
|
|
234
|
+
return Promise.reject(new Error('本部署没有 attachment 存储,无法回传图像'));
|
|
235
|
+
return attachments.readImage(imageRef);
|
|
236
|
+
});
|
|
237
|
+
// llm 是可选 seam:没挂载时不注册,插件其余能力照常工作
|
|
238
|
+
ctx.inject(['llm'], (llmCtx) => {
|
|
239
|
+
llmCtx.llm.registerAdapter([providerId], adapter);
|
|
240
|
+
// 设置卡片与 Models 页的「拉取模型」走这里(本插件命名空间下的发现)
|
|
241
|
+
llmCtx.llm.registerModelDiscovery(KENARI_SETTINGS_NAMESPACE, async () => (await catalog.chatModels()).map((model) => ({
|
|
242
|
+
id: model.id,
|
|
243
|
+
...(model.name === undefined ? {} : { name: model.name }),
|
|
244
|
+
...(typeof model.context_length === 'number' ? { contextWindow: model.context_length } : {}),
|
|
245
|
+
})));
|
|
246
|
+
logger?.info(`kenari: native LlmAdapter registered for route "${providerId}"`);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
// 模型失败恢复:重试用尽后换模型、再回退默认 provider。
|
|
250
|
+
// llm 是可选 seam,缺它整块不装 —— 与自带适配器同一模式,插件其余能力不受影响。
|
|
251
|
+
ctx.inject(['llm'], (llmCtx) => {
|
|
252
|
+
const llm = llmCtx.llm;
|
|
253
|
+
const candidates = new ModelCandidates({
|
|
254
|
+
// 显式转发而不是直接传 llmCtx.llm:LlmRuntime 的方法依赖 this,
|
|
255
|
+
// 脱开接收者调用会在内部 this.registration(...) 处炸掉
|
|
256
|
+
llm: {
|
|
257
|
+
listProviders: () => llm.listProviders(),
|
|
258
|
+
listModels: (provider) => llm.listModels(provider),
|
|
259
|
+
resolveModelInfo: (provider, model, signal) => llm.resolveModelInfo(provider, model, signal),
|
|
260
|
+
},
|
|
261
|
+
cacheTtlMs: liveConfig.catalogCacheTtlMs ?? 3_600_000,
|
|
262
|
+
});
|
|
263
|
+
installModelRecovery(llmCtx, {
|
|
264
|
+
enabled: liveConfig.modelRecoveryEnabled ?? true,
|
|
265
|
+
providers: liveConfig.modelRecoveryProviders ?? ['kenari', 'kenari-direct'],
|
|
266
|
+
switchEnabled: liveConfig.modelSwitchEnabled ?? true,
|
|
267
|
+
switchDelayMs: liveConfig.modelSwitchDelayMs ?? 5_000,
|
|
268
|
+
skipCodes: liveConfig.modelSwitchSkipCodes ?? [],
|
|
269
|
+
noticeEnabled: liveConfig.modelSwitchNoticeEnabled ?? true,
|
|
270
|
+
candidates,
|
|
271
|
+
defaultSelection: defaultSelectionOf(ctx),
|
|
272
|
+
...(logger === undefined ? {} : { logger }),
|
|
273
|
+
});
|
|
274
|
+
logger?.info('kenari: model failure recovery installed (retry → model switch → default provider)');
|
|
275
|
+
});
|
|
276
|
+
// 会话标题前缀:在服务端 `session/title` 事件上剥旧前缀、按会话创建时间重算。
|
|
277
|
+
// 不注册 provider、不改 dsh 行;也不需要额外注入 —— 未打 scope 标签的插件 ctx
|
|
278
|
+
// 收得到所有会话事件(dsh-scope 的 carrier 对 untagged listener 放行)。
|
|
279
|
+
installSessionTitlePrefix(ctx, {
|
|
280
|
+
enabled: () => liveConfig.sessionTitlePrefixEnabled ?? true,
|
|
281
|
+
template: () => liveConfig.sessionTitlePrefix ?? 'yyyyMMddHHmmss-',
|
|
282
|
+
maxBytes: () => liveConfig.sessionTitleMaxBytes ?? 96,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kenari 原生 LlmAdapter(第 5 期,**可选**,默认关闭)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么有它:`llm-pi-ai` 预设(第 3 期)已经能把 Kenari 当会话模型用,但它按通用
|
|
5
|
+
* OpenAI 兼容语义处理线上字段,丢掉了几样 Kenari 特有的东西:
|
|
6
|
+
*
|
|
7
|
+
* 1. **真实价格进模型选择器**:目录里的 `pricing` 换算成 IDR/1M 写进 `description`
|
|
8
|
+
* 2. **token 与费用进账本**:pi-ai 的 usage 到不了本插件,`kenari_billing` 的
|
|
9
|
+
* `cached_tokens` 命中率因此一直没有数据;本适配器逐次把 usage 记进同一本账
|
|
10
|
+
* 3. **推理档位按目录原样暴露**:`reasoning_options` 的值就是线上 `reasoning_effort`
|
|
11
|
+
* 的写法(含 `none`),不再需要 off/none 的键位翻译
|
|
12
|
+
* 4. **reasoning 通道**:`reasoning_content` → `reasoning-delta`,与可见文本分开
|
|
13
|
+
*
|
|
14
|
+
* 不做的事:不回放思考块、不注入 `file-parser`(文件块投影成说明文本,读文档请用
|
|
15
|
+
* `kenari_ocr` 工具)。这些在 README 里写明。
|
|
16
|
+
*
|
|
17
|
+
* 与预设路由**不同名**(默认 `kenari-direct`),所以两者可以并存、可以回退。
|
|
18
|
+
* @module dsh-kenari-plugin/llm/adapter
|
|
19
|
+
*/
|
|
20
|
+
import { LlmAdapter } from '@deepseek-ai/dsh-llm';
|
|
21
|
+
import type { GenerateOptions, LlmModelInfo, LlmProviderInfo, LlmResolvedModelInfo, ResolvedRetryPolicy, StreamChunk, TokenUsage } from '@deepseek-ai/dsh-llm';
|
|
22
|
+
import type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment';
|
|
23
|
+
import type { KenariHttpDeps } from '../http.js';
|
|
24
|
+
import type { KenariCatalog } from '../catalog.js';
|
|
25
|
+
import type { BillingLedger } from '../billing.js';
|
|
26
|
+
/** 适配器依赖:传输层(含实时配置与 key 解析)、目录、账本。 */
|
|
27
|
+
export interface KenariAdapterDeps {
|
|
28
|
+
readonly http: KenariHttpDeps;
|
|
29
|
+
readonly catalog: KenariCatalog;
|
|
30
|
+
readonly billing: BillingLedger;
|
|
31
|
+
/** Kenari 路由的重试策略;省略则用 dsh 默认(指数退避 5 次)。 */
|
|
32
|
+
readonly retryPolicy?: ResolvedRetryPolicy;
|
|
33
|
+
readonly logger?: {
|
|
34
|
+
warn(msg: string): void;
|
|
35
|
+
info(msg: string): void;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** attachment 读取的最小形状(只用到 readImage)。 */
|
|
39
|
+
type ReadImage = (ref: ImageAttachmentRef) => Promise<{
|
|
40
|
+
ref: ImageAttachmentRef;
|
|
41
|
+
data: Uint8Array;
|
|
42
|
+
}>;
|
|
43
|
+
/** [OI] usage → dsh TokenUsage(dsh 要求各项**互斥**:inputTokens 是不含缓存的那部分)。 */
|
|
44
|
+
export declare function mapUsage(usage: {
|
|
45
|
+
prompt_tokens?: number;
|
|
46
|
+
completion_tokens?: number;
|
|
47
|
+
total_tokens?: number;
|
|
48
|
+
prompt_tokens_details?: {
|
|
49
|
+
cached_tokens?: number;
|
|
50
|
+
};
|
|
51
|
+
}): TokenUsage;
|
|
52
|
+
/** Kenari [OI] 线的原生适配器。 */
|
|
53
|
+
export declare class KenariLlmAdapter extends LlmAdapter {
|
|
54
|
+
private readonly deps;
|
|
55
|
+
/** 目录里读图像字节的入口(`ctx.attachments.readImage`);缺失则图像降级为文本。 */
|
|
56
|
+
private readonly readImage?;
|
|
57
|
+
constructor(deps: KenariAdapterDeps,
|
|
58
|
+
/** 目录里读图像字节的入口(`ctx.attachments.readImage`);缺失则图像降级为文本。 */
|
|
59
|
+
readImage?: ReadImage | undefined);
|
|
60
|
+
providerInfo(provider: string): LlmProviderInfo;
|
|
61
|
+
/**
|
|
62
|
+
* 把插件配置拼出的重试策略交给 dsh 的重试机制。基类默认返回 undefined,
|
|
63
|
+
* 也就是走 dsh 默认策略(指数退避 500ms→10s、5 次)。
|
|
64
|
+
* 注意 dsh 只在 `registerAdapter()` 时读取一次并冻结,所以改配置要重启才生效。
|
|
65
|
+
*/
|
|
66
|
+
providerRetryPolicy(_provider: string): ResolvedRetryPolicy | undefined;
|
|
67
|
+
/** 目录即模型列表:价格与上下文随目录刷新,不再静态写死在配置里。 */
|
|
68
|
+
listModels(provider: string): Promise<readonly LlmModelInfo[]>;
|
|
69
|
+
/** 逐模型元数据:上下文窗口、推理档位、输出上限都来自目录。 */
|
|
70
|
+
resolveModel(provider: string, model: string): Promise<LlmResolvedModelInfo>;
|
|
71
|
+
stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
|
|
72
|
+
private run;
|
|
73
|
+
/** usage 记进共享账本:命中率直接来自 `cached_tokens`,费用按目录单价预估。 */
|
|
74
|
+
private recordUsage;
|
|
75
|
+
private recordSpendEstimate;
|
|
76
|
+
}
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/llm/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAA8D,MAAM,sBAAsB,CAAA;AAC7G,OAAO,KAAK,EAGV,eAAe,EACf,YAAY,EACZ,eAAe,EACf,oBAAoB,EAEpB,mBAAmB,EACnB,WAAW,EACX,UAAU,EAEX,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,eAAe,CAAA;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAIlD,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,4CAA4C;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CACvE;AA+DD,yCAAyC;AACzC,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC;IAAE,GAAG,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAA;AA6DpG,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACnD,GAAG,UAAU,CAUb;AA0BD,2BAA2B;AAC3B,qBAAa,gBAAiB,SAAQ,UAAU;IAE5C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAFV,IAAI,EAAE,iBAAiB;IACxC,2DAA2D;IAC1C,SAAS,CAAC,EAAE,SAAS,YAAA;IAK/B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAIxD;;;;OAIG;IACM,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAIhF,sCAAsC;IACvB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAW7E,mCAAmC;IACpB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOlF,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;YAItD,GAAG;IAwKlB,sDAAsD;IACtD,OAAO,CAAC,WAAW;YAaL,mBAAmB;CAsBlC"}
|