nolo-cli 0.1.39 → 0.1.41

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.
Files changed (438) hide show
  1. package/README.md +4 -4
  2. package/agent-runtime/dialogWritePlan.ts +39 -0
  3. package/agent-runtime/hostAdapter.ts +4 -0
  4. package/agent-runtime/hybridRecordStore.ts +5 -3
  5. package/agent-runtime/index.ts +15 -0
  6. package/agent-runtime/localLoop.ts +87 -7
  7. package/agent-runtime/localToolPolicy.ts +2 -13
  8. package/agent-runtime/localWorkspaceTools.ts +42 -110
  9. package/agent-runtime/runtimeToolPolicy.ts +2 -11
  10. package/agent-runtime/runtimeToolSurface.ts +198 -0
  11. package/agent-runtime/types.ts +1 -0
  12. package/agentAliases.ts +2 -1
  13. package/agentRunCommand.ts +10 -32
  14. package/agentRuntimeLocal.ts +1 -0
  15. package/ai/agent/_executeModel.ts +146 -0
  16. package/ai/agent/agentSlice.ts +556 -1
  17. package/ai/agent/appWorkingMemory.ts +126 -0
  18. package/ai/agent/buildEditingContext.ts +378 -0
  19. package/ai/agent/buildSystemPrompt.ts +585 -0
  20. package/ai/agent/canvasEditingContext.ts +49 -0
  21. package/ai/agent/cleanAgentMessages.ts +140 -0
  22. package/ai/agent/cliChatClient.ts +153 -0
  23. package/ai/agent/cliExecutor.ts +314 -40
  24. package/ai/agent/contextCompiler.ts +107 -0
  25. package/ai/agent/contextLayerContract.ts +44 -0
  26. package/ai/agent/createAgentSchema.ts +272 -0
  27. package/ai/agent/currentTimeContext.ts +65 -0
  28. package/ai/agent/executeToolCall.ts +58 -0
  29. package/ai/agent/fetchAgentContexts.ts +42 -0
  30. package/ai/agent/generatePrompt.ts +3 -0
  31. package/ai/agent/getFullChatContextKeys.ts +168 -0
  32. package/ai/agent/guidedCreation/capabilities.ts +84 -0
  33. package/ai/agent/guidedCreation/types.ts +38 -0
  34. package/ai/agent/isLiveAudioOnlyAgent.ts +26 -0
  35. package/ai/agent/liveAudioModel.ts +2 -0
  36. package/ai/agent/pageBuilderHandoffRules.ts +75 -0
  37. package/ai/agent/persistMessageWithFixedId.ts +37 -0
  38. package/ai/agent/planSlice.ts +259 -0
  39. package/ai/agent/referenceUtils.ts +229 -0
  40. package/ai/agent/runAgentBackground.ts +310 -0
  41. package/ai/agent/runAgentClientLoop.ts +164 -0
  42. package/ai/agent/runtimeGuidance.ts +116 -0
  43. package/ai/agent/serverOrigin.ts +7 -0
  44. package/ai/agent/startParallelAgentStreams.ts +424 -0
  45. package/ai/agent/startupProtocol.ts +53 -0
  46. package/ai/agent/streamAgentChatTurn.ts +2001 -0
  47. package/ai/agent/streamAgentChatTurnUtils.ts +860 -0
  48. package/ai/agent/toolFailureGuard.ts +99 -0
  49. package/ai/agent/types.ts +73 -0
  50. package/ai/agent/utils/imageOutput.ts +37 -0
  51. package/ai/agent/utils/publicImageAgentMode.ts +26 -0
  52. package/ai/ai.locale.ts +1095 -0
  53. package/ai/chat/accumulateToolCallChunks.ts +126 -0
  54. package/ai/chat/fetchUtils.ts +143 -0
  55. package/ai/chat/inlineImageUrlsForCustomProvider.ts +117 -0
  56. package/ai/chat/parseApiError.ts +67 -0
  57. package/ai/chat/parseMultilineSSE.ts +95 -0
  58. package/ai/chat/sendOpenAICompletionsRequest.ts +897 -0
  59. package/ai/chat/sendOpenAIResponseRequest.ts +720 -0
  60. package/ai/chat/serverProxyRetry.ts +102 -0
  61. package/ai/chat/shouldUseServerProxy.ts +18 -0
  62. package/ai/chat/streamRetry.ts +46 -0
  63. package/ai/chat/updateTotalUsage.ts +89 -0
  64. package/ai/context/buildReferenceContext.ts +437 -0
  65. package/ai/context/retention.ts +165 -0
  66. package/ai/context/tokenUtils.ts +78 -0
  67. package/ai/llm/agentCapabilities.ts +74 -0
  68. package/ai/llm/deepinfra.ts +79 -0
  69. package/ai/llm/fireworks.ts +68 -0
  70. package/ai/llm/generateRequestBody.ts +165 -0
  71. package/ai/llm/getModelContextWindow.ts +93 -0
  72. package/ai/llm/getPricing.ts +252 -0
  73. package/ai/llm/imagePricing.ts +66 -0
  74. package/ai/llm/isResponseAPIModel.ts +13 -0
  75. package/ai/llm/kimi.ts +23 -0
  76. package/ai/llm/mimo.ts +99 -0
  77. package/ai/llm/mistral.ts +21 -0
  78. package/ai/llm/models.ts +45 -0
  79. package/ai/llm/openrouterModels.ts +6 -0
  80. package/ai/llm/providers.ts +313 -0
  81. package/ai/llm/reasoningModels.ts +27 -0
  82. package/ai/llm/types.ts +82 -0
  83. package/ai/llm/usageRequestOptions.ts +59 -0
  84. package/ai/memory/queryShared.ts +161 -0
  85. package/ai/memory/recentRelationshipRecap.ts +247 -0
  86. package/ai/memory/remember.ts +167 -0
  87. package/ai/memory/store.ts +20 -0
  88. package/ai/memory/storeShared.ts +76 -0
  89. package/ai/memory/types.ts +46 -0
  90. package/ai/memory/understanding.ts +349 -0
  91. package/ai/memory/understandingGreeting.ts +264 -0
  92. package/ai/policy/personalizationDialog.ts +333 -0
  93. package/ai/policy/runtimePolicy.ts +454 -0
  94. package/ai/policy/selfUpdateFields.ts +48 -0
  95. package/ai/policy/types.ts +64 -0
  96. package/ai/skills/referenceRuntime.ts +274 -0
  97. package/ai/skills/skillDiagnostics.ts +251 -0
  98. package/ai/skills/skillDocBuilder.ts +139 -0
  99. package/ai/skills/skillSummaryMarker.ts +26 -0
  100. package/ai/token/calculatePrice.ts +576 -0
  101. package/ai/token/missingUsageEstimate.ts +42 -0
  102. package/ai/token/normalizeUsage.ts +124 -0
  103. package/ai/token/openaiImageGenerationUsage.ts +56 -0
  104. package/ai/token/prepareTokenUsageData.ts +93 -0
  105. package/ai/token/resolveBillingTarget.ts +52 -0
  106. package/ai/token/saveTokenRecord.ts +53 -0
  107. package/ai/token/types.ts +103 -0
  108. package/ai/tools/agent/agentTools.ts +235 -0
  109. package/ai/tools/agent/agentUpdateShared.ts +311 -0
  110. package/ai/tools/agent/callAgentTool.ts +139 -0
  111. package/ai/tools/agent/createAgentTool.ts +512 -0
  112. package/ai/tools/agent/createDialogTool.ts +69 -0
  113. package/ai/tools/agent/createSkillAgentTool.ts +62 -0
  114. package/ai/tools/agent/parallelBudget.ts +221 -0
  115. package/ai/tools/agent/prepareAgentDraftTool.ts +159 -0
  116. package/ai/tools/agent/presets/appBuilderPreset.ts +154 -0
  117. package/ai/tools/agent/runLlmTool.ts +96 -0
  118. package/ai/tools/agent/runStreamingAgentTool.ts +73 -0
  119. package/ai/tools/agent/skillAgentArgs.ts +106 -0
  120. package/ai/tools/agent/startAgentDialogTool.ts +53 -0
  121. package/ai/tools/agent/streamParallelAgentsTool.ts +123 -0
  122. package/ai/tools/agent/updateAgentTool.ts +96 -0
  123. package/ai/tools/agent/updateSelfTool.ts +113 -0
  124. package/ai/tools/amazonProductScraperTool.ts +86 -0
  125. package/ai/tools/apifyActorClient.ts +45 -0
  126. package/ai/tools/appEditGuard.ts +372 -0
  127. package/ai/tools/appReadSnapshot.ts +153 -0
  128. package/ai/tools/appTools.ts +1549 -0
  129. package/ai/tools/applyEditTool.ts +259 -0
  130. package/ai/tools/applyLineEditsTool.ts +315 -0
  131. package/ai/tools/browserTools/click.ts +33 -0
  132. package/ai/tools/browserTools/closeSession.ts +29 -0
  133. package/ai/tools/browserTools/common.ts +27 -0
  134. package/ai/tools/browserTools/openSession.ts +48 -0
  135. package/ai/tools/browserTools/readContent.ts +38 -0
  136. package/ai/tools/browserTools/selectOption.ts +46 -0
  137. package/ai/tools/browserTools/typeText.ts +42 -0
  138. package/ai/tools/category/createCategoryTool.ts +66 -0
  139. package/ai/tools/category/queryContentsByCategoryTool.ts +69 -0
  140. package/ai/tools/category/updateContentCategoryTool.ts +75 -0
  141. package/ai/tools/cfBrowserTools.ts +319 -0
  142. package/ai/tools/cfSpeechToTextTool.ts +49 -0
  143. package/ai/tools/checkEnvTool.ts +102 -0
  144. package/ai/tools/cloudflareCrawlTool.ts +289 -0
  145. package/ai/tools/codeSearchTool.ts +123 -0
  146. package/ai/tools/codeTools.ts +101 -0
  147. package/ai/tools/convertMarxistsBookTool.ts +103 -0
  148. package/ai/tools/createDocTool.ts +132 -0
  149. package/ai/tools/createSkillDocTool.ts +155 -0
  150. package/ai/tools/createWorkflowTool.ts +154 -0
  151. package/ai/tools/delayTool.ts +31 -0
  152. package/ai/tools/deleteSpacesTool.ts +325 -0
  153. package/ai/tools/deleteSpacesToolModel.ts +159 -0
  154. package/ai/tools/devReloadUtils.ts +29 -0
  155. package/ai/tools/dialogMessageSearch.ts +137 -0
  156. package/ai/tools/doctorSkillTool.ts +72 -0
  157. package/ai/tools/ecommerceScraperTool.ts +86 -0
  158. package/ai/tools/emailTools.ts +549 -0
  159. package/ai/tools/evalSkillTool.ts +92 -0
  160. package/ai/tools/exaSearchTool.ts +63 -0
  161. package/ai/tools/execShellTool.ts +266 -0
  162. package/ai/tools/executeSqlTool.ts +192 -0
  163. package/ai/tools/fetchWebpageSupport.ts +333 -0
  164. package/ai/tools/fetchWebpageTool.ts +97 -0
  165. package/ai/tools/geminiImagePreviewTool.ts +386 -0
  166. package/ai/tools/generateDocxTool.ts +215 -0
  167. package/ai/tools/googleSearchScraperTool.ts +106 -0
  168. package/ai/tools/importDataTool.ts +133 -0
  169. package/ai/tools/importSkillTool.ts +162 -0
  170. package/ai/tools/index.ts +2308 -0
  171. package/ai/tools/jdProductScraperTool.ts +821 -0
  172. package/ai/tools/listUserSpacesTool.ts +113 -0
  173. package/ai/tools/localFilesTool.ts +276 -0
  174. package/ai/tools/marxistsOfflineBook.ts +253 -0
  175. package/ai/tools/modelUsageTools.ts +206 -0
  176. package/ai/tools/noloWorkspaceReadTools.ts +467 -0
  177. package/ai/tools/olmOcrTool.ts +33 -0
  178. package/ai/tools/openaiImageTool.ts +267 -0
  179. package/ai/tools/prepareTools.ts +23 -0
  180. package/ai/tools/readDocTool.ts +88 -0
  181. package/ai/tools/readFileTool.ts +214 -0
  182. package/ai/tools/readTool.ts +194 -0
  183. package/ai/tools/readXPostTool.ts +229 -0
  184. package/ai/tools/readXhsProfileTool.ts +627 -0
  185. package/ai/tools/rememberMemoryTool.ts +84 -0
  186. package/ai/tools/remotionVideoTool.ts +151 -0
  187. package/ai/tools/searchDialogMessagesTool.ts +222 -0
  188. package/ai/tools/searchWorkspaceTool.ts +259 -0
  189. package/ai/tools/skillFollowup.ts +86 -0
  190. package/ai/tools/surfWeatherTool.ts +169 -0
  191. package/ai/tools/table/addTableRowTool.ts +217 -0
  192. package/ai/tools/table/createTableTool.ts +315 -0
  193. package/ai/tools/table/rowTools.ts +386 -0
  194. package/ai/tools/table/schemaTools.ts +244 -0
  195. package/ai/tools/table/shareTableTool.ts +148 -0
  196. package/ai/tools/table/toolShared.ts +129 -0
  197. package/ai/tools/taobaoTmallProductScraperTool.ts +49 -0
  198. package/ai/tools/toolApiClient.ts +279 -0
  199. package/ai/tools/toolResultError.ts +42 -0
  200. package/ai/tools/toolRunSlice.ts +303 -0
  201. package/ai/tools/toolSchemaCompatibility.ts +53 -0
  202. package/ai/tools/uiAskChoiceTool.ts +104 -0
  203. package/ai/tools/updateContentTitleTool.ts +84 -0
  204. package/ai/tools/updateDocTool.ts +105 -0
  205. package/ai/tools/updateUserPreferenceProfileTool.ts +153 -0
  206. package/ai/tools/wereadGatewayTool.ts +152 -0
  207. package/ai/tools/whisperTool.ts +76 -0
  208. package/ai/tools/writeFileTool.ts +213 -0
  209. package/ai/tools/youtubeScraperTool.ts +116 -0
  210. package/ai/tools/ziweiChartTool.ts +678 -0
  211. package/ai/types.ts +55 -0
  212. package/ai/workflow/workflowExecutor.ts +323 -0
  213. package/ai/workflow/workflowSlice.ts +73 -0
  214. package/ai/workflow/workflowTypes.ts +106 -0
  215. package/app/actions/syncAppRecord.ts +73 -0
  216. package/app/constants/animationSets.ts +21 -0
  217. package/app/constants/appEditor.ts +99 -0
  218. package/app/favorite/favoriteSlice.ts +690 -0
  219. package/app/favorite/type.ts +43 -0
  220. package/app/hooks/deleteDbKey.ts +233 -0
  221. package/app/i18n/client.ts +13 -0
  222. package/app/i18n/i18n.base.ts +14 -0
  223. package/app/i18n/i18n.config.ts +77 -0
  224. package/app/i18n/index.ts +15 -0
  225. package/app/i18n/mapLanguage.ts +11 -0
  226. package/app/i18n/translations/appBuilder.locale.ts +453 -0
  227. package/app/i18n/translations/error.locale.ts +246 -0
  228. package/app/i18n/translations/interface.locale.ts +2174 -0
  229. package/app/i18n/translations/pricing.locale.ts +397 -0
  230. package/app/i18n/translations/privacy.locale.ts +168 -0
  231. package/app/i18n/translations/seo.locale.ts +129 -0
  232. package/app/i18n/translations/terms.locale.ts +124 -0
  233. package/app/i18n/types.ts +6 -0
  234. package/app/notifications/model.ts +77 -0
  235. package/app/notifications/notificationSlice.ts +141 -0
  236. package/app/reducer.ts +36 -0
  237. package/app/settings/dbActionThunks.ts +34 -0
  238. package/app/settings/defaultSpacePreference.ts +87 -0
  239. package/app/settings/settingSlice.tsx +1212 -0
  240. package/app/settings/settingsRecord.ts +8 -0
  241. package/app/stateViews/runtime.ts +90 -0
  242. package/app/store.ts +55 -0
  243. package/app/theme/colors.ts +280 -0
  244. package/app/theme/fontPreference.ts +77 -0
  245. package/app/theme/theme.config.ts +120 -0
  246. package/app/theme/themeModeBootstrap.ts +123 -0
  247. package/app/types/appSummary.ts +114 -0
  248. package/app/types.ts +358 -0
  249. package/app/utils/appKeys.ts +55 -0
  250. package/app/utils/async.ts +28 -0
  251. package/app/utils/desktopAgentRuntimeTurnClient.ts +73 -0
  252. package/app/utils/env.ts +17 -0
  253. package/app/utils/fileUtils.ts +229 -0
  254. package/app/utils/imageUtils.ts +274 -0
  255. package/app/utils/myContentItems.ts +289 -0
  256. package/app/utils/retryAfter.ts +36 -0
  257. package/app/utils/retryFetch.ts +61 -0
  258. package/app/utils/toast.ts +3 -0
  259. package/auth/action/signUpAction.ts +227 -0
  260. package/auth/adminPermissions.ts +18 -0
  261. package/auth/authSlice.ts +531 -0
  262. package/auth/client/loginRequest.ts +14 -0
  263. package/auth/resetAuthScopedClientState.ts +27 -0
  264. package/auth/routes.ts +178 -0
  265. package/auth/token.ts +63 -0
  266. package/auth/types.ts +40 -0
  267. package/chat/chat.locale.ts +813 -0
  268. package/chat/dialog/actions/addCybotAction.ts +52 -0
  269. package/chat/dialog/actions/addReferenceKeysAction.ts +62 -0
  270. package/chat/dialog/actions/builtinDialogLlm.ts +35 -0
  271. package/chat/dialog/actions/cleanupCliSession.ts +40 -0
  272. package/chat/dialog/actions/createDialogAction.ts +379 -0
  273. package/chat/dialog/actions/createScheduledTaskAction.ts +78 -0
  274. package/chat/dialog/actions/handleSendMessageAction.ts +197 -0
  275. package/chat/dialog/actions/handleSendMessageResolver.ts +27 -0
  276. package/chat/dialog/actions/removeCybotAction.ts +6 -0
  277. package/chat/dialog/actions/removeDialogAgentAction.ts +44 -0
  278. package/chat/dialog/actions/replacePrimaryCybotAction.ts +6 -0
  279. package/chat/dialog/actions/setPrimaryDialogAgentAction.ts +52 -0
  280. package/chat/dialog/actions/updateDialogSummaryAction.ts +430 -0
  281. package/chat/dialog/actions/updateDialogTitleAction.ts +151 -0
  282. package/chat/dialog/actions/updateDialogTitlePolicy.ts +30 -0
  283. package/chat/dialog/actions/updateTokensAction.ts +233 -0
  284. package/chat/dialog/dialogAgents.ts +72 -0
  285. package/chat/dialog/dialogSlice.ts +872 -0
  286. package/chat/dialog/dialogTitle.ts +81 -0
  287. package/chat/dialog/dialogTokenStats.ts +12 -0
  288. package/chat/dialog/dialogUrl.ts +6 -0
  289. package/chat/dialog/goal.ts +108 -0
  290. package/chat/dialog/objectAssistantRegistry.ts +286 -0
  291. package/chat/dialog/schedule.ts +17 -0
  292. package/chat/messages/fetchAndCacheMessages.ts +119 -0
  293. package/chat/messages/fetchConvMsgs.ts +51 -0
  294. package/chat/messages/fileUrl.ts +13 -0
  295. package/chat/messages/messageAgent.ts +8 -0
  296. package/chat/messages/messageContent.ts +199 -0
  297. package/chat/messages/messageContract.ts +88 -0
  298. package/chat/messages/messageSlice.ts +1367 -0
  299. package/chat/messages/toolThunks.ts +625 -0
  300. package/cli/agentAliases.ts +2 -1
  301. package/cli/agentRunCommand.ts +10 -32
  302. package/cli/agentRuntimeLocal.ts +1 -0
  303. package/cli/client/agentRun.ts +67 -95
  304. package/cli/client/localRuntimeAdapter.ts +323 -54
  305. package/cli/commandRegistry.ts +2 -2
  306. package/cli/machineWsRunDispatch.ts +51 -6
  307. package/cli/offlineMarxistsAgentCommand.ts +6 -4
  308. package/client/agentConfigResolver.test.ts +2 -2
  309. package/client/agentRun.test.ts +175 -57
  310. package/client/agentRun.ts +67 -95
  311. package/client/localRuntimeAdapter.test.ts +682 -37
  312. package/client/localRuntimeAdapter.ts +323 -54
  313. package/client/localRuntimeDryRun.test.ts +23 -9
  314. package/client/localToolPolicy.test.ts +4 -4
  315. package/commandRegistry.ts +2 -2
  316. package/core/builtinAgents.ts +209 -0
  317. package/core/config.ts +15 -0
  318. package/core/crypto.ts +51 -0
  319. package/core/generateKeyPairFromSeedV1.ts +15 -0
  320. package/core/generateMainKey.ts +22 -0
  321. package/core/init.ts +41 -0
  322. package/core/localOrigins.ts +8 -0
  323. package/core/password.ts +13 -0
  324. package/core/prefix.ts +23 -0
  325. package/create/editor/transforms/fromMarkdown/index.ts +260 -0
  326. package/create/editor/transforms/fromMarkdown/inline.ts +285 -0
  327. package/create/editor/transforms/fromMarkdown/table.ts +130 -0
  328. package/create/editor/transforms/markdownToSlate.ts +24 -0
  329. package/create/editor/transforms/slateToRenderMarkdown.ts +218 -0
  330. package/create/editor/transforms/slateToSimplifiedMarkdown.ts +224 -0
  331. package/create/editor/transforms/slateToText.ts +33 -0
  332. package/create/editor/utils/slateUtils.ts +233 -0
  333. package/create/space/addSpaceAction.ts +193 -0
  334. package/create/space/category/categoryActions.ts +427 -0
  335. package/create/space/changeSpaceAction.ts +36 -0
  336. package/create/space/constants.ts +8 -0
  337. package/create/space/content/addContentAction.ts +116 -0
  338. package/create/space/content/contentThunks.ts +90 -0
  339. package/create/space/content/deleteContentFromSpaceAction.ts +187 -0
  340. package/create/space/content/deleteMultipleContentAction.ts +112 -0
  341. package/create/space/content/moveContentAction.ts +285 -0
  342. package/create/space/content/updateContentCategoryAction.ts +154 -0
  343. package/create/space/content/updateContentTitleAction.ts +151 -0
  344. package/create/space/content/uploadAndAddFileToSpaceAction.ts +98 -0
  345. package/create/space/contentKeyUtils.ts +117 -0
  346. package/create/space/deleteSpaceAction.ts +276 -0
  347. package/create/space/fetchSpaceAction.ts +70 -0
  348. package/create/space/fetchSpaceSidebarStateAction.ts +26 -0
  349. package/create/space/loadDefaultSpaceAction.ts +57 -0
  350. package/create/space/member/addMemberAction.ts +79 -0
  351. package/create/space/member/fetchUserSpaceMembershipsAction.ts +386 -0
  352. package/create/space/member/memberThunks.ts +47 -0
  353. package/create/space/member/removeMemberAction.ts +67 -0
  354. package/create/space/resolvePreferredSpaceId.ts +113 -0
  355. package/create/space/sidebarVisibleTypes.ts +241 -0
  356. package/create/space/space.locale.ts +1087 -0
  357. package/create/space/spaceAccess.ts +182 -0
  358. package/create/space/spaceCollapsedState.ts +54 -0
  359. package/create/space/spaceKeys.ts +65 -0
  360. package/create/space/spaceSlice.ts +328 -0
  361. package/create/space/spaceThunks.ts +410 -0
  362. package/create/space/types.ts +27 -0
  363. package/create/space/updateSpaceAction.ts +107 -0
  364. package/create/space/utils/permissions.ts +47 -0
  365. package/create/types.ts +21 -0
  366. package/database/actions/agentReadResolution.ts +33 -0
  367. package/database/actions/common.ts +243 -0
  368. package/database/actions/deleteFile.ts +40 -0
  369. package/database/actions/fileContent.ts +125 -0
  370. package/database/actions/patch.ts +155 -0
  371. package/database/actions/read.ts +358 -0
  372. package/database/actions/readAndWait.ts +260 -0
  373. package/database/actions/readRequestManager.ts +120 -0
  374. package/database/actions/readResolution.ts +125 -0
  375. package/database/actions/remove.ts +94 -0
  376. package/database/actions/replication.ts +477 -0
  377. package/database/actions/upload.ts +186 -0
  378. package/database/actions/upsert.ts +56 -0
  379. package/database/actions/write.ts +146 -0
  380. package/database/authority/ownerKey.ts +80 -0
  381. package/database/authority/recordAuthority.ts +67 -0
  382. package/database/authority/userAuthorityRegistry.ts +54 -0
  383. package/database/client/fetchUserData.ts +61 -0
  384. package/database/dbActionThunks.ts +1 -0
  385. package/database/dbSlice.ts +149 -0
  386. package/database/fileRing.ts +51 -0
  387. package/database/fileStorage.ts +232 -0
  388. package/database/fileUrl.ts +34 -0
  389. package/database/keys.ts +767 -0
  390. package/database/queryPrefixes.ts +14 -0
  391. package/database/requests.ts +443 -0
  392. package/database/runtimeServerContext.ts +54 -0
  393. package/database/server/levelAuthorityStore.ts +20 -1
  394. package/database/tenantPlacement.ts +57 -0
  395. package/database/userPreferenceRegister.ts +131 -0
  396. package/database/utils/ulid.ts +1 -0
  397. package/integrations/anthropic/anthropicModels.ts +47 -0
  398. package/integrations/deepseek/models.ts +37 -0
  399. package/integrations/google/models.ts +341 -0
  400. package/integrations/openai/chatCompletionStreamMode.ts +10 -0
  401. package/integrations/openai/filterAndCleanMessages.ts +284 -0
  402. package/integrations/openai/flexTier.ts +102 -0
  403. package/integrations/openai/generateOpenAIRequestBody.ts +274 -0
  404. package/integrations/openai/generateResponseRequestBody.ts +77 -0
  405. package/integrations/openai/models.ts +271 -0
  406. package/integrations/openai/providerBodyCompatibility.ts +23 -0
  407. package/integrations/openai/responsesHelpers.ts +297 -0
  408. package/integrations/x-reader/types.ts +109 -0
  409. package/integrations/xai/models.ts +13 -0
  410. package/integrations/xhs-reader/analyze/profileAnalyzer.ts +205 -0
  411. package/integrations/xhs-reader/backends/playwrightProfileCollector.ts +624 -0
  412. package/integrations/xhs-reader/bridge/readXhsProfileWithBridge.ts +227 -0
  413. package/integrations/xhs-reader/client/xhsWebApiClient.ts +229 -0
  414. package/integrations/xhs-reader/normalize.ts +390 -0
  415. package/integrations/xhs-reader/orchestrator.ts +178 -0
  416. package/integrations/xhs-reader/redaction.ts +68 -0
  417. package/integrations/xhs-reader/types.ts +244 -0
  418. package/integrations/xhs-reader/url.ts +57 -0
  419. package/machineWsRunDispatch.ts +51 -6
  420. package/offlineMarxistsAgentCommand.ts +6 -4
  421. package/package.json +430 -3
  422. package/render/page/createPageAction.ts +183 -0
  423. package/render/page/docSlice.ts +468 -0
  424. package/render/page/types.ts +17 -0
  425. package/render/table/createTableAction.ts +270 -0
  426. package/render/table/deleteTableAction.ts +193 -0
  427. package/render/table/fetchAndCacheTableRows.ts +174 -0
  428. package/render/table/tableSlice.ts +1106 -0
  429. package/render/table/toolValueUtils.ts +363 -0
  430. package/render/table/types.ts +252 -0
  431. package/render/table/utils/tableSerialization.ts +50 -0
  432. package/server/handlers/agentRun/types.ts +104 -0
  433. package/share/action.ts +225 -0
  434. package/share/helpers.ts +302 -0
  435. package/share/keys.ts +243 -0
  436. package/share/publicSharePolicy.ts +27 -0
  437. package/share/shareSlice.ts +53 -0
  438. package/share/types.ts +100 -0
@@ -0,0 +1,284 @@
1
+ // packages/integrations/openai/filterAndCleanMessages.ts
2
+
3
+ export type MessagePart =
4
+ | { type: "text"; text: string }
5
+ | { type: "image_url"; image_url: { url: string; detail?: "low" | "high" | "auto" } };
6
+
7
+ export interface ToolCallFunction {
8
+ name: string;
9
+ arguments: string;
10
+ }
11
+
12
+ export interface ToolCall {
13
+ id: string;
14
+ type: "function";
15
+ function: ToolCallFunction;
16
+ }
17
+
18
+ export interface OpenAIMessage {
19
+ id?: string;
20
+ role: "system" | "user" | "assistant" | "tool";
21
+ content: string | MessagePart[];
22
+ name?: string;
23
+ tool_calls?: ToolCall[];
24
+ tool_call_id?: string;
25
+ }
26
+
27
+ export interface InternalMessage extends Omit<Partial<OpenAIMessage>, "content"> {
28
+ role: OpenAIMessage["role"];
29
+ content?: unknown;
30
+ toolName?: string;
31
+ toolCalls?: ToolCall[];
32
+ toolCallId?: string;
33
+ toolPayload?: {
34
+ toolName?: string;
35
+ rawToolCall?: ToolCall & { id: string };
36
+ };
37
+ [key: string]: any;
38
+ }
39
+
40
+ const TOOL_CONTEXT_MAX_CHARS = 4000;
41
+
42
+ const truncateText = (text: string, maxChars: number = TOOL_CONTEXT_MAX_CHARS): string => {
43
+ if (text.length <= maxChars) return text;
44
+ return `${text.slice(0, maxChars)}\n…[截断,原始长度 ${text.length} 字符]`;
45
+ };
46
+
47
+ export const isValidMessagePart = (part: any): part is MessagePart => {
48
+ if (!part || typeof part !== "object") return false;
49
+ if (part.type === "text") return typeof part.text === "string";
50
+ if (part.type === "image_url") {
51
+ const img = part.image_url;
52
+ return img && typeof img === "object" && typeof img.url === "string" && img.url.length > 0;
53
+ }
54
+ return false;
55
+ };
56
+
57
+ const extractContent = (msg: InternalMessage): string | MessagePart[] | null => {
58
+ if (msg.role === "tool") {
59
+ const llmContext = typeof msg.toolPayload?.llmContext === "string"
60
+ ? msg.toolPayload.llmContext.trim()
61
+ : "";
62
+ if (llmContext) return truncateText(llmContext);
63
+
64
+ const summary = typeof msg.toolPayload?.summary === "string"
65
+ ? msg.toolPayload.summary.trim()
66
+ : "";
67
+ if (summary) return truncateText(summary);
68
+
69
+ if (typeof msg.content === "string") return truncateText(msg.content);
70
+ if (msg.content != null) return truncateText(JSON.stringify(msg.content));
71
+ return null;
72
+ }
73
+
74
+ if (typeof msg.content === "string") return msg.content;
75
+ if (Array.isArray(msg.content)) {
76
+ const parts = msg.content.filter(isValidMessagePart);
77
+ return parts.length > 0 ? parts : null;
78
+ }
79
+ if (msg.content && typeof msg.content === "object" && isValidMessagePart(msg.content)) {
80
+ return [msg.content as MessagePart];
81
+ }
82
+ return null;
83
+ };
84
+
85
+ const extractToolCalls = (msg: InternalMessage): ToolCall[] | undefined => {
86
+ const calls = msg.tool_calls ?? msg.toolCalls;
87
+ return Array.isArray(calls) && calls.length > 0 ? calls : undefined;
88
+ };
89
+
90
+ const extractToolCallId = (msg: InternalMessage): string | undefined =>
91
+ msg.tool_call_id ?? msg.toolCallId ?? msg.toolPayload?.rawToolCall?.id;
92
+
93
+ const extractName = (msg: InternalMessage): string | undefined => {
94
+ if (typeof msg.name === "string") return msg.name;
95
+ if (typeof msg.toolName === "string") return msg.toolName;
96
+ if (typeof msg.toolPayload?.toolName === "string") return msg.toolPayload.toolName;
97
+ return undefined;
98
+ };
99
+
100
+ const getToolName = (msg: any): string | undefined =>
101
+ msg?.toolName ?? msg?.toolPayload?.toolName;
102
+
103
+ const parseJsonObject = (value: unknown): Record<string, any> | undefined => {
104
+ if (typeof value !== "string") return undefined;
105
+ try {
106
+ const parsed = JSON.parse(value);
107
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
108
+ ? parsed
109
+ : undefined;
110
+ } catch {
111
+ return undefined;
112
+ }
113
+ };
114
+
115
+ const getStreamParallelReturnMode = (msg: any): string | undefined =>
116
+ msg?.toolPayload?.input?.returnMode ?? parseJsonObject(msg?.content)?.returnMode;
117
+
118
+ const isHandoffToolMessage = (msg: any): boolean => {
119
+ const toolName = getToolName(msg);
120
+ if (toolName === "runStreamingAgent") return true;
121
+ if (toolName !== "streamParallelAgents") return false;
122
+ return getStreamParallelReturnMode(msg) !== "continue";
123
+ };
124
+
125
+ const getToolMessageCallId = (msg: any): string | undefined =>
126
+ msg?.tool_call_id ?? msg?.toolCallId ?? msg?.toolPayload?.rawToolCall?.id;
127
+
128
+ const collectHandoffToolCallIds = (msgs: any[]): Set<string> => {
129
+ const ids = new Set<string>();
130
+ for (const msg of msgs) {
131
+ if (msg?.role !== "tool" || !isHandoffToolMessage(msg)) continue;
132
+ const id = getToolMessageCallId(msg);
133
+ if (id) ids.add(id);
134
+ }
135
+ return ids;
136
+ };
137
+
138
+ const stripHandoffToolMessage = (msg: any): any | null =>
139
+ msg?.role === "tool" && isHandoffToolMessage(msg) ? null : msg;
140
+
141
+ const removeToolCallsById = (calls: any[] | undefined, ids: Set<string>) =>
142
+ calls?.filter((call) => !ids.has(call.id));
143
+
144
+ const stripHandoffToolCallsFromAssistant = (msg: any, handoffIds: Set<string>): any => {
145
+ if (msg?.role !== "assistant") return msg;
146
+
147
+ const calls: any[] | undefined = msg.tool_calls ?? msg.toolCalls;
148
+ if (!calls?.some((call) => handoffIds.has(call.id))) return msg;
149
+
150
+ const kept = removeToolCallsById(calls, handoffIds);
151
+ return {
152
+ ...msg,
153
+ tool_calls: kept?.length ? kept : undefined,
154
+ toolCalls: kept?.length ? kept : undefined,
155
+ };
156
+ };
157
+
158
+ export const stripHandoffToolMessages = (msgs: any[]): any[] => {
159
+ const handoffIds = collectHandoffToolCallIds(msgs);
160
+ if (handoffIds.size === 0) return msgs;
161
+
162
+ return msgs
163
+ .map(stripHandoffToolMessage)
164
+ .filter(Boolean)
165
+ .map((msg) => stripHandoffToolCallsFromAssistant(msg, handoffIds));
166
+ };
167
+
168
+ const toOpenAIMessage = (rawMsg: any): OpenAIMessage | null => {
169
+ const msg = rawMsg as InternalMessage;
170
+ const { role, id } = msg;
171
+
172
+ if (!role || !["system", "user", "assistant", "tool"].includes(role)) return null;
173
+
174
+ const toolCalls = extractToolCalls(msg);
175
+ let content = extractContent(msg);
176
+
177
+ // assistant with tool_calls 允许 content 为空
178
+ if (content === null) {
179
+ if (role === "assistant" && toolCalls) content = "";
180
+ else return null;
181
+ }
182
+
183
+ const cleaned: OpenAIMessage = { role, content };
184
+
185
+ if (id) cleaned.id = id;
186
+ const name = extractName(msg);
187
+ if (name) cleaned.name = name;
188
+
189
+ if (role === "assistant" && toolCalls) {
190
+ cleaned.tool_calls = toolCalls;
191
+ }
192
+
193
+ if (role === "tool") {
194
+ const toolCallId = extractToolCallId(msg);
195
+ if (toolCallId) cleaned.tool_call_id = toolCallId;
196
+ if (!cleaned.tool_call_id) {
197
+ console.warn("[filterAndCleanMessages] 丢弃无效 tool 消息:缺少 tool_call_id", msg);
198
+ return null;
199
+ }
200
+ }
201
+
202
+ return cleaned;
203
+ };
204
+
205
+ /**
206
+ * 清除孤立的 tool_result / assistant stub 对。
207
+ *
208
+ * 一条 tool 消息若在其前面最近的 assistant 消息的 tool_calls 中找不到对应 id,
209
+ * 则视为孤立——连同对应的空 assistant stub 一起丢弃。
210
+ */
211
+ const removeOrphanedToolPairs = (msgs: OpenAIMessage[]): OpenAIMessage[] => {
212
+ const dropIndexes = new Set<number>();
213
+
214
+ // 为每条 tool 消息找到对应的 assistant 索引
215
+ const toolToAssistant = new Map<number, number>();
216
+ for (let i = 0; i < msgs.length; i++) {
217
+ if (msgs[i].role !== "tool") continue;
218
+ for (let j = i - 1; j >= 0; j--) {
219
+ if (msgs[j].role === "assistant") {
220
+ toolToAssistant.set(i, j);
221
+ break;
222
+ }
223
+ }
224
+ }
225
+
226
+ // 标记孤立的 tool 消息
227
+ for (let i = 0; i < msgs.length; i++) {
228
+ if (msgs[i].role === "tool" && !toolToAssistant.has(i)) {
229
+ dropIndexes.add(i);
230
+ console.warn("[filterAndCleanMessages] 丢弃孤立 tool 消息:缺少前置 assistant", msgs[i].tool_call_id);
231
+ }
232
+ }
233
+
234
+ for (const [toolIdx, assistantIdx] of toolToAssistant) {
235
+ const toolMsg = msgs[toolIdx];
236
+ if (!toolMsg.tool_call_id) continue;
237
+
238
+ const knownIds = new Set((msgs[assistantIdx].tool_calls ?? []).map((tc) => tc.id));
239
+ if (!knownIds.has(toolMsg.tool_call_id)) {
240
+ dropIndexes.add(toolIdx);
241
+ console.warn("[filterAndCleanMessages] 丢弃孤立 tool 消息:", toolMsg.tool_call_id);
242
+ }
243
+ }
244
+
245
+ // 检查 assistant stub:若其所有 tool_calls 都已被孤立且自身无文本,一并丢弃
246
+ for (const assistantIdx of new Set(toolToAssistant.values())) {
247
+ if (dropIndexes.has(assistantIdx)) continue;
248
+
249
+ const stub = msgs[assistantIdx];
250
+ const content = typeof stub.content === "string" ? stub.content.trim() : stub.content;
251
+ const isEmpty = content === "" || (Array.isArray(content) && content.length === 0);
252
+ if (!isEmpty) continue;
253
+
254
+ const allToolsDropped = (stub.tool_calls ?? []).every((tc) => {
255
+ // 找所有引用该 id 的 tool 消息,看是否全被 drop
256
+ return msgs.every((m, idx) =>
257
+ m.role !== "tool" || m.tool_call_id !== tc.id || dropIndexes.has(idx)
258
+ );
259
+ });
260
+
261
+ if (allToolsDropped) {
262
+ dropIndexes.add(assistantIdx);
263
+ console.warn("[filterAndCleanMessages] 一并丢弃孤立 assistant stub(index:", assistantIdx, ")");
264
+ }
265
+ }
266
+
267
+ if (dropIndexes.size === 0) return msgs;
268
+ return msgs.filter((_, idx) => !dropIndexes.has(idx));
269
+ };
270
+
271
+ /**
272
+ * 将内部消息数组清洗为严格的 OpenAIMessage[]。
273
+ *
274
+ * 调用顺序建议:
275
+ * selectAllMsgs → buildAgentViewMessages → filterAndCleanMessages → generateRequestBody
276
+ */
277
+ export const filterAndCleanMessages = (msgs: any[]): OpenAIMessage[] => {
278
+ if (!Array.isArray(msgs)) return [];
279
+
280
+ const flat = msgs.flat();
281
+ const preprocessed = stripHandoffToolMessages(flat);
282
+ const cleaned = preprocessed.map(toOpenAIMessage).filter((m): m is OpenAIMessage => m !== null);
283
+ return removeOrphanedToolPairs(cleaned);
284
+ };
@@ -0,0 +1,102 @@
1
+ export type OpenAIServiceTier = "flex" | "default";
2
+
3
+ type OpenAIModelProfile = {
4
+ upstreamModel: string;
5
+ defaultServiceTier?: OpenAIServiceTier;
6
+ preAdjustedFlexPrice?: boolean;
7
+ };
8
+
9
+ const OPENAI_MODEL_PROFILES: Record<string, OpenAIModelProfile> = {
10
+ "gpt-5.5": {
11
+ upstreamModel: "gpt-5.5",
12
+ defaultServiceTier: "default",
13
+ },
14
+ "gpt-5.5-flex": {
15
+ upstreamModel: "gpt-5.5",
16
+ defaultServiceTier: "flex",
17
+ preAdjustedFlexPrice: true,
18
+ },
19
+ "gpt-5.5-pro-flex": {
20
+ upstreamModel: "gpt-5.5-pro",
21
+ defaultServiceTier: "flex",
22
+ preAdjustedFlexPrice: true,
23
+ },
24
+ "gpt-5.4": {
25
+ upstreamModel: "gpt-5.4",
26
+ defaultServiceTier: "default",
27
+ },
28
+ "gpt-5.4-flex": {
29
+ upstreamModel: "gpt-5.4",
30
+ defaultServiceTier: "flex",
31
+ preAdjustedFlexPrice: true,
32
+ },
33
+ "gpt-5.4-pro-flex": {
34
+ upstreamModel: "gpt-5.4-pro",
35
+ defaultServiceTier: "flex",
36
+ preAdjustedFlexPrice: true,
37
+ },
38
+ };
39
+
40
+ const getOpenAIModelProfile = (model?: string | null): OpenAIModelProfile | undefined => {
41
+ if (!model) return undefined;
42
+ return OPENAI_MODEL_PROFILES[model];
43
+ };
44
+
45
+ const isExplicitFlexModel = (model?: string | null): boolean => {
46
+ return getOpenAIModelProfile(model)?.defaultServiceTier === "flex";
47
+ };
48
+
49
+ export const resolveOpenAIUpstreamModel = ({
50
+ providerName,
51
+ model,
52
+ }: {
53
+ providerName?: string | null;
54
+ model?: string | null;
55
+ }): string | undefined => {
56
+ if (!model) return undefined;
57
+ if (providerName !== "openai") return model;
58
+ return getOpenAIModelProfile(model)?.upstreamModel ?? model;
59
+ };
60
+
61
+ export const isOpenAIFlexPricedModel = (model?: string | null): boolean => {
62
+ return getOpenAIModelProfile(model)?.preAdjustedFlexPrice === true;
63
+ };
64
+
65
+ export const resolveOpenAIServiceTier = ({
66
+ providerName,
67
+ model,
68
+ requestedServiceTier,
69
+ }: {
70
+ providerName?: string | null;
71
+ model?: string | null;
72
+ requestedServiceTier?: string | null;
73
+ }): OpenAIServiceTier | undefined => {
74
+ if (providerName !== "openai" || !model) return undefined;
75
+ const normalizedRequestedServiceTier =
76
+ requestedServiceTier === "flex" || requestedServiceTier === "default"
77
+ ? requestedServiceTier
78
+ : undefined;
79
+
80
+ if (normalizedRequestedServiceTier === "flex") {
81
+ return isExplicitFlexModel(model) ? "flex" : undefined;
82
+ }
83
+ if (normalizedRequestedServiceTier === "default") return "default";
84
+ return getOpenAIModelProfile(model)?.defaultServiceTier;
85
+ };
86
+
87
+ export const resolveOpenAIRequestTarget = ({
88
+ providerName,
89
+ model,
90
+ requestedServiceTier,
91
+ }: {
92
+ providerName?: string | null;
93
+ model?: string | null;
94
+ requestedServiceTier?: string | null;
95
+ }): { model?: string; serviceTier?: OpenAIServiceTier } => ({
96
+ model: resolveOpenAIUpstreamModel({ providerName, model }),
97
+ serviceTier: resolveOpenAIServiceTier({
98
+ providerName,
99
+ model,
100
+ requestedServiceTier,
101
+ }),
102
+ });
@@ -0,0 +1,274 @@
1
+ // 路径: /integrations/openai/generateOpenAIRequestBody.ts
2
+ import { Agent, Message } from "../../app/types";
3
+
4
+ import { isModelSupportReasoningEffort } from "../../ai/llm/reasoningModels";
5
+ import { getUsageRequestOptions } from "../../ai/llm/usageRequestOptions";
6
+ import {
7
+ isDeepInfraKimiModel,
8
+ isFireworksKimiModel,
9
+ resolveFireworksKimiModel,
10
+ } from "../../ai/llm/kimi";
11
+ import { Contexts } from "../../ai/types";
12
+ import { generatePrompt } from "../../ai/agent/generatePrompt";
13
+ import { resolveOpenAIRequestTarget } from "./flexTier";
14
+ import { normalizeChatCompletionsBodyForProvider } from "./providerBodyCompatibility";
15
+
16
+ // model 理论上不应为空(schema 已强制必填),但防御性处理 undefined
17
+ const isClaudeModel = (model: string | undefined): boolean =>
18
+ !!model && (model.includes("claude") || model.includes("anthropic"));
19
+
20
+ const applyClaudeCache = (content: any): any => {
21
+ if (typeof content === "string") {
22
+ return [
23
+ { type: "text", text: content, cache_control: { type: "ephemeral" } },
24
+ ];
25
+ }
26
+ if (Array.isArray(content)) {
27
+ // 已经是数组,给最后一个元素加上缓存标记
28
+ const lastIdx = content.length - 1;
29
+ return content.map((part, idx) => {
30
+ if (idx === lastIdx && typeof part === "object") {
31
+ return { ...part, cache_control: { type: "ephemeral" } };
32
+ }
33
+ return part;
34
+ });
35
+ }
36
+ return content;
37
+ };
38
+
39
+ const prependPromptMessage = (
40
+ messages: Message[],
41
+ agentConfig: Agent,
42
+ resolvedModel: string,
43
+ language: string,
44
+ contexts?: Contexts,
45
+ prependSystemPrompt = true
46
+ ): Message[] => {
47
+ if (!prependSystemPrompt) return messages;
48
+ if (!contexts && !agentConfig.prompt) return messages;
49
+
50
+ const promptContent = generatePrompt({ agentConfig, language, contexts });
51
+ if (!promptContent.trim()) return messages;
52
+
53
+ const content = isClaudeModel(resolvedModel)
54
+ ? applyClaudeCache(promptContent)
55
+ : promptContent;
56
+
57
+ const systemMessage: Message = { role: "system", content };
58
+ return [systemMessage, ...messages];
59
+ };
60
+
61
+ interface BuildRequestBodyOptions {
62
+ model: string;
63
+ messages: Message[];
64
+ providerName: string;
65
+ temperature?: number;
66
+ top_p?: number;
67
+ frequency_penalty?: number;
68
+ presence_penalty?: number;
69
+ max_tokens?: number;
70
+ reasoning_effort?: string;
71
+ }
72
+
73
+ const isLocalhostUrl = (url: string | undefined): boolean => {
74
+ if (!url?.trim()) return false;
75
+ try {
76
+ const hostname = new URL(url).hostname.toLowerCase();
77
+ return hostname === "127.0.0.1" || hostname === "localhost" || hostname === "::1";
78
+ } catch {
79
+ return false;
80
+ }
81
+ };
82
+
83
+ const shouldInjectLlamaCppThinkingToggle = (agentConfig: Agent): boolean => {
84
+ if (typeof agentConfig.enableThinking !== "boolean") return false;
85
+ if (!isLocalhostUrl(agentConfig.customProviderUrl)) return false;
86
+ return /qwen/i.test(agentConfig.model ?? "");
87
+ };
88
+
89
+ const shouldDisableMiMoThinking = (agentConfig: Agent): boolean => {
90
+ if (agentConfig.enableThinking === true) return false;
91
+ return (
92
+ /xiaomimimo\.com/i.test(agentConfig.customProviderUrl ?? "") ||
93
+ (agentConfig.provider ?? "").toLowerCase() === "mimo"
94
+ );
95
+ };
96
+
97
+ const shouldDisableKimiThinking = (
98
+ agentConfig: Agent,
99
+ providerName: string,
100
+ resolvedModel: string
101
+ ): boolean => {
102
+ if (agentConfig.enableThinking !== false) return false;
103
+ if (providerName === "deepinfra") return isDeepInfraKimiModel(resolvedModel);
104
+ if (providerName === "fireworks") return isFireworksKimiModel(resolvedModel);
105
+ if (providerName === "openrouter") {
106
+ return resolvedModel.toLowerCase() === "moonshotai/kimi-k2.6";
107
+ }
108
+ return false;
109
+ };
110
+
111
+ const normalizeChatCompletionsContent = (
112
+ content: Message["content"] | Record<string, unknown> | null | undefined
113
+ ): Message["content"] | null => {
114
+ if (typeof content === "string" || Array.isArray(content)) return content;
115
+ if (content == null) return null;
116
+ return JSON.stringify(content);
117
+ };
118
+
119
+ const sanitizeChatCompletionsMessage = (message: Message & Record<string, any>) => {
120
+ const sanitized: Record<string, any> = {
121
+ role: message.role,
122
+ content: normalizeChatCompletionsContent(message.content),
123
+ };
124
+
125
+ if (typeof message.name === "string" && message.name.trim()) {
126
+ sanitized.name = message.name.trim();
127
+ }
128
+
129
+ if (typeof message.tool_call_id === "string" && message.tool_call_id.trim()) {
130
+ sanitized.tool_call_id = message.tool_call_id.trim();
131
+ }
132
+
133
+ if (Array.isArray(message.tool_calls)) {
134
+ sanitized.tool_calls = message.tool_calls;
135
+ }
136
+
137
+ if (
138
+ message.role === "assistant" &&
139
+ typeof message.reasoning_content === "string" &&
140
+ message.reasoning_content
141
+ ) {
142
+ sanitized.reasoning_content = message.reasoning_content;
143
+ }
144
+
145
+ return sanitized;
146
+ };
147
+
148
+ const buildRequestBody = (options: BuildRequestBodyOptions): any => {
149
+ const {
150
+ model,
151
+ messages,
152
+ providerName,
153
+ temperature,
154
+ top_p,
155
+ frequency_penalty,
156
+ presence_penalty,
157
+ max_tokens,
158
+ reasoning_effort,
159
+ } = options;
160
+
161
+ // 只保留上游协议允许的字段,避免 UI/runtime 元数据泄漏到 chat-completions 请求体。
162
+ const cleanedMessages = messages.map((message) =>
163
+ sanitizeChatCompletionsMessage(message as Message & Record<string, any>)
164
+ );
165
+
166
+ const requestTarget = resolveOpenAIRequestTarget({
167
+ providerName,
168
+ model,
169
+ });
170
+ const bodyData: any = {
171
+ model: requestTarget.model ?? model,
172
+ messages: cleanedMessages,
173
+ stream: true,
174
+ };
175
+ const usageRequestOptions = getUsageRequestOptions(providerName, {
176
+ api: "chat-completions",
177
+ });
178
+ Object.assign(bodyData, usageRequestOptions);
179
+
180
+ // 推理强度(仅部分模型支持)
181
+ if (reasoning_effort && isModelSupportReasoningEffort(model)) {
182
+ bodyData.reasoning_effort = reasoning_effort;
183
+ }
184
+
185
+ if (requestTarget.serviceTier) {
186
+ bodyData.service_tier = requestTarget.serviceTier;
187
+ }
188
+
189
+ if (typeof temperature === "number") bodyData.temperature = temperature;
190
+ if (typeof top_p === "number") bodyData.top_p = top_p;
191
+ if (typeof frequency_penalty === "number")
192
+ bodyData.frequency_penalty = frequency_penalty;
193
+ if (typeof presence_penalty === "number")
194
+ bodyData.presence_penalty = presence_penalty;
195
+ if (typeof max_tokens === "number") bodyData.max_tokens = max_tokens;
196
+
197
+ return bodyData;
198
+ };
199
+
200
+ /**
201
+ * 主函数:生成完整的 OpenAI 请求体。
202
+ */
203
+ export const generateOpenAIRequestBody = (
204
+ agentConfig: Agent,
205
+ providerName: string,
206
+ messages: Message[],
207
+ contexts?: Contexts,
208
+ stableMessages: Message[] = [],
209
+ prependSystemPrompt = true
210
+ ) => {
211
+ // 0. 解析最终 model 名:统一用 model 字段,不再有 customModelName
212
+ // model 在 platform 和 custom 模式下都是同一个字段
213
+ const resolvedModel =
214
+ providerName === "fireworks"
215
+ ? resolveFireworksKimiModel(agentConfig.model)
216
+ : agentConfig.model ?? "";
217
+
218
+ // 1. 处理 stableMessages 的缓存点 (仅针对 Claude)
219
+ let processedStable = [...stableMessages];
220
+ if (isClaudeModel(resolvedModel) && processedStable.length > 0) {
221
+ const lastStableIdx = processedStable.length - 1;
222
+ processedStable[lastStableIdx] = {
223
+ ...processedStable[lastStableIdx],
224
+ content: applyClaudeCache(processedStable[lastStableIdx].content),
225
+ };
226
+ }
227
+
228
+ // 2. 合并 stable + dynamic
229
+ const fullMessages = [...processedStable, ...messages];
230
+
231
+ const messagesWithPrompt = prependPromptMessage(
232
+ fullMessages,
233
+ agentConfig,
234
+ resolvedModel,
235
+ typeof navigator !== "undefined" ? (navigator as any).language : "en",
236
+ contexts,
237
+ prependSystemPrompt
238
+ );
239
+
240
+ const requestBody = buildRequestBody({
241
+ model: resolvedModel,
242
+ messages: messagesWithPrompt,
243
+ providerName,
244
+ temperature: agentConfig.temperature,
245
+ top_p: agentConfig.top_p,
246
+ frequency_penalty: agentConfig.frequency_penalty,
247
+ presence_penalty: agentConfig.presence_penalty,
248
+ max_tokens: agentConfig.max_tokens,
249
+ reasoning_effort: agentConfig.reasoning_effort,
250
+ });
251
+
252
+ if (shouldInjectLlamaCppThinkingToggle(agentConfig)) {
253
+ requestBody.chat_template_kwargs = {
254
+ ...(requestBody.chat_template_kwargs ?? {}),
255
+ enable_thinking: agentConfig.enableThinking,
256
+ };
257
+ }
258
+
259
+ if (shouldDisableMiMoThinking(agentConfig)) {
260
+ requestBody.thinking = { type: "disabled" };
261
+ }
262
+
263
+ if (shouldDisableKimiThinking(agentConfig, providerName, resolvedModel)) {
264
+ requestBody.thinking = { type: "disabled" };
265
+ requestBody.reasoning_effort = "none";
266
+ requestBody.reasoning = { enabled: false };
267
+ }
268
+
269
+ return normalizeChatCompletionsBodyForProvider({
270
+ body: requestBody,
271
+ provider: providerName,
272
+ model: requestBody.model,
273
+ });
274
+ };