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,576 @@
1
+ // 路径: ai/token/calculatePrice.ts
2
+
3
+ import { nolotusId } from "../../core/init";
4
+ import { Model, ModelPrice } from "../llm/types";
5
+ import { findModelConfig, getModelConfig } from "../llm/providers";
6
+ import { getApproxPricePerImage } from "../llm/imagePricing";
7
+ import {
8
+ isOpenAIFlexPricedModel,
9
+ type OpenAIServiceTier,
10
+ resolveOpenAIServiceTier,
11
+ } from "../../integrations/openai/flexTier";
12
+
13
+ // ==================== 接口定义 ====================
14
+
15
+ /**
16
+ * 这里的 Usage 是「已经 normalize 过」的结构
17
+ * ——来自 normalizeUsage,字段名统一成这几个
18
+ */
19
+ export interface Usage {
20
+ input_tokens: number;
21
+ output_tokens: number;
22
+ cache_creation_input_tokens: number;
23
+ cache_read_input_tokens: number;
24
+ /**
25
+ * 对于 OpenRouter 等支持 usage.cost 的 provider:
26
+ * usage.cost 是 provider 返回的账户扣费金额。
27
+ * OpenRouter 官方 credits 以 USD 为基准,本仓库仍需再换算成平台 credits。
28
+ */
29
+ cost?: number;
30
+ billing_service_tier?: string;
31
+ image_generation_count?: number;
32
+ }
33
+
34
+ export interface ExternalPrice {
35
+ input: number;
36
+ output: number;
37
+ creatorId?: string;
38
+ }
39
+
40
+ interface CalculatePriceParams {
41
+ modelName: string;
42
+ usage: Usage;
43
+ externalPrice?: ExternalPrice;
44
+ /**
45
+ * provider 名称(deepseek / openrouter / anthropic 等)。
46
+ * apiSource="custom" 的 agent 不填此字段,传 undefined 即可。
47
+ * 注意:不要依赖参数默认值,调用方应显式传值或不传。
48
+ */
49
+ provider?: string;
50
+ billingServiceTier?: string;
51
+ sharingLevel?: "default" | "split" | "full";
52
+ }
53
+
54
+ export interface PriceResult {
55
+ cost: number;
56
+ pay: Record<string, number>;
57
+ }
58
+
59
+ export interface CostBreakdown {
60
+ regular: number;
61
+ charge: number;
62
+ details?: {
63
+ inputCost: number;
64
+ outputCost: number;
65
+ cachingWriteCost: number;
66
+ cachingReadCost: number;
67
+ };
68
+ }
69
+
70
+ // ==================== 核心逻辑:阶梯定价解析 ====================
71
+
72
+ const resolveModelPrice = (model: Model, usage: Usage): ModelPrice => {
73
+ let activePrice = { ...model.price };
74
+
75
+ if (model.pricingStrategy?.type === "tiered_context") {
76
+ const contextSize = usage.input_tokens || 0;
77
+ const tiers = model.pricingStrategy.tiers || [];
78
+
79
+ const sortedTiers = [...tiers].sort((a, b) => a.minContext - b.minContext);
80
+
81
+ for (const tier of sortedTiers) {
82
+ if (contextSize >= tier.minContext) {
83
+ activePrice = { ...tier.price };
84
+ }
85
+ }
86
+ }
87
+
88
+ return activePrice;
89
+ };
90
+
91
+ const scaleModelPrice = (price: ModelPrice, multiplier: number): ModelPrice => ({
92
+ input: price.input * multiplier,
93
+ output: price.output * multiplier,
94
+ ...(typeof price.cachingWrite === "number"
95
+ ? { cachingWrite: price.cachingWrite * multiplier }
96
+ : {}),
97
+ ...(typeof price.cachingRead === "number"
98
+ ? { cachingRead: price.cachingRead * multiplier }
99
+ : {}),
100
+ ...(typeof price.inputCacheHit === "number"
101
+ ? { inputCacheHit: price.inputCacheHit * multiplier }
102
+ : {}),
103
+ });
104
+
105
+ const scaleModelInputOutputPrice = (
106
+ price: ModelPrice,
107
+ multiplier: number
108
+ ): ModelPrice => ({
109
+ ...price,
110
+ input: price.input * multiplier,
111
+ output: price.output * multiplier,
112
+ });
113
+
114
+ const scaleModelServiceTierPrice = (
115
+ price: ModelPrice,
116
+ inputOutputMultiplier: number,
117
+ cacheMultiplier?: number
118
+ ): ModelPrice => ({
119
+ ...price,
120
+ input: price.input * inputOutputMultiplier,
121
+ output: price.output * inputOutputMultiplier,
122
+ ...(typeof cacheMultiplier === "number" && typeof price.cachingWrite === "number"
123
+ ? { cachingWrite: price.cachingWrite * cacheMultiplier }
124
+ : {}),
125
+ ...(typeof cacheMultiplier === "number" && typeof price.cachingRead === "number"
126
+ ? { cachingRead: price.cachingRead * cacheMultiplier }
127
+ : {}),
128
+ });
129
+
130
+ const resolveGoogleServiceTierPrice = (
131
+ model: Model,
132
+ price: ModelPrice,
133
+ billingServiceTier?: string
134
+ ): ModelPrice => {
135
+ const normalizedTier =
136
+ typeof billingServiceTier === "string"
137
+ ? billingServiceTier.trim().toLowerCase()
138
+ : "";
139
+ const imageOutputPrice =
140
+ typeof model.imageTokenPricePerMillion === "number"
141
+ ? model.imageTokenPricePerMillion
142
+ : undefined;
143
+ const priceWithImageOutput =
144
+ typeof imageOutputPrice === "number"
145
+ ? { ...price, output: imageOutputPrice }
146
+ : price;
147
+ const serviceTierMultiplier =
148
+ normalizedTier === "batch" ||
149
+ normalizedTier === "flex" ||
150
+ normalizedTier === "priority"
151
+ ? model.serviceTierPriceMultipliers?.[normalizedTier]
152
+ : undefined;
153
+
154
+ if (serviceTierMultiplier) {
155
+ return scaleModelServiceTierPrice(
156
+ priceWithImageOutput,
157
+ serviceTierMultiplier.inputOutput,
158
+ serviceTierMultiplier.cache
159
+ );
160
+ }
161
+
162
+ if (normalizedTier === "flex" || normalizedTier === "batch") {
163
+ return scaleModelInputOutputPrice(priceWithImageOutput, 0.5);
164
+ }
165
+
166
+ if (normalizedTier === "priority") {
167
+ return scaleModelInputOutputPrice(priceWithImageOutput, 1.8);
168
+ }
169
+
170
+ return priceWithImageOutput;
171
+ };
172
+
173
+ const resolveEffectiveModelPrice = ({
174
+ model,
175
+ usage,
176
+ provider,
177
+ billingServiceTier,
178
+ }: {
179
+ model: Model;
180
+ usage: Usage;
181
+ provider: string;
182
+ billingServiceTier?: string;
183
+ }): ModelPrice => {
184
+ const resolvedPrice = resolveModelPrice(model, usage);
185
+ if (provider === "google") {
186
+ return resolveGoogleServiceTierPrice(model, resolvedPrice, billingServiceTier);
187
+ }
188
+ const effectiveOpenAIServiceTier = resolveOpenAIServiceTier({
189
+ providerName: provider,
190
+ model: model.name,
191
+ requestedServiceTier: billingServiceTier as OpenAIServiceTier | undefined,
192
+ });
193
+
194
+ if (provider === "openai" && effectiveOpenAIServiceTier === "flex") {
195
+ if (isOpenAIFlexPricedModel(model.name)) {
196
+ return resolvedPrice;
197
+ }
198
+ return scaleModelPrice(resolvedPrice, 0.5);
199
+ }
200
+
201
+ return resolvedPrice;
202
+ };
203
+
204
+ // ==================== 辅助逻辑:价格保护 ====================
205
+
206
+ const getEffectivePrices = (
207
+ resolvedPrice: ModelPrice,
208
+ externalPrice?: ExternalPrice
209
+ ): {
210
+ input: number;
211
+ output: number;
212
+ cachingWrite: number;
213
+ cachingRead: number;
214
+ } => {
215
+ const effectiveInputPrice = Math.max(
216
+ externalPrice?.input || 0,
217
+ resolvedPrice.input
218
+ );
219
+ const effectiveOutputPrice = Math.max(
220
+ externalPrice?.output || 0,
221
+ resolvedPrice.output
222
+ );
223
+
224
+ return {
225
+ input: effectiveInputPrice,
226
+ output: effectiveOutputPrice,
227
+ cachingWrite: resolvedPrice.cachingWrite || 0,
228
+ cachingRead: resolvedPrice.cachingRead || 0,
229
+ };
230
+ };
231
+
232
+ // ==================== 具体计算函数 ====================
233
+
234
+ const calculateAnthropicCost = (
235
+ resolvedPrice: ModelPrice,
236
+ usage: Usage,
237
+ externalPrice?: ExternalPrice
238
+ ): CostBreakdown => {
239
+ const {
240
+ input_tokens,
241
+ output_tokens,
242
+ cache_creation_input_tokens,
243
+ cache_read_input_tokens,
244
+ } = usage;
245
+
246
+ const {
247
+ input: effectiveInputPrice,
248
+ output: effectiveOutputPrice,
249
+ cachingWrite: effectiveCachingWritePrice,
250
+ cachingRead: effectiveCachingReadPrice,
251
+ } = getEffectivePrices(resolvedPrice, externalPrice);
252
+
253
+ const regularInputTokens = input_tokens - cache_read_input_tokens;
254
+
255
+ const regularTotal =
256
+ (regularInputTokens * resolvedPrice.input +
257
+ output_tokens * resolvedPrice.output +
258
+ cache_creation_input_tokens * (resolvedPrice.cachingWrite || 0) +
259
+ cache_read_input_tokens * (resolvedPrice.cachingRead || 0)) /
260
+ 1_000_000;
261
+
262
+ const chargeTotal =
263
+ (regularInputTokens * effectiveInputPrice +
264
+ output_tokens * effectiveOutputPrice +
265
+ cache_creation_input_tokens * effectiveCachingWritePrice +
266
+ cache_read_input_tokens * effectiveCachingReadPrice) /
267
+ 1_000_000;
268
+
269
+ return {
270
+ regular: regularTotal,
271
+ charge: chargeTotal,
272
+ details: {
273
+ inputCost: (regularInputTokens * resolvedPrice.input) / 1_000_000,
274
+ outputCost: (output_tokens * resolvedPrice.output) / 1_000_000,
275
+ cachingWriteCost:
276
+ (cache_creation_input_tokens * (resolvedPrice.cachingWrite || 0)) /
277
+ 1_000_000,
278
+ cachingReadCost:
279
+ (cache_read_input_tokens * (resolvedPrice.cachingRead || 0)) /
280
+ 1_000_000,
281
+ },
282
+ };
283
+ };
284
+
285
+ const calculateCacheBasedCost = (
286
+ resolvedPrice: ModelPrice,
287
+ usage: Usage,
288
+ externalPrice?: ExternalPrice
289
+ ): CostBreakdown => {
290
+ const { input_tokens, output_tokens, cache_read_input_tokens } = usage;
291
+ const { input: effectiveInputPrice, output: effectiveOutputPrice } =
292
+ getEffectivePrices(resolvedPrice, externalPrice);
293
+
294
+ const cacheMissTokens = input_tokens - cache_read_input_tokens;
295
+ const cacheHitPrice = resolvedPrice.inputCacheHit || 0;
296
+
297
+ const regularTotal =
298
+ (cacheMissTokens * resolvedPrice.input +
299
+ cache_read_input_tokens * cacheHitPrice +
300
+ output_tokens * resolvedPrice.output) /
301
+ 1_000_000;
302
+
303
+ const chargeTotal =
304
+ (cacheMissTokens * effectiveInputPrice +
305
+ cache_read_input_tokens * cacheHitPrice +
306
+ output_tokens * effectiveOutputPrice) /
307
+ 1_000_000;
308
+
309
+ return {
310
+ regular: regularTotal,
311
+ charge: chargeTotal,
312
+ details: {
313
+ inputCost: (cacheMissTokens * resolvedPrice.input) / 1_000_000,
314
+ outputCost: (output_tokens * resolvedPrice.output) / 1_000_000,
315
+ cachingReadCost: (cache_read_input_tokens * cacheHitPrice) / 1_000_000,
316
+ cachingWriteCost: 0,
317
+ },
318
+ };
319
+ };
320
+
321
+ const calculateSimpleCost = (
322
+ resolvedPrice: ModelPrice,
323
+ usage: Usage,
324
+ externalPrice?: ExternalPrice
325
+ ): CostBreakdown => {
326
+ const { input_tokens, output_tokens } = usage;
327
+ const { input: effectiveInputPrice, output: effectiveOutputPrice } =
328
+ getEffectivePrices(resolvedPrice, externalPrice);
329
+
330
+ const regularTotal =
331
+ (input_tokens * resolvedPrice.input +
332
+ output_tokens * resolvedPrice.output) /
333
+ 1_000_000;
334
+
335
+ const chargeTotal =
336
+ (input_tokens * effectiveInputPrice +
337
+ output_tokens * effectiveOutputPrice) /
338
+ 1_000_000;
339
+
340
+ return {
341
+ regular: regularTotal,
342
+ charge: chargeTotal,
343
+ details: {
344
+ inputCost: (input_tokens * resolvedPrice.input) / 1_000_000,
345
+ outputCost: (output_tokens * resolvedPrice.output) / 1_000_000,
346
+ cachingWriteCost: 0,
347
+ cachingReadCost: 0,
348
+ },
349
+ };
350
+ };
351
+
352
+ const calculateOpenRouterFallbackCost = (
353
+ resolvedPrice: ModelPrice,
354
+ usage: Usage,
355
+ externalPrice?: ExternalPrice
356
+ ): CostBreakdown => {
357
+ if (
358
+ typeof resolvedPrice.cachingWrite === "number" ||
359
+ typeof resolvedPrice.cachingRead === "number"
360
+ ) {
361
+ return calculateAnthropicCost(resolvedPrice, usage, externalPrice);
362
+ }
363
+
364
+ if (typeof resolvedPrice.inputCacheHit === "number") {
365
+ return calculateCacheBasedCost(resolvedPrice, usage, externalPrice);
366
+ }
367
+
368
+ return calculateSimpleCost(resolvedPrice, usage, externalPrice);
369
+ };
370
+
371
+ // OpenRouter usage.cost 是按其账户 credit(USD 基准)返回,
372
+ // OpenRouter belongs to the non-GPT/non-Claude bucket: 1 USD = 7 credits.
373
+ const OPENROUTER_COST_MULTIPLIER = 7;
374
+
375
+ const calculateOpenRouterCost = (usage: Usage): CostBreakdown => {
376
+ if (!usage || typeof usage.cost !== "number" || usage.cost <= 0) {
377
+ return {
378
+ regular: 0,
379
+ charge: 0,
380
+ details: {
381
+ inputCost: 0,
382
+ outputCost: 0,
383
+ cachingWriteCost: 0,
384
+ cachingReadCost: 0,
385
+ },
386
+ };
387
+ }
388
+
389
+ const regular = usage.cost * OPENROUTER_COST_MULTIPLIER;
390
+
391
+ return {
392
+ regular,
393
+ charge: regular,
394
+ details: {
395
+ inputCost: regular,
396
+ outputCost: 0,
397
+ cachingWriteCost: 0,
398
+ cachingReadCost: 0,
399
+ },
400
+ };
401
+ };
402
+
403
+ const resolveOpenAIBuiltInImageSurcharge = (
404
+ model: Model,
405
+ usage: Usage
406
+ ): number => {
407
+ const imageGenerationCount =
408
+ typeof usage.image_generation_count === "number" &&
409
+ Number.isFinite(usage.image_generation_count)
410
+ ? usage.image_generation_count
411
+ : 0;
412
+ const pricePerImage =
413
+ getApproxPricePerImage(model) ??
414
+ getApproxPricePerImage(findModelConfig("openai", "gpt-image-2")) ??
415
+ 0;
416
+
417
+ if (imageGenerationCount <= 0 || pricePerImage <= 0) return 0;
418
+ return imageGenerationCount * pricePerImage;
419
+ };
420
+
421
+ // ==================== 路由与分发 ====================
422
+
423
+ const calculateBasicCost = (
424
+ model: Model,
425
+ usage: Usage,
426
+ provider: string,
427
+ externalPrice?: ExternalPrice,
428
+ billingServiceTier?: OpenAIServiceTier
429
+ ): CostBreakdown => {
430
+ if (!usage || typeof usage.input_tokens !== "number") {
431
+ throw new Error("Invalid usage data");
432
+ }
433
+
434
+ const resolvedPrice = resolveEffectiveModelPrice({
435
+ model,
436
+ usage,
437
+ provider,
438
+ billingServiceTier,
439
+ });
440
+
441
+ switch (provider) {
442
+ case "deepseek":
443
+ case "openai":
444
+ case "deepinfra":
445
+ return calculateCacheBasedCost(resolvedPrice, usage, externalPrice);
446
+
447
+ case "anthropic":
448
+ return calculateAnthropicCost(resolvedPrice, usage, externalPrice);
449
+
450
+ case "google":
451
+ if (model.name.includes("gemini-3")) {
452
+ return calculateAnthropicCost(resolvedPrice, usage, externalPrice);
453
+ }
454
+ return calculateSimpleCost(resolvedPrice, usage, externalPrice);
455
+
456
+ case "openrouter": {
457
+ const orCost = calculateOpenRouterCost(usage);
458
+ if (orCost.regular > 0) return orCost;
459
+ return calculateOpenRouterFallbackCost(
460
+ resolvedPrice,
461
+ usage,
462
+ externalPrice
463
+ );
464
+ }
465
+
466
+ case "mistral":
467
+ case "xai":
468
+ case "fireworks":
469
+ default:
470
+ return calculateSimpleCost(resolvedPrice, usage, externalPrice);
471
+ }
472
+ };
473
+
474
+ const calculatePayDistribution = (
475
+ costs: CostBreakdown,
476
+ externalPrice?: ExternalPrice,
477
+ sharingLevel: "default" | "split" | "full"
478
+ ): Record<string, number> => {
479
+ const pay: Record<string, number> = {};
480
+
481
+ pay[nolotusId] = costs.regular;
482
+
483
+ const sharingRatios = {
484
+ default: 0,
485
+ split: 0.5,
486
+ full: 1,
487
+ };
488
+
489
+ if (externalPrice?.creatorId) {
490
+ const profit = Math.max(0, costs.charge - costs.regular);
491
+
492
+ if (profit > 0) {
493
+ switch (sharingLevel) {
494
+ case "split":
495
+ pay[externalPrice.creatorId] = profit * sharingRatios.split;
496
+ break;
497
+ case "full":
498
+ pay[externalPrice.creatorId] = profit;
499
+ break;
500
+ default:
501
+ break;
502
+ }
503
+ }
504
+ }
505
+
506
+ return Object.fromEntries(
507
+ Object.entries(pay).map(([key, value]) => [
508
+ key,
509
+ Number(value.toFixed(6)),
510
+ ])
511
+ );
512
+ };
513
+
514
+ export const calculatePrice = ({
515
+ modelName,
516
+ usage,
517
+ externalPrice,
518
+ // 不设默认值,undefined 表示 custom/未知 provider,走 zeroCostModel 路径
519
+ provider,
520
+ billingServiceTier,
521
+ sharingLevel = "default",
522
+ }: CalculatePriceParams): PriceResult => {
523
+ // apiSource="custom" 的 agent 不一定有 provider,或 provider 不在 MODEL_MAP 里。
524
+ // 此时平台不承担 API 成本(由 agent owner 自费),但 agent 可能对外设有 inputPrice/outputPrice,
525
+ // 仍需走 externalPrice 计费路径向用户收费并分成给创作者。
526
+ // 用零成本的虚拟 model 代替,让 calculateBasicCost 正常走 externalPrice 分支。
527
+ let model: ReturnType<typeof getModelConfig>;
528
+ try {
529
+ model = getModelConfig(provider, modelName);
530
+ } catch {
531
+ const zeroCostModel: Model = {
532
+ name: modelName,
533
+ hasVision: false,
534
+ price: { input: 0, output: 0 },
535
+ };
536
+ const costs = calculateBasicCost(
537
+ zeroCostModel,
538
+ usage,
539
+ "custom",
540
+ externalPrice,
541
+ billingServiceTier
542
+ );
543
+ const pay = calculatePayDistribution(costs, externalPrice, sharingLevel);
544
+ return { cost: Number(costs.charge.toFixed(6)), pay };
545
+ }
546
+
547
+ const costs = calculateBasicCost(
548
+ model,
549
+ usage,
550
+ provider,
551
+ externalPrice,
552
+ billingServiceTier
553
+ );
554
+ const openAIImageSurcharge =
555
+ provider === "openai" ? resolveOpenAIBuiltInImageSurcharge(model, usage) : 0;
556
+ const adjustedCosts =
557
+ openAIImageSurcharge > 0
558
+ ? {
559
+ ...costs,
560
+ regular: costs.regular + openAIImageSurcharge,
561
+ charge: costs.charge + openAIImageSurcharge,
562
+ details: costs.details
563
+ ? {
564
+ ...costs.details,
565
+ outputCost: costs.details.outputCost + openAIImageSurcharge,
566
+ }
567
+ : costs.details,
568
+ }
569
+ : costs;
570
+ const pay = calculatePayDistribution(adjustedCosts, externalPrice, sharingLevel);
571
+
572
+ return {
573
+ cost: Number(adjustedCosts.charge.toFixed(6)),
574
+ pay,
575
+ };
576
+ };
@@ -0,0 +1,42 @@
1
+ import type { RawUsage } from "./types";
2
+
3
+ const APPROX_CHARS_PER_TOKEN = 4;
4
+
5
+ const stringifyContent = (content: unknown): string => {
6
+ if (typeof content === "string") return content;
7
+ if (Array.isArray(content)) {
8
+ return content
9
+ .map((part) => {
10
+ if (typeof part === "string") return part;
11
+ if (part && typeof part === "object" && "text" in part) {
12
+ return String((part as any).text ?? "");
13
+ }
14
+ return "";
15
+ })
16
+ .join("\n");
17
+ }
18
+ if (content == null) return "";
19
+ return String(content);
20
+ };
21
+
22
+ export const estimateMissingUsage = ({
23
+ content,
24
+ minimumOutputTokens = 1,
25
+ }: {
26
+ content: unknown;
27
+ minimumOutputTokens?: number;
28
+ }): RawUsage => {
29
+ const text = stringifyContent(content);
30
+ const estimatedOutputTokens = Math.max(
31
+ minimumOutputTokens,
32
+ Math.ceil(text.length / APPROX_CHARS_PER_TOKEN)
33
+ );
34
+
35
+ return {
36
+ input_tokens: 1,
37
+ output_tokens: estimatedOutputTokens,
38
+ cache_creation_input_tokens: 0,
39
+ cache_read_input_tokens: 0,
40
+ billing_estimated: true,
41
+ };
42
+ };