@lobehub/chat 1.17.6 → 1.18.0

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.

Potentially problematic release.


This version of @lobehub/chat might be problematic. Click here for more details.

Files changed (339) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/locales/ar/common.json +1 -1
  3. package/locales/ar/discover.json +204 -0
  4. package/locales/ar/metadata.json +20 -3
  5. package/locales/ar/models.json +845 -0
  6. package/locales/ar/providers.json +80 -0
  7. package/locales/bg-BG/common.json +1 -1
  8. package/locales/bg-BG/discover.json +204 -0
  9. package/locales/bg-BG/metadata.json +20 -3
  10. package/locales/bg-BG/models.json +845 -0
  11. package/locales/bg-BG/providers.json +80 -0
  12. package/locales/de-DE/common.json +1 -1
  13. package/locales/de-DE/discover.json +204 -0
  14. package/locales/de-DE/metadata.json +20 -3
  15. package/locales/de-DE/models.json +845 -0
  16. package/locales/de-DE/providers.json +80 -0
  17. package/locales/en-US/common.json +1 -1
  18. package/locales/en-US/discover.json +204 -0
  19. package/locales/en-US/metadata.json +20 -3
  20. package/locales/en-US/models.json +845 -0
  21. package/locales/en-US/providers.json +80 -0
  22. package/locales/es-ES/common.json +1 -1
  23. package/locales/es-ES/discover.json +204 -0
  24. package/locales/es-ES/metadata.json +20 -3
  25. package/locales/es-ES/models.json +845 -0
  26. package/locales/es-ES/providers.json +80 -0
  27. package/locales/fr-FR/common.json +1 -1
  28. package/locales/fr-FR/discover.json +204 -0
  29. package/locales/fr-FR/metadata.json +20 -3
  30. package/locales/fr-FR/models.json +845 -0
  31. package/locales/fr-FR/providers.json +80 -0
  32. package/locales/it-IT/common.json +1 -1
  33. package/locales/it-IT/discover.json +204 -0
  34. package/locales/it-IT/metadata.json +20 -3
  35. package/locales/it-IT/models.json +845 -0
  36. package/locales/it-IT/providers.json +80 -0
  37. package/locales/ja-JP/common.json +1 -1
  38. package/locales/ja-JP/discover.json +204 -0
  39. package/locales/ja-JP/metadata.json +20 -3
  40. package/locales/ja-JP/models.json +845 -0
  41. package/locales/ja-JP/providers.json +80 -0
  42. package/locales/ko-KR/common.json +1 -1
  43. package/locales/ko-KR/discover.json +204 -0
  44. package/locales/ko-KR/metadata.json +20 -3
  45. package/locales/ko-KR/models.json +845 -0
  46. package/locales/ko-KR/providers.json +80 -0
  47. package/locales/nl-NL/common.json +1 -1
  48. package/locales/nl-NL/discover.json +204 -0
  49. package/locales/nl-NL/metadata.json +20 -3
  50. package/locales/nl-NL/models.json +845 -0
  51. package/locales/nl-NL/providers.json +80 -0
  52. package/locales/pl-PL/common.json +1 -1
  53. package/locales/pl-PL/discover.json +204 -0
  54. package/locales/pl-PL/metadata.json +20 -3
  55. package/locales/pl-PL/models.json +845 -0
  56. package/locales/pl-PL/providers.json +80 -0
  57. package/locales/pt-BR/common.json +1 -1
  58. package/locales/pt-BR/discover.json +204 -0
  59. package/locales/pt-BR/metadata.json +20 -3
  60. package/locales/pt-BR/models.json +845 -0
  61. package/locales/pt-BR/providers.json +80 -0
  62. package/locales/ru-RU/common.json +1 -1
  63. package/locales/ru-RU/discover.json +204 -0
  64. package/locales/ru-RU/metadata.json +20 -3
  65. package/locales/ru-RU/models.json +845 -0
  66. package/locales/ru-RU/providers.json +80 -0
  67. package/locales/tr-TR/common.json +1 -1
  68. package/locales/tr-TR/discover.json +204 -0
  69. package/locales/tr-TR/metadata.json +20 -3
  70. package/locales/tr-TR/models.json +845 -0
  71. package/locales/tr-TR/providers.json +80 -0
  72. package/locales/vi-VN/common.json +1 -1
  73. package/locales/vi-VN/discover.json +204 -0
  74. package/locales/vi-VN/metadata.json +20 -3
  75. package/locales/vi-VN/models.json +845 -0
  76. package/locales/vi-VN/providers.json +80 -0
  77. package/locales/zh-CN/common.json +1 -1
  78. package/locales/zh-CN/discover.json +204 -0
  79. package/locales/zh-CN/metadata.json +20 -3
  80. package/locales/zh-CN/models.json +845 -0
  81. package/locales/zh-CN/providers.json +80 -0
  82. package/locales/zh-CN/welcome.json +1 -1
  83. package/locales/zh-TW/common.json +1 -1
  84. package/locales/zh-TW/discover.json +204 -0
  85. package/locales/zh-TW/metadata.json +20 -3
  86. package/locales/zh-TW/models.json +845 -0
  87. package/locales/zh-TW/providers.json +80 -0
  88. package/package.json +3 -2
  89. package/src/app/(main)/@nav/_layout/Desktop/TopActions.test.tsx +3 -3
  90. package/src/app/(main)/@nav/_layout/Desktop/TopActions.tsx +3 -3
  91. package/src/app/(main)/@nav/_layout/Mobile.tsx +3 -3
  92. package/src/app/(main)/_layout/Mobile.tsx +9 -1
  93. package/src/app/(main)/discover/(detail)/_layout/Desktop.tsx +24 -0
  94. package/src/app/(main)/discover/(detail)/_layout/Mobile/Header.tsx +25 -0
  95. package/src/app/(main)/discover/(detail)/_layout/Mobile/index.tsx +17 -0
  96. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/Actions.tsx +35 -0
  97. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/AddAgent.tsx +86 -0
  98. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/ConversationExample/TopicList.tsx +74 -0
  99. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/ConversationExample/index.tsx +100 -0
  100. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/Header.tsx +118 -0
  101. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/SuggestionItem.tsx +62 -0
  102. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/ToolItem.tsx +19 -0
  103. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/InfoSidebar/index.tsx +64 -0
  104. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/SystemRole.tsx +35 -0
  105. package/src/app/(main)/discover/(detail)/assistant/[slug]/features/Temp.tsx +44 -0
  106. package/src/app/(main)/discover/(detail)/assistant/[slug]/page.tsx +121 -0
  107. package/src/app/(main)/discover/(detail)/error.tsx +5 -0
  108. package/src/app/(main)/discover/(detail)/features/Back.tsx +42 -0
  109. package/src/app/(main)/discover/(detail)/features/Block.tsx +50 -0
  110. package/src/app/(main)/discover/(detail)/features/DetailLayout.tsx +91 -0
  111. package/src/app/(main)/discover/(detail)/features/HighlightBlock.tsx +82 -0
  112. package/src/app/(main)/discover/(detail)/features/ShareButton.tsx +160 -0
  113. package/src/app/(main)/discover/(detail)/features/SidebarContainer.tsx +19 -0
  114. package/src/app/(main)/discover/(detail)/layout.tsx +12 -0
  115. package/src/app/(main)/discover/(detail)/loading.tsx +38 -0
  116. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/Actions.tsx +46 -0
  117. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ChatWithModel.tsx +93 -0
  118. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/Header.tsx +85 -0
  119. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/InfoSidebar/SuggestionItem.tsx +75 -0
  120. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/InfoSidebar/index.tsx +49 -0
  121. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ParameterList/ParameterItem.tsx +71 -0
  122. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ParameterList/index.tsx +110 -0
  123. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ProviderList/ProviderItem.tsx +152 -0
  124. package/src/app/(main)/discover/(detail)/model/[...slugs]/features/ProviderList/index.tsx +45 -0
  125. package/src/app/(main)/discover/(detail)/model/[...slugs]/page.tsx +114 -0
  126. package/src/app/(main)/discover/(detail)/not-found.tsx +3 -0
  127. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/Actions.tsx +35 -0
  128. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/Header.tsx +114 -0
  129. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/InfoSidebar/SuggestionItem.tsx +62 -0
  130. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/InfoSidebar/index.tsx +49 -0
  131. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/InstallPlugin.tsx +87 -0
  132. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/ParameterList.tsx +95 -0
  133. package/src/app/(main)/discover/(detail)/plugin/[slug]/features/Schema.tsx +23 -0
  134. package/src/app/(main)/discover/(detail)/plugin/[slug]/page.tsx +103 -0
  135. package/src/app/(main)/discover/(detail)/provider/[slug]/features/Actions.tsx +49 -0
  136. package/src/app/(main)/discover/(detail)/provider/[slug]/features/Header.tsx +73 -0
  137. package/src/app/(main)/discover/(detail)/provider/[slug]/features/InfoSidebar/SuggestionItem.tsx +75 -0
  138. package/src/app/(main)/discover/(detail)/provider/[slug]/features/InfoSidebar/index.tsx +49 -0
  139. package/src/app/(main)/discover/(detail)/provider/[slug]/features/ModelList/ModelItem.tsx +148 -0
  140. package/src/app/(main)/discover/(detail)/provider/[slug]/features/ModelList/index.tsx +60 -0
  141. package/src/app/(main)/discover/(detail)/provider/[slug]/features/ProviderConfig.tsx +80 -0
  142. package/src/app/(main)/discover/(detail)/provider/[slug]/page.tsx +116 -0
  143. package/src/app/(main)/discover/(list)/(home)/Client.tsx +42 -0
  144. package/src/app/(main)/discover/(list)/(home)/features/AssistantList.tsx +33 -0
  145. package/src/app/(main)/discover/(list)/(home)/features/ModelList.tsx +22 -0
  146. package/src/app/(main)/discover/(list)/(home)/features/PluginList.tsx +25 -0
  147. package/src/app/(main)/discover/(list)/(home)/loading.tsx +1 -0
  148. package/src/app/(main)/discover/(list)/(home)/page.tsx +54 -0
  149. package/src/app/(main)/discover/(list)/_layout/Desktop/Nav.tsx +118 -0
  150. package/src/app/(main)/discover/(list)/_layout/Desktop/index.tsx +37 -0
  151. package/src/app/(main)/discover/(list)/_layout/Desktop/useScroll.ts +33 -0
  152. package/src/app/(main)/discover/(list)/_layout/Mobile/Header.tsx +62 -0
  153. package/src/app/(main)/discover/(list)/_layout/Mobile/Nav.tsx +94 -0
  154. package/src/app/(main)/discover/(list)/_layout/Mobile/index.tsx +27 -0
  155. package/src/app/(main)/discover/(list)/assistants/[slug]/page.tsx +64 -0
  156. package/src/app/(main)/discover/(list)/assistants/_layout/Desktop.tsx +22 -0
  157. package/src/app/(main)/discover/(list)/assistants/_layout/Mobile.tsx +9 -0
  158. package/src/app/(main)/discover/(list)/assistants/features/Card.tsx +176 -0
  159. package/src/app/(main)/discover/(list)/assistants/features/Category.tsx +48 -0
  160. package/src/app/(main)/discover/(list)/assistants/features/List.tsx +97 -0
  161. package/src/app/(main)/discover/(list)/assistants/features/useCategory.tsx +116 -0
  162. package/src/app/(main)/discover/(list)/assistants/layout.tsx +12 -0
  163. package/src/app/(main)/discover/(list)/assistants/loading.tsx +1 -0
  164. package/src/app/(main)/discover/(list)/assistants/page.tsx +51 -0
  165. package/src/app/(main)/discover/(list)/error.tsx +5 -0
  166. package/src/app/(main)/{market → discover/(list)}/layout.tsx +4 -3
  167. package/src/app/(main)/discover/(list)/loading.tsx +39 -0
  168. package/src/app/(main)/discover/(list)/models/[slug]/page.tsx +70 -0
  169. package/src/app/(main)/discover/(list)/models/_layout/Desktop.tsx +28 -0
  170. package/src/app/(main)/discover/(list)/models/_layout/Mobile.tsx +9 -0
  171. package/src/app/(main)/discover/(list)/models/features/Card.tsx +116 -0
  172. package/src/app/(main)/discover/(list)/models/features/Category.tsx +67 -0
  173. package/src/app/(main)/discover/(list)/models/features/List.tsx +72 -0
  174. package/src/app/(main)/discover/(list)/models/features/const.ts +9 -0
  175. package/src/app/(main)/discover/(list)/models/layout.tsx +12 -0
  176. package/src/app/(main)/discover/(list)/models/loading.tsx +1 -0
  177. package/src/app/(main)/discover/(list)/models/page.tsx +61 -0
  178. package/src/app/(main)/discover/(list)/not-found.tsx +3 -0
  179. package/src/app/(main)/discover/(list)/plugins/[slug]/page.tsx +64 -0
  180. package/src/app/(main)/discover/(list)/plugins/_layout/Desktop.tsx +22 -0
  181. package/src/app/(main)/discover/(list)/plugins/_layout/Mobile.tsx +9 -0
  182. package/src/app/(main)/discover/(list)/plugins/features/Card.tsx +154 -0
  183. package/src/app/(main)/discover/(list)/plugins/features/Category.tsx +45 -0
  184. package/src/app/(main)/discover/(list)/plugins/features/List.tsx +96 -0
  185. package/src/app/(main)/discover/(list)/plugins/features/useCategory.tsx +80 -0
  186. package/src/app/(main)/discover/(list)/plugins/layout.tsx +12 -0
  187. package/src/app/(main)/discover/(list)/plugins/loading.tsx +1 -0
  188. package/src/app/(main)/discover/(list)/plugins/page.tsx +52 -0
  189. package/src/app/(main)/discover/(list)/providers/features/Card.tsx +117 -0
  190. package/src/app/(main)/discover/(list)/providers/features/List.tsx +71 -0
  191. package/src/app/(main)/discover/(list)/providers/loading.tsx +1 -0
  192. package/src/app/(main)/discover/(list)/providers/page.tsx +52 -0
  193. package/src/app/(main)/discover/_layout/Desktop/Header.tsx +36 -0
  194. package/src/app/(main)/discover/_layout/Desktop/index.tsx +21 -0
  195. package/src/app/(main)/discover/_layout/Mobile/index.tsx +9 -0
  196. package/src/app/(main)/{market/features/AgentCard/AgentCardBanner.tsx → discover/components/CardBanner.tsx} +5 -5
  197. package/src/app/(main)/discover/components/CategoryContainer.tsx +18 -0
  198. package/src/app/(main)/discover/components/CategoryMenu.tsx +39 -0
  199. package/src/app/(main)/discover/components/GitHubAvatar.tsx +19 -0
  200. package/src/app/(main)/discover/components/GridLoadingCard.tsx +69 -0
  201. package/src/app/(main)/discover/components/ListLoading.tsx +66 -0
  202. package/src/app/(main)/discover/components/Loading.tsx +17 -0
  203. package/src/app/(main)/discover/components/SearchResultCount.tsx +37 -0
  204. package/src/app/(main)/discover/components/Statistic.tsx +92 -0
  205. package/src/app/(main)/discover/components/Title.tsx +76 -0
  206. package/src/app/(main)/discover/components/VirtuosoGridList/index.tsx +52 -0
  207. package/src/app/(main)/discover/components/VirtuosoGridList/useScrollParent.ts +19 -0
  208. package/src/app/(main)/discover/error.tsx +5 -0
  209. package/src/app/(main)/{market/features/ShareAgentButton → discover/features/CreateButton}/Inner.tsx +9 -10
  210. package/src/app/(main)/{market/features/ShareAgentButton → discover/features/CreateButton}/index.tsx +9 -9
  211. package/src/app/(main)/discover/features/LikeButton.tsx +73 -0
  212. package/src/app/(main)/discover/features/ModelFeatureTags.tsx +77 -0
  213. package/src/app/(main)/discover/features/StoreSearchBar.tsx +84 -0
  214. package/src/app/(main)/discover/features/const.ts +2 -0
  215. package/src/app/(main)/discover/features/useNav.tsx +71 -0
  216. package/src/app/(main)/discover/layout.tsx +12 -0
  217. package/src/app/(main)/discover/loading.tsx +9 -0
  218. package/src/app/(main)/discover/not-found.tsx +3 -0
  219. package/src/app/(main)/discover/search/_layout/Desktop.tsx +42 -0
  220. package/src/app/(main)/discover/search/_layout/Mobile/Header.tsx +31 -0
  221. package/src/app/(main)/discover/search/_layout/Mobile/Nav.tsx +56 -0
  222. package/src/app/(main)/discover/search/_layout/Mobile/index.tsx +32 -0
  223. package/src/app/(main)/discover/search/features/AssistantsResult.tsx +27 -0
  224. package/src/app/(main)/discover/search/features/Category.tsx +41 -0
  225. package/src/app/(main)/discover/search/features/ModelsResult.tsx +27 -0
  226. package/src/app/(main)/discover/search/features/PluginsResult.tsx +27 -0
  227. package/src/app/(main)/discover/search/features/ProvidersResult.tsx +26 -0
  228. package/src/app/(main)/discover/search/layout.tsx +12 -0
  229. package/src/app/(main)/discover/search/loading.tsx +1 -0
  230. package/src/app/(main)/discover/search/page.tsx +78 -0
  231. package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +0 -6
  232. package/src/app/(main)/welcome/features/Actions.tsx +1 -1
  233. package/src/app/@modal/(.)discover/assistant/[slug]/page.tsx +1 -0
  234. package/src/app/@modal/(.)discover/layout.tsx +29 -0
  235. package/src/app/@modal/(.)discover/loading.tsx +3 -0
  236. package/src/app/@modal/(.)discover/model/[...slugs]/page.tsx +1 -0
  237. package/src/app/@modal/(.)discover/plugin/[slug]/page.tsx +1 -0
  238. package/src/app/@modal/(.)discover/provider/[slug]/page.tsx +1 -0
  239. package/src/app/@modal/features/InterceptingContext.tsx +9 -0
  240. package/src/app/@modal/layout.tsx +58 -21
  241. package/src/app/api/{market → assistant}/[id]/route.ts +2 -3
  242. package/src/app/api/{market → assistant/store}/route.ts +2 -5
  243. package/src/app/api/plugin/store/route.ts +1 -4
  244. package/src/app/metadata.ts +3 -0
  245. package/src/app/redirect/page.tsx +15 -0
  246. package/src/components/FetchErrorNotification/Description.tsx +2 -0
  247. package/src/components/InterceptingLink/index.tsx +27 -0
  248. package/src/components/mdx/CodeBlock.tsx +46 -0
  249. package/src/components/mdx/Link.tsx +21 -0
  250. package/src/components/mdx/index.tsx +51 -0
  251. package/src/config/modelProviders/ollama.ts +0 -8
  252. package/src/const/discover.ts +63 -1
  253. package/src/features/Conversation/Error/PluginSettings.tsx +1 -1
  254. package/src/features/Conversation/Messages/Tool/Inspector/Settings.tsx +1 -1
  255. package/src/features/Conversation/components/InboxWelcome/AgentsSuggest.tsx +41 -24
  256. package/src/features/MobileTabBar/index.tsx +3 -3
  257. package/src/features/PluginDetailModal/APIs.tsx +1 -1
  258. package/src/features/PluginDevModal/UrlManifestForm.tsx +1 -1
  259. package/src/features/PluginStore/PluginItem/Action.tsx +1 -1
  260. package/src/features/PluginsUI/Render/DefaultType/index.tsx +1 -1
  261. package/src/features/PluginsUI/Render/StandaloneType/index.tsx +1 -1
  262. package/src/hooks/useInterceptingRoutes.ts +21 -1
  263. package/src/hooks/useShare.tsx +191 -0
  264. package/src/libs/agent-runtime/utils/streams/openai.test.ts +43 -0
  265. package/src/libs/agent-runtime/utils/streams/openai.ts +1 -1
  266. package/src/locales/create.ts +1 -1
  267. package/src/locales/default/common.ts +1 -1
  268. package/src/locales/default/discover.ts +205 -0
  269. package/src/locales/default/index.ts +6 -2
  270. package/src/locales/default/metadata.ts +23 -3
  271. package/src/locales/default/models.ts +15 -0
  272. package/src/locales/default/providers.ts +15 -0
  273. package/src/locales/default/welcome.ts +1 -1
  274. package/src/locales/resources.ts +2 -0
  275. package/src/server/ld.ts +85 -11
  276. package/src/server/metadata.ts +41 -3
  277. package/src/{app/api/market/AgentMarket.test.ts → server/modules/AssistantStore/index.test.ts} +15 -15
  278. package/src/{app/api/market/AgentMarket.ts → server/modules/AssistantStore/index.ts} +7 -3
  279. package/src/{app/api/plugin/store/Store.test.ts → server/modules/PluginStore/index.test.ts} +1 -1
  280. package/src/server/services/discover/index.ts +352 -0
  281. package/src/server/services/doc/index.tsx +40 -0
  282. package/src/server/translation.ts +11 -5
  283. package/src/services/__tests__/__snapshots__/tool.test.ts.snap +1 -1
  284. package/src/services/{_auth.test.ts → __tests__/_auth.test.ts} +1 -1
  285. package/src/services/__tests__/assistant.test.ts +82 -0
  286. package/src/services/__tests__/tool.test.ts +13 -13
  287. package/src/services/_url.ts +2 -2
  288. package/src/services/assistant.ts +30 -0
  289. package/src/services/chat.ts +1 -1
  290. package/src/services/tool.ts +7 -129
  291. package/src/store/chat/slices/plugin/action.test.ts +112 -0
  292. package/src/store/chat/slices/plugin/action.ts +1 -3
  293. package/src/store/global/initialState.ts +1 -1
  294. package/src/store/tool/selectors/tool.test.ts +1 -1
  295. package/src/store/tool/slices/customPlugin/action.test.ts +1 -1
  296. package/src/store/tool/slices/customPlugin/action.ts +1 -1
  297. package/src/store/tool/slices/plugin/action.ts +1 -1
  298. package/src/store/tool/slices/plugin/selectors.test.ts +3 -3
  299. package/src/store/tool/slices/plugin/selectors.ts +3 -3
  300. package/src/store/tool/slices/store/action.test.ts +16 -22
  301. package/src/store/tool/slices/store/action.ts +8 -8
  302. package/src/types/discover.ts +152 -0
  303. package/src/types/llm.ts +4 -2
  304. package/src/types/meta.ts +1 -0
  305. package/src/utils/format.test.ts +191 -112
  306. package/src/utils/format.ts +36 -0
  307. package/src/utils/toolManifest.ts +124 -0
  308. package/src/app/(main)/market/@detail/default.tsx +0 -12
  309. package/src/app/(main)/market/@detail/features/AgentDetailContent.tsx +0 -73
  310. package/src/app/(main)/market/@detail/features/Banner.tsx +0 -46
  311. package/src/app/(main)/market/@detail/features/Comment.tsx +0 -16
  312. package/src/app/(main)/market/@detail/features/Header.tsx +0 -81
  313. package/src/app/(main)/market/@detail/features/Loading.tsx +0 -63
  314. package/src/app/(main)/market/@detail/features/TokenTag.tsx +0 -27
  315. package/src/app/(main)/market/@detail/features/style.ts +0 -32
  316. package/src/app/(main)/market/_layout/Desktop/DetailSidebar.tsx +0 -84
  317. package/src/app/(main)/market/_layout/Desktop/Header.tsx +0 -29
  318. package/src/app/(main)/market/_layout/Desktop/Hero.tsx +0 -40
  319. package/src/app/(main)/market/_layout/Desktop/index.tsx +0 -46
  320. package/src/app/(main)/market/_layout/Mobile/DetailModal.tsx +0 -32
  321. package/src/app/(main)/market/_layout/Mobile/Header.tsx +0 -20
  322. package/src/app/(main)/market/_layout/Mobile/index.tsx +0 -25
  323. package/src/app/(main)/market/_layout/type.ts +0 -6
  324. package/src/app/(main)/market/features/AgentCard/index.tsx +0 -139
  325. package/src/app/(main)/market/features/AgentList.tsx +0 -103
  326. package/src/app/(main)/market/features/AgentSearchBar.tsx +0 -42
  327. package/src/app/(main)/market/features/TagList.tsx +0 -69
  328. package/src/app/(main)/market/loading.tsx +0 -15
  329. package/src/app/(main)/market/page.tsx +0 -44
  330. package/src/const/market.ts +0 -15
  331. package/src/locales/default/market.ts +0 -32
  332. package/src/services/market.ts +0 -22
  333. package/src/store/market/action.ts +0 -82
  334. package/src/store/market/index.ts +0 -3
  335. package/src/store/market/initialState.ts +0 -19
  336. package/src/store/market/selectors.ts +0 -38
  337. package/src/store/market/store.ts +0 -48
  338. package/src/types/market.ts +0 -20
  339. /package/src/{app/api/plugin/store/Store.ts → server/modules/PluginStore/index.ts} +0 -0
@@ -1,116 +1,195 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
 
3
- import { formatSize, formatSpeed, formatTime, formatTokenNumber } from './format';
4
-
5
- describe('formatSize', () => {
6
- it('should format bytes to KB correctly', () => {
7
- expect(formatSize(1024)).toBe('1.0 KB');
8
- expect(formatSize(2048)).toBe('2.0 KB');
9
- expect(formatSize(1536)).toBe('1.5 KB');
10
- });
11
-
12
- it('should format bytes to MB correctly', () => {
13
- expect(formatSize(1048576)).toBe('1.0 MB');
14
- expect(formatSize(2097152)).toBe('2.0 MB');
15
- expect(formatSize(1572864)).toBe('1.5 MB');
16
- });
17
-
18
- it('should format bytes to GB correctly', () => {
19
- expect(formatSize(1073741824)).toBe('1.0 GB');
20
- expect(formatSize(2147483648)).toBe('2.0 GB');
21
- expect(formatSize(1610612736)).toBe('1.5 GB');
22
- });
23
-
24
- it('should handle edge cases', () => {
25
- expect(formatSize(0)).toBe('0.0 KB');
26
- expect(formatSize(1023)).toBe('1.0 KB');
27
- expect(formatSize(1073741823)).toBe('1024.0 MB');
28
- });
29
- });
30
-
31
- describe('formatSpeed', () => {
32
- it('should format speed in KB/s correctly', () => {
33
- expect(formatSpeed(10 * 1024)).toBe('10.00 KB/s');
34
- expect(formatSpeed(999.99 * 1024)).toBe('999.99 KB/s');
35
- });
36
-
37
- it('should format speed in MB/s correctly', () => {
38
- expect(formatSpeed(1024 * 1024)).toBe('1.00 MB/s');
39
- expect(formatSpeed(10240 * 1024)).toBe('10.00 MB/s');
40
- });
41
-
42
- it('should format speed in GB/s correctly', () => {
43
- expect(formatSpeed(1048576 * 1024)).toBe('1.00 GB/s');
44
- expect(formatSpeed(10485760 * 1024)).toBe('10.00 GB/s');
45
- });
46
-
47
- it('should handle edge cases', () => {
48
- expect(formatSpeed(0)).toBe('0.00 Byte/s');
49
- expect(formatSpeed(1000 * 1024)).toBe('1000.00 KB/s');
50
- expect(formatSpeed(1000.01 * 1024)).toBe('0.98 MB/s');
51
- });
52
- });
53
-
54
- describe('formatTime', () => {
55
- it('should format time in seconds correctly', () => {
56
- expect(formatTime(30)).toBe('30.0 s');
57
- expect(formatTime(59.9)).toBe('59.9 s');
58
- });
59
-
60
- it('should format time in minutes correctly', () => {
61
- expect(formatTime(60)).toBe('1.0 min');
62
- expect(formatTime(3599)).toBe('60.0 min');
63
- });
64
-
65
- it('should format time in hours correctly', () => {
66
- expect(formatTime(3600)).toBe('1.00 h');
67
- expect(formatTime(7200)).toBe('2.00 h');
68
- });
69
-
70
- it('should handle edge cases', () => {
71
- expect(formatTime(0)).toBe('0.0 s');
72
- expect(formatTime(59.99)).toBe('60.0 s');
73
- expect(formatTime(3599.99)).toBe('60.0 min');
74
- });
75
- });
76
-
77
- describe('formatTokenNumber', () => {
78
- it('should return "1K" for numbers between 1 and 1023', () => {
79
- expect(formatTokenNumber(500)).toBe('1K');
80
- expect(formatTokenNumber(1000)).toBe('1K');
81
- });
82
-
83
- it('should format numbers between 1024 and 41,983 correctly', () => {
84
- expect(formatTokenNumber(1024)).toBe('1K');
85
- expect(formatTokenNumber(2000)).toBe('2K');
86
- expect(formatTokenNumber(2048)).toBe('2K');
87
- expect(formatTokenNumber(4000)).toBe('4K');
88
- expect(formatTokenNumber(4096)).toBe('4K');
89
- expect(formatTokenNumber(32000)).toBe('32K');
90
- expect(formatTokenNumber(65536)).toBe('64K');
91
- });
92
-
93
- it('should format numbers between 41,984 and 127,999 correctly', () => {
94
- expect(formatTokenNumber(41984)).toBe('41K');
95
- expect(formatTokenNumber(100000)).toBe('97K');
96
- expect(formatTokenNumber(127999)).toBe('124K');
97
- });
98
-
99
- it('should return "128K" for 131,072', () => {
100
- expect(formatTokenNumber(131072)).toBe('128K'); // Qwen
101
- });
102
-
103
- it('should format numbers between 128,000 and 999,999 correctly', () => {
104
- expect(formatTokenNumber(128000)).toBe('128K');
105
- expect(formatTokenNumber(200000)).toBe('200K'); // Claude
106
- expect(formatTokenNumber(999999)).toBe('999K');
107
- });
108
-
109
- it('should format numbers 1,000,000 and above correctly', () => {
110
- expect(formatTokenNumber(1000000)).toBe('1M');
111
- expect(formatTokenNumber(1024000)).toBe('1M');
112
- expect(formatTokenNumber(1048576)).toBe('1M'); // Gemini Flash
113
- expect(formatTokenNumber(2000000)).toBe('2M');
114
- expect(formatTokenNumber(2097152)).toBe('2M'); // Gemini Pro
3
+ import {
4
+ formatNumber,
5
+ formatPrice,
6
+ formatPriceByCurrency,
7
+ formatShortenNumber,
8
+ formatSize,
9
+ formatSpeed,
10
+ formatTime,
11
+ formatTokenNumber,
12
+ } from './format';
13
+
14
+ // 保留你已经编写的测试用例
15
+ describe('format', () => {
16
+ describe('formatSize', () => {
17
+ it('should format bytes to KB correctly', () => {
18
+ expect(formatSize(1024)).toBe('1.0 KB');
19
+ expect(formatSize(2048)).toBe('2.0 KB');
20
+ expect(formatSize(1536)).toBe('1.5 KB');
21
+ });
22
+
23
+ it('should format bytes to MB correctly', () => {
24
+ expect(formatSize(1048576)).toBe('1.0 MB');
25
+ expect(formatSize(2097152)).toBe('2.0 MB');
26
+ expect(formatSize(1572864)).toBe('1.5 MB');
27
+ });
28
+
29
+ it('should format bytes to GB correctly', () => {
30
+ expect(formatSize(1073741824)).toBe('1.0 GB');
31
+ expect(formatSize(2147483648)).toBe('2.0 GB');
32
+ expect(formatSize(1610612736)).toBe('1.5 GB');
33
+ });
34
+
35
+ it('should handle edge cases', () => {
36
+ expect(formatSize(0)).toBe('0.0 KB');
37
+ expect(formatSize(1023)).toBe('1.0 KB');
38
+ expect(formatSize(1073741823)).toBe('1024.0 MB');
39
+ });
40
+ });
41
+
42
+ describe('formatSpeed', () => {
43
+ it('should format speed in KB/s correctly', () => {
44
+ expect(formatSpeed(10 * 1024)).toBe('10.00 KB/s');
45
+ expect(formatSpeed(999.99 * 1024)).toBe('999.99 KB/s');
46
+ });
47
+
48
+ it('should format speed in MB/s correctly', () => {
49
+ expect(formatSpeed(1024 * 1024)).toBe('1.00 MB/s');
50
+ expect(formatSpeed(10240 * 1024)).toBe('10.00 MB/s');
51
+ });
52
+
53
+ it('should format speed in GB/s correctly', () => {
54
+ expect(formatSpeed(1048576 * 1024)).toBe('1.00 GB/s');
55
+ expect(formatSpeed(10485760 * 1024)).toBe('10.00 GB/s');
56
+ });
57
+
58
+ it('should handle edge cases', () => {
59
+ expect(formatSpeed(0)).toBe('0.00 Byte/s');
60
+ expect(formatSpeed(1000 * 1024)).toBe('1000.00 KB/s');
61
+ expect(formatSpeed(1000.01 * 1024)).toBe('0.98 MB/s');
62
+ });
63
+ });
64
+
65
+ describe('formatTime', () => {
66
+ it('should format time in seconds correctly', () => {
67
+ expect(formatTime(30)).toBe('30.0 s');
68
+ expect(formatTime(59.9)).toBe('59.9 s');
69
+ });
70
+
71
+ it('should format time in minutes correctly', () => {
72
+ expect(formatTime(60)).toBe('1.0 min');
73
+ expect(formatTime(3599)).toBe('60.0 min');
74
+ });
75
+
76
+ it('should format time in hours correctly', () => {
77
+ expect(formatTime(3600)).toBe('1.00 h');
78
+ expect(formatTime(7200)).toBe('2.00 h');
79
+ });
80
+
81
+ it('should handle edge cases', () => {
82
+ expect(formatTime(0)).toBe('0.0 s');
83
+ expect(formatTime(59.99)).toBe('60.0 s');
84
+ expect(formatTime(3599.99)).toBe('60.0 min');
85
+ });
86
+ it('should handle edge cases', () => {
87
+ expect(formatTime(0)).toBe('0.0 s');
88
+ expect(formatTime(59.99)).toBe('60.0 s');
89
+ expect(formatTime(3599.99)).toBe('60.0 min');
90
+ });
91
+ });
92
+
93
+ describe('formatShortenNumber', () => {
94
+ it('should return the input if it is not a number', () => {
95
+ expect(formatShortenNumber('not a number')).toBe('not a number');
96
+ expect(formatShortenNumber(null)).toBe(null);
97
+ });
98
+
99
+ it('should format numbers less than 10,000 correctly', () => {
100
+ expect(formatShortenNumber(0)).toBe(0);
101
+ expect(formatShortenNumber(1234)).toBe('1,234');
102
+ expect(formatShortenNumber(9999)).toBe('9,999');
103
+ });
104
+
105
+ it('should format numbers between 10,000 and 9,999,999 correctly', () => {
106
+ expect(formatShortenNumber(10000)).toBe('10.0K');
107
+ expect(formatShortenNumber(123456)).toBe('123.5K');
108
+ expect(formatShortenNumber(9999999)).toBe('10000.0K');
109
+ });
110
+
111
+ it('should format numbers 10,000,000 and above correctly', () => {
112
+ expect(formatShortenNumber(10000000)).toBe('10.0M');
113
+ expect(formatShortenNumber(123456789)).toBe('123.5M');
114
+ expect(formatShortenNumber(9876543210)).toBe('9876.5M');
115
+ });
116
+ });
117
+
118
+ describe('formatNumber', () => {
119
+ it('should format numbers with commas correctly', () => {
120
+ expect(formatNumber(1000)).toBe('1,000');
121
+ expect(formatNumber(1000000)).toBe('1,000,000');
122
+ expect(formatNumber(1234567.89)).toBe('1,234,567.89');
123
+ });
124
+
125
+ it('should handle non-number inputs', () => {
126
+ expect(formatNumber('1000')).toBe('1,000');
127
+ expect(formatNumber('not a number')).toBe(Number.NaN.toString());
128
+ expect(formatNumber(null)).toBe(undefined);
129
+ });
130
+ });
131
+
132
+ describe('formatPrice', () => {
133
+ it('should format prices correctly', () => {
134
+ expect(formatPrice(1000)).toBe('1,000.00');
135
+ expect(formatPrice(1234.56)).toBe('1,234.56');
136
+ expect(formatPrice(0.99)).toBe('0.99');
137
+ expect(formatPrice(1000000.01)).toBe('1,000,000.01');
138
+ });
139
+ });
140
+
141
+ describe('formatPriceByCurrency', () => {
142
+ it('should format USD prices correctly', () => {
143
+ expect(formatPriceByCurrency(1000)).toBe('1,000.00');
144
+ expect(formatPriceByCurrency(1234.56, 'USD')).toBe('1,234.56');
145
+ });
146
+
147
+ it('should format CNY prices correctly', () => {
148
+ // Assuming CNY_TO_USD is 6.5
149
+ const CNY_TO_USD = 6.5;
150
+ expect(formatPriceByCurrency(1000, 'CNY')).toBe('140.06');
151
+ expect(formatPriceByCurrency(6500, 'CNY')).toBe('910.36');
152
+ });
153
+ });
154
+
155
+ describe('formatTokenNumber', () => {
156
+ it('should return "1K" for numbers between 1 and 1023', () => {
157
+ expect(formatTokenNumber(500)).toBe('1K');
158
+ expect(formatTokenNumber(1000)).toBe('1K');
159
+ });
160
+
161
+ it('should format numbers between 1024 and 41,983 correctly', () => {
162
+ expect(formatTokenNumber(1024)).toBe('1K');
163
+ expect(formatTokenNumber(2000)).toBe('2K');
164
+ expect(formatTokenNumber(2048)).toBe('2K');
165
+ expect(formatTokenNumber(4000)).toBe('4K');
166
+ expect(formatTokenNumber(4096)).toBe('4K');
167
+ expect(formatTokenNumber(32000)).toBe('32K');
168
+ expect(formatTokenNumber(65536)).toBe('64K');
169
+ });
170
+
171
+ it('should format numbers between 41,984 and 127,999 correctly', () => {
172
+ expect(formatTokenNumber(41984)).toBe('41K');
173
+ expect(formatTokenNumber(100000)).toBe('97K');
174
+ expect(formatTokenNumber(127999)).toBe('124K');
175
+ });
176
+
177
+ it('should return "128K" for 131,072', () => {
178
+ expect(formatTokenNumber(131072)).toBe('128K'); // Qwen
179
+ });
180
+
181
+ it('should format numbers between 128,000 and 999,999 correctly', () => {
182
+ expect(formatTokenNumber(128000)).toBe('128K');
183
+ expect(formatTokenNumber(200000)).toBe('200K'); // Claude
184
+ expect(formatTokenNumber(999999)).toBe('999K');
185
+ });
186
+
187
+ it('should format numbers 1,000,000 and above correctly', () => {
188
+ expect(formatTokenNumber(1000000)).toBe('1M');
189
+ expect(formatTokenNumber(1024000)).toBe('1M');
190
+ expect(formatTokenNumber(1048576)).toBe('1M'); // Gemini Flash
191
+ expect(formatTokenNumber(2000000)).toBe('2M');
192
+ expect(formatTokenNumber(2097152)).toBe('2M'); // Gemini Pro
193
+ });
115
194
  });
116
195
  });
@@ -1,3 +1,9 @@
1
+ import { isNumber } from 'lodash-es';
2
+ import numeral from 'numeral';
3
+
4
+ import { CNY_TO_USD } from '@/const/discover';
5
+ import { ModelPriceCurrency } from '@/types/llm';
6
+
1
7
  export const formatSize = (bytes: number, fractionDigits = 1): string => {
2
8
  const kbSize = bytes / 1024;
3
9
  if (kbSize < 1024) {
@@ -47,11 +53,29 @@ export const formatTime = (timeInSeconds: number): string => {
47
53
  }
48
54
  };
49
55
 
56
+ export const formatShortenNumber = (num: any) => {
57
+ if (!isNumber(num)) return num;
58
+ // 使用Intl.NumberFormat来添加千分号
59
+ const formattedWithComma = new Intl.NumberFormat('en-US').format(num);
60
+
61
+ // 格式化为 K 或 M
62
+ if (num >= 10_000_000) {
63
+ return (num / 1_000_000).toFixed(1) + 'M';
64
+ } else if (num >= 10_000) {
65
+ return (num / 1000).toFixed(1) + 'K';
66
+ } else if (num === 0) {
67
+ return 0;
68
+ } else {
69
+ return formattedWithComma;
70
+ }
71
+ };
72
+
50
73
  /**
51
74
  * format number with comma
52
75
  * @param num
53
76
  */
54
77
  export const formatNumber = (num: any) => {
78
+ if (!num) return;
55
79
  return new Intl.NumberFormat('en-US').format(num);
56
80
  };
57
81
 
@@ -65,3 +89,15 @@ export const formatTokenNumber = (num: number): string => {
65
89
  if (num === 131_072) return '128K';
66
90
  return kiloToken < 1000 ? `${kiloToken}K` : `${Math.floor(kiloToken / 1000)}M`;
67
91
  };
92
+
93
+ export const formatPrice = (price: number) => {
94
+ const [a, b] = price.toFixed(2).split('.');
95
+ return `${numeral(a).format('0,0')}.${b}`;
96
+ };
97
+
98
+ export const formatPriceByCurrency = (price: number, currency?: ModelPriceCurrency) => {
99
+ if (currency === 'CNY') {
100
+ return formatPrice(price / CNY_TO_USD);
101
+ }
102
+ return formatPrice(price);
103
+ };
@@ -0,0 +1,124 @@
1
+ import { LobeChatPluginManifest, pluginManifestSchema } from '@lobehub/chat-plugin-sdk';
2
+
3
+ import { API_ENDPOINTS } from '@/services/_url';
4
+ import { OpenAIPluginManifest } from '@/types/openai/plugin';
5
+
6
+ const fetchJSON = async <T = any>(url: string, proxy = false): Promise<T> => {
7
+ // 2. 发送请求
8
+ let res: Response;
9
+ try {
10
+ res = await (proxy ? fetch(API_ENDPOINTS.proxy, { body: url, method: 'POST' }) : fetch(url));
11
+ } catch {
12
+ throw new TypeError('fetchError');
13
+ }
14
+
15
+ if (!res.ok) {
16
+ throw new TypeError('fetchError');
17
+ }
18
+
19
+ let data;
20
+ const contentType = res.headers.get('Content-Type');
21
+
22
+ try {
23
+ if (contentType === 'application/json') {
24
+ data = await res.json();
25
+ } else {
26
+ const { default: YAML } = await import('yaml');
27
+
28
+ const yaml = await res.text();
29
+ data = YAML.parse(yaml);
30
+ }
31
+ } catch {
32
+ throw new TypeError('urlError');
33
+ }
34
+
35
+ return data;
36
+ };
37
+
38
+ export const convertOpenAIManifestToLobeManifest = (
39
+ data: OpenAIPluginManifest,
40
+ ): LobeChatPluginManifest => {
41
+ const manifest: LobeChatPluginManifest = {
42
+ api: [],
43
+ homepage: data.legal_info_url,
44
+ identifier: data.name_for_model,
45
+ meta: {
46
+ avatar: data.logo_url,
47
+ description: data.description_for_human,
48
+ title: data.name_for_human,
49
+ },
50
+ openapi: data.api.url,
51
+ systemRole: data.description_for_model,
52
+ type: 'default',
53
+ version: '1',
54
+ };
55
+ switch (data.auth.type) {
56
+ case 'none': {
57
+ break;
58
+ }
59
+ case 'service_http': {
60
+ manifest.settings = {
61
+ properties: {
62
+ apiAuthKey: {
63
+ default: data.auth.verification_tokens['openai'],
64
+ description: 'API Key',
65
+ format: 'password',
66
+ title: 'API Key',
67
+ type: 'string',
68
+ },
69
+ },
70
+ type: 'object',
71
+ };
72
+ break;
73
+ }
74
+ }
75
+
76
+ return manifest;
77
+ };
78
+
79
+ export const getToolManifest = async (
80
+ url?: string,
81
+ useProxy: boolean = false,
82
+ ): Promise<LobeChatPluginManifest> => {
83
+ // 1. valid plugin
84
+ if (!url) {
85
+ throw new TypeError('noManifest');
86
+ }
87
+
88
+ // 2. 发送请求
89
+
90
+ let data = await fetchJSON<LobeChatPluginManifest>(url, useProxy);
91
+
92
+ // @ts-ignore
93
+ // if there is a description_for_model, it is an OpenAI plugin
94
+ // we need convert to lobe plugin
95
+ if (data['description_for_model']) {
96
+ data = convertOpenAIManifestToLobeManifest(data as any);
97
+ }
98
+
99
+ // 3. 校验插件文件格式规范
100
+ const parser = pluginManifestSchema.safeParse(data);
101
+
102
+ if (!parser.success) {
103
+ throw new TypeError('manifestInvalid', { cause: parser.error });
104
+ }
105
+
106
+ // 4. if exist OpenAPI api, merge the OpenAPIs to api
107
+ if (parser.data.openapi) {
108
+ const openapiJson = await fetchJSON(parser.data.openapi, useProxy);
109
+
110
+ try {
111
+ const { OpenAPIConvertor } = await import('@lobehub/chat-plugin-sdk/openapi');
112
+
113
+ const convertor = new OpenAPIConvertor(openapiJson);
114
+ const openAPIs = await convertor.convertOpenAPIToPluginSchema();
115
+ data.api = [...data.api, ...openAPIs];
116
+
117
+ data.settings = await convertor.convertAuthToSettingsSchema(data.settings);
118
+ } catch (error) {
119
+ throw new TypeError('openAPIInvalid', { cause: error });
120
+ }
121
+ }
122
+
123
+ return data;
124
+ };
@@ -1,12 +0,0 @@
1
- import { isMobileDevice } from '@/utils/responsive';
2
-
3
- import AgentDetailContent from './features/AgentDetailContent';
4
-
5
- const Detail = () => {
6
- const mobile = isMobileDevice();
7
- return <AgentDetailContent mobile={mobile} />;
8
- };
9
-
10
- Detail.displayName = 'AgentDetail';
11
-
12
- export default Detail;
@@ -1,73 +0,0 @@
1
- 'use client';
2
-
3
- import { Markdown, TabsNav } from '@lobehub/ui';
4
- import { memo, useState } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { Flexbox } from 'react-layout-kit';
7
-
8
- import Banner from '@/app/(main)/market/@detail/features/Banner';
9
- import { useMarketStore } from '@/store/market';
10
-
11
- import Comment from './Comment';
12
- import Header from './Header';
13
- import Loading from './Loading';
14
- import TokenTag from './TokenTag';
15
-
16
- enum InfoTabs {
17
- comment = 'comment',
18
- prompt = 'prompt',
19
- }
20
-
21
- const AgentDetailContent = memo<{ mobile?: boolean }>(({ mobile }) => {
22
- const [useFetchAgent, currentIdentifier] = useMarketStore((s) => [
23
- s.useFetchAgent,
24
- s.currentIdentifier,
25
- ]);
26
- const { t } = useTranslation('market');
27
- const [tab, setTab] = useState<string>(InfoTabs.prompt);
28
- const { data, isLoading } = useFetchAgent(currentIdentifier);
29
-
30
- if (isLoading || !data?.meta) return <Loading />;
31
-
32
- const { config, meta, identifier } = data;
33
- const { systemRole } = config;
34
-
35
- return (
36
- <>
37
- <Banner avatar={meta.avatar} backgroundColor={meta.backgroundColor} mobile={mobile} />
38
- <Header />
39
- <Flexbox align={'center'}>
40
- <TabsNav
41
- activeKey={tab}
42
- items={[
43
- {
44
- key: InfoTabs.prompt,
45
- label: (
46
- <Flexbox align={'center'} gap={8} horizontal>
47
- {t('sidebar.prompt')} <TokenTag systemRole={systemRole} />
48
- </Flexbox>
49
- ),
50
- },
51
- {
52
- key: InfoTabs.comment,
53
- label: t('sidebar.comment'),
54
- },
55
- ]}
56
- onChange={setTab}
57
- style={{ paddingTop: 8 }}
58
- variant={'compact'}
59
- />
60
- </Flexbox>
61
- <Flexbox style={{ padding: 16 }}>
62
- {tab === InfoTabs.prompt && (
63
- <Markdown fullFeaturedCodeBlock variant={'chat'}>
64
- {systemRole}
65
- </Markdown>
66
- )}
67
- {tab === InfoTabs.comment && <Comment identifier={identifier} />}
68
- </Flexbox>
69
- </>
70
- );
71
- });
72
-
73
- export default AgentDetailContent;
@@ -1,46 +0,0 @@
1
- import { Avatar } from '@lobehub/ui';
2
- import { Skeleton } from 'antd';
3
- import { useTheme } from 'antd-style';
4
- import { memo } from 'react';
5
- import { Center, Flexbox } from 'react-layout-kit';
6
-
7
- import AgentCardBanner from '../../features/AgentCard/AgentCardBanner';
8
-
9
- const Banner = memo<{
10
- avatar?: string;
11
- backgroundColor?: string;
12
- loading?: boolean;
13
- mobile?: boolean;
14
- }>(({ avatar, backgroundColor, mobile, loading }) => {
15
- const theme = useTheme();
16
-
17
- return (
18
- <Flexbox align={'center'}>
19
- <AgentCardBanner
20
- avatar={loading ? undefined : avatar}
21
- size={800}
22
- style={{ height: 120, marginBottom: -60 }}
23
- />
24
- <Center
25
- flex={'none'}
26
- height={120}
27
- style={{
28
- backgroundColor:
29
- backgroundColor || mobile ? theme.colorBgElevated : theme.colorBgContainer,
30
- borderRadius: '50%',
31
- overflow: 'hidden',
32
- zIndex: 2,
33
- }}
34
- width={120}
35
- >
36
- {loading ? (
37
- <Skeleton.Avatar active size={100} />
38
- ) : (
39
- <Avatar animation avatar={avatar} shape={'circle'} size={100} />
40
- )}
41
- </Center>
42
- </Flexbox>
43
- );
44
- });
45
-
46
- export default Banner;
@@ -1,16 +0,0 @@
1
- import { Giscus } from '@lobehub/ui';
2
- import { memo } from 'react';
3
-
4
- const Comment = memo<{ identifier: string }>(({ identifier }) => (
5
- <Giscus
6
- category="General"
7
- categoryId="DIC_kwDOKON5YM4CZNRJ"
8
- id="lobehub"
9
- mapping="specific"
10
- repo="lobehub/lobe-chat-agents"
11
- repoId="R_kgDOKON5YA"
12
- term={identifier}
13
- />
14
- ));
15
-
16
- export default Comment;