dsh-connect-trae 4.4.1 → 4.4.2
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/CHANGELOG.md +50 -0
- package/lib/index.d.ts +30 -1
- package/lib/index.js +143 -85
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,55 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.4.2 (2026-10-23)
|
|
4
|
+
|
|
5
|
+
> **带工具的对话在 deepseek-v4.1-flash 上整轮 400/4027 拒绝。这个版本在两个工具出口
|
|
6
|
+
> 把 draft-3 风格的 `required: true` 归一化为 draft-4。**
|
|
7
|
+
>
|
|
8
|
+
> 接 issue #48 的后续证据(issue #49):上游校验**分后端**。同一凭证、同一 SOLO 出口、
|
|
9
|
+
> 同一工具 schema,`glm-5.2`(智谱后端)放行属性内的 `required: true`,而
|
|
10
|
+
> `deepseek-v4.1-flash` 按 JSON Schema draft-4+ 严校验,直接回
|
|
11
|
+
> `4027 … tools.N.function.parameters/properties/X/required: invalid JSON Schema` ——
|
|
12
|
+
> 且 `tools.N` 是**按批校验**,一个不合格即全挂,所以「带工具必 400」。
|
|
13
|
+
> 之前 #48 判「上游已放行」是因为只在宽松的智谱后端上试过。
|
|
14
|
+
|
|
15
|
+
### 修复
|
|
16
|
+
|
|
17
|
+
- **工具 schema 出口统一归一化为 draft-4**(`fix(protocol)`,issue #49)。
|
|
18
|
+
DSH schemastery 生成的工具参数是 draft-3 风格 —— `required: true` 写在属性**内部**:
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{ "type": "object", "properties": { "tool": { "type": "string", "required": true } } }
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
JSON Schema draft-4 起已把 per-property boolean `required` 移除,改为父级字符串数组
|
|
25
|
+
`{ "required": ["tool"] }`。deepseek-v4.1-flash 这类严校验后端对前者直接判
|
|
26
|
+
`invalid JSON Schema`,整请求被拒。由于模型路由到哪个后端由上游决定、随 config 变化,
|
|
27
|
+
凡带工具的请求都必须是 draft-4 干净的,与探针上次试过后端无关。
|
|
28
|
+
- 新增 `normalizeTraeToolSchema` / `normalizeTraeToolSchemas`(`src/raw-chat.ts`):
|
|
29
|
+
递归把属性内 boolean `required` 提升到父级 `required` 数组(与既有数组去重合并)后
|
|
30
|
+
删除 boolean;覆盖 `items` / `anyOf` / `oneOf` / `allOf` 等任意嵌套。**幂等** ——
|
|
31
|
+
已是 draft-4 的 schema 原样返回(同一对象,零拷贝),不改变合法载荷。
|
|
32
|
+
- **两个工具出口都套上归一化**:`prepareSoloBody`(SOLO `llm_utils_chat` 主路径,
|
|
33
|
+
`parameters` 在 `JSON.stringify` 前归一化)与 `buildTraeRawChatDraft`(raw chat 路径,
|
|
34
|
+
`structuredClone` 后的 `tools` 归一化)。纯本地、不碰凭据、不改调用方入参。
|
|
35
|
+
- 归一化后的载荷形态与 issue #49 的 D3 对照实验(draft-4 提升后经
|
|
36
|
+
deepseek-v4.1-flash 后端 200 正常 SSE)一致。
|
|
37
|
+
|
|
38
|
+
### 测试补强
|
|
39
|
+
|
|
40
|
+
- **989 例测试全绿**(`pnpm run test`),新增 **7 例**:draft-3 提升、嵌套
|
|
41
|
+
`items`/`anyOf` 递归、与既有 `required` 数组合并、draft-4 幂等(字节不变)、
|
|
42
|
+
`properties` 之外的 boolean `required` 与 `required: false` 不误伤、调用方 `tools`
|
|
43
|
+
不被原地修改、SOLO 信封 wire 载荷为 draft-4。
|
|
44
|
+
|
|
45
|
+
### 已知边界
|
|
46
|
+
|
|
47
|
+
- 归一化只处理 draft-3 boolean `required` 这一种已实测命中的非法形态;上游若日后
|
|
48
|
+
收紧到拒绝更多 draft-3 残留(如属性内其他 boolean 关键字),需另行取证后处理。
|
|
49
|
+
- 本次修复未经本机真实凭据实测(修复者无 Trae 凭据);上游行为依据 issue #49 报告人
|
|
50
|
+
的三步对照实验(D1 无工具 200 / D2 draft-3 4027 / D3 draft-4 200)。本地验证为
|
|
51
|
+
单测 + 构造载荷核验。
|
|
52
|
+
|
|
3
53
|
## 4.4.1 (2026-10-22)
|
|
4
54
|
|
|
5
55
|
> **4.4.0 的修复自己藏掉了 `kimi-k2-0905`。这个版本把它捞回来,并补上 4.4.0 缺的实测。**
|
package/lib/index.d.ts
CHANGED
|
@@ -2465,6 +2465,35 @@ declare function traeEndpoint(baseUrl: string, path: string): string;
|
|
|
2465
2465
|
//#region src/raw-chat.d.ts
|
|
2466
2466
|
declare const TRAE_RAW_CHAT_V2_PATH = "/api/ide/v2/llm_raw_chat";
|
|
2467
2467
|
declare const TRAE_RAW_CHAT_V1_PATH = "/api/ide/v1/llm_raw_chat";
|
|
2468
|
+
/**
|
|
2469
|
+
* Normalise a tool `parameters` schema from JSON Schema draft-3 style to
|
|
2470
|
+
* draft-4 style (issue #49).
|
|
2471
|
+
*
|
|
2472
|
+
* Draft-3 declared a required property by putting a boolean `required: true`
|
|
2473
|
+
* INSIDE the property schema:
|
|
2474
|
+
*
|
|
2475
|
+
* { "type": "object", "properties": { "tool": { "type": "string", "required": true } } }
|
|
2476
|
+
*
|
|
2477
|
+
* Draft-4 removed the per-property boolean and uses a parent-level string
|
|
2478
|
+
* array instead: `{ "required": ["tool"] }`. The Trae backends disagree on how
|
|
2479
|
+
* strictly they check this: the Zhipu backend (glm-5.2) tolerates draft-3
|
|
2480
|
+
* `required: true`, but the DeepSeek backend (deepseek-v4.1-flash) rejects the
|
|
2481
|
+
* whole request with `4027 … tools.N.function.parameters/properties/X/required:
|
|
2482
|
+
* invalid JSON Schema` whenever ANY tool carries the boolean form — and
|
|
2483
|
+
* `tools.N` are validated as a batch, so one bad schema fails the entire turn
|
|
2484
|
+
* (issue #49, after #48). Since a model's backend is chosen by the upstream
|
|
2485
|
+
* router and can change per config, every tool-carrying request must be
|
|
2486
|
+
* draft-4 clean regardless of which backend the probe last saw.
|
|
2487
|
+
*
|
|
2488
|
+
* The rewrite is local, idempotent, and recursive: it lifts each boolean
|
|
2489
|
+
* `required` up to the enclosing schema's `required` array (merging with any
|
|
2490
|
+
* array already present), then drops the boolean. Non-object property entries
|
|
2491
|
+
* are left untouched — draft-4 forbids boolean schemas anyway, so no boolean
|
|
2492
|
+
* `required` can hide inside them.
|
|
2493
|
+
*/
|
|
2494
|
+
declare function normalizeTraeToolSchema(value: unknown): unknown;
|
|
2495
|
+
/** Issue #49: apply `normalizeTraeToolSchema` to an OpenAI-style tool list. */
|
|
2496
|
+
declare function normalizeTraeToolSchemas<T>(tools: readonly T[]): T[];
|
|
2468
2497
|
type RawChatRole = 'assistant' | 'system' | 'tool' | 'user';
|
|
2469
2498
|
interface RawChatTextContent {
|
|
2470
2499
|
type: 'text';
|
|
@@ -3999,4 +4028,4 @@ declare function asVolatile<S>(schema: S): S;
|
|
|
3999
4028
|
declare const Config: z<Config>;
|
|
4000
4029
|
declare function apply(ctx: Context$1, config: Config): void;
|
|
4001
4030
|
//#endregion
|
|
4002
|
-
export { Config, FALLBACK_TRAE_MODELS, FALLBACK_TRAE_MODELS_AI, MAX_PROBE_INPUT_TOKENS, type PiAiGeneration, type PiAiRuntimeInfo, REGION_GATEWAYS, type RawChatDelta, type RawChatMessage, type RawChatTool, SseDecoder, type SseEvent, TRAE_ACCOUNT_STATUS_PATH, TRAE_AI_PROVIDER, TRAE_CHECKIN_PATH, TRAE_CN_AGENT_TASK_PATH, TRAE_CN_TITLE_PATH, TRAE_ENTERPRISE_PROVIDER, TRAE_MODELS_TEST_PATH, TRAE_MODEL_DETAIL_FUNCTIONS, TRAE_MODEL_DETAIL_PATH, TRAE_PANELS, TRAE_PAY_BASE, TRAE_PROBE_TIMEOUT_MS, TRAE_PROVIDER, TRAE_PROVIDERS, TRAE_PROVIDER_DISPLAY_NAMES, TRAE_PROVIDER_IDS, TRAE_PROVIDER_ID_DISPLAY_NAMES, TRAE_PROVIDER_ROUTES, TRAE_RAW_CHAT_V1_PATH, TRAE_RAW_CHAT_V2_PATH, TRAE_REASONING_EFFORTS, TRAE_REGIONS, TRAE_REGION_PARAM, TRAE_SETTINGS_NS, TRAE_SOLO_CHAT_PATH, TRAE_SOLO_FUNCTION, TRAE_SOLO_MODELS_PATH, TRAE_SOLO_REMOTE_BASE, TRAE_STATE_DB_FILENAME, TRAE_STREAM_IDLE_TIMEOUT_MS, TRAE_USAGE_PATH, TRAE_VERSION_CODE_FALLBACK, type TraeActivityRule, type TraeAdapter, type TraeCachedModelConfig, TraeCatalog, type TraeChatResult, type TraeCheckinClaim, type TraeCheckinStatus, type TraeContextBudget, type TraeCredential, TraeCredentialStore, TraeDelegatingUpstreamClient, type TraeDiscoveredModel, type TraeDiscoveredReasoning, type TraeEdition, type TraeFailure, TraeFallbackUpstreamClient, type TraeFallbackUpstreamOptions, type TraeFusionRawChatEnvelope, TraeGatedUpstreamClient, type TraeGatedUpstreamOptions, type TraeIdentity, type TraeInputModality, type TraeModelDetailRequest, type TraeModelInfo, type TraeModelProbeVerdict, type TraeModelsTestResponse, type TraeObservedModelConfig, type TraePanel, type TraeProbeResult, type TraeProbeVerdict, type TraeProviderRoute, TraeRawCapabilityController, type TraeRawCapabilityControllerOptions, type TraeRawCapabilitySnapshot, TraeRawCapabilityState, type TraeRawChatBehaviorConfig, type TraeRawChatCapability, type TraeRawChatClientOptions, type TraeRawChatConfig, type TraeRawChatFailureReason, type TraeRawChatRuntimeConfig, TraeRawChatUpstreamClient, type TraeRawDiagnostic, type TraeRawDiagnosticState, type TraeRawGateway, type TraeRawGatewayOptions, type TraeRawResolverResult, type TraeReasoningCapability, type TraeReasoningEffort, type TraeRefreshDevice, type TraeRegion, type TraeRegionGateways, TraeRegionState, type TraeShim, TraeSoloBridge, type TraeSoloClientOptions, TraeSoloRemoteCatalogClient, type TraeSoloRemoteCatalogOptions, TraeSoloUpstreamClient, type TraeStorageCandidate, type TraeStreamEvent, type TraeUpstreamClient, TraeUsageClient, type TraeUsageOptions, type TraeUsagePack, type TraeUsageRouteOptions, type TraeUsageSnapshot, type TraeUsageSummary, type TraeUsageView, type TraeWebAccountState, type TraeWebActivity, type TraeWebCheckin, type TraeWebCheckinClaim, type TraeWebCredits, type TraeWebUsage, type TraeWireModel, type TraeWireTarget, UnconfiguredTraeUpstreamClient, adaptLegacyPiAiContext, adaptModernPiAiContext, apply, applyContextBudgets, applyImageSelection, applyReasoningEffort, asVolatile, bridgeTraeSoloStream, buildTraeAgentTaskBody, buildTraeCnHeaders, buildTraeFusionRawChatEnvelope, buildTraeModelDetailRequest, buildTraeRawChatDraft, buildTraeRawChatRuntimeConfig, classifyProbeError, classifyProbeResult, classifyTraeRawChatFailure, configuredAccountsOf, createTraeAdapter, createTraeRawGateway, createTraeShim, creditPosition, decidePiAiGeneration, decodeRawChatChunk, decodeTraeEvent, decryptTraeStorageValue, deriveCatalog, describeIdShape, describeNameShape, describeTraeFailure, discoveredCatalog, displayNameOfTraeProvider, fallbackModelsFor, generationOf, hashTraeRawChatArg, identityHeaders, inject, isEnterpriseAccount, isPromotableWireModel, legacyTraeOwnAuthPath, maskUserPath, mergeTraeModelSources, name, nextRegionCreditPosition, nextRegionEnabled, nextRegionSlots, normalizeTraeCredential, normalizeTraeVersionCode, panelOfKey, panelOfProvider, parseObservedModelConfig, parseReasoningCapability, parseTraeAuthValue, parseTraeCachedModel, parseTraeModelExtraConfigLogLine, parseTraeRawChatBehaviorConfig, parseTraeRemoteModel, parseTraeStorageDocument, piAiRuntimeInfo, pickTraeStorageIdentity, prepareSoloBody, probeBody, probeModelsSequentially, probeOneModel, probeTraeRawChatCapability, providerOfPanel, rawCapabilityDiagnostic, rawCapabilityFingerprint, readTraeCachedModel, readTraeCliIdentity, readTraeIdentity, refreshTraeCredential, regionCreditPositionOf, regionEnabled, regionEnabledOf, regionOfCredential, regionOfEdition, regionOfHost, regionOfPanel, regionOfTraeProvider, regionOfTraeStatusUrl, regionOfUserRegion, regionStateOf, registerTraeUsageRoute, resolveTraeIdentity, resolveTraeRawRuntime, routeOfTraeProvider, sanitizeCatalog, settingsNamespaceOf, traeEndpoint, traeInputModalities, traeModelDisplayName, traeOwnAuthPath, traeRawChatExtraInfo, traeStateDatabaseCandidates, traeStorageCandidates, traeWebUsage, traeWindowsAppNames, unwrapVolatile, unwrapVolatileDeep, wireTargetsOf, withContextAdaptation, withTraeRegion };
|
|
4031
|
+
export { Config, FALLBACK_TRAE_MODELS, FALLBACK_TRAE_MODELS_AI, MAX_PROBE_INPUT_TOKENS, type PiAiGeneration, type PiAiRuntimeInfo, REGION_GATEWAYS, type RawChatDelta, type RawChatMessage, type RawChatTool, SseDecoder, type SseEvent, TRAE_ACCOUNT_STATUS_PATH, TRAE_AI_PROVIDER, TRAE_CHECKIN_PATH, TRAE_CN_AGENT_TASK_PATH, TRAE_CN_TITLE_PATH, TRAE_ENTERPRISE_PROVIDER, TRAE_MODELS_TEST_PATH, TRAE_MODEL_DETAIL_FUNCTIONS, TRAE_MODEL_DETAIL_PATH, TRAE_PANELS, TRAE_PAY_BASE, TRAE_PROBE_TIMEOUT_MS, TRAE_PROVIDER, TRAE_PROVIDERS, TRAE_PROVIDER_DISPLAY_NAMES, TRAE_PROVIDER_IDS, TRAE_PROVIDER_ID_DISPLAY_NAMES, TRAE_PROVIDER_ROUTES, TRAE_RAW_CHAT_V1_PATH, TRAE_RAW_CHAT_V2_PATH, TRAE_REASONING_EFFORTS, TRAE_REGIONS, TRAE_REGION_PARAM, TRAE_SETTINGS_NS, TRAE_SOLO_CHAT_PATH, TRAE_SOLO_FUNCTION, TRAE_SOLO_MODELS_PATH, TRAE_SOLO_REMOTE_BASE, TRAE_STATE_DB_FILENAME, TRAE_STREAM_IDLE_TIMEOUT_MS, TRAE_USAGE_PATH, TRAE_VERSION_CODE_FALLBACK, type TraeActivityRule, type TraeAdapter, type TraeCachedModelConfig, TraeCatalog, type TraeChatResult, type TraeCheckinClaim, type TraeCheckinStatus, type TraeContextBudget, type TraeCredential, TraeCredentialStore, TraeDelegatingUpstreamClient, type TraeDiscoveredModel, type TraeDiscoveredReasoning, type TraeEdition, type TraeFailure, TraeFallbackUpstreamClient, type TraeFallbackUpstreamOptions, type TraeFusionRawChatEnvelope, TraeGatedUpstreamClient, type TraeGatedUpstreamOptions, type TraeIdentity, type TraeInputModality, type TraeModelDetailRequest, type TraeModelInfo, type TraeModelProbeVerdict, type TraeModelsTestResponse, type TraeObservedModelConfig, type TraePanel, type TraeProbeResult, type TraeProbeVerdict, type TraeProviderRoute, TraeRawCapabilityController, type TraeRawCapabilityControllerOptions, type TraeRawCapabilitySnapshot, TraeRawCapabilityState, type TraeRawChatBehaviorConfig, type TraeRawChatCapability, type TraeRawChatClientOptions, type TraeRawChatConfig, type TraeRawChatFailureReason, type TraeRawChatRuntimeConfig, TraeRawChatUpstreamClient, type TraeRawDiagnostic, type TraeRawDiagnosticState, type TraeRawGateway, type TraeRawGatewayOptions, type TraeRawResolverResult, type TraeReasoningCapability, type TraeReasoningEffort, type TraeRefreshDevice, type TraeRegion, type TraeRegionGateways, TraeRegionState, type TraeShim, TraeSoloBridge, type TraeSoloClientOptions, TraeSoloRemoteCatalogClient, type TraeSoloRemoteCatalogOptions, TraeSoloUpstreamClient, type TraeStorageCandidate, type TraeStreamEvent, type TraeUpstreamClient, TraeUsageClient, type TraeUsageOptions, type TraeUsagePack, type TraeUsageRouteOptions, type TraeUsageSnapshot, type TraeUsageSummary, type TraeUsageView, type TraeWebAccountState, type TraeWebActivity, type TraeWebCheckin, type TraeWebCheckinClaim, type TraeWebCredits, type TraeWebUsage, type TraeWireModel, type TraeWireTarget, UnconfiguredTraeUpstreamClient, adaptLegacyPiAiContext, adaptModernPiAiContext, apply, applyContextBudgets, applyImageSelection, applyReasoningEffort, asVolatile, bridgeTraeSoloStream, buildTraeAgentTaskBody, buildTraeCnHeaders, buildTraeFusionRawChatEnvelope, buildTraeModelDetailRequest, buildTraeRawChatDraft, buildTraeRawChatRuntimeConfig, classifyProbeError, classifyProbeResult, classifyTraeRawChatFailure, configuredAccountsOf, createTraeAdapter, createTraeRawGateway, createTraeShim, creditPosition, decidePiAiGeneration, decodeRawChatChunk, decodeTraeEvent, decryptTraeStorageValue, deriveCatalog, describeIdShape, describeNameShape, describeTraeFailure, discoveredCatalog, displayNameOfTraeProvider, fallbackModelsFor, generationOf, hashTraeRawChatArg, identityHeaders, inject, isEnterpriseAccount, isPromotableWireModel, legacyTraeOwnAuthPath, maskUserPath, mergeTraeModelSources, name, nextRegionCreditPosition, nextRegionEnabled, nextRegionSlots, normalizeTraeCredential, normalizeTraeToolSchema, normalizeTraeToolSchemas, normalizeTraeVersionCode, panelOfKey, panelOfProvider, parseObservedModelConfig, parseReasoningCapability, parseTraeAuthValue, parseTraeCachedModel, parseTraeModelExtraConfigLogLine, parseTraeRawChatBehaviorConfig, parseTraeRemoteModel, parseTraeStorageDocument, piAiRuntimeInfo, pickTraeStorageIdentity, prepareSoloBody, probeBody, probeModelsSequentially, probeOneModel, probeTraeRawChatCapability, providerOfPanel, rawCapabilityDiagnostic, rawCapabilityFingerprint, readTraeCachedModel, readTraeCliIdentity, readTraeIdentity, refreshTraeCredential, regionCreditPositionOf, regionEnabled, regionEnabledOf, regionOfCredential, regionOfEdition, regionOfHost, regionOfPanel, regionOfTraeProvider, regionOfTraeStatusUrl, regionOfUserRegion, regionStateOf, registerTraeUsageRoute, resolveTraeIdentity, resolveTraeRawRuntime, routeOfTraeProvider, sanitizeCatalog, settingsNamespaceOf, traeEndpoint, traeInputModalities, traeModelDisplayName, traeOwnAuthPath, traeRawChatExtraInfo, traeStateDatabaseCandidates, traeStorageCandidates, traeWebUsage, traeWindowsAppNames, unwrapVolatile, unwrapVolatileDeep, wireTargetsOf, withContextAdaptation, withTraeRegion };
|
package/lib/index.js
CHANGED
|
@@ -3874,6 +3874,147 @@ function traeEndpoint(baseUrl, path) {
|
|
|
3874
3874
|
return `${baseUrl.replace(/\/$/, "")}/${path.replace(/^\//, "")}`;
|
|
3875
3875
|
}
|
|
3876
3876
|
//#endregion
|
|
3877
|
+
//#region src/raw-chat.ts
|
|
3878
|
+
const TRAE_RAW_CHAT_V2_PATH = "/api/ide/v2/llm_raw_chat";
|
|
3879
|
+
const TRAE_RAW_CHAT_V1_PATH = "/api/ide/v1/llm_raw_chat";
|
|
3880
|
+
/**
|
|
3881
|
+
* Normalise a tool `parameters` schema from JSON Schema draft-3 style to
|
|
3882
|
+
* draft-4 style (issue #49).
|
|
3883
|
+
*
|
|
3884
|
+
* Draft-3 declared a required property by putting a boolean `required: true`
|
|
3885
|
+
* INSIDE the property schema:
|
|
3886
|
+
*
|
|
3887
|
+
* { "type": "object", "properties": { "tool": { "type": "string", "required": true } } }
|
|
3888
|
+
*
|
|
3889
|
+
* Draft-4 removed the per-property boolean and uses a parent-level string
|
|
3890
|
+
* array instead: `{ "required": ["tool"] }`. The Trae backends disagree on how
|
|
3891
|
+
* strictly they check this: the Zhipu backend (glm-5.2) tolerates draft-3
|
|
3892
|
+
* `required: true`, but the DeepSeek backend (deepseek-v4.1-flash) rejects the
|
|
3893
|
+
* whole request with `4027 … tools.N.function.parameters/properties/X/required:
|
|
3894
|
+
* invalid JSON Schema` whenever ANY tool carries the boolean form — and
|
|
3895
|
+
* `tools.N` are validated as a batch, so one bad schema fails the entire turn
|
|
3896
|
+
* (issue #49, after #48). Since a model's backend is chosen by the upstream
|
|
3897
|
+
* router and can change per config, every tool-carrying request must be
|
|
3898
|
+
* draft-4 clean regardless of which backend the probe last saw.
|
|
3899
|
+
*
|
|
3900
|
+
* The rewrite is local, idempotent, and recursive: it lifts each boolean
|
|
3901
|
+
* `required` up to the enclosing schema's `required` array (merging with any
|
|
3902
|
+
* array already present), then drops the boolean. Non-object property entries
|
|
3903
|
+
* are left untouched — draft-4 forbids boolean schemas anyway, so no boolean
|
|
3904
|
+
* `required` can hide inside them.
|
|
3905
|
+
*/
|
|
3906
|
+
function normalizeTraeToolSchema(value) {
|
|
3907
|
+
if (Array.isArray(value)) {
|
|
3908
|
+
let changed = false;
|
|
3909
|
+
const items = value.map((item) => {
|
|
3910
|
+
const next = normalizeTraeToolSchema(item);
|
|
3911
|
+
if (next !== item) changed = true;
|
|
3912
|
+
return next;
|
|
3913
|
+
});
|
|
3914
|
+
return changed ? items : value;
|
|
3915
|
+
}
|
|
3916
|
+
if (typeof value !== "object" || value === null) return value;
|
|
3917
|
+
const source = value;
|
|
3918
|
+
const result = {};
|
|
3919
|
+
for (const [key, entry] of Object.entries(source)) {
|
|
3920
|
+
if (key === "required" && typeof entry === "boolean") continue;
|
|
3921
|
+
result[key] = normalizeTraeToolSchema(entry);
|
|
3922
|
+
}
|
|
3923
|
+
const properties = source["properties"];
|
|
3924
|
+
if (typeof properties === "object" && properties !== null && !Array.isArray(properties)) {
|
|
3925
|
+
const promoted = [];
|
|
3926
|
+
if (Array.isArray(source["required"])) {
|
|
3927
|
+
for (const name of source["required"]) if (typeof name === "string" && !promoted.includes(name)) promoted.push(name);
|
|
3928
|
+
}
|
|
3929
|
+
for (const [name, property] of Object.entries(properties)) if (typeof property === "object" && property !== null && property["required"] === true && !promoted.includes(name)) promoted.push(name);
|
|
3930
|
+
if (promoted.length > 0) result["required"] = promoted;
|
|
3931
|
+
}
|
|
3932
|
+
return JSON.stringify(result) === JSON.stringify(value) ? value : result;
|
|
3933
|
+
}
|
|
3934
|
+
/** Issue #49: apply `normalizeTraeToolSchema` to an OpenAI-style tool list. */
|
|
3935
|
+
function normalizeTraeToolSchemas(tools) {
|
|
3936
|
+
return tools.map((tool) => normalizeTraeToolSchema(tool));
|
|
3937
|
+
}
|
|
3938
|
+
/**
|
|
3939
|
+
* Evidence-bounded OpenAI-like draft inferred from Trae's LLMRaw* DTO symbols.
|
|
3940
|
+
* Pure/offline only: the upstream remains disabled until one controlled probe.
|
|
3941
|
+
*/
|
|
3942
|
+
function buildTraeRawChatDraft(input) {
|
|
3943
|
+
if (input.model.trim() === "") throw new Error("Trae raw chat requires a model");
|
|
3944
|
+
if (input.messages.length === 0) throw new Error("Trae raw chat requires messages");
|
|
3945
|
+
return {
|
|
3946
|
+
model: input.model,
|
|
3947
|
+
messages: structuredClone([...input.messages]),
|
|
3948
|
+
stream: true,
|
|
3949
|
+
...input.tools === void 0 || input.tools.length === 0 ? {} : { tools: normalizeTraeToolSchemas(structuredClone([...input.tools])) },
|
|
3950
|
+
...input.maxTokens === void 0 ? {} : { max_tokens: input.maxTokens },
|
|
3951
|
+
...input.temperature === void 0 ? {} : { temperature: input.temperature },
|
|
3952
|
+
...input.reasoningEffort === void 0 ? {} : { reasoning_effort: input.reasoningEffort },
|
|
3953
|
+
...input.extraInfo === void 0 ? {} : { extra_info: structuredClone(input.extraInfo) }
|
|
3954
|
+
};
|
|
3955
|
+
}
|
|
3956
|
+
/** Decode OpenAI-like raw-chat chunks while preserving unknown structures. */
|
|
3957
|
+
function decodeRawChatChunk(value) {
|
|
3958
|
+
if (value === "[DONE]") return [{
|
|
3959
|
+
type: "done",
|
|
3960
|
+
finishReason: "stop"
|
|
3961
|
+
}];
|
|
3962
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return [{
|
|
3963
|
+
type: "unknown",
|
|
3964
|
+
value
|
|
3965
|
+
}];
|
|
3966
|
+
const record = value;
|
|
3967
|
+
const result = [];
|
|
3968
|
+
const choices = Array.isArray(record["choices"]) ? record["choices"] : [];
|
|
3969
|
+
for (const rawChoice of choices) {
|
|
3970
|
+
if (typeof rawChoice !== "object" || rawChoice === null) continue;
|
|
3971
|
+
const choice = rawChoice;
|
|
3972
|
+
const delta = typeof choice["delta"] === "object" && choice["delta"] !== null ? choice["delta"] : {};
|
|
3973
|
+
if (typeof delta["reasoning_content"] === "string" && delta["reasoning_content"] !== "") result.push({
|
|
3974
|
+
type: "reasoning",
|
|
3975
|
+
text: delta["reasoning_content"]
|
|
3976
|
+
});
|
|
3977
|
+
if (typeof delta["content"] === "string" && delta["content"] !== "") result.push({
|
|
3978
|
+
type: "text",
|
|
3979
|
+
text: delta["content"]
|
|
3980
|
+
});
|
|
3981
|
+
if (Array.isArray(delta["tool_calls"])) for (const rawTool of delta["tool_calls"]) {
|
|
3982
|
+
if (typeof rawTool !== "object" || rawTool === null) continue;
|
|
3983
|
+
const tool = rawTool;
|
|
3984
|
+
const fn = typeof tool["function"] === "object" && tool["function"] !== null ? tool["function"] : {};
|
|
3985
|
+
result.push({
|
|
3986
|
+
type: "tool-call",
|
|
3987
|
+
index: typeof tool["index"] === "number" ? tool["index"] : 0,
|
|
3988
|
+
...typeof tool["id"] === "string" ? { id: tool["id"] } : {},
|
|
3989
|
+
...typeof fn["name"] === "string" ? { name: fn["name"] } : {},
|
|
3990
|
+
...typeof fn["arguments"] === "string" ? { arguments: fn["arguments"] } : {}
|
|
3991
|
+
});
|
|
3992
|
+
}
|
|
3993
|
+
if (typeof choice["finish_reason"] === "string" && choice["finish_reason"] !== "") result.push({
|
|
3994
|
+
type: "done",
|
|
3995
|
+
finishReason: choice["finish_reason"]
|
|
3996
|
+
});
|
|
3997
|
+
}
|
|
3998
|
+
if (typeof record["usage"] === "object" && record["usage"] !== null) {
|
|
3999
|
+
const usage = record["usage"];
|
|
4000
|
+
const details = typeof usage["prompt_tokens_details"] === "object" && usage["prompt_tokens_details"] !== null ? usage["prompt_tokens_details"] : {};
|
|
4001
|
+
const cacheRead = details["cached_tokens"] ?? usage["prompt_cache_hit_tokens"] ?? usage["cached_tokens"];
|
|
4002
|
+
const cacheWrite = details["cache_write_tokens"];
|
|
4003
|
+
result.push({
|
|
4004
|
+
type: "usage",
|
|
4005
|
+
...typeof usage["prompt_tokens"] === "number" ? { inputTokens: usage["prompt_tokens"] } : {},
|
|
4006
|
+
...typeof usage["completion_tokens"] === "number" ? { outputTokens: usage["completion_tokens"] } : {},
|
|
4007
|
+
...typeof usage["total_tokens"] === "number" ? { totalTokens: usage["total_tokens"] } : {},
|
|
4008
|
+
...typeof cacheRead === "number" ? { cacheReadTokens: cacheRead } : {},
|
|
4009
|
+
...typeof cacheWrite === "number" ? { cacheWriteTokens: cacheWrite } : {}
|
|
4010
|
+
});
|
|
4011
|
+
}
|
|
4012
|
+
return result.length === 0 ? [{
|
|
4013
|
+
type: "unknown",
|
|
4014
|
+
value
|
|
4015
|
+
}] : result;
|
|
4016
|
+
}
|
|
4017
|
+
//#endregion
|
|
3877
4018
|
//#region src/promo.ts
|
|
3878
4019
|
function record$1(value) {
|
|
3879
4020
|
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
@@ -4127,7 +4268,7 @@ function prepareSoloBody(source, defaultModel = "glm-5.2", functionName) {
|
|
|
4127
4268
|
const fn = raw["function"];
|
|
4128
4269
|
if (typeof fn !== "object" || fn === null) continue;
|
|
4129
4270
|
const record = fn;
|
|
4130
|
-
if (typeof record["parameters"] === "object" && record["parameters"] !== null) record["parameters"] = JSON.stringify(record["parameters"]);
|
|
4271
|
+
if (typeof record["parameters"] === "object" && record["parameters"] !== null) record["parameters"] = JSON.stringify(normalizeTraeToolSchema(record["parameters"]));
|
|
4131
4272
|
}
|
|
4132
4273
|
return JSON.stringify(body);
|
|
4133
4274
|
}
|
|
@@ -5588,89 +5729,6 @@ var TraeSoloRemoteCatalogClient = class TraeSoloRemoteCatalogClient {
|
|
|
5588
5729
|
}
|
|
5589
5730
|
};
|
|
5590
5731
|
//#endregion
|
|
5591
|
-
//#region src/raw-chat.ts
|
|
5592
|
-
const TRAE_RAW_CHAT_V2_PATH = "/api/ide/v2/llm_raw_chat";
|
|
5593
|
-
const TRAE_RAW_CHAT_V1_PATH = "/api/ide/v1/llm_raw_chat";
|
|
5594
|
-
/**
|
|
5595
|
-
* Evidence-bounded OpenAI-like draft inferred from Trae's LLMRaw* DTO symbols.
|
|
5596
|
-
* Pure/offline only: the upstream remains disabled until one controlled probe.
|
|
5597
|
-
*/
|
|
5598
|
-
function buildTraeRawChatDraft(input) {
|
|
5599
|
-
if (input.model.trim() === "") throw new Error("Trae raw chat requires a model");
|
|
5600
|
-
if (input.messages.length === 0) throw new Error("Trae raw chat requires messages");
|
|
5601
|
-
return {
|
|
5602
|
-
model: input.model,
|
|
5603
|
-
messages: structuredClone([...input.messages]),
|
|
5604
|
-
stream: true,
|
|
5605
|
-
...input.tools === void 0 || input.tools.length === 0 ? {} : { tools: structuredClone([...input.tools]) },
|
|
5606
|
-
...input.maxTokens === void 0 ? {} : { max_tokens: input.maxTokens },
|
|
5607
|
-
...input.temperature === void 0 ? {} : { temperature: input.temperature },
|
|
5608
|
-
...input.reasoningEffort === void 0 ? {} : { reasoning_effort: input.reasoningEffort },
|
|
5609
|
-
...input.extraInfo === void 0 ? {} : { extra_info: structuredClone(input.extraInfo) }
|
|
5610
|
-
};
|
|
5611
|
-
}
|
|
5612
|
-
/** Decode OpenAI-like raw-chat chunks while preserving unknown structures. */
|
|
5613
|
-
function decodeRawChatChunk(value) {
|
|
5614
|
-
if (value === "[DONE]") return [{
|
|
5615
|
-
type: "done",
|
|
5616
|
-
finishReason: "stop"
|
|
5617
|
-
}];
|
|
5618
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) return [{
|
|
5619
|
-
type: "unknown",
|
|
5620
|
-
value
|
|
5621
|
-
}];
|
|
5622
|
-
const record = value;
|
|
5623
|
-
const result = [];
|
|
5624
|
-
const choices = Array.isArray(record["choices"]) ? record["choices"] : [];
|
|
5625
|
-
for (const rawChoice of choices) {
|
|
5626
|
-
if (typeof rawChoice !== "object" || rawChoice === null) continue;
|
|
5627
|
-
const choice = rawChoice;
|
|
5628
|
-
const delta = typeof choice["delta"] === "object" && choice["delta"] !== null ? choice["delta"] : {};
|
|
5629
|
-
if (typeof delta["reasoning_content"] === "string" && delta["reasoning_content"] !== "") result.push({
|
|
5630
|
-
type: "reasoning",
|
|
5631
|
-
text: delta["reasoning_content"]
|
|
5632
|
-
});
|
|
5633
|
-
if (typeof delta["content"] === "string" && delta["content"] !== "") result.push({
|
|
5634
|
-
type: "text",
|
|
5635
|
-
text: delta["content"]
|
|
5636
|
-
});
|
|
5637
|
-
if (Array.isArray(delta["tool_calls"])) for (const rawTool of delta["tool_calls"]) {
|
|
5638
|
-
if (typeof rawTool !== "object" || rawTool === null) continue;
|
|
5639
|
-
const tool = rawTool;
|
|
5640
|
-
const fn = typeof tool["function"] === "object" && tool["function"] !== null ? tool["function"] : {};
|
|
5641
|
-
result.push({
|
|
5642
|
-
type: "tool-call",
|
|
5643
|
-
index: typeof tool["index"] === "number" ? tool["index"] : 0,
|
|
5644
|
-
...typeof tool["id"] === "string" ? { id: tool["id"] } : {},
|
|
5645
|
-
...typeof fn["name"] === "string" ? { name: fn["name"] } : {},
|
|
5646
|
-
...typeof fn["arguments"] === "string" ? { arguments: fn["arguments"] } : {}
|
|
5647
|
-
});
|
|
5648
|
-
}
|
|
5649
|
-
if (typeof choice["finish_reason"] === "string" && choice["finish_reason"] !== "") result.push({
|
|
5650
|
-
type: "done",
|
|
5651
|
-
finishReason: choice["finish_reason"]
|
|
5652
|
-
});
|
|
5653
|
-
}
|
|
5654
|
-
if (typeof record["usage"] === "object" && record["usage"] !== null) {
|
|
5655
|
-
const usage = record["usage"];
|
|
5656
|
-
const details = typeof usage["prompt_tokens_details"] === "object" && usage["prompt_tokens_details"] !== null ? usage["prompt_tokens_details"] : {};
|
|
5657
|
-
const cacheRead = details["cached_tokens"] ?? usage["prompt_cache_hit_tokens"] ?? usage["cached_tokens"];
|
|
5658
|
-
const cacheWrite = details["cache_write_tokens"];
|
|
5659
|
-
result.push({
|
|
5660
|
-
type: "usage",
|
|
5661
|
-
...typeof usage["prompt_tokens"] === "number" ? { inputTokens: usage["prompt_tokens"] } : {},
|
|
5662
|
-
...typeof usage["completion_tokens"] === "number" ? { outputTokens: usage["completion_tokens"] } : {},
|
|
5663
|
-
...typeof usage["total_tokens"] === "number" ? { totalTokens: usage["total_tokens"] } : {},
|
|
5664
|
-
...typeof cacheRead === "number" ? { cacheReadTokens: cacheRead } : {},
|
|
5665
|
-
...typeof cacheWrite === "number" ? { cacheWriteTokens: cacheWrite } : {}
|
|
5666
|
-
});
|
|
5667
|
-
}
|
|
5668
|
-
return result.length === 0 ? [{
|
|
5669
|
-
type: "unknown",
|
|
5670
|
-
value
|
|
5671
|
-
}] : result;
|
|
5672
|
-
}
|
|
5673
|
-
//#endregion
|
|
5674
5732
|
//#region src/raw-runtime-config.ts
|
|
5675
5733
|
/** Merge safe current-cache facts with observed behavior flags; no network credentials enter this object. */
|
|
5676
5734
|
function traeRawChatExtraInfo(config) {
|
|
@@ -10235,4 +10293,4 @@ function apply(ctx, config) {
|
|
|
10235
10293
|
});
|
|
10236
10294
|
}
|
|
10237
10295
|
//#endregion
|
|
10238
|
-
export { Config, FALLBACK_TRAE_MODELS, FALLBACK_TRAE_MODELS_AI, MAX_PROBE_INPUT_TOKENS, REGION_GATEWAYS, SseDecoder, TRAE_ACCOUNT_STATUS_PATH, TRAE_AI_PROVIDER, TRAE_CHECKIN_PATH, TRAE_CN_AGENT_TASK_PATH, TRAE_CN_TITLE_PATH, TRAE_ENTERPRISE_PROVIDER, TRAE_MODELS_TEST_PATH, TRAE_MODEL_DETAIL_FUNCTIONS, TRAE_MODEL_DETAIL_PATH, TRAE_PANELS, TRAE_PAY_BASE, TRAE_PROBE_TIMEOUT_MS, TRAE_PROVIDER, TRAE_PROVIDERS, TRAE_PROVIDER_DISPLAY_NAMES, TRAE_PROVIDER_IDS, TRAE_PROVIDER_ID_DISPLAY_NAMES, TRAE_PROVIDER_ROUTES, TRAE_RAW_CHAT_V1_PATH, TRAE_RAW_CHAT_V2_PATH, TRAE_REASONING_EFFORTS, TRAE_REGIONS, TRAE_REGION_PARAM, TRAE_SETTINGS_NS, TRAE_SOLO_CHAT_PATH, TRAE_SOLO_FUNCTION, TRAE_SOLO_MODELS_PATH, TRAE_SOLO_REMOTE_BASE, TRAE_STATE_DB_FILENAME, TRAE_STREAM_IDLE_TIMEOUT_MS, TRAE_USAGE_PATH, TRAE_VERSION_CODE_FALLBACK, TraeCatalog, TraeCredentialStore, TraeDelegatingUpstreamClient, TraeFallbackUpstreamClient, TraeGatedUpstreamClient, TraeRawCapabilityController, TraeRawCapabilityState, TraeRawChatUpstreamClient, TraeSoloBridge, TraeSoloRemoteCatalogClient, TraeSoloUpstreamClient, TraeUsageClient, UnconfiguredTraeUpstreamClient, adaptLegacyPiAiContext, adaptModernPiAiContext, apply, applyContextBudgets, applyImageSelection, applyReasoningEffort, asVolatile, bridgeTraeSoloStream, buildTraeAgentTaskBody, buildTraeCnHeaders, buildTraeFusionRawChatEnvelope, buildTraeModelDetailRequest, buildTraeRawChatDraft, buildTraeRawChatRuntimeConfig, classifyProbeError, classifyProbeResult, classifyTraeRawChatFailure, configuredAccountsOf, createTraeAdapter, createTraeRawGateway, createTraeShim, creditPosition, decidePiAiGeneration, decodeRawChatChunk, decodeTraeEvent, decryptTraeStorageValue, deriveCatalog, describeIdShape, describeNameShape, describeTraeFailure, discoveredCatalog, displayNameOfTraeProvider, fallbackModelsFor, generationOf, hashTraeRawChatArg, identityHeaders, inject, isEnterpriseAccount, isPromotableWireModel, legacyTraeOwnAuthPath, maskUserPath, mergeTraeModelSources, name, nextRegionCreditPosition, nextRegionEnabled, nextRegionSlots, normalizeTraeCredential, normalizeTraeVersionCode, panelOfKey, panelOfProvider, parseObservedModelConfig, parseReasoningCapability, parseTraeAuthValue, parseTraeCachedModel, parseTraeModelExtraConfigLogLine, parseTraeRawChatBehaviorConfig, parseTraeRemoteModel, parseTraeStorageDocument, piAiRuntimeInfo, pickTraeStorageIdentity, prepareSoloBody, probeBody, probeModelsSequentially, probeOneModel, probeTraeRawChatCapability, providerOfPanel, rawCapabilityDiagnostic, rawCapabilityFingerprint, readTraeCachedModel, readTraeCliIdentity, readTraeIdentity, refreshTraeCredential, regionCreditPositionOf, regionEnabled, regionEnabledOf, regionOfCredential, regionOfEdition, regionOfHost, regionOfPanel, regionOfTraeProvider, regionOfTraeStatusUrl, regionOfUserRegion, regionStateOf, registerTraeUsageRoute, resolveTraeIdentity, resolveTraeRawRuntime, routeOfTraeProvider, sanitizeCatalog, settingsNamespaceOf, traeEndpoint, traeInputModalities, traeModelDisplayName, traeOwnAuthPath, traeRawChatExtraInfo, traeStateDatabaseCandidates, traeStorageCandidates, traeWebUsage, traeWindowsAppNames, unwrapVolatile, unwrapVolatileDeep, wireTargetsOf, withContextAdaptation, withTraeRegion };
|
|
10296
|
+
export { Config, FALLBACK_TRAE_MODELS, FALLBACK_TRAE_MODELS_AI, MAX_PROBE_INPUT_TOKENS, REGION_GATEWAYS, SseDecoder, TRAE_ACCOUNT_STATUS_PATH, TRAE_AI_PROVIDER, TRAE_CHECKIN_PATH, TRAE_CN_AGENT_TASK_PATH, TRAE_CN_TITLE_PATH, TRAE_ENTERPRISE_PROVIDER, TRAE_MODELS_TEST_PATH, TRAE_MODEL_DETAIL_FUNCTIONS, TRAE_MODEL_DETAIL_PATH, TRAE_PANELS, TRAE_PAY_BASE, TRAE_PROBE_TIMEOUT_MS, TRAE_PROVIDER, TRAE_PROVIDERS, TRAE_PROVIDER_DISPLAY_NAMES, TRAE_PROVIDER_IDS, TRAE_PROVIDER_ID_DISPLAY_NAMES, TRAE_PROVIDER_ROUTES, TRAE_RAW_CHAT_V1_PATH, TRAE_RAW_CHAT_V2_PATH, TRAE_REASONING_EFFORTS, TRAE_REGIONS, TRAE_REGION_PARAM, TRAE_SETTINGS_NS, TRAE_SOLO_CHAT_PATH, TRAE_SOLO_FUNCTION, TRAE_SOLO_MODELS_PATH, TRAE_SOLO_REMOTE_BASE, TRAE_STATE_DB_FILENAME, TRAE_STREAM_IDLE_TIMEOUT_MS, TRAE_USAGE_PATH, TRAE_VERSION_CODE_FALLBACK, TraeCatalog, TraeCredentialStore, TraeDelegatingUpstreamClient, TraeFallbackUpstreamClient, TraeGatedUpstreamClient, TraeRawCapabilityController, TraeRawCapabilityState, TraeRawChatUpstreamClient, TraeSoloBridge, TraeSoloRemoteCatalogClient, TraeSoloUpstreamClient, TraeUsageClient, UnconfiguredTraeUpstreamClient, adaptLegacyPiAiContext, adaptModernPiAiContext, apply, applyContextBudgets, applyImageSelection, applyReasoningEffort, asVolatile, bridgeTraeSoloStream, buildTraeAgentTaskBody, buildTraeCnHeaders, buildTraeFusionRawChatEnvelope, buildTraeModelDetailRequest, buildTraeRawChatDraft, buildTraeRawChatRuntimeConfig, classifyProbeError, classifyProbeResult, classifyTraeRawChatFailure, configuredAccountsOf, createTraeAdapter, createTraeRawGateway, createTraeShim, creditPosition, decidePiAiGeneration, decodeRawChatChunk, decodeTraeEvent, decryptTraeStorageValue, deriveCatalog, describeIdShape, describeNameShape, describeTraeFailure, discoveredCatalog, displayNameOfTraeProvider, fallbackModelsFor, generationOf, hashTraeRawChatArg, identityHeaders, inject, isEnterpriseAccount, isPromotableWireModel, legacyTraeOwnAuthPath, maskUserPath, mergeTraeModelSources, name, nextRegionCreditPosition, nextRegionEnabled, nextRegionSlots, normalizeTraeCredential, normalizeTraeToolSchema, normalizeTraeToolSchemas, normalizeTraeVersionCode, panelOfKey, panelOfProvider, parseObservedModelConfig, parseReasoningCapability, parseTraeAuthValue, parseTraeCachedModel, parseTraeModelExtraConfigLogLine, parseTraeRawChatBehaviorConfig, parseTraeRemoteModel, parseTraeStorageDocument, piAiRuntimeInfo, pickTraeStorageIdentity, prepareSoloBody, probeBody, probeModelsSequentially, probeOneModel, probeTraeRawChatCapability, providerOfPanel, rawCapabilityDiagnostic, rawCapabilityFingerprint, readTraeCachedModel, readTraeCliIdentity, readTraeIdentity, refreshTraeCredential, regionCreditPositionOf, regionEnabled, regionEnabledOf, regionOfCredential, regionOfEdition, regionOfHost, regionOfPanel, regionOfTraeProvider, regionOfTraeStatusUrl, regionOfUserRegion, regionStateOf, registerTraeUsageRoute, resolveTraeIdentity, resolveTraeRawRuntime, routeOfTraeProvider, sanitizeCatalog, settingsNamespaceOf, traeEndpoint, traeInputModalities, traeModelDisplayName, traeOwnAuthPath, traeRawChatExtraInfo, traeStateDatabaseCandidates, traeStorageCandidates, traeWebUsage, traeWindowsAppNames, unwrapVolatile, unwrapVolatileDeep, wireTargetsOf, withContextAdaptation, withTraeRegion };
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dsh-connect-trae",
|
|
3
3
|
"displayName": "DSH Connect Trae",
|
|
4
4
|
"description": "把本机登录的 Trae 模型接入 DeepSeek Harness:国内版与国际版双供应商并行,提供用量/积分概览与每日签到领取。",
|
|
5
|
-
"version": "4.4.
|
|
5
|
+
"version": "4.4.2",
|
|
6
6
|
"author": "dingminhua",
|
|
7
7
|
"copyright": "Copyright (c) 2026 LaoDing",
|
|
8
8
|
"license": "MIT",
|