@dsh-enhanced/assistant-super-relay-budget 0.1.34
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.md +66 -0
- package/cordis.patch.yml +3 -0
- package/lib/adapter.d.ts +43 -0
- package/lib/adapter.d.ts.map +1 -0
- package/lib/adapter.js +398 -0
- package/lib/adapter.js.map +1 -0
- package/lib/config.d.ts +12 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +29 -0
- package/lib/config.js.map +1 -0
- package/lib/contract.d.ts +28 -0
- package/lib/contract.d.ts.map +1 -0
- package/lib/contract.js +35 -0
- package/lib/contract.js.map +1 -0
- package/lib/index.d.ts +21 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +48 -0
- package/lib/index.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +2 -0
- package/lib/version.js.map +1 -0
- package/package.json +82 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dsh-enhanced contributors
|
|
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/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# @dsh-enhanced/assistant-super-relay-budget
|
|
2
|
+
|
|
3
|
+
为 `assistant-goals` 提供固定的 Super Relay OpenAI Responses 路由,以及同生命周期的保守 token 预算计量。它只注册 `super-relay` provider,并且只接受单一模型 `auto_model/alwaysday1`;不能改 endpoint、模型别名或 context window。
|
|
4
|
+
|
|
5
|
+
普通界面调用会等待一次完整、受字节限制的 JSON Responses 调用,随后才向 DSH 发出 blocks;它不是流式 UI。目标预算使用固定 `200,000` 输入 token 上界——这是在网关未公开官方 context window 时采用的保守值,而非从其文档抄得的硬容量。网关没有公开定价,因此 USD 费率刻意为 `null`,绝不估算或伪造 cost。
|
|
6
|
+
|
|
7
|
+
## 安装与配置
|
|
8
|
+
|
|
9
|
+
先安装并配置 `assistant-goals` 的有限 `executionBudget`。本插件仅在 `enabled: true` 时启用;此时若 Goals 预算能力不存在,整个路由不会注册。
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
- id: dsh-enhanced-assistant-super-relay-budget
|
|
13
|
+
name: '@dsh-enhanced/assistant-super-relay-budget'
|
|
14
|
+
config:
|
|
15
|
+
enabled: true
|
|
16
|
+
apiKeyEnv: SUPER_RELAY_API_KEY
|
|
17
|
+
timeoutMs: 60000
|
|
18
|
+
maxResponseBytes: 4194304
|
|
19
|
+
defaultMaxTokens: 8192
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
字段约束:
|
|
23
|
+
|
|
24
|
+
- `enabled`(默认 `false`):关闭时不注册 adapter,也不注册任何 meter。
|
|
25
|
+
- `apiKeyEnv`(默认 `SUPER_RELAY_API_KEY`):DSH credential reference 的**环境变量引用名**,必须匹配 `^[A-Z_][A-Z0-9_]*$`。它不是 API key,配置绝不接受明文 key。
|
|
26
|
+
- `timeoutMs`(默认 `60000`,范围 `1000`–`300000`):单次上游调用的硬竞速上限。
|
|
27
|
+
- `maxResponseBytes`(默认 `4194304`,即 4 MiB):响应体字节上限。
|
|
28
|
+
- `defaultMaxTokens`(默认 `8192`,上限 `32768`):wire `max_output_tokens` 的缺省值;实际取值始终来自受限的 DSH request。
|
|
29
|
+
|
|
30
|
+
配置 Proxy 拒绝非对象入参和任何未知字段,`normalizeConfig()` 返回冻结对象。
|
|
31
|
+
|
|
32
|
+
## 凭证
|
|
33
|
+
|
|
34
|
+
每次请求优先通过 `ctx.credentials.resolve()` 读取 `apiKeyEnv` 指向的引用;仅在当前 adapter 尚未观察到 credentials 服务且该服务不存在时,才读取同名进程环境变量。一旦观察过该服务,服务移除、拒绝或解析失败都会拒绝请求(`MISSING_CREDENTIAL`),不回退环境变量。请求头携带 `Authorization: Bearer <key>`;key 只在内存中短暂使用,不会被记录或回显。
|
|
35
|
+
|
|
36
|
+
## 协议契约与限制
|
|
37
|
+
|
|
38
|
+
固定使用 `POST https://super-relay.byted.org/v1/responses`(OpenAI **Responses** 协议,不是 Chat Completions)、`stream: false`、`redirect: 'error'`、`credentials: 'omit'`,没有自动重试、图片/文件 API、全局 fetch patch 或额外 wire 字段。
|
|
39
|
+
|
|
40
|
+
- system prompt 必须走顶层 `instructions` 字段;直接传 `system` role 消息会被拒绝。
|
|
41
|
+
- 工具以 Responses `tools` 发送;响应中的 `function_call` item 映射为 DSH `tool-call` block,finish 置为 `tool-calls`。
|
|
42
|
+
- 校验响应 `status`、`output` 数组与 `usage`(要求 `total_tokens === input_tokens + output_tokens`);未知 status、非数组 output、usage 不一致均 fail closed。空完成抛 `EMPTY_RESPONSE_CODE`。
|
|
43
|
+
- `incomplete` 状态仅接受 `reason === 'max_output_tokens'`,其余拒绝。
|
|
44
|
+
|
|
45
|
+
### 硬竞速取消
|
|
46
|
+
|
|
47
|
+
请求取消、超时和插件卸载不能依赖被取消的 fetch/stream 自己结束——非配合的网关可能忽略 abort 信号而让调用方永久挂起。adapter 因此对每个不可信异步边界使用独立的 `bounded()` 硬竞速:即使上游忽略 `AbortSignal`,调用方也会在 `timeoutMs` 确定地 reject。这与 assistant-policy 中修复 approval waterfall 冻结所用的同一类保证。
|
|
48
|
+
|
|
49
|
+
### 短期 primary-source contract
|
|
50
|
+
|
|
51
|
+
协议契约 id 为 `super-relay-responses-2026-09-14`,`checkedAt = 2026-09-14`,`expiresAt = 2026-10-14`。契约基于对真实 endpoint 的非合成探测建立。过期后每个新 request 与每次目标预算计量都会 fail-closed 拒绝,直到维护者用新的 primary-source 证据复核并更新 `src/contract.ts`。
|
|
52
|
+
|
|
53
|
+
## 卸载与生命周期
|
|
54
|
+
|
|
55
|
+
`apply()` 先为每个 model 注册一个 goal budget meter,再注册 provider adapter;任一注册失败都会逆序回滚已注册项并 shutdown adapter。`ctx.effect()` 注册的清理逻辑在卸载时逆序撤销 adapter、释放所有 meter 并 shutdown;shutdown 后 adapter 翻转为非活动态,后续 stream 直接拒绝。
|
|
56
|
+
|
|
57
|
+
## 测试与证据边界
|
|
58
|
+
|
|
59
|
+
包内 `tests/index.spec.ts` 是**工程层测试**:通过 adapter deps 注入假 `fetch`、伪造 cordis 服务面运行,不发起任何真实网络请求、不使用真实密钥。它们 pin 住配置校验、Responses 请求/响应映射、usage 校验、凭证解析、contract 过期门、meter 路由/maxTokens 校验、硬超时与卸载语义,但**不构成真实 Super Relay 外部系统行为的证据**。真实协议结论以 `src/contract.ts` 的短期 primary-source contract 为准;真实配对评测须在 assistant-evaluation 中以真实 `SUPER_RELAY_API_KEY` 单独执行,其费率/cost 字段如实给 `null`。
|
|
60
|
+
|
|
61
|
+
## 权限与数据
|
|
62
|
+
|
|
63
|
+
- 网络:仅向固定 Super Relay HTTPS endpoint 发出 Responses 请求,禁止重定向、不携带 cookie。
|
|
64
|
+
- 凭据:每次调用短暂读取 credential reference 或环境变量;不会记录 key 或原始响应。
|
|
65
|
+
- 文件系统、子进程、浏览器、安装脚本:无。
|
|
66
|
+
- 普通前台调用同样使用该 adapter;Goals 预算只对处于已绑定目标执行的 Agent 生效,部署者仍须为前台使用配置 DSH 自身的权限与成本控制。
|
package/cordis.patch.yml
ADDED
package/lib/adapter.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { credentialRef } from '@deepseek-ai/dsh-credentials';
|
|
2
|
+
import { LlmAdapter } from '@deepseek-ai/dsh-llm';
|
|
3
|
+
import type { GenerateOptions, LlmModelInfo, LlmResolvedModelInfo, StreamChunk } from '@deepseek-ai/dsh-llm';
|
|
4
|
+
import { type SuperRelayGoalMeteredConfig } from './config.js';
|
|
5
|
+
export interface SuperRelayFetch {
|
|
6
|
+
(url: string, init: RequestInit): Promise<Response>;
|
|
7
|
+
}
|
|
8
|
+
export interface SuperRelayCredentialResolver {
|
|
9
|
+
resolve(ref: ReturnType<typeof credentialRef>): Promise<{
|
|
10
|
+
value: string;
|
|
11
|
+
} | undefined>;
|
|
12
|
+
}
|
|
13
|
+
export interface SuperRelayAdapterDependencies {
|
|
14
|
+
/** Test seam only; production uses the process fetch without patching it. */
|
|
15
|
+
fetch?: SuperRelayFetch;
|
|
16
|
+
now?: () => number;
|
|
17
|
+
environment?: Readonly<Record<string, string | undefined>>;
|
|
18
|
+
/** Look up the current service per request; do not retain replaced credentials. */
|
|
19
|
+
credentialResolver?: () => SuperRelayCredentialResolver | undefined;
|
|
20
|
+
}
|
|
21
|
+
/** Fixed Super Relay Responses adapter. It buffers one bounded JSON response before emitting any block. */
|
|
22
|
+
export declare class SuperRelayGoalMeteredAdapter extends LlmAdapter {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(input: SuperRelayGoalMeteredConfig, dependencies?: SuperRelayAdapterDependencies);
|
|
25
|
+
readonly config: Readonly<Required<SuperRelayGoalMeteredConfig>>;
|
|
26
|
+
shutdown(): void;
|
|
27
|
+
providerInfo(provider: string): {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
};
|
|
31
|
+
providerRetryPolicy(_provider: string): {
|
|
32
|
+
mode: "normal";
|
|
33
|
+
maxRetries: number;
|
|
34
|
+
retryableCodes: never[];
|
|
35
|
+
initialDelayMs: number;
|
|
36
|
+
maxDelayMs: number;
|
|
37
|
+
jitterRatio: number;
|
|
38
|
+
};
|
|
39
|
+
listModels(provider: string): Promise<readonly LlmModelInfo[]>;
|
|
40
|
+
resolveModel(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
|
|
41
|
+
stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAuB,UAAU,EAAwB,MAAM,sBAAsB,CAAA;AAC5F,OAAO,KAAK,EAAgB,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAW,WAAW,EAAc,MAAM,sBAAsB,CAAA;AAC/I,OAAO,EAAmB,KAAK,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAgB/E,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACpD;AACD,MAAM,WAAW,4BAA4B;IAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;CAAE;AACxI,MAAM,WAAW,6BAA6B;IAC5C,6EAA6E;IAC7E,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC1D,mFAAmF;IACnF,kBAAkB,CAAC,EAAE,MAAM,4BAA4B,GAAG,SAAS,CAAA;CACpE;AAqKD,2GAA2G;AAC3G,qBAAa,4BAA6B,SAAQ,UAAU;;gBAQ9C,KAAK,EAAE,2BAA2B,EAAE,YAAY,GAAE,6BAAkC;IAGhG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAA;IAChE,QAAQ,IAAI,IAAI;IACP,YAAY,CAAC,QAAQ,EAAE,MAAM;;;;IAC7B,mBAAmB,CAAC,SAAS,EAAE,MAAM;;;;;;;;IAC/B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAC9D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAMjG,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;CAyD7E"}
|
package/lib/adapter.js
ADDED
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
2
|
+
import { credentialRef } from '@deepseek-ai/dsh-credentials';
|
|
3
|
+
import { EMPTY_RESPONSE_CODE, LlmAdapter, LlmError, ToolCallId } from '@deepseek-ai/dsh-llm';
|
|
4
|
+
import { normalizeConfig } from './config.js';
|
|
5
|
+
import { assertCurrentContract, isSuperRelayModel, SUPER_RELAY_MODELS, SUPER_RELAY_PROVIDER } from './contract.js';
|
|
6
|
+
const ENDPOINT = 'https://super-relay.byted.org/v1/responses';
|
|
7
|
+
const MAX_TEXT_BYTES = 8 * 1024 * 1024;
|
|
8
|
+
const MAX_REQUEST_BYTES = 8 * 1024 * 1024;
|
|
9
|
+
const integer = (value, maximum = 2_097_152) => Number.isSafeInteger(value) && typeof value === 'number' && value >= 0 && value <= maximum;
|
|
10
|
+
const object = (value, label) => {
|
|
11
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
12
|
+
throw new Error(`assistant-super-relay-budget: invalid ${label}`);
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
15
|
+
const text = (value, label, allowEmpty = true) => {
|
|
16
|
+
if (typeof value !== 'string' || (!allowEmpty && value.length === 0) || Buffer.byteLength(value, 'utf8') > MAX_TEXT_BYTES)
|
|
17
|
+
throw new Error(`assistant-super-relay-budget: invalid ${label}`);
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
function fail(message, code = 'SUPER_RELAY_PROTOCOL') { throw new LlmError(`Super Relay response rejected: ${message}`, code); }
|
|
21
|
+
function requestError(code) { throw new LlmError('Super Relay request failed', code); }
|
|
22
|
+
/** Race every untrusted async boundary so cancellation does not depend on a service or stream cooperating. */
|
|
23
|
+
function bounded(operation, signal) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const abort = () => { signal.removeEventListener('abort', abort); reject(new LlmError('Super Relay request failed', 'SUPER_RELAY_ABORTED')); };
|
|
26
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
27
|
+
if (signal.aborted)
|
|
28
|
+
abort();
|
|
29
|
+
void operation.then(value => { signal.removeEventListener('abort', abort); resolve(value); }, error => { signal.removeEventListener('abort', abort); reject(error); });
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function textOnly(blocks, role) {
|
|
33
|
+
let value = '';
|
|
34
|
+
for (const block of blocks) {
|
|
35
|
+
if (block.type !== 'text')
|
|
36
|
+
throw new Error(`assistant-super-relay-budget: ${role} content must be text-only`);
|
|
37
|
+
value += block.text;
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Project one DSH Message to OpenAI Responses `input` items. System text is
|
|
43
|
+
* carried by the top-level `instructions` field, so a system-role Message here
|
|
44
|
+
* is rejected rather than silently moved.
|
|
45
|
+
*/
|
|
46
|
+
function projectMessage(message) {
|
|
47
|
+
if (message.role === 'system')
|
|
48
|
+
throw new Error('assistant-super-relay-budget: system prompt must be supplied as instructions');
|
|
49
|
+
if (message.role === 'user') {
|
|
50
|
+
if (message.source.kind === 'tool') {
|
|
51
|
+
if (message.content.length !== 1 || message.content[0]?.type !== 'tool-result' || message.content[0].toolCallId !== message.source.callId) {
|
|
52
|
+
throw new Error('assistant-super-relay-budget: invalid tool result message');
|
|
53
|
+
}
|
|
54
|
+
return [{ type: 'function_call_output', call_id: message.source.callId, output: textOnly(message.content[0].content, 'tool result') }];
|
|
55
|
+
}
|
|
56
|
+
return [{ role: 'user', content: [{ type: 'input_text', text: textOnly(message.content, 'user') }] }];
|
|
57
|
+
}
|
|
58
|
+
// Assistant turn: visible text becomes one message item; each replayed tool
|
|
59
|
+
// call becomes its own function_call item. Reasoning blocks are not replayed:
|
|
60
|
+
// the gateway owns reasoning and the input contract was verified without it.
|
|
61
|
+
const items = [];
|
|
62
|
+
let visible = '';
|
|
63
|
+
for (const block of message.content) {
|
|
64
|
+
if (block.type === 'text')
|
|
65
|
+
visible += block.text;
|
|
66
|
+
else if (block.type === 'reasoning')
|
|
67
|
+
continue;
|
|
68
|
+
else if (block.type === 'tool-call') {
|
|
69
|
+
if (!/^[\x20-\x7e]{1,256}$/u.test(block.id) || !/^[A-Za-z0-9_-]{1,64}$/u.test(block.name))
|
|
70
|
+
throw new Error('assistant-super-relay-budget: invalid replayed tool call');
|
|
71
|
+
JSON.parse(block.arguments);
|
|
72
|
+
items.push({ type: 'function_call', call_id: String(block.id), name: block.name, arguments: block.arguments });
|
|
73
|
+
}
|
|
74
|
+
else
|
|
75
|
+
throw new Error('assistant-super-relay-budget: unsupported assistant content');
|
|
76
|
+
}
|
|
77
|
+
if (visible !== '')
|
|
78
|
+
items.unshift({ type: 'message', role: 'assistant', content: [{ type: 'output_text', text: visible }] });
|
|
79
|
+
return items;
|
|
80
|
+
}
|
|
81
|
+
function project(options, maxTokens) {
|
|
82
|
+
if (options.system !== undefined)
|
|
83
|
+
text(options.system, 'instructions');
|
|
84
|
+
if (options.temperature !== undefined && (!Number.isFinite(options.temperature) || options.temperature < 0 || options.temperature > 2))
|
|
85
|
+
throw new Error('assistant-super-relay-budget: invalid temperature');
|
|
86
|
+
// The Responses route has no stop-sequence parameter and was verified without
|
|
87
|
+
// a reasoning-effort override; reject both rather than change generation silently.
|
|
88
|
+
if (options.stop !== undefined)
|
|
89
|
+
throw new Error('assistant-super-relay-budget: stop sequences are unsupported');
|
|
90
|
+
if (options.reasoningEffort !== undefined)
|
|
91
|
+
throw new Error('assistant-super-relay-budget: reasoning effort override is unsupported');
|
|
92
|
+
if (options.tools !== undefined && options.tools.length > 128)
|
|
93
|
+
throw new Error('assistant-super-relay-budget: too many tools');
|
|
94
|
+
const tools = options.tools === undefined ? undefined : options.tools.map(tool => {
|
|
95
|
+
if (tool === null || typeof tool !== 'object' || !/^[A-Za-z0-9_-]{1,64}$/u.test(tool.name) || typeof tool.description !== 'string' || tool.parameters === null || typeof tool.parameters !== 'object' || Array.isArray(tool.parameters))
|
|
96
|
+
throw new Error('assistant-super-relay-budget: invalid tool schema');
|
|
97
|
+
return { type: 'function', name: tool.name, description: tool.description, parameters: tool.parameters };
|
|
98
|
+
});
|
|
99
|
+
return {
|
|
100
|
+
model: options.model, stream: false, max_output_tokens: maxTokens,
|
|
101
|
+
...(options.system === undefined ? {} : { instructions: options.system }),
|
|
102
|
+
input: options.messages.flatMap(projectMessage),
|
|
103
|
+
...(tools === undefined ? {} : { tools }),
|
|
104
|
+
...(options.temperature === undefined ? {} : { temperature: options.temperature }),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async function boundedJson(response, maxBytes, signal) {
|
|
108
|
+
if (response.body === null)
|
|
109
|
+
requestError('SUPER_RELAY_EMPTY_RESPONSE');
|
|
110
|
+
const reader = response.body.getReader();
|
|
111
|
+
const chunks = [];
|
|
112
|
+
let bytes = 0;
|
|
113
|
+
try {
|
|
114
|
+
while (true) {
|
|
115
|
+
if (signal.aborted)
|
|
116
|
+
requestError('SUPER_RELAY_ABORTED');
|
|
117
|
+
const next = await bounded(reader.read(), signal);
|
|
118
|
+
if (next.done)
|
|
119
|
+
break;
|
|
120
|
+
bytes += next.value.byteLength;
|
|
121
|
+
if (bytes > maxBytes)
|
|
122
|
+
requestError('SUPER_RELAY_RESPONSE_TOO_LARGE');
|
|
123
|
+
chunks.push(next.value);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
try {
|
|
128
|
+
await bounded(reader.cancel(), signal);
|
|
129
|
+
}
|
|
130
|
+
catch { }
|
|
131
|
+
}
|
|
132
|
+
let raw;
|
|
133
|
+
try {
|
|
134
|
+
raw = new TextDecoder().decode(Buffer.concat(chunks));
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
requestError('SUPER_RELAY_INVALID_RESPONSE');
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
return JSON.parse(raw);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
requestError('SUPER_RELAY_INVALID_RESPONSE');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function usage(value, maxTokens) {
|
|
147
|
+
const record = object(value, 'usage');
|
|
148
|
+
const input = record.input_tokens;
|
|
149
|
+
const output = record.output_tokens;
|
|
150
|
+
const total = record.total_tokens;
|
|
151
|
+
if (!integer(input) || !integer(output, maxTokens) || !integer(total) || total !== input + output)
|
|
152
|
+
fail('usage');
|
|
153
|
+
let cached = 0;
|
|
154
|
+
if (record.input_tokens_details !== undefined) {
|
|
155
|
+
const details = object(record.input_tokens_details, 'input usage details');
|
|
156
|
+
if (details.cached_tokens !== undefined) {
|
|
157
|
+
if (!integer(details.cached_tokens, input))
|
|
158
|
+
fail('cached usage');
|
|
159
|
+
cached = details.cached_tokens;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
let reasoning = 0;
|
|
163
|
+
if (record.output_tokens_details !== undefined) {
|
|
164
|
+
const details = object(record.output_tokens_details, 'output usage details');
|
|
165
|
+
if (details.reasoning_tokens !== undefined) {
|
|
166
|
+
if (!integer(details.reasoning_tokens, output))
|
|
167
|
+
fail('reasoning usage');
|
|
168
|
+
reasoning = details.reasoning_tokens;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Responses input_tokens already includes the cached portion; DSH reports the
|
|
172
|
+
// disjoint uncached component plus a separate cache-read count.
|
|
173
|
+
return { inputTokens: input - cached, ...(cached === 0 ? {} : { cacheReadTokens: cached }),
|
|
174
|
+
outputTokens: output, totalTokens: total, ...(reasoning === 0 ? {} : { reasoningTokens: reasoning }) };
|
|
175
|
+
}
|
|
176
|
+
function response(value, maxTokens, requestedModel) {
|
|
177
|
+
const result = object(value, 'response');
|
|
178
|
+
if (result.model !== requestedModel)
|
|
179
|
+
fail('response model');
|
|
180
|
+
const status = result.status;
|
|
181
|
+
if (status !== 'completed' && status !== 'incomplete')
|
|
182
|
+
fail('status');
|
|
183
|
+
let truncated = false;
|
|
184
|
+
if (status === 'incomplete') {
|
|
185
|
+
const details = result.incomplete_details;
|
|
186
|
+
if (details === null || typeof details !== 'object' || details.reason !== 'max_output_tokens')
|
|
187
|
+
fail('incomplete reason');
|
|
188
|
+
truncated = true;
|
|
189
|
+
}
|
|
190
|
+
else if (result.incomplete_details !== null && result.incomplete_details !== undefined) {
|
|
191
|
+
fail('incomplete details');
|
|
192
|
+
}
|
|
193
|
+
if (!Array.isArray(result.output))
|
|
194
|
+
fail('output items');
|
|
195
|
+
if (result.output.length > 128)
|
|
196
|
+
fail('output items');
|
|
197
|
+
const blocks = [];
|
|
198
|
+
let hasCalls = false;
|
|
199
|
+
for (const candidate of result.output) {
|
|
200
|
+
const item = object(candidate, 'output item');
|
|
201
|
+
const kind = item.type;
|
|
202
|
+
if (kind === 'reasoning') {
|
|
203
|
+
const parts = item.content;
|
|
204
|
+
if (!Array.isArray(parts))
|
|
205
|
+
fail('reasoning content');
|
|
206
|
+
let value = '';
|
|
207
|
+
for (const part of parts) {
|
|
208
|
+
const p = object(part, 'reasoning part');
|
|
209
|
+
if (p.type !== 'reasoning_text')
|
|
210
|
+
fail('reasoning part type');
|
|
211
|
+
value += text(p.text, 'reasoning text');
|
|
212
|
+
}
|
|
213
|
+
if (value !== '')
|
|
214
|
+
blocks.push({ type: 'reasoning', text: value });
|
|
215
|
+
}
|
|
216
|
+
else if (kind === 'message') {
|
|
217
|
+
if (item.role !== 'assistant')
|
|
218
|
+
fail('message role');
|
|
219
|
+
const parts = item.content;
|
|
220
|
+
if (!Array.isArray(parts))
|
|
221
|
+
fail('message content');
|
|
222
|
+
for (const part of parts) {
|
|
223
|
+
const p = object(part, 'message part');
|
|
224
|
+
if (p.type !== 'output_text')
|
|
225
|
+
fail('message part type');
|
|
226
|
+
const value = text(p.text, 'output text');
|
|
227
|
+
if (value !== '')
|
|
228
|
+
blocks.push({ type: 'text', text: value });
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else if (kind === 'function_call') {
|
|
232
|
+
hasCalls = true;
|
|
233
|
+
const id = text(item.call_id, 'tool id', false);
|
|
234
|
+
const name = text(item.name, 'tool name', false);
|
|
235
|
+
const argumentsValue = text(item.arguments, 'tool arguments');
|
|
236
|
+
if (!/^[\x20-\x7e]{1,256}$/u.test(id) || !/^[A-Za-z0-9_-]{1,64}$/u.test(name))
|
|
237
|
+
fail('tool call identifiers');
|
|
238
|
+
if (!truncated)
|
|
239
|
+
try {
|
|
240
|
+
JSON.parse(argumentsValue);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
fail('tool arguments');
|
|
244
|
+
}
|
|
245
|
+
blocks.push({ type: 'tool-call', id: ToolCallId(id), name, arguments: argumentsValue });
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
fail('output item type');
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const ids = blocks.filter((block) => block.type === 'tool-call').map(block => String(block.id));
|
|
252
|
+
if (new Set(ids).size !== ids.length)
|
|
253
|
+
fail('duplicate tool call ids');
|
|
254
|
+
const finish = truncated ? 'max-tokens' : hasCalls ? 'tool-calls' : 'stop';
|
|
255
|
+
if (finish === 'stop' && hasCalls)
|
|
256
|
+
fail('inconsistent completion');
|
|
257
|
+
if (blocks.length === 0)
|
|
258
|
+
fail('empty completion', EMPTY_RESPONSE_CODE);
|
|
259
|
+
return { blocks, usage: usage(result.usage, maxTokens), finish, replay: Object.freeze({ kind: 'super-relay-responses/v1' }) };
|
|
260
|
+
}
|
|
261
|
+
/** Fixed Super Relay Responses adapter. It buffers one bounded JSON response before emitting any block. */
|
|
262
|
+
export class SuperRelayGoalMeteredAdapter extends LlmAdapter {
|
|
263
|
+
#lifecycle = new AbortController();
|
|
264
|
+
#fetch;
|
|
265
|
+
#now;
|
|
266
|
+
#environment;
|
|
267
|
+
#resolver;
|
|
268
|
+
#credentialServiceSeen = false;
|
|
269
|
+
#active = true;
|
|
270
|
+
constructor(input, dependencies = {}) {
|
|
271
|
+
super();
|
|
272
|
+
this.config = normalizeConfig(input);
|
|
273
|
+
this.#fetch = dependencies.fetch ?? fetch;
|
|
274
|
+
this.#now = dependencies.now ?? Date.now;
|
|
275
|
+
this.#environment = dependencies.environment ?? process.env;
|
|
276
|
+
this.#resolver = dependencies.credentialResolver;
|
|
277
|
+
}
|
|
278
|
+
config;
|
|
279
|
+
shutdown() { if (this.#active) {
|
|
280
|
+
this.#active = false;
|
|
281
|
+
this.#lifecycle.abort(new Error('assistant-super-relay-budget unloaded'));
|
|
282
|
+
} }
|
|
283
|
+
providerInfo(provider) { if (provider !== SUPER_RELAY_PROVIDER)
|
|
284
|
+
fail('provider', 'INVALID_PROVIDER'); return { id: SUPER_RELAY_PROVIDER, name: 'Super Relay (goal-metered)' }; }
|
|
285
|
+
providerRetryPolicy(_provider) { return { mode: 'normal', maxRetries: 0, retryableCodes: [], initialDelayMs: 500, maxDelayMs: 500, jitterRatio: 0 }; }
|
|
286
|
+
async listModels(provider) { this.providerInfo(provider); return SUPER_RELAY_MODELS.map(id => ({ provider: SUPER_RELAY_PROVIDER, id, name: id, inputModalities: ['text'] })); }
|
|
287
|
+
async resolveModel(provider, model, signal) {
|
|
288
|
+
this.providerInfo(provider);
|
|
289
|
+
if (!isSuperRelayModel(model) || signal?.aborted || !this.#active)
|
|
290
|
+
fail('model', 'INVALID_MODEL');
|
|
291
|
+
assertCurrentContract(this.#now());
|
|
292
|
+
// No reasoning-effort menu is advertised: the gateway model reasons by default and the
|
|
293
|
+
// adapter rejects an effort override, keeping the wire identical to the verified probes.
|
|
294
|
+
return { provider: SUPER_RELAY_PROVIDER, id: model, name: model, inputModalities: ['text'], defaultMaxTokens: this.config.defaultMaxTokens };
|
|
295
|
+
}
|
|
296
|
+
async *stream(options) {
|
|
297
|
+
const model = options.model;
|
|
298
|
+
if (!this.#active || options.provider !== SUPER_RELAY_PROVIDER || !isSuperRelayModel(model))
|
|
299
|
+
fail('route', 'INVALID_PROVIDER');
|
|
300
|
+
assertCurrentContract(this.#now());
|
|
301
|
+
const maxTokens = options.maxTokens ?? this.config.defaultMaxTokens;
|
|
302
|
+
if (!integer(maxTokens, 32_768) || maxTokens < 1)
|
|
303
|
+
fail('max tokens', 'INVALID_MAX_TOKENS');
|
|
304
|
+
const signal = options.signal === undefined ? this.#lifecycle.signal : AbortSignal.any([options.signal, this.#lifecycle.signal]);
|
|
305
|
+
if (signal.aborted)
|
|
306
|
+
requestError('SUPER_RELAY_ABORTED');
|
|
307
|
+
const timer = AbortSignal.timeout(this.config.timeoutMs);
|
|
308
|
+
const requestSignal = AbortSignal.any([signal, timer]);
|
|
309
|
+
const body = JSON.stringify(project(options, maxTokens));
|
|
310
|
+
if (Buffer.byteLength(body, 'utf8') > MAX_REQUEST_BYTES)
|
|
311
|
+
requestError('SUPER_RELAY_REQUEST_TOO_LARGE');
|
|
312
|
+
let resolver;
|
|
313
|
+
let resolved;
|
|
314
|
+
try {
|
|
315
|
+
resolver = this.#resolver?.();
|
|
316
|
+
if (resolver === undefined && this.#credentialServiceSeen)
|
|
317
|
+
requestError('SUPER_RELAY_CREDENTIAL_CHANGED');
|
|
318
|
+
if (resolver !== undefined)
|
|
319
|
+
this.#credentialServiceSeen = true;
|
|
320
|
+
resolved = resolver === undefined ? undefined : await bounded(resolver.resolve(credentialRef(this.config.apiKeyEnv)), requestSignal);
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
requestError(requestSignal.aborted ? 'SUPER_RELAY_ABORTED' : 'SUPER_RELAY_CREDENTIAL');
|
|
324
|
+
}
|
|
325
|
+
if (requestSignal.aborted || !this.#active)
|
|
326
|
+
requestError('SUPER_RELAY_ABORTED');
|
|
327
|
+
assertCurrentContract(this.#now());
|
|
328
|
+
const resolverIdentity = (value) => value === undefined ? undefined : Reflect.get(value, Service.tracker) ?? value;
|
|
329
|
+
let sameResolver;
|
|
330
|
+
try {
|
|
331
|
+
sameResolver = resolverIdentity(this.#resolver?.()) === resolverIdentity(resolver);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
requestError('SUPER_RELAY_CREDENTIAL');
|
|
335
|
+
}
|
|
336
|
+
if (!sameResolver)
|
|
337
|
+
requestError('SUPER_RELAY_CREDENTIAL_CHANGED');
|
|
338
|
+
const key = resolver === undefined ? this.#environment[this.config.apiKeyEnv] : resolved?.value;
|
|
339
|
+
if (typeof key !== 'string' || key.length === 0)
|
|
340
|
+
requestError('MISSING_CREDENTIAL');
|
|
341
|
+
let wire;
|
|
342
|
+
try {
|
|
343
|
+
assertCurrentContract(this.#now());
|
|
344
|
+
const init = {
|
|
345
|
+
method: 'POST', redirect: 'error', credentials: 'omit', signal: requestSignal,
|
|
346
|
+
headers: { authorization: `Bearer ${key}`, 'content-type': 'application/json', accept: 'application/json' },
|
|
347
|
+
body,
|
|
348
|
+
};
|
|
349
|
+
const received = await bounded(this.#fetch(ENDPOINT, init), requestSignal);
|
|
350
|
+
if (!received.ok) {
|
|
351
|
+
try {
|
|
352
|
+
await bounded(received.body?.cancel() ?? Promise.resolve(), requestSignal);
|
|
353
|
+
}
|
|
354
|
+
catch { }
|
|
355
|
+
;
|
|
356
|
+
requestError(`SUPER_RELAY_HTTP_${received.status}`);
|
|
357
|
+
}
|
|
358
|
+
wire = await boundedJson(received, this.config.maxResponseBytes, requestSignal);
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
if (error instanceof LlmError)
|
|
362
|
+
throw error;
|
|
363
|
+
requestError(requestSignal.aborted ? 'SUPER_RELAY_ABORTED' : 'SUPER_RELAY_TRANSPORT');
|
|
364
|
+
}
|
|
365
|
+
if (signal.aborted || !this.#active)
|
|
366
|
+
requestError('SUPER_RELAY_ABORTED');
|
|
367
|
+
assertCurrentContract(this.#now());
|
|
368
|
+
const parsed = response(wire, maxTokens, model);
|
|
369
|
+
const assertLive = () => {
|
|
370
|
+
if (requestSignal.aborted || !this.#active)
|
|
371
|
+
requestError('SUPER_RELAY_ABORTED');
|
|
372
|
+
assertCurrentContract(this.#now());
|
|
373
|
+
};
|
|
374
|
+
for (const [index, block] of parsed.blocks.entries()) {
|
|
375
|
+
assertLive();
|
|
376
|
+
yield { type: 'block-start', index, blockType: block.type };
|
|
377
|
+
if (block.type === 'text') {
|
|
378
|
+
assertLive();
|
|
379
|
+
yield { type: 'text-delta', index, text: block.text };
|
|
380
|
+
}
|
|
381
|
+
else if (block.type === 'reasoning') {
|
|
382
|
+
assertLive();
|
|
383
|
+
yield { type: 'reasoning-delta', index, text: block.text };
|
|
384
|
+
}
|
|
385
|
+
else if (block.type === 'tool-call') {
|
|
386
|
+
assertLive();
|
|
387
|
+
yield { type: 'tool-call-delta', index, id: block.id, name: block.name, argumentsDelta: block.arguments };
|
|
388
|
+
}
|
|
389
|
+
assertLive();
|
|
390
|
+
yield { type: 'block-end', index, block };
|
|
391
|
+
}
|
|
392
|
+
assertLive();
|
|
393
|
+
yield { type: 'usage', usage: parsed.usage };
|
|
394
|
+
assertLive();
|
|
395
|
+
yield { type: 'finish', reason: { kind: parsed.finish }, replayState: { response: parsed.replay } };
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
2
|
+
export interface SuperRelayGoalMeteredConfig {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
/** Credential reference only; this plugin never accepts a literal API key. */
|
|
5
|
+
apiKeyEnv?: string;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
maxResponseBytes?: number;
|
|
8
|
+
defaultMaxTokens?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const Config: Schema<SuperRelayGoalMeteredConfig>;
|
|
11
|
+
export declare function normalizeConfig(input?: SuperRelayGoalMeteredConfig): Readonly<Required<SuperRelayGoalMeteredConfig>>;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAE7C,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAaD,eAAO,MAAM,MAAM,EAOb,MAAM,CAAC,2BAA2B,CAAC,CAAA;AAEzC,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,2BAA2B,GAAG,QAAQ,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAIpH"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
2
|
+
const fields = new Set(['enabled', 'apiKeyEnv', 'timeoutMs', 'maxResponseBytes', 'defaultMaxTokens']);
|
|
3
|
+
const ref = Schema.string().pattern(/^[A-Z_][A-Z0-9_]*$/u);
|
|
4
|
+
const schema = Schema.object({
|
|
5
|
+
enabled: Schema.boolean().default(false),
|
|
6
|
+
apiKeyEnv: ref.default('SUPER_RELAY_API_KEY'),
|
|
7
|
+
timeoutMs: Schema.natural().min(1_000).max(300_000).default(60_000),
|
|
8
|
+
maxResponseBytes: Schema.natural().min(1_024).max(32 * 1024 * 1024).default(4 * 1024 * 1024),
|
|
9
|
+
defaultMaxTokens: Schema.natural().min(1).max(32_768).default(8_192),
|
|
10
|
+
});
|
|
11
|
+
export const Config = new Proxy(schema, {
|
|
12
|
+
apply(target, thisArg, argumentsList) {
|
|
13
|
+
const value = argumentsList[0];
|
|
14
|
+
if (value !== undefined && (value === null || typeof value !== 'object' || Array.isArray(value)))
|
|
15
|
+
throw new Error('assistant-super-relay-budget: config must be an object');
|
|
16
|
+
if (value !== undefined)
|
|
17
|
+
for (const key of Object.keys(value))
|
|
18
|
+
if (!fields.has(key))
|
|
19
|
+
throw new Error(`assistant-super-relay-budget: unknown config field: ${key}`);
|
|
20
|
+
return Reflect.apply(target, thisArg, argumentsList);
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
export function normalizeConfig(input) {
|
|
24
|
+
const config = Config(input);
|
|
25
|
+
if (!/^[A-Z_][A-Z0-9_]*$/u.test(config.apiKeyEnv))
|
|
26
|
+
throw new Error('assistant-super-relay-budget: invalid apiKeyEnv');
|
|
27
|
+
return Object.freeze({ ...config });
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAW7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAA;AACrG,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAE1D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACxC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACnE,gBAAgB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5F,gBAAgB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;CACrE,CAAwC,CAAA;AAEzC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;IACtC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,aAAwB;QAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;QAC3K,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,GAAG,EAAE,CAAC,CAAA;QAC5K,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAgC,CAAA;IACrF,CAAC;CACF,CAAwC,CAAA;AAEzC,MAAM,UAAU,eAAe,CAAC,KAAmC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA0C,CAAA;IACrE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IACrH,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Short-lived primary-source contract for the internal Super Relay OpenAI
|
|
3
|
+
* Responses route. Expiry disables both dispatch and metering.
|
|
4
|
+
*
|
|
5
|
+
* The gateway publishes no public protocol/pricing documentation; the contract
|
|
6
|
+
* was established against the live endpoint with real, non-synthetic probes
|
|
7
|
+
* (see checkedAt). It must be re-verified before expiry.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SUPER_RELAY_RESPONSES_CONTRACT: Readonly<{
|
|
10
|
+
id: "super-relay-responses-2026-09-14";
|
|
11
|
+
checkedAt: "2026-09-14T00:00:00.000Z";
|
|
12
|
+
expiresAt: "2026-10-14T00:00:00.000Z";
|
|
13
|
+
links: readonly string[];
|
|
14
|
+
}>;
|
|
15
|
+
export declare const SUPER_RELAY_PROVIDER = "super-relay";
|
|
16
|
+
export declare const SUPER_RELAY_MODELS: readonly ["auto_model/alwaysday1"];
|
|
17
|
+
export type SuperRelayModel = typeof SUPER_RELAY_MODELS[number];
|
|
18
|
+
/**
|
|
19
|
+
* Conservative per-request input upper bound. `auto_model/alwaysday1` declares
|
|
20
|
+
* no context window; this is a deliberately conservative fail-closed ceiling
|
|
21
|
+
* well below the 1,000,000-token windows the gateway declares for its other
|
|
22
|
+
* models, NOT an estimate of what any request will consume. Real measured
|
|
23
|
+
* strategy probes stayed under 1,000 input tokens.
|
|
24
|
+
*/
|
|
25
|
+
export declare const SUPER_RELAY_INPUT_TOKEN_UPPER_BOUND = 200000;
|
|
26
|
+
export declare function assertCurrentContract(now?: number): void;
|
|
27
|
+
export declare function isSuperRelayModel(value: unknown): value is SuperRelayModel;
|
|
28
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B;;;;;EAOzC,CAAA;AAEF,eAAO,MAAM,oBAAoB,gBAAgB,CAAA;AACjD,eAAO,MAAM,kBAAkB,oCAAoD,CAAA;AACnF,MAAM,MAAM,eAAe,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAA;AAC/D;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,SAAU,CAAA;AAE1D,wBAAgB,qBAAqB,CAAC,GAAG,SAAa,GAAG,IAAI,CAI5D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E"}
|
package/lib/contract.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Short-lived primary-source contract for the internal Super Relay OpenAI
|
|
3
|
+
* Responses route. Expiry disables both dispatch and metering.
|
|
4
|
+
*
|
|
5
|
+
* The gateway publishes no public protocol/pricing documentation; the contract
|
|
6
|
+
* was established against the live endpoint with real, non-synthetic probes
|
|
7
|
+
* (see checkedAt). It must be re-verified before expiry.
|
|
8
|
+
*/
|
|
9
|
+
export const SUPER_RELAY_RESPONSES_CONTRACT = Object.freeze({
|
|
10
|
+
id: 'super-relay-responses-2026-09-14',
|
|
11
|
+
checkedAt: '2026-09-14T00:00:00.000Z',
|
|
12
|
+
expiresAt: '2026-10-14T00:00:00.000Z',
|
|
13
|
+
links: Object.freeze([
|
|
14
|
+
'https://super-relay.byted.org/v1',
|
|
15
|
+
]),
|
|
16
|
+
});
|
|
17
|
+
export const SUPER_RELAY_PROVIDER = 'super-relay';
|
|
18
|
+
export const SUPER_RELAY_MODELS = Object.freeze(['auto_model/alwaysday1']);
|
|
19
|
+
/**
|
|
20
|
+
* Conservative per-request input upper bound. `auto_model/alwaysday1` declares
|
|
21
|
+
* no context window; this is a deliberately conservative fail-closed ceiling
|
|
22
|
+
* well below the 1,000,000-token windows the gateway declares for its other
|
|
23
|
+
* models, NOT an estimate of what any request will consume. Real measured
|
|
24
|
+
* strategy probes stayed under 1,000 input tokens.
|
|
25
|
+
*/
|
|
26
|
+
export const SUPER_RELAY_INPUT_TOKEN_UPPER_BOUND = 200_000;
|
|
27
|
+
export function assertCurrentContract(now = Date.now()) {
|
|
28
|
+
if (!Number.isFinite(now) || now >= Date.parse(SUPER_RELAY_RESPONSES_CONTRACT.expiresAt)) {
|
|
29
|
+
throw new Error('assistant-super-relay-budget: Super Relay protocol contract has expired; update and review it before dispatch');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function isSuperRelayModel(value) {
|
|
33
|
+
return typeof value === 'string' && SUPER_RELAY_MODELS.includes(value);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1D,EAAE,EAAE,kCAAkC;IACtC,SAAS,EAAE,0BAA0B;IACrC,SAAS,EAAE,0BAA0B;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,kCAAkC;KACnC,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAA;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,uBAAuB,CAAU,CAAC,CAAA;AAEnF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,OAAO,CAAA;AAE1D,MAAM,UAAU,qBAAqB,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,SAAS,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,+GAA+G,CAAC,CAAA;IAClI,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,kBAAwC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC/F,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { SuperRelayGoalMeteredAdapter } from './adapter.js';
|
|
3
|
+
import type { SuperRelayAdapterDependencies, SuperRelayCredentialResolver } from './adapter.js';
|
|
4
|
+
import { Config, normalizeConfig } from './config.js';
|
|
5
|
+
import type { SuperRelayGoalMeteredConfig } from './config.js';
|
|
6
|
+
import { assertCurrentContract, isSuperRelayModel, SUPER_RELAY_INPUT_TOKEN_UPPER_BOUND, SUPER_RELAY_MODELS, SUPER_RELAY_PROVIDER, SUPER_RELAY_RESPONSES_CONTRACT } from './contract.js';
|
|
7
|
+
import type { SuperRelayModel } from './contract.js';
|
|
8
|
+
import { version } from './version.js';
|
|
9
|
+
export declare const name = "dsh-enhanced-assistant-super-relay-budget";
|
|
10
|
+
export declare const inject: string[];
|
|
11
|
+
export { Config, normalizeConfig, SuperRelayGoalMeteredAdapter, SUPER_RELAY_PROVIDER, SUPER_RELAY_MODELS, SUPER_RELAY_RESPONSES_CONTRACT, SUPER_RELAY_INPUT_TOKEN_UPPER_BOUND, assertCurrentContract, isSuperRelayModel, version, };
|
|
12
|
+
export type { SuperRelayGoalMeteredConfig, SuperRelayAdapterDependencies, SuperRelayCredentialResolver, SuperRelayModel, };
|
|
13
|
+
export declare function apply(ctx: Context, input?: SuperRelayGoalMeteredConfig): void;
|
|
14
|
+
declare const _default: {
|
|
15
|
+
name: string;
|
|
16
|
+
Config: import("@deepseek-ai/schemastery").default<SuperRelayGoalMeteredConfig>;
|
|
17
|
+
inject: string[];
|
|
18
|
+
apply: typeof apply;
|
|
19
|
+
};
|
|
20
|
+
export default _default;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,KAAK,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAA;AAC/F,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,mCAAmC,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAA;AACvL,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,eAAO,MAAM,IAAI,8CAA8C,CAAA;AAC/D,eAAO,MAAM,MAAM,UAA4B,CAAA;AAC/C,OAAO,EACL,MAAM,EACN,eAAe,EACf,4BAA4B,EAC5B,oBAAoB,EACpB,kBAAkB,EAClB,8BAA8B,EAC9B,mCAAmC,EACnC,qBAAqB,EACrB,iBAAiB,EACjB,OAAO,GACR,CAAA;AACD,YAAY,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,eAAe,GAChB,CAAA;AAiBD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAmB7E;;;;;;;AAED,wBAA8C"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SuperRelayGoalMeteredAdapter } from './adapter.js';
|
|
2
|
+
import { Config, normalizeConfig } from './config.js';
|
|
3
|
+
import { assertCurrentContract, isSuperRelayModel, SUPER_RELAY_INPUT_TOKEN_UPPER_BOUND, SUPER_RELAY_MODELS, SUPER_RELAY_PROVIDER, SUPER_RELAY_RESPONSES_CONTRACT } from './contract.js';
|
|
4
|
+
import { version } from './version.js';
|
|
5
|
+
export const name = 'dsh-enhanced-assistant-super-relay-budget';
|
|
6
|
+
export const inject = ['llm', 'assistantGoals'];
|
|
7
|
+
export { Config, normalizeConfig, SuperRelayGoalMeteredAdapter, SUPER_RELAY_PROVIDER, SUPER_RELAY_MODELS, SUPER_RELAY_RESPONSES_CONTRACT, SUPER_RELAY_INPUT_TOKEN_UPPER_BOUND, assertCurrentContract, isSuperRelayModel, version, };
|
|
8
|
+
function meter(model) {
|
|
9
|
+
return Object.freeze({
|
|
10
|
+
id: `super-relay-goal-metered:${model}:v1`, provider: SUPER_RELAY_PROVIDER, model,
|
|
11
|
+
inputTokenUpperBound(options) {
|
|
12
|
+
assertCurrentContract();
|
|
13
|
+
if (options.provider !== SUPER_RELAY_PROVIDER || options.model !== model || !Number.isSafeInteger(options.maxTokens) || options.maxTokens < 1 || options.maxTokens > 32_768) {
|
|
14
|
+
throw new Error('assistant-super-relay-budget: meter received an invalid route or maxTokens');
|
|
15
|
+
}
|
|
16
|
+
return SUPER_RELAY_INPUT_TOKEN_UPPER_BOUND;
|
|
17
|
+
},
|
|
18
|
+
// The gateway publishes no tariff; report null rather than invent a price.
|
|
19
|
+
inputUsdMicrosPerMillionTokens: null, outputUsdMicrosPerMillionTokens: null,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function apply(ctx, input) {
|
|
23
|
+
const config = normalizeConfig(input);
|
|
24
|
+
if (!config.enabled)
|
|
25
|
+
return;
|
|
26
|
+
assertCurrentContract();
|
|
27
|
+
const adapter = new SuperRelayGoalMeteredAdapter(config, { credentialResolver: () => ctx.get('credentials') });
|
|
28
|
+
const releases = [];
|
|
29
|
+
try {
|
|
30
|
+
for (const modelId of SUPER_RELAY_MODELS)
|
|
31
|
+
releases.push(ctx.assistantGoals.registerBudgetMeter(meter(modelId)));
|
|
32
|
+
const unregisterAdapter = ctx.llm.registerAdapter([SUPER_RELAY_PROVIDER], adapter);
|
|
33
|
+
ctx.effect(() => () => {
|
|
34
|
+
unregisterAdapter();
|
|
35
|
+
for (const release of releases.splice(0).reverse())
|
|
36
|
+
release();
|
|
37
|
+
adapter.shutdown();
|
|
38
|
+
}, 'dsh-enhanced-assistant-super-relay-budget.lifecycle');
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
for (const release of releases.reverse())
|
|
42
|
+
release();
|
|
43
|
+
adapter.shutdown();
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export default { name, Config, inject, apply };
|
|
48
|
+
//# 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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"}
|
package/lib/version.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAA"}
|
package/lib/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dsh-enhanced/assistant-super-relay-budget",
|
|
3
|
+
"version": "0.1.34",
|
|
4
|
+
"description": "A Super Relay OpenAI Responses route with conservative goal-budget token metering.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./lib/index.js",
|
|
8
|
+
"types": "./lib/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./lib/index.d.ts",
|
|
12
|
+
"default": "./lib/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"lib",
|
|
19
|
+
"cordis.patch.yml",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/22-ai-00/dsh-enhanced.git",
|
|
32
|
+
"directory": "plugins/assistant-super-relay-budget"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"super-relay",
|
|
36
|
+
"openai-responses",
|
|
37
|
+
"deepseek-harness",
|
|
38
|
+
"dsh-plugin"
|
|
39
|
+
],
|
|
40
|
+
"dsh": {
|
|
41
|
+
"bundle": {
|
|
42
|
+
"patch": "./cordis.patch.yml"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@deepseek-ai/schemastery": "3.18.2"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
50
|
+
"@deepseek-ai/dsh-credentials": ">=0.1.2-rc.1 <0.2.0",
|
|
51
|
+
"@deepseek-ai/dsh-llm": ">=0.1.2-rc.1 <0.2.0",
|
|
52
|
+
"@dsh-enhanced/assistant-goals": ">=0.1.0 <0.2.0"
|
|
53
|
+
},
|
|
54
|
+
"peerDependenciesMeta": {
|
|
55
|
+
"@deepseek-ai/cordis": {
|
|
56
|
+
"optional": true
|
|
57
|
+
},
|
|
58
|
+
"@deepseek-ai/dsh-credentials": {
|
|
59
|
+
"optional": true
|
|
60
|
+
},
|
|
61
|
+
"@deepseek-ai/dsh-llm": {
|
|
62
|
+
"optional": true
|
|
63
|
+
},
|
|
64
|
+
"@dsh-enhanced/assistant-goals": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@deepseek-ai/cordis": "4.0.2",
|
|
70
|
+
"@deepseek-ai/dsh-credentials": "0.1.2-rc.1",
|
|
71
|
+
"@deepseek-ai/dsh-llm": "0.1.2-rc.1",
|
|
72
|
+
"@types/node": "22.20.0",
|
|
73
|
+
"typescript": "6.0.3",
|
|
74
|
+
"vitest": "4.1.8",
|
|
75
|
+
"@dsh-enhanced/assistant-goals": "0.1.34"
|
|
76
|
+
},
|
|
77
|
+
"scripts": {
|
|
78
|
+
"build": "tsc -p tsconfig.build.json",
|
|
79
|
+
"test": "vitest run",
|
|
80
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
81
|
+
}
|
|
82
|
+
}
|