@sema-agent/client-core 0.77.0 → 0.77.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 +23 -1
- package/README.md +5 -4
- package/dist/abortableSleep.d.ts +0 -28
- package/dist/abortableSleep.js +0 -28
- package/dist/adapt/arms.d.ts +0 -46
- package/dist/adapt/arms.js +9 -544
- package/dist/adapt/ids.d.ts +0 -58
- package/dist/adapt/ids.js +0 -63
- package/dist/adapt/instanceLedger.d.ts +0 -25
- package/dist/adapt/instanceLedger.js +0 -20
- package/dist/adapt/panelTasks.d.ts +0 -69
- package/dist/adapt/panelTasks.js +0 -95
- package/dist/adapt/textSegmentAuthority.d.ts +1 -137
- package/dist/adapt/textSegmentAuthority.js +0 -54
- package/dist/adapt/textStream.d.ts +0 -252
- package/dist/adapt/textStream.js +2 -281
- package/dist/adapt/toolCards.d.ts +0 -46
- package/dist/adapt/toolCards.js +0 -23
- package/dist/adapt/turnFlags.d.ts +0 -54
- package/dist/adapt/turnFlags.js +1 -17
- package/dist/adapt/wireShapes.d.ts +0 -92
- package/dist/adapt/wireShapes.js +0 -83
- package/dist/adapt.d.ts +0 -55
- package/dist/adapt.js +1 -120
- package/dist/adapter/activeRunSelfHeal.d.ts +22 -515
- package/dist/adapter/activeRunSelfHeal.js +10 -625
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -305
- package/dist/adapter/downstream/eventToSdkMessage.js +2 -867
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -314
- package/dist/adapter/downstream/terminalToSdkResult.js +13 -560
- package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +0 -95
- package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -31
- package/dist/adapter/runStream.d.ts +0 -206
- package/dist/adapter/runStream.js +6 -596
- package/dist/adapter/types.d.ts +0 -111
- package/dist/adapter/types.js +0 -29
- package/dist/agentSession/backgroundView.d.ts +0 -106
- package/dist/agentSession/backgroundView.js +3 -49
- package/dist/agentSession/contract.d.ts +0 -98
- package/dist/agentSession/contract.js +0 -12
- package/dist/agentsWireCaps.d.ts +0 -72
- package/dist/agentsWireCaps.js +4 -72
- package/dist/approvalsStreamLiveCapability.d.ts +0 -25
- package/dist/approvalsStreamLiveCapability.js +0 -31
- package/dist/argvFlagValue.d.ts +0 -33
- package/dist/argvFlagValue.js +3 -35
- package/dist/attachmentsWireCaps.d.ts +0 -127
- package/dist/attachmentsWireCaps.js +0 -144
- package/dist/autoModeUnavailable.d.ts +0 -120
- package/dist/autoModeUnavailable.js +0 -144
- package/dist/classifierStatus.d.ts +0 -72
- package/dist/classifierStatus.js +0 -167
- package/dist/classifierVerdictWire.d.ts +0 -54
- package/dist/classifierVerdictWire.js +0 -133
- package/dist/clientContextWireCaps.d.ts +0 -37
- package/dist/clientContextWireCaps.js +0 -36
- package/dist/clientSlice.d.ts +0 -63
- package/dist/clientSlice.js +0 -45
- package/dist/cloudConfigWireCaps.d.ts +0 -86
- package/dist/cloudConfigWireCaps.js +2 -65
- package/dist/compensations.d.ts +0 -52
- package/dist/compensations.js +2 -63
- package/dist/controlRouter.d.ts +2 -208
- package/dist/controlRouter.js +1 -129
- package/dist/coreValuePorts.d.ts +0 -84
- package/dist/coreValuePorts.js +0 -29
- package/dist/decideReceipt.d.ts +0 -110
- package/dist/decideReceipt.js +0 -84
- package/dist/detachWire.d.ts +0 -130
- package/dist/detachWire.js +1 -130
- package/dist/deviceExecutorManagementCapability.d.ts +2 -35
- package/dist/deviceExecutorManagementCapability.js +1 -37
- package/dist/diagnostics.d.ts +0 -8
- package/dist/diagnostics.js +0 -8
- package/dist/diff/patch.d.ts +0 -17
- package/dist/diff/patch.js +0 -19
- package/dist/effectiveFacts.d.ts +0 -40
- package/dist/effectiveFacts.js +0 -22
- package/dist/effortWire.d.ts +0 -11
- package/dist/effortWire.js +0 -12
- package/dist/engineAgentPanelStore.d.ts +0 -169
- package/dist/engineAgentPanelStore.js +13 -293
- package/dist/engineCapReader.d.ts +0 -62
- package/dist/engineCapReader.js +1 -43
- package/dist/engineCapsCache.d.ts +0 -177
- package/dist/engineCapsCache.js +0 -199
- package/dist/engineCapsGenerationGuard.d.ts +0 -2
- package/dist/engineCapsGenerationGuard.js +0 -11
- package/dist/engineErrorCodes.d.ts +1 -316
- package/dist/engineErrorCodes.js +0 -427
- package/dist/engineHttpTools.d.ts +0 -29
- package/dist/engineHttpTools.js +0 -29
- package/dist/engineIdentity.d.ts +0 -83
- package/dist/engineIdentity.js +0 -88
- package/dist/engineInlineTaskStats.d.ts +0 -57
- package/dist/engineInlineTaskStats.js +1 -42
- package/dist/engineNoticeCodes.d.ts +0 -190
- package/dist/engineNoticeCodes.js +0 -182
- package/dist/engineSessionParam.d.ts +0 -30
- package/dist/engineSessionParam.js +0 -52
- package/dist/engineToolLabelStore.d.ts +0 -29
- package/dist/engineToolLabelStore.js +0 -31
- package/dist/engineWireSdk.d.ts +0 -90
- package/dist/engineWireSdk.js +0 -74
- package/dist/engineWireTarget.d.ts +0 -14
- package/dist/engineWireTarget.js +0 -39
- package/dist/env/localeGeo.d.ts +0 -12
- package/dist/env/localeGeo.js +2 -77
- package/dist/env/localeTag.d.ts +0 -34
- package/dist/env/localeTag.js +0 -32
- package/dist/env/uiLanguage.d.ts +0 -13
- package/dist/env/uiLanguage.js +0 -25
- package/dist/envFlag.d.ts +0 -37
- package/dist/envFlag.js +0 -40
- package/dist/executionLaneCapability.d.ts +0 -48
- package/dist/executionLaneCapability.js +0 -54
- package/dist/finalVerifyWire.d.ts +0 -67
- package/dist/finalVerifyWire.js +3 -43
- package/dist/fleet/fleetLedger.d.ts +0 -308
- package/dist/fleet/fleetLedger.js +10 -429
- package/dist/fleet/fleetProjection.d.ts +0 -240
- package/dist/fleet/fleetProjection.js +0 -189
- package/dist/fleet/fleetRowAgentType.d.ts +0 -6
- package/dist/fleet/fleetRowAgentType.js +1 -32
- package/dist/fleet/workflowSizeWarning.d.ts +0 -47
- package/dist/fleet/workflowSizeWarning.js +1 -46
- package/dist/fleetAgentPanelProjection.d.ts +0 -48
- package/dist/fleetAgentPanelProjection.js +8 -173
- package/dist/fleetTaskDesc.d.ts +0 -39
- package/dist/fleetTaskDesc.js +0 -69
- package/dist/forkWireCaps.d.ts +0 -23
- package/dist/forkWireCaps.js +1 -24
- package/dist/gateOutcome.d.ts +0 -140
- package/dist/gateOutcome.js +0 -85
- package/dist/gateVocabulary.d.ts +0 -114
- package/dist/gateVocabulary.js +1 -161
- package/dist/goalStopHook.d.ts +0 -127
- package/dist/goalStopHook.js +0 -178
- package/dist/headlessPermissionModeWire.d.ts +0 -76
- package/dist/headlessPermissionModeWire.js +1 -155
- package/dist/headlessReconnectWire.d.ts +0 -84
- package/dist/headlessReconnectWire.js +13 -67
- package/dist/hitl/approvalDecisionNoteAudit.d.ts +0 -49
- package/dist/hitl/approvalDecisionNoteAudit.js +0 -56
- package/dist/hitl/approvalOutcomeNote.d.ts +0 -2
- package/dist/hitl/approvalOutcomeNote.js +0 -20
- package/dist/hitl/approvalResolution.d.ts +0 -113
- package/dist/hitl/approvalResolution.js +0 -66
- package/dist/hitl/approvalsFeed.d.ts +0 -183
- package/dist/hitl/approvalsFeed.js +12 -243
- package/dist/hitl/armedGateRegistry.d.ts +0 -55
- package/dist/hitl/armedGateRegistry.js +0 -146
- package/dist/hitl/askGateWire.d.ts +0 -86
- package/dist/hitl/askGateWire.js +1 -95
- package/dist/hitl/askParkRowRouting.d.ts +0 -123
- package/dist/hitl/askParkRowRouting.js +1 -89
- package/dist/hitl/crashConverged.d.ts +0 -148
- package/dist/hitl/crashConverged.js +0 -214
- package/dist/hitl/editedRuleTextPrecheck.d.ts +0 -109
- package/dist/hitl/editedRuleTextPrecheck.js +0 -71
- package/dist/hitl/frameRouter.d.ts +0 -134
- package/dist/hitl/frameRouter.js +6 -378
- package/dist/hitl/gateIdentity.d.ts +0 -39
- package/dist/hitl/gateIdentity.js +0 -41
- package/dist/hitl/gateLedger.d.ts +0 -267
- package/dist/hitl/gateLedger.js +0 -121
- package/dist/hitl/hitlBridge.d.ts +7 -431
- package/dist/hitl/hitlBridge.js +7 -476
- package/dist/hitl/hitlHostSurface.d.ts +0 -150
- package/dist/hitl/hitlHostSurface.js +0 -169
- package/dist/hitl/livePendingAsk.d.ts +0 -91
- package/dist/hitl/livePendingAsk.js +0 -74
- package/dist/hitl/localAllowRule.d.ts +0 -62
- package/dist/hitl/localAllowRule.js +1 -33
- package/dist/hitl/parkOwnership.d.ts +0 -56
- package/dist/hitl/parkOwnership.js +0 -22
- package/dist/hitl/parkResolver.d.ts +3 -88
- package/dist/hitl/parkResolver.js +8 -349
- package/dist/hitl/parkRowBirthWait.d.ts +2 -26
- package/dist/hitl/parkRowBirthWait.js +3 -93
- package/dist/hitl/persistedRulesWire.d.ts +13 -358
- package/dist/hitl/persistedRulesWire.js +0 -310
- package/dist/hitl/planReviewWire.d.ts +4 -176
- package/dist/hitl/planReviewWire.js +9 -312
- package/dist/hitl/resumeRunningCard.d.ts +0 -105
- package/dist/hitl/resumeRunningCard.js +0 -105
- package/dist/hitl/sessionPolicyWire.d.ts +11 -191
- package/dist/hitl/sessionPolicyWire.js +0 -149
- package/dist/hitl/suspendedReopen.d.ts +3 -24
- package/dist/hitl/suspendedReopen.js +0 -14
- package/dist/hitl/toolApprovalWire.d.ts +5 -1308
- package/dist/hitl/toolApprovalWire.js +5 -945
- package/dist/hooksWireCaps.d.ts +0 -38
- package/dist/hooksWireCaps.js +0 -190
- package/dist/host.d.ts +0 -105
- package/dist/host.js +0 -33
- package/dist/hostEnv.d.ts +0 -14
- package/dist/hostEnv.js +0 -13
- package/dist/imagesWireCaps.d.ts +0 -21
- package/dist/imagesWireCaps.js +0 -22
- package/dist/index.d.ts +0 -134
- package/dist/index.js +0 -476
- package/dist/interactiveHalt.d.ts +5 -153
- package/dist/interactiveHalt.js +0 -111
- package/dist/interactiveToolsWire.d.ts +0 -62
- package/dist/interactiveToolsWire.js +1 -67
- package/dist/leaderConflict.d.ts +0 -59
- package/dist/leaderConflict.js +0 -48
- package/dist/limitsWire.d.ts +0 -125
- package/dist/limitsWire.js +2 -120
- package/dist/liveInitToolFace.d.ts +0 -77
- package/dist/liveInitToolFace.js +1 -109
- package/dist/liveModelCatalog.d.ts +0 -52
- package/dist/liveModelCatalog.js +0 -48
- package/dist/liveQuestionStore.d.ts +0 -87
- package/dist/liveQuestionStore.js +1 -56
- package/dist/mcpLiveness.d.ts +0 -151
- package/dist/mcpLiveness.js +0 -122
- package/dist/mcpPanel.d.ts +0 -104
- package/dist/mcpPanel.js +0 -49
- package/dist/mcpReconnect.d.ts +0 -58
- package/dist/mcpReconnect.js +1 -69
- package/dist/mcpWireCaps.d.ts +0 -55
- package/dist/mcpWireCaps.js +1 -13
- package/dist/memoryComplianceCapability.d.ts +3 -57
- package/dist/memoryComplianceCapability.js +0 -57
- package/dist/memoryEntriesWire.d.ts +6 -198
- package/dist/memoryEntriesWire.js +0 -144
- package/dist/memoryOriginCapability.d.ts +3 -53
- package/dist/memoryOriginCapability.js +0 -50
- package/dist/memorySpecWire.d.ts +0 -116
- package/dist/memorySpecWire.js +0 -150
- package/dist/model/catalog.d.ts +0 -111
- package/dist/model/catalog.js +0 -87
- package/dist/model/catalogLoader.d.ts +0 -114
- package/dist/model/catalogLoader.js +2 -139
- package/dist/model/modelSupplyRules.d.ts +1 -55
- package/dist/model/modelSupplyRules.js +0 -62
- package/dist/model/providerAuth.d.ts +0 -103
- package/dist/model/providerAuth.js +2 -38
- package/dist/model/providerCatalog.d.ts +0 -45
- package/dist/model/providerCatalog.js +0 -37
- package/dist/model/providerPresets.d.ts +0 -33
- package/dist/model/providerPresets.js +2 -91
- package/dist/model/tierVocabulary.d.ts +0 -31
- package/dist/model/tierVocabulary.js +0 -27
- package/dist/modelBudgetRule.d.ts +0 -39
- package/dist/modelBudgetRule.js +0 -39
- package/dist/modelCapabilityProbe.d.ts +0 -175
- package/dist/modelCapabilityProbe.js +0 -147
- package/dist/modelWireCaps.d.ts +0 -13
- package/dist/modelWireCaps.js +0 -13
- package/dist/notifications.d.ts +0 -233
- package/dist/notifications.js +14 -492
- package/dist/oneShotWireCaps.d.ts +0 -34
- package/dist/oneShotWireCaps.js +0 -35
- package/dist/ownKey.d.ts +0 -33
- package/dist/ownKey.js +0 -33
- package/dist/panelRunningHistory.d.ts +0 -28
- package/dist/panelRunningHistory.js +0 -43
- package/dist/peerFrames.d.ts +0 -71
- package/dist/peerFrames.js +0 -168
- package/dist/peerLaneCapability.d.ts +0 -44
- package/dist/peerLaneCapability.js +0 -52
- package/dist/permissionRuleIssue.d.ts +0 -30
- package/dist/permissionRuleIssue.js +0 -78
- package/dist/permissionRulesWriteCapability.d.ts +0 -46
- package/dist/permissionRulesWriteCapability.js +0 -54
- package/dist/permissionWireCaps.d.ts +0 -37
- package/dist/permissionWireCaps.js +0 -37
- package/dist/postureKnob.d.ts +0 -71
- package/dist/postureKnob.js +0 -86
- package/dist/principalWire.d.ts +0 -17
- package/dist/principalWire.js +0 -17
- package/dist/printToolResultFrame.d.ts +0 -100
- package/dist/printToolResultFrame.js +0 -33
- package/dist/promptProfileWireCaps.d.ts +0 -13
- package/dist/promptProfileWireCaps.js +0 -13
- package/dist/readFacePosture.d.ts +0 -43
- package/dist/readFacePosture.js +0 -46
- package/dist/request/printNotification.d.ts +0 -20
- package/dist/request/printNotification.js +0 -55
- package/dist/request/taskRequest.d.ts +0 -249
- package/dist/request/taskRequest.js +10 -496
- package/dist/resumeRefusalCopy.d.ts +0 -136
- package/dist/resumeRefusalCopy.js +1 -117
- package/dist/retainBackgroundWireCaps.d.ts +0 -48
- package/dist/retainBackgroundWireCaps.js +0 -48
- package/dist/retryStatus.d.ts +2 -221
- package/dist/retryStatus.js +0 -107
- package/dist/rewindWireCaps.d.ts +0 -27
- package/dist/rewindWireCaps.js +0 -24
- package/dist/runCancelContext.d.ts +1 -20
- package/dist/runCancelContext.js +0 -34
- package/dist/runTerminal.d.ts +0 -273
- package/dist/runTerminal.js +0 -177
- package/dist/sandboxWire.d.ts +0 -38
- package/dist/sandboxWire.js +0 -82
- package/dist/scenarioWire.d.ts +0 -60
- package/dist/scenarioWire.js +0 -68
- package/dist/scratchpadWireCaps.d.ts +0 -11
- package/dist/scratchpadWireCaps.js +0 -32
- package/dist/sdkWireTransit.d.ts +0 -38
- package/dist/sdkWireTransit.js +0 -30
- package/dist/seam.d.ts +18 -853
- package/dist/seam.js +0 -52
- package/dist/seatContract.d.ts +0 -555
- package/dist/seatContract.js +5 -304
- package/dist/selfOrchestrationDenial.d.ts +0 -189
- package/dist/selfOrchestrationDenial.js +0 -162
- package/dist/selfOrchestrationWireCaps.d.ts +0 -38
- package/dist/selfOrchestrationWireCaps.js +0 -38
- package/dist/sessionMap.d.ts +0 -60
- package/dist/sessionMap.js +0 -37
- package/dist/sessionMemoryStatus.d.ts +11 -114
- package/dist/sessionMemoryStatus.js +0 -112
- package/dist/sessionModelLatch.d.ts +0 -29
- package/dist/sessionModelLatch.js +0 -40
- package/dist/sessionPolicyCapability.d.ts +3 -53
- package/dist/sessionPolicyCapability.js +0 -52
- package/dist/sessionSlot.d.ts +0 -26
- package/dist/sessionSlot.js +0 -17
- package/dist/skillsWireCaps.d.ts +0 -87
- package/dist/skillsWireCaps.js +0 -38
- package/dist/sqlEngineCapability.d.ts +0 -118
- package/dist/sqlEngineCapability.js +0 -134
- package/dist/sseIdleTriage.d.ts +0 -79
- package/dist/sseIdleTriage.js +1 -80
- package/dist/steering.d.ts +0 -54
- package/dist/steering.js +0 -63
- package/dist/subagent/engineCompactWire.d.ts +0 -34
- package/dist/subagent/engineCompactWire.js +4 -134
- package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
- package/dist/subagent/engineDelegatedPrompt.js +1 -103
- package/dist/subagent/engineRowStopGate.d.ts +0 -20
- package/dist/subagent/engineRowStopGate.js +0 -49
- package/dist/subagent/engineSubagentOutput.d.ts +0 -7
- package/dist/subagent/engineSubagentOutput.js +1 -51
- package/dist/subagent/engineSubagentResume.d.ts +2 -279
- package/dist/subagent/engineSubagentResume.js +2 -129
- package/dist/subagent/engineSubagentSteer.d.ts +0 -26
- package/dist/subagent/engineSubagentSteer.js +0 -63
- package/dist/subagent/engineSubagentTail.d.ts +0 -38
- package/dist/subagent/engineSubagentTail.js +2 -110
- package/dist/subagent/engineTaskHandleWire.d.ts +11 -65
- package/dist/subagent/engineTaskHandleWire.js +20 -131
- package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
- package/dist/subagent/subagentOwnerAbsence.js +0 -25
- package/dist/subagentContentStore.d.ts +3 -260
- package/dist/subagentContentStore.js +7 -540
- package/dist/systemReminderTag.d.ts +0 -49
- package/dist/systemReminderTag.js +0 -61
- package/dist/toolResult.d.ts +1 -211
- package/dist/toolResult.js +1 -358
- package/dist/toolRoster.d.ts +0 -140
- package/dist/toolRoster.js +0 -66
- package/dist/typePins.d.ts +0 -46
- package/dist/types/engineState.d.ts +0 -71
- package/dist/types/engineState.js +0 -16
- package/dist/ultracodeWireCaps.d.ts +0 -75
- package/dist/ultracodeWireCaps.js +0 -92
- package/dist/unrefTimer.d.ts +0 -27
- package/dist/webSearchBackendCapability.d.ts +0 -72
- package/dist/webSearchBackendCapability.js +0 -79
- package/dist/webSearchWireCaps.d.ts +0 -37
- package/dist/webSearchWireCaps.js +0 -34
- package/dist/websearch/searchProviderPresets.d.ts +0 -81
- package/dist/websearch/searchProviderPresets.js +0 -27
- package/dist/wireErrorTriage.d.ts +4 -160
- package/dist/wireErrorTriage.js +0 -171
- package/dist/wireRefusalCopy.d.ts +0 -28
- package/dist/wireRefusalCopy.js +0 -28
- package/dist/workflow.d.ts +0 -40
- package/dist/workflow.js +0 -52
- package/dist/workflowClient.d.ts +0 -122
- package/dist/workflowClient.js +8 -360
- package/dist/workflowMonitor.d.ts +2 -72
- package/dist/workflowMonitor.js +0 -26
- package/dist/writeProtectionCapability.d.ts +0 -112
- package/dist/writeProtectionCapability.js +0 -109
- package/docs/INTEGRATION-CLIENTS.md +62 -1
- package/package.json +1 -1
|
@@ -1,25 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 包内实现的设备码 provider 表。
|
|
3
|
-
* 🔴 **今天是空的,理由见文件头**(宁空勿假:没有我们自己名下的 client_id 之前,填一行 = 冒用)。
|
|
4
|
-
* 加一家 = 加一行;端点必须 https(门 ④a 逐行校)。
|
|
5
|
-
*/
|
|
6
1
|
export const DEVICE_AUTH_PROVIDERS = [];
|
|
7
|
-
/** 包内是否实现了这一家(能力真值的一半)。 */
|
|
8
2
|
export function deviceAuthProviderFor(providerId) {
|
|
9
3
|
return DEVICE_AUTH_PROVIDERS.find((p) => p.providerId === providerId);
|
|
10
4
|
}
|
|
11
|
-
/**
|
|
12
|
-
* UI 是否显示「设备码登录」= **目录说有** ∧ **包里有实现**。
|
|
13
|
-
* 任一缺席 ⇒ false(见文件头「能力真值」段)。
|
|
14
|
-
*/
|
|
15
5
|
export function supportsDeviceCodeAuth(providerId, catalogHint) {
|
|
16
6
|
if (catalogHint?.kind !== 'device_code')
|
|
17
7
|
return false;
|
|
18
8
|
return deviceAuthProviderFor(providerId) !== undefined;
|
|
19
9
|
}
|
|
20
|
-
/**
|
|
21
|
-
* 一家 provider 摆给用户的轨(顺序 = UI 呈现序)。`api_key` 恒在;`device_code` 只在能力真值成立时出。
|
|
22
|
-
*/
|
|
23
10
|
export function providerAuthMethods(preset) {
|
|
24
11
|
const out = [{ kind: 'api_key', env: preset.authEnv }];
|
|
25
12
|
if (supportsDeviceCodeAuth(preset.id, preset.deviceAuth)) {
|
|
@@ -27,19 +14,13 @@ export function providerAuthMethods(preset) {
|
|
|
27
14
|
}
|
|
28
15
|
return out;
|
|
29
16
|
}
|
|
30
|
-
/** 轮询间隔下限(RFC 8628 建议 5s;服务端给更大的值时听服务端的)。 */
|
|
31
17
|
const DEVICE_CODE_MIN_INTERVAL_MS = 5000;
|
|
32
|
-
/** 会话墙钟上限(design/166 §5:15min)。服务端 `expires_in` 更短时听服务端的。 */
|
|
33
18
|
const DEVICE_CODE_MAX_LIFETIME_MS = 15 * 60 * 1000;
|
|
34
|
-
/** 429 / slow_down 的退避增量(RFC 8628 §3.5 就是「加 5 秒」)。 */
|
|
35
19
|
const DEVICE_CODE_BACKOFF_STEP_MS = 5000;
|
|
36
|
-
/** 单次 HTTP 预算。 */
|
|
37
20
|
const DEVICE_CODE_HTTP_TIMEOUT_MS = 10_000;
|
|
38
|
-
/** 异常 → 短 detail(绝不带栈、绝不带响应体)。 */
|
|
39
21
|
function shortError(e) {
|
|
40
22
|
return (e instanceof Error ? e.message : String(e)).slice(0, 160);
|
|
41
23
|
}
|
|
42
|
-
/** POST application/x-www-form-urlencoded,收 JSON。返回 {status, body}(body 解析不动 ⇒ null)。 */
|
|
43
24
|
async function postForm(url, form, fetchImpl, timeoutMs, signal) {
|
|
44
25
|
const controller = new AbortController();
|
|
45
26
|
const onAbort = () => controller.abort();
|
|
@@ -61,7 +42,7 @@ async function postForm(url, form, fetchImpl, timeoutMs, signal) {
|
|
|
61
42
|
body = JSON.parse(text);
|
|
62
43
|
}
|
|
63
44
|
catch {
|
|
64
|
-
body = null;
|
|
45
|
+
body = null;
|
|
65
46
|
}
|
|
66
47
|
return { status: res.status, body };
|
|
67
48
|
}
|
|
@@ -70,14 +51,6 @@ async function postForm(url, form, fetchImpl, timeoutMs, signal) {
|
|
|
70
51
|
signal.removeEventListener('abort', onAbort);
|
|
71
52
|
}
|
|
72
53
|
}
|
|
73
|
-
/**
|
|
74
|
-
* 开一次设备码会话 —— **端点由调用方给**(包内表里那一行,或门的合成 descriptor)。
|
|
75
|
-
* 🔴 端点是**编译进包的常量**,不是远端数据,所以本函数不对它再做白名单;真正的门是
|
|
76
|
-
* 「client_id/端点绝不目录化下发」(design/165 §2 红线)+ 表内每行必须 https(门 ④a)。
|
|
77
|
-
*
|
|
78
|
-
* 失败(网络 / 非 2xx / 缺 user_code)⇒ **throw**(§C1 三选一里的 throw):开不出会话就是开不出,
|
|
79
|
-
* 绝不返回一个永远 pending 的假会话。
|
|
80
|
-
*/
|
|
81
54
|
export async function openDeviceCodeSession(endpoints, opts) {
|
|
82
55
|
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
83
56
|
const timeoutMs = opts.timeoutMs ?? DEVICE_CODE_HTTP_TIMEOUT_MS;
|
|
@@ -113,16 +86,13 @@ export async function openDeviceCodeSession(endpoints, opts) {
|
|
|
113
86
|
abort.abort();
|
|
114
87
|
},
|
|
115
88
|
};
|
|
116
|
-
/** 终态一旦落定就恒定(拿到 key 之后再 poll 不重复拨号)。 */
|
|
117
89
|
let terminal = null;
|
|
118
|
-
/** 下一次允许真正拨号的墙钟时刻(间隔是硬的,不靠调用方自律)。 */
|
|
119
90
|
let nextDialAtMs = started;
|
|
120
91
|
async function poll() {
|
|
121
92
|
if (terminal !== null)
|
|
122
93
|
return terminal;
|
|
123
94
|
const now = opts.nowMs();
|
|
124
95
|
if (now >= session.expiresAtMs) {
|
|
125
|
-
// 本地上限先于服务端判:上限是我们对用户的承诺,不该靠服务端良心。
|
|
126
96
|
terminal = { status: 'expired', detail: 'device code session exceeded its lifetime — start a new one' };
|
|
127
97
|
return terminal;
|
|
128
98
|
}
|
|
@@ -139,8 +109,7 @@ export async function openDeviceCodeSession(endpoints, opts) {
|
|
|
139
109
|
}
|
|
140
110
|
catch (e) {
|
|
141
111
|
if (terminal !== null)
|
|
142
|
-
return terminal;
|
|
143
|
-
// 单次网络失败不是终态:设备码流本就是长轮询,下一拍再试(退避一格避免打点)。
|
|
112
|
+
return terminal;
|
|
144
113
|
nextDialAtMs = opts.nowMs() + session.intervalMs;
|
|
145
114
|
return { status: 'pending', detail: `poll failed, will retry: ${shortError(e)}` };
|
|
146
115
|
}
|
|
@@ -171,15 +140,10 @@ export async function openDeviceCodeSession(endpoints, opts) {
|
|
|
171
140
|
if (res.status < 200 || res.status >= 300) {
|
|
172
141
|
return { status: 'pending', detail: `poll got HTTP ${res.status}, will retry` };
|
|
173
142
|
}
|
|
174
|
-
// 认不出的 error 码:不冒充终态(别把一个我们没见过的码说成「过期了」),下一拍再试。
|
|
175
143
|
return { status: 'pending', detail: err === '' ? 'unrecognised token response' : `unrecognised error: ${err}` };
|
|
176
144
|
}
|
|
177
145
|
return session;
|
|
178
146
|
}
|
|
179
|
-
/**
|
|
180
|
-
* 按 providerId 开设备码会话(UI 入口)。
|
|
181
|
-
* 包内没有这一家 ⇒ **throw**(UI 本就不该显示这个选项;走到这里说明能力判据被绕过了)。
|
|
182
|
-
*/
|
|
183
147
|
export async function beginDeviceCodeAuth(providerId, opts) {
|
|
184
148
|
const provider = deviceAuthProviderFor(providerId);
|
|
185
149
|
if (provider === undefined) {
|
|
@@ -1,63 +1,18 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* providerCatalog.ts — F4 族D(A-028.17,2026-08-15):46 家 provider 表的**规范折表层**
|
|
3
|
-
* (canonical fold)。纯派生、零 IO、零宿主依赖 —— 表本体在 `providerPresets.json`,
|
|
4
|
-
* 本件只做「表 → 目录行」的那一次投影与行级文案判定。
|
|
5
|
-
*
|
|
6
|
-
* ## 为什么折表要进包
|
|
7
|
-
*
|
|
8
|
-
* 搬迁前这张表被折了三次:cli `src/sema/config/providerDirectory.ts`(Model Hub 目录行)、
|
|
9
|
-
* web `src/lib/providers/catalog.ts`(向导折表)、web `provider-catalog.ts`(降级表二次映射)。
|
|
10
|
-
* 三份折表各自持有「host 怎么取 / 零模型家怎么说 / 顺序动不动」这些**判定**,两侧常驻全表门
|
|
11
|
-
* 只能靠人工对齐 —— 判定漂了没有任何编译器会响。折表进包后:cli 换装 re-export(单一真源),
|
|
12
|
-
* web 侧第二份折表退役是 web 半场的事(发布帖点名)。
|
|
13
|
-
*
|
|
14
|
-
* ## 三条继承自 cli #175 的设计约束(逐字保留语义)
|
|
15
|
-
*
|
|
16
|
-
* ① **单一真源**:每个量都从 `PROVIDER_PRESETS` 现算,本文件里没有第二张表 —— 没有硬编码的
|
|
17
|
-
* 家名/baseUrl/模型清单。表更新一次,所有端的目录跟着变。
|
|
18
|
-
* ② **全表不重排**:顺序 = 表序,一行不筛、不重排、不分组(clay 令 2026-08-01:模型 provider
|
|
19
|
-
* 完全用户选择,走全表)。本件不导出任何排序/过滤函数。
|
|
20
|
-
* ③ **诚实缺席**:表里没登记模型列表的家(ollama / vllm / litellm / 聚合网关等)`modelIds`
|
|
21
|
-
* 就是空数组,行文案说「model id typed in」,**不写「0 models」**——「0 个模型」是编造
|
|
22
|
-
* 出来的量:表没登记 ≠ 这家没有模型。consoleUrl / signupUrl 缺席同样原样缺席,不回落编造。
|
|
23
|
-
*
|
|
24
|
-
* 行形是 cli DirectoryRow 与 web 折表两侧字段的**严格超集**(字段名与 cli 侧逐字一致,cli 直接
|
|
25
|
-
* re-export 零改动;web 侧的 label/keyEnvSuggestion/suggestedModels 对应 name/authEnv/modelIds)。
|
|
26
|
-
*/
|
|
27
1
|
import { type ProviderPreset } from './providerPresets.js';
|
|
28
|
-
/** 目录/向导的一行(表的一次纯投影;字段全部现算,invariant:modelCount === modelIds.length)。 */
|
|
29
2
|
export interface ProviderCatalogRow {
|
|
30
|
-
/** preset 表里的 id(行 key + 回查用) */
|
|
31
3
|
presetId: string;
|
|
32
4
|
name: string;
|
|
33
5
|
baseUrl: string;
|
|
34
|
-
/** baseUrl 的 host(含端口);解析不出时给空串(诚实缺席,不猜) */
|
|
35
6
|
host: string;
|
|
36
7
|
api: ProviderPreset['api'];
|
|
37
|
-
/** 领 key 的环境变量**名**(绝不是值;web 侧的 keyEnvSuggestion) */
|
|
38
8
|
authEnv: string;
|
|
39
|
-
/** 表里登记了的模型 id(原序原样;空数组 = 这家的 model id 由用户手填,见约束③) */
|
|
40
9
|
modelIds: string[];
|
|
41
|
-
/** 表里**登记了**的模型条数(0 = model id 手填,不是「这家没有模型」) */
|
|
42
10
|
modelCount: number;
|
|
43
|
-
/** 聚合网关/本地引擎:模型 id 手填,ctx/maxTokens 走家族表 */
|
|
44
11
|
modelViaFamily: boolean;
|
|
45
|
-
/** 去哪拿 key 的控制台页(纯 URL);缺席 = 上游没有确证地址,不编 */
|
|
46
12
|
consoleUrl?: string;
|
|
47
|
-
/** 没账号时的注册入口;缺席 = 用 consoleUrl 那条 */
|
|
48
13
|
signupUrl?: string;
|
|
49
14
|
}
|
|
50
|
-
/**
|
|
51
|
-
* 全表 → 目录行。**顺序 = 表序**(约束②):这里没有 filter,也没有 sort。
|
|
52
|
-
* `presets` 入参只给测试用(注入一张小表),产品路径恒走 `PROVIDER_PRESETS`。
|
|
53
|
-
*/
|
|
54
15
|
export declare function providerCatalogRows(presets?: readonly ProviderPreset[]): ProviderCatalogRow[];
|
|
55
|
-
/** 目录规模。端上「家数」与目录行数同源 —— 两处不会各报一个数。 */
|
|
56
16
|
export declare function providerCatalogCount(): number;
|
|
57
|
-
/** 按 preset id 回查整条 preset(目录选中之后要拿 baseUrl / models / consoleUrl)。 */
|
|
58
17
|
export declare function providerPresetById(presetId: string): ProviderPreset | undefined;
|
|
59
|
-
/**
|
|
60
|
-
* 一行的 dim 说明:`host · api · 模型情况`。
|
|
61
|
-
* 约束③:`modelCount === 0` 说「model id typed in」,绝不写「0 models」。
|
|
62
|
-
*/
|
|
63
18
|
export declare function providerCatalogRowDetail(row: Pick<ProviderCatalogRow, 'host' | 'baseUrl' | 'api' | 'modelCount' | 'modelViaFamily'>): string;
|
|
@@ -1,29 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* providerCatalog.ts — F4 族D(A-028.17,2026-08-15):46 家 provider 表的**规范折表层**
|
|
3
|
-
* (canonical fold)。纯派生、零 IO、零宿主依赖 —— 表本体在 `providerPresets.json`,
|
|
4
|
-
* 本件只做「表 → 目录行」的那一次投影与行级文案判定。
|
|
5
|
-
*
|
|
6
|
-
* ## 为什么折表要进包
|
|
7
|
-
*
|
|
8
|
-
* 搬迁前这张表被折了三次:cli `src/sema/config/providerDirectory.ts`(Model Hub 目录行)、
|
|
9
|
-
* web `src/lib/providers/catalog.ts`(向导折表)、web `provider-catalog.ts`(降级表二次映射)。
|
|
10
|
-
* 三份折表各自持有「host 怎么取 / 零模型家怎么说 / 顺序动不动」这些**判定**,两侧常驻全表门
|
|
11
|
-
* 只能靠人工对齐 —— 判定漂了没有任何编译器会响。折表进包后:cli 换装 re-export(单一真源),
|
|
12
|
-
* web 侧第二份折表退役是 web 半场的事(发布帖点名)。
|
|
13
|
-
*
|
|
14
|
-
* ## 三条继承自 cli #175 的设计约束(逐字保留语义)
|
|
15
|
-
*
|
|
16
|
-
* ① **单一真源**:每个量都从 `PROVIDER_PRESETS` 现算,本文件里没有第二张表 —— 没有硬编码的
|
|
17
|
-
* 家名/baseUrl/模型清单。表更新一次,所有端的目录跟着变。
|
|
18
|
-
* ② **全表不重排**:顺序 = 表序,一行不筛、不重排、不分组(clay 令 2026-08-01:模型 provider
|
|
19
|
-
* 完全用户选择,走全表)。本件不导出任何排序/过滤函数。
|
|
20
|
-
* ③ **诚实缺席**:表里没登记模型列表的家(ollama / vllm / litellm / 聚合网关等)`modelIds`
|
|
21
|
-
* 就是空数组,行文案说「model id typed in」,**不写「0 models」**——「0 个模型」是编造
|
|
22
|
-
* 出来的量:表没登记 ≠ 这家没有模型。consoleUrl / signupUrl 缺席同样原样缺席,不回落编造。
|
|
23
|
-
*
|
|
24
|
-
* 行形是 cli DirectoryRow 与 web 折表两侧字段的**严格超集**(字段名与 cli 侧逐字一致,cli 直接
|
|
25
|
-
* re-export 零改动;web 侧的 label/keyEnvSuggestion/suggestedModels 对应 name/authEnv/modelIds)。
|
|
26
|
-
*/
|
|
27
1
|
import { PROVIDER_PRESETS } from './providerPresets.js';
|
|
28
2
|
const hostOf = (u) => {
|
|
29
3
|
try {
|
|
@@ -33,12 +7,7 @@ const hostOf = (u) => {
|
|
|
33
7
|
return '';
|
|
34
8
|
}
|
|
35
9
|
};
|
|
36
|
-
/** api 家族的行内短名(目录行/芯片行两端同一个词,不各自缩写)。 */
|
|
37
10
|
const providerApiShortName = (api) => api === 'anthropic-messages' ? 'anthropic' : 'openai';
|
|
38
|
-
/**
|
|
39
|
-
* 全表 → 目录行。**顺序 = 表序**(约束②):这里没有 filter,也没有 sort。
|
|
40
|
-
* `presets` 入参只给测试用(注入一张小表),产品路径恒走 `PROVIDER_PRESETS`。
|
|
41
|
-
*/
|
|
42
11
|
export function providerCatalogRows(presets = PROVIDER_PRESETS) {
|
|
43
12
|
return presets.map(p => ({
|
|
44
13
|
presetId: p.id,
|
|
@@ -54,18 +23,12 @@ export function providerCatalogRows(presets = PROVIDER_PRESETS) {
|
|
|
54
23
|
...(p.signupUrl === undefined ? {} : { signupUrl: p.signupUrl }),
|
|
55
24
|
}));
|
|
56
25
|
}
|
|
57
|
-
/** 目录规模。端上「家数」与目录行数同源 —— 两处不会各报一个数。 */
|
|
58
26
|
export function providerCatalogCount() {
|
|
59
27
|
return providerCatalogRows().length;
|
|
60
28
|
}
|
|
61
|
-
/** 按 preset id 回查整条 preset(目录选中之后要拿 baseUrl / models / consoleUrl)。 */
|
|
62
29
|
export function providerPresetById(presetId) {
|
|
63
30
|
return PROVIDER_PRESETS.find(p => p.id === presetId);
|
|
64
31
|
}
|
|
65
|
-
/**
|
|
66
|
-
* 一行的 dim 说明:`host · api · 模型情况`。
|
|
67
|
-
* 约束③:`modelCount === 0` 说「model id typed in」,绝不写「0 models」。
|
|
68
|
-
*/
|
|
69
32
|
export function providerCatalogRowDetail(row) {
|
|
70
33
|
const models = row.modelCount === 0
|
|
71
34
|
? 'model id typed in'
|
|
@@ -2,7 +2,6 @@ export type PresetModel = {
|
|
|
2
2
|
id: string;
|
|
3
3
|
contextWindow: number;
|
|
4
4
|
maxTokens: number;
|
|
5
|
-
/** Marks the provider's cheap sibling — screen-4 execution-slot recommendation. */
|
|
6
5
|
cheapHint?: boolean;
|
|
7
6
|
};
|
|
8
7
|
export type ProviderPreset = {
|
|
@@ -12,61 +11,29 @@ export type ProviderPreset = {
|
|
|
12
11
|
api: 'anthropic-messages' | 'openai-completions';
|
|
13
12
|
authEnv: string;
|
|
14
13
|
models: PresetModel[];
|
|
15
|
-
/** Aggregator gateways (OpenRouter): model id is hand-typed, ctx/maxtok via family table. */
|
|
16
14
|
modelViaFamily?: boolean;
|
|
17
|
-
/**
|
|
18
|
-
* 🆕 design/160 需求②-B(2026-07-31):**去哪拿 key** 的控制台页(纯链接,离线也能显示)。
|
|
19
|
-
*
|
|
20
|
-
* 🔴 **诚实缺席**:只填能可靠确认的官网控制台地址;拿不准的家**不填**,绝不编 URL —— 这个字段
|
|
21
|
-
* 会被 onboard 直接拿去开浏览器,编一个 = 把用户送到错误的地方。本地/自建家(ollama /
|
|
22
|
-
* lmstudio / vllm / sglang / litellm)按定义没有控制台页,缺席是正确答案不是遗漏。
|
|
23
|
-
* 设计档待裁点 3b:`oauth` / `subscribe` 两类**本批不加**(授权码流/设备码流单独排)。
|
|
24
|
-
*/
|
|
25
15
|
consoleUrl?: string;
|
|
26
|
-
/** 没账号时的注册入口。与 `consoleUrl` 同页的家不重复填(缺席 = 用 consoleUrl 那条)。 */
|
|
27
16
|
signupUrl?: string;
|
|
28
|
-
/**
|
|
29
|
-
* 🆕 design/165 §2 + design/166 §5(2026-08-04):**设备码能力开关**(B 档)。
|
|
30
|
-
*
|
|
31
|
-
* 🔴 它只是**开关**,不携带 client_id / token 端点 / authorize 端点 —— 那些编译进
|
|
32
|
-
* `model/providerAuth.ts` 的 `DEVICE_AUTH_PROVIDERS`。理由:目录是远端可改的数据,
|
|
33
|
-
* 让它决定鉴权端点 = 把钓鱼面下发给客户端(design/165 §2 红线④,CI 的 validate.mjs
|
|
34
|
-
* 里有对应的机械不变式)。
|
|
35
|
-
* 🔴 能力真值 = **本键在场 ∧ 包内有实现**(`supportsDeviceCodeAuth`)——目录先行不造 affordance。
|
|
36
|
-
*/
|
|
37
17
|
deviceAuth?: ProviderDeviceAuthHint;
|
|
38
18
|
};
|
|
39
|
-
/** 目录里的设备码能力开关(只有 kind 与文档链接;凭证参数一律不进目录)。 */
|
|
40
19
|
export interface ProviderDeviceAuthHint {
|
|
41
20
|
kind: 'device_code';
|
|
42
|
-
/** 该家自己的设备码说明页(纯链接;拿不准就不填,绝不编 URL)。 */
|
|
43
21
|
docsUrl?: string;
|
|
44
22
|
}
|
|
45
23
|
export type ModelFamily = {
|
|
46
24
|
id: string;
|
|
47
25
|
name: string;
|
|
48
|
-
/** Regex source matched against a model id to PRE-SELECT the family. '' = fallback. */
|
|
49
26
|
match: string;
|
|
50
27
|
contextWindow: number;
|
|
51
28
|
maxTokens: number;
|
|
52
|
-
/** 图像输入能力(确信才标:false=确认无 vision,true=确认有;缺省=未知不 stamp)。 */
|
|
53
29
|
vision?: boolean;
|
|
54
|
-
/**
|
|
55
|
-
* per-model 已知输出上限 —— 仅 inferFamily 第①层(providerPresets.json 精确表)命中时携带
|
|
56
|
-
* (=该行 maxTokens)。F2 裁决(clay 2026-07-15)封顶① 的证据位:家族正则/主干层的 maxTokens
|
|
57
|
-
* 是家族参考值,不是该模型的确证 cap,不带此位。
|
|
58
|
-
*/
|
|
59
30
|
perModelCap?: number;
|
|
60
31
|
};
|
|
61
32
|
export declare const PROVIDER_PRESETS: ProviderPreset[];
|
|
62
33
|
export declare const MODEL_FAMILIES: ModelFamily[];
|
|
63
|
-
/** Infer context/max from a model id — four evidence tiers, strongest first. */
|
|
64
34
|
export declare function inferFamily(modelId: string): ModelFamily | undefined;
|
|
65
|
-
/** Format token counts like "1m" / "384k". */
|
|
66
35
|
export declare function fmtTokens(n: number): string;
|
|
67
|
-
/** "1m ctx / 384k out" style short metric text. */
|
|
68
36
|
export declare function fmtCtxOut(ctx: number, out: number): string;
|
|
69
|
-
/** Screen-4 execution-slot recommendation: cheapHint first, else a cheap-sounding sibling. */
|
|
70
37
|
export declare function pickCheapCandidate<T extends {
|
|
71
38
|
id: string;
|
|
72
39
|
cheapHint?: boolean;
|
|
@@ -1,44 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6 · B4「四残件」之 model 数据表):cli
|
|
3
|
-
* `src/sema/onboard/providerPresets.{ts,json}` + `modelFamilies.json` 整搬(零依赖、纯查表)。
|
|
4
|
-
*
|
|
5
|
-
* 🔴 **为什么数据表必须进包**:`modelBudgetRule.defaultMaxTokensFor()`(B2 已搬)的封顶① 参数
|
|
6
|
-
* `perModelCap` 只有一个来源 —— `inferFamily()` 第①层精确命中。表留在壳里 ⇒ 库里那条中央规则
|
|
7
|
-
* 在 web/桌面上**永远拿不到 cap**,`defaultMaxTokensFor(ctx)` 恒走 min(base, ctx/4),
|
|
8
|
-
* 对 deepseek-chat(cap 8192)这类模型直接超发 ⇒ 网关 400。这不是「少个装饰」。
|
|
9
|
-
*
|
|
10
|
-
* 🔴 **搬迁期的双份漂移锁已退役(0.11.10)**:搬迁期壳树那两个 JSON 还在,pure 门当时有一条
|
|
11
|
-
* **byte-identity 断言**(本包 `src/model/*.json` 与壳树 `src/sema/onboard/*.json` 逐字节相等)。
|
|
12
|
-
* 壳侧 shim 落地(那两个 JSON 删除、`providerPresets.ts` 改 re-export 本包)之后,那条断言的
|
|
13
|
-
* **前提消失**了 —— 它从此每跑必打 DEGRADED 且**永远不会再跑**(校一个已经不存在的物,再自我
|
|
14
|
-
* 降级放过 = 僵尸腿)。继任不变量不是「两份一致」,是「**只有一份、而且用户拿到的就是它**」:
|
|
15
|
-
* · pure 门:`dist/model/*.json` 与 src **语义**等同(tsc emit 会重排缩进,跨 emit 边界只能校
|
|
16
|
-
* 语义)+ 运行时表的 id 序列 === 表本身 + src 树里各恰好一份 + 壳树零副本/shim 仍 re-export;
|
|
17
|
-
* · public-surface 门:`npm pack` 的**真实发布清单**里必须有这两个 JSON(换 bundler / 一行
|
|
18
|
-
* .npmignore 就能让数据表静悄悄不进 tarball,而类型与单测照样全绿)。
|
|
19
|
-
*
|
|
20
|
-
* ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
|
|
21
|
-
*
|
|
22
|
-
* providerPresets.ts — typed accessors over the static preset data tables for
|
|
23
|
-
* `sema onboard` (GUIDE-ONBOARD-DESIGN §3a/§3b, clay 拍板 2026-07-03).
|
|
24
|
-
*
|
|
25
|
-
* DATA lives in the sibling JSON files (providerPresets.json /
|
|
26
|
-
* modelFamilies.json) — adding a provider or family is a table row, no code
|
|
27
|
-
* change (维护性原则: new source = one module + one table row). Shapes align
|
|
28
|
-
* with openclaw's plugin-manifest `modelCatalog.providers` / CenterModel so
|
|
29
|
-
* translators stay ~free, but centralized (sema has no plugin system).
|
|
30
|
-
*
|
|
31
|
-
* All numbers are best-effort defaults (待核 official docs); qwen/glm values
|
|
32
|
-
* were read from clay's real ~/.openclaw catalog.
|
|
33
|
-
*/
|
|
34
1
|
import presetData from './providerPresets.json' with { type: 'json' };
|
|
35
2
|
import familyData from './modelFamilies.json' with { type: 'json' };
|
|
36
3
|
export const PROVIDER_PRESETS = presetData.presets;
|
|
37
4
|
export const MODEL_FAMILIES = familyData.families;
|
|
38
|
-
// ── 模型自动匹配 v2(clay 07-06:预填要"较为准确的推荐",真实测例驱动,verify/_infer-family-test)──
|
|
39
|
-
// 四层:①preset 大表精确命中(46 provider 的真实 models,最强证据)②容量后缀/名内提示([1m]、-128k)
|
|
40
|
-
// ③家族主干匹配(部署前缀/参数量/量化后缀容忍)④family 表前缀兜底。
|
|
41
|
-
/** 尾部变体词(主干提取时剥):不承载 ctx 信息的营销/角色/量化/参数量后缀。 */
|
|
42
5
|
const VARIANT_TAIL = /(-(plus|pro|max|flash|turbo|mini|lite|chat|coder?|code|instruct|thinking|reasoner|next|preview|latest|fp8|fp16|awq|int[48]|gptq|\d+b))+$/;
|
|
43
6
|
let presetIndexCache = null;
|
|
44
7
|
function presetIndex() {
|
|
@@ -64,13 +27,6 @@ function presetIndex() {
|
|
|
64
27
|
presetIndexCache = { exact, stems };
|
|
65
28
|
return presetIndexCache;
|
|
66
29
|
}
|
|
67
|
-
/**
|
|
68
|
-
* family 表(第④层)的**唯一**匹配器 —— anchored 优先、再 unanchored 兜底。
|
|
69
|
-
*
|
|
70
|
-
* 提出来的理由不是整洁,是**单源**:`vision` 位只住在这张表上,而第①/②/③ 层命中时也要能读到它
|
|
71
|
-
* (见 {@link visionFromFamilyTable})。若两处各写一遍两趟正则,「这个 id 属哪个家族」在同一个函数
|
|
72
|
-
* 里就会有两个答案。
|
|
73
|
-
*/
|
|
74
30
|
function familyFromTable(id) {
|
|
75
31
|
for (const fam of MODEL_FAMILIES) {
|
|
76
32
|
if (fam.match && new RegExp(fam.match, 'i').test(id))
|
|
@@ -82,25 +38,6 @@ function familyFromTable(id) {
|
|
|
82
38
|
}
|
|
83
39
|
return undefined;
|
|
84
40
|
}
|
|
85
|
-
/**
|
|
86
|
-
* 🔴 **#318 件③(cli [4752] 自领缺口1)—— `vision` 的分层遮蔽修**。
|
|
87
|
-
*
|
|
88
|
-
* 病(修前的真行为,不是假设):`vision` 位只写在 `modelFamilies.json` 上,而那张表只有**第④层**
|
|
89
|
-
* 读。可是任何真实的 `deepseek-*` id 在**第①层**(preset 大表精确)或**第③层**(家族主干包含)
|
|
90
|
-
* 就已经命中并 return 了,而这两层的构造器 `hitOf` **不带 vision 位** ⇒ 第④层对它们**结构性不可达**
|
|
91
|
-
* ⇒ `deepseek4` 行的 `vision: false` **永远读不出来**,壳的 `MODEL_VISION=false` stamp 恒不发生
|
|
92
|
-
* (下游两处注释自述的行为是死的)。
|
|
93
|
-
*
|
|
94
|
-
* 修的形:把 `vision` 从「第④层的一个字段」提成**与 ctx/maxTokens 证据层正交的一次独立查表**。
|
|
95
|
-
* 判据分工从此是两条轴,各自单源:
|
|
96
|
-
* · **容量轴**(contextWindow / maxTokens / perModelCap)= 四层证据,强者先赢 —— 一字不动;
|
|
97
|
-
* · **vision 轴** = 恒查 family 表(本函数),与哪一层命中**无关**。
|
|
98
|
-
* 为什么正交是对的:preset 大表(第①层)根本没有 vision 列,主干匹配(第③层)拿的是**别的模型**
|
|
99
|
-
* 的行 —— 两者都不是「这个 id 能不能看图」的证据。唯一有这个事实的地方就是 family 表。
|
|
100
|
-
*
|
|
101
|
-
* 🔴 **诚实缺席**:表上没标(键缺席)⇒ 返回 `undefined` ⇒ 调用方**不 stamp 这个键**。
|
|
102
|
-
* 「没人说过这个模型能不能看图」与「确认它不能看图」是两件事,后者会永久封死一个真能力。
|
|
103
|
-
*/
|
|
104
41
|
function visionFromFamilyTable(id) {
|
|
105
42
|
const fam = familyFromTable(id);
|
|
106
43
|
return typeof fam?.vision === 'boolean' ? fam.vision : undefined;
|
|
@@ -109,25 +46,20 @@ function normalizeId(raw) {
|
|
|
109
46
|
let id = raw.trim().toLowerCase();
|
|
110
47
|
const slash = id.lastIndexOf('/');
|
|
111
48
|
if (slash >= 0)
|
|
112
|
-
id = id.slice(slash + 1);
|
|
113
|
-
id = id.replace(/\[[0-9]+[km]\]$/, '');
|
|
49
|
+
id = id.slice(slash + 1);
|
|
50
|
+
id = id.replace(/\[[0-9]+[km]\]$/, '');
|
|
114
51
|
return id;
|
|
115
52
|
}
|
|
116
|
-
/** Infer context/max from a model id — four evidence tiers, strongest first. */
|
|
117
53
|
export function inferFamily(modelId) {
|
|
118
54
|
const raw = modelId.trim().toLowerCase();
|
|
119
55
|
if (!raw)
|
|
120
56
|
return undefined;
|
|
121
57
|
const idx = presetIndex();
|
|
122
|
-
// ② 前置:显式容量标注恒赢([1m]/[200k] CC 惯例后缀)——用户/工具已声明,别猜。
|
|
123
58
|
const capSuffix = raw.match(/\[(\d+)([km])\]$/);
|
|
124
59
|
if (capSuffix) {
|
|
125
60
|
const n = Number(capSuffix[1]);
|
|
126
61
|
const ctx = capSuffix[2] === 'm' ? n * 1000000 : n * 1024;
|
|
127
62
|
const base = inferFamily(raw.replace(/\[[0-9]+[km]\]$/, ''));
|
|
128
|
-
// perModelCap 透传:后缀只声明 ctx,不改该模型的确证输出 cap(deepseek-chat[1m] 仍 cap 8192)
|
|
129
|
-
// eopt:vision/perModelCap 是「缺省=未知不 stamp」的条件展开位(与 taskId/status 那种「键恒在」
|
|
130
|
-
// 公面契约不同义——那两位没有「已确认为未知」这个第三态,这两位有),诚实透传 base 的键在场与否。
|
|
131
63
|
return {
|
|
132
64
|
id: base?.id ?? 'cap-suffix',
|
|
133
65
|
name: base?.name ?? 'capacity suffix',
|
|
@@ -139,20 +71,13 @@ export function inferFamily(modelId) {
|
|
|
139
71
|
};
|
|
140
72
|
}
|
|
141
73
|
const id = normalizeId(raw);
|
|
142
|
-
// vision 轴:与容量证据层**正交**的一次独立查表(#318 件③ 分层遮蔽修,推导见 visionFromFamilyTable)。
|
|
143
|
-
// 恒按**完整归一 id** 查(不按主干):family 的 match 是锚在 id 上的前缀正则,拿主干去查会把
|
|
144
|
-
// `deepseek-chat` 的证据换成 `deepseek` 的证据 —— 同族时同解,不同族时是另一个答案。
|
|
145
74
|
const vision = visionFromFamilyTable(id);
|
|
146
|
-
// ① preset 大表精确(含剥变体尾巴后再试)——精确命中才带 perModelCap(F2 裁决封顶① 证据位;
|
|
147
|
-
// ③ 层主干匹配拿的是家族参考行,不是该模型的确证 cap)
|
|
148
75
|
const hitOf = (m, exact = false) => ({
|
|
149
76
|
id: m.famId,
|
|
150
77
|
name: m.famId,
|
|
151
78
|
match: '',
|
|
152
79
|
contextWindow: m.contextWindow,
|
|
153
80
|
maxTokens: m.maxTokens,
|
|
154
|
-
// 🔴 诚实缺席:表上没标就**不 stamp 键**(`exactOptionalPropertyTypes` 下 `vision: undefined`
|
|
155
|
-
// 与键缺席不是一回事,消费方读的正是「键在不在」这个三态)。
|
|
156
81
|
...(vision !== undefined ? { vision } : {}),
|
|
157
82
|
...(exact ? { perModelCap: m.maxTokens } : {}),
|
|
158
83
|
});
|
|
@@ -165,14 +90,11 @@ export function inferFamily(modelId) {
|
|
|
165
90
|
if (e2)
|
|
166
91
|
return hitOf(e2, true);
|
|
167
92
|
}
|
|
168
|
-
// ② 名内容量提示(moonshot-v1-128k / *-32k):k=×1024
|
|
169
93
|
const inline = id.match(/-(\d+)([km])\b/);
|
|
170
94
|
if (inline) {
|
|
171
95
|
const n = Number(inline[1]);
|
|
172
96
|
if ((inline[2] === 'k' && n >= 8) || inline[2] === 'm') {
|
|
173
97
|
const ctx = inline[2] === 'm' ? n * 1000000 : n * 1024;
|
|
174
|
-
// vision 轴同样正交透出(`deepseek-v3-128k` 这类 id 在这一层就 return,不透 = 同一个遮蔽病
|
|
175
|
-
// 换个层复发)。
|
|
176
98
|
return {
|
|
177
99
|
id: 'inline-cap',
|
|
178
100
|
name: 'capacity in id',
|
|
@@ -183,14 +105,11 @@ export function inferFamily(modelId) {
|
|
|
183
105
|
};
|
|
184
106
|
}
|
|
185
107
|
}
|
|
186
|
-
// ③ 家族主干:候选主干=preset model id 剥变体尾;主干出现在待匹配 id 中,取最长主干
|
|
187
108
|
let best = null;
|
|
188
109
|
let bestLen = 0;
|
|
189
110
|
for (const m of idx.stems) {
|
|
190
111
|
const stem = m.id.replace(VARIANT_TAIL, '');
|
|
191
112
|
if (stem.length >= 6 && id.includes(stem)) {
|
|
192
|
-
// 同长命中取 ctx 最小=家族原生保守值(服务档扩展如 DashScope 1M 让用户在档位里升,
|
|
193
|
-
// 预填错大比错小危险——超发请求直接被网关拒)
|
|
194
113
|
if (stem.length > bestLen || (stem.length === bestLen && best && m.contextWindow < best.contextWindow)) {
|
|
195
114
|
best = m;
|
|
196
115
|
bestLen = stem.length;
|
|
@@ -199,15 +118,9 @@ export function inferFamily(modelId) {
|
|
|
199
118
|
}
|
|
200
119
|
if (best)
|
|
201
120
|
return hitOf(best);
|
|
202
|
-
// ④ family 表前缀(anchored → unanchored)—— 与 vision 轴共用同一个匹配器(单源,见 familyFromTable)
|
|
203
121
|
return familyFromTable(id);
|
|
204
122
|
}
|
|
205
|
-
/** Format token counts like "1m" / "384k". */
|
|
206
123
|
export function fmtTokens(n) {
|
|
207
|
-
// token 界惯例=二进制 K(clay 07-06:32768 显示 33K 是错的,就是 32K;262144=256K)。
|
|
208
|
-
// 1024 整除走二进制;否则十进制圆整(200000→200k、202800→203k);M 档十进制(1000000→1m)。
|
|
209
|
-
// #29⑤(prelaunch audit):十进制整千先判 —— 128000 是十进制圆数,必须渲 128k,不是 125k
|
|
210
|
-
// (128000%1024==0 曾把它劫进二进制档;其它入口全都叫 128K)。32768/262144/393216 不整除 1000,不受影响。
|
|
211
124
|
if (n >= 1000000 && n % 100000 === 0)
|
|
212
125
|
return `${n / 1000000}m`;
|
|
213
126
|
if (n >= 1000 && n % 1000 === 0)
|
|
@@ -218,11 +131,9 @@ export function fmtTokens(n) {
|
|
|
218
131
|
return `${Math.round(n / 1000)}k`;
|
|
219
132
|
return String(n);
|
|
220
133
|
}
|
|
221
|
-
/** "1m ctx / 384k out" style short metric text. */
|
|
222
134
|
export function fmtCtxOut(ctx, out) {
|
|
223
135
|
return `${fmtTokens(ctx)} ctx / ${fmtTokens(out)} out`;
|
|
224
136
|
}
|
|
225
|
-
/** Screen-4 execution-slot recommendation: cheapHint first, else a cheap-sounding sibling. */
|
|
226
137
|
export function pickCheapCandidate(models, defaultId) {
|
|
227
138
|
const others = models.filter(m => m.id !== defaultId);
|
|
228
139
|
return (others.find(m => m.cheapHint) ??
|
|
@@ -1,43 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* tierVocabulary.ts — F4 族D(A-028.18,2026-08-15):档位(tier)的**词表 + 派生 + 校验**单源。
|
|
3
|
-
* 纯数据 + 纯函数,零 IO、零宿主依赖。
|
|
4
|
-
*
|
|
5
|
-
* ## 为什么进包
|
|
6
|
-
*
|
|
7
|
-
* 搬迁前这套词表跨两仓共三份:cli `src/sema/config/tierCore.ts`(词表 + isTier 校验 +
|
|
8
|
-
* resolveTierBinding 派生)、web `tiers-page.tsx`(词表)、web `chat/wording.ts`(词表 + 按
|
|
9
|
-
* 模型名 token 化的派生)。五档顺序/别名映射漂了没有任何编译器会响。词表进包后:cli 的
|
|
10
|
-
* tierCore 换装 re-export(settings 读写那半场留在壳里 —— 那是宿主存储,不是词表);web 侧
|
|
11
|
-
* 两份的退役是 web 半场的事(发布帖点名)。
|
|
12
|
-
*
|
|
13
|
-
* ## 与引擎侧的对齐
|
|
14
|
-
*
|
|
15
|
-
* 五档序镜像 core `DEFAULT_TIER_ORDER`、CC 别名镜像 core `CC_MODEL_TIER_ALIASES`(cli 侧
|
|
16
|
-
* tierStore.test.ts 有对 core 导出的运行时 drift-lock);`ultra` 预留在 max 之上(core 已排位,
|
|
17
|
-
* UI 今天不面)。缺省默认档 pro(clay [599])。
|
|
18
|
-
*/
|
|
19
|
-
/** sema 档位(用户/模型可寻址的命名档)。`ultra` 预留(core 已排位,UI 今天不面)。 */
|
|
20
1
|
export type Tier = 'ultra' | 'max' | 'pro' | 'flash' | 'lite';
|
|
21
|
-
/** 降档链(强→弱)——镜像 core DEFAULT_TIER_ORDER;解析某档无绑定时沿链向后取第一个有绑定的档。 */
|
|
22
2
|
export declare const TIER_ORDER: readonly Tier[];
|
|
23
|
-
/** UI 呈现的四档(ultra 预留不面)。 */
|
|
24
3
|
export declare const SURFACED_TIERS: readonly Tier[];
|
|
25
|
-
/** CC 档位词 → sema 档位(内置固定映射,镜像 core CC_MODEL_TIER_ALIASES;兼容层不可配)。 */
|
|
26
4
|
export declare const CC_TIER_ALIASES: Readonly<Record<string, Tier>>;
|
|
27
|
-
/** 缺省默认档(clay [599]:默认档缺省 pro)。 */
|
|
28
5
|
export declare const DEFAULT_TIER: Tier;
|
|
29
|
-
/** 各档一句话职责(档位 Hub/onboard 行描述共用;无 roster/role 词)。 */
|
|
30
6
|
export declare const TIER_BLURBS: Readonly<Record<Tier, string>>;
|
|
31
|
-
/** 一个命名档位组的绑定形(纯类型:绑定值 = 端侧模型目录的 entry id)。 */
|
|
32
7
|
export type TierGroupDef = {
|
|
33
|
-
/** tier → 模型 entry id。未绑档沿 TIER_ORDER 向下 fail-open(见 resolveTierBinding)。 */
|
|
34
8
|
tiers: Partial<Record<Tier, string>>;
|
|
35
|
-
/** 组内默认档(缺省 DEFAULT_TIER=pro)。 */
|
|
36
9
|
defaultTier?: Tier;
|
|
37
10
|
};
|
|
38
11
|
export declare const isTier: (v: unknown) => v is Tier;
|
|
39
|
-
/**
|
|
40
|
-
* 组内解析某档 → 绑定 entry id(该档未绑则沿 TIER_ORDER 向下取第一个有绑定的档;全空
|
|
41
|
-
* undefined)。fail-open 沿链向下,镜像 core expandTiers 语义。
|
|
42
|
-
*/
|
|
43
12
|
export declare function resolveTierBinding(def: TierGroupDef, tier: Tier): string | undefined;
|
|
@@ -1,26 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* tierVocabulary.ts — F4 族D(A-028.18,2026-08-15):档位(tier)的**词表 + 派生 + 校验**单源。
|
|
3
|
-
* 纯数据 + 纯函数,零 IO、零宿主依赖。
|
|
4
|
-
*
|
|
5
|
-
* ## 为什么进包
|
|
6
|
-
*
|
|
7
|
-
* 搬迁前这套词表跨两仓共三份:cli `src/sema/config/tierCore.ts`(词表 + isTier 校验 +
|
|
8
|
-
* resolveTierBinding 派生)、web `tiers-page.tsx`(词表)、web `chat/wording.ts`(词表 + 按
|
|
9
|
-
* 模型名 token 化的派生)。五档顺序/别名映射漂了没有任何编译器会响。词表进包后:cli 的
|
|
10
|
-
* tierCore 换装 re-export(settings 读写那半场留在壳里 —— 那是宿主存储,不是词表);web 侧
|
|
11
|
-
* 两份的退役是 web 半场的事(发布帖点名)。
|
|
12
|
-
*
|
|
13
|
-
* ## 与引擎侧的对齐
|
|
14
|
-
*
|
|
15
|
-
* 五档序镜像 core `DEFAULT_TIER_ORDER`、CC 别名镜像 core `CC_MODEL_TIER_ALIASES`(cli 侧
|
|
16
|
-
* tierStore.test.ts 有对 core 导出的运行时 drift-lock);`ultra` 预留在 max 之上(core 已排位,
|
|
17
|
-
* UI 今天不面)。缺省默认档 pro(clay [599])。
|
|
18
|
-
*/
|
|
19
|
-
/** 降档链(强→弱)——镜像 core DEFAULT_TIER_ORDER;解析某档无绑定时沿链向后取第一个有绑定的档。 */
|
|
20
1
|
export const TIER_ORDER = ['ultra', 'max', 'pro', 'flash', 'lite'];
|
|
21
|
-
/** UI 呈现的四档(ultra 预留不面)。 */
|
|
22
2
|
export const SURFACED_TIERS = ['max', 'pro', 'flash', 'lite'];
|
|
23
|
-
/** CC 档位词 → sema 档位(内置固定映射,镜像 core CC_MODEL_TIER_ALIASES;兼容层不可配)。 */
|
|
24
3
|
export const CC_TIER_ALIASES = {
|
|
25
4
|
fable: 'max',
|
|
26
5
|
mythos: 'max',
|
|
@@ -28,9 +7,7 @@ export const CC_TIER_ALIASES = {
|
|
|
28
7
|
sonnet: 'flash',
|
|
29
8
|
haiku: 'lite',
|
|
30
9
|
};
|
|
31
|
-
/** 缺省默认档(clay [599]:默认档缺省 pro)。 */
|
|
32
10
|
export const DEFAULT_TIER = 'pro';
|
|
33
|
-
/** 各档一句话职责(档位 Hub/onboard 行描述共用;无 roster/role 词)。 */
|
|
34
11
|
export const TIER_BLURBS = {
|
|
35
12
|
ultra: 'reserved above max — binds when a stronger model lands',
|
|
36
13
|
max: 'hardest problems — deep reasoning, big refactors',
|
|
@@ -39,10 +16,6 @@ export const TIER_BLURBS = {
|
|
|
39
16
|
lite: 'cheapest — bulk classification, simple lookups',
|
|
40
17
|
};
|
|
41
18
|
export const isTier = (v) => typeof v === 'string' && TIER_ORDER.includes(v);
|
|
42
|
-
/**
|
|
43
|
-
* 组内解析某档 → 绑定 entry id(该档未绑则沿 TIER_ORDER 向下取第一个有绑定的档;全空
|
|
44
|
-
* undefined)。fail-open 沿链向下,镜像 core expandTiers 语义。
|
|
45
|
-
*/
|
|
46
19
|
export function resolveTierBinding(def, tier) {
|
|
47
20
|
const direct = def.tiers[tier];
|
|
48
21
|
if (direct)
|
|
@@ -1,44 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/modelBudgetRule.ts 逐字搬入(零依赖,纯规则)。
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* modelBudgetRule.ts — max-output-tokens 中央规则(clay 2026-07-15 拍板,F2 maxTokens 裁决批)。
|
|
6
|
-
*
|
|
7
|
-
* 裁决(逐字):
|
|
8
|
-
* · 上下文窗口:预设/家族表能匹配用匹配值;匹配不上默认 200000(FALLBACK_CONTEXT_WINDOW)。
|
|
9
|
-
* · maxTokens 默认:32000;上下文窗口 ≥500000 → 64000;恒受两道封顶:
|
|
10
|
-
* ① per-model 已知 cap(providerPresets 精确表,inferFamily 第①层命中带 perModelCap);
|
|
11
|
-
* ② 上下文窗口 ÷ 4(向下取整)。
|
|
12
|
-
* · UI 四档(超集):16K / 32K(默认)/ 64K / 128K;档位 > 上下文窗口÷4 的禁用/跳过
|
|
13
|
-
* (例:128K 上下文 → 顶 32K;1M → 全档可用)。
|
|
14
|
-
* · env 显式值恒赢:CLAUDE_CODE_MAX_OUTPUT_TOKENS 映射与显式 MODEL_MAX_TOKENS 既有行为不动
|
|
15
|
-
* (本模块只算默认,不碰覆盖层 —— 见 ccConfigFallback.applyModelEnvFamilyFallback)。
|
|
16
|
-
*
|
|
17
|
-
* CC 对照锚(有意偏离,记忆档 max-tokens-ruling-deviate-cc):CC 2.1.207 per-model 表
|
|
18
|
-
* `max_output_tokens:{default:32000,upper:64000}`(源 13760)+ CLAUDE_CODE_MAX_OUTPUT_TOKENS env
|
|
19
|
-
* 钳制(源 529278),无 UI 档位、无 ÷4 封顶。sema 面对任意三方模型/网关,家族表大数直接当默认会
|
|
20
|
-
* 超供应商 cap(400)或单轮吃穿预算 —— 故默认收敛到 CC 口径 32K/64K,并加 ÷4 与 per-model 封顶;
|
|
21
|
-
* UI 档位是超集便利面。
|
|
22
|
-
*
|
|
23
|
-
* 注意:providerPresets.json 精确表 / modelFamilies.json 家族表的 maxTokens 字段【保留】——
|
|
24
|
-
* 只作 cap 参考(perModelCap / 显示),不再直接当默认 stamp 值。
|
|
25
|
-
*/
|
|
26
|
-
/** 裁决:预设/家族都匹配不上时的上下文窗口默认(=CC 的 200k 口径)。 */
|
|
27
1
|
export declare const FALLBACK_CONTEXT_WINDOW = 200000;
|
|
28
|
-
/** UI 四档(超集):16K / 32K(默认)/ 64K / 128K。十进制(与 CC 32000/64000 同基)。 */
|
|
29
2
|
export declare const MAXTOK_TIERS: readonly [16000, 32000, 64000, 128000];
|
|
30
|
-
/**
|
|
31
|
-
* 默认 max tokens = min( ctx>=500000 ? 64000 : 32000 , floor(ctx/4) , perModelCap ?? ∞ )。
|
|
32
|
-
* contextWindow 传 null/undefined/非法 = 匹配不上 → 按 200000 算(→ 32000)。
|
|
33
|
-
*/
|
|
34
3
|
export declare function defaultMaxTokensFor(contextWindow: number | null | undefined, perModelCap?: number | null): number;
|
|
35
|
-
/**
|
|
36
|
-
* 该上下文窗口下可用的 UI 档位(> ctx÷4 的禁用/跳过)。可能为空(ctx < 64000,如 32K 上下文
|
|
37
|
-
* 连 16K 档都超 ÷4)—— UI 调用方对空列表降级(提示用 M 自由输入),规则函数不瞎补。
|
|
38
|
-
*/
|
|
39
4
|
export declare function tierChoicesFor(contextWindow: number | null | undefined): number[];
|
|
40
|
-
/**
|
|
41
|
-
* 档位循环:当前值在档内 → 下一档(循环);不在档内(自由输入/家族值)→ 大于当前的最小档,
|
|
42
|
-
* 都不大于则回第一档(与 modelCtxOverride.nextStep 同语义)。无可用档 → null(调用方降级)。
|
|
43
|
-
*/
|
|
44
5
|
export declare function nextMaxTokTier(current: number | null | undefined, contextWindow: number | null | undefined): number | null;
|