@lobehub/lobehub 2.0.0-next.283 → 2.0.0-next.285

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 (32) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/changelog/v1.json +21 -0
  3. package/locales/en-US/setting.json +1 -0
  4. package/locales/en-US/subscription.json +2 -0
  5. package/locales/zh-CN/setting.json +1 -0
  6. package/locales/zh-CN/subscription.json +2 -0
  7. package/package.json +1 -1
  8. package/packages/builtin-tool-agent-builder/src/ExecutionRuntime/index.ts +79 -2
  9. package/packages/builtin-tool-agent-builder/src/client/Intervention/InstallPlugin.tsx +66 -5
  10. package/packages/builtin-tool-agent-builder/src/client/Render/InstallPlugin.tsx +12 -4
  11. package/packages/builtin-tool-agent-builder/src/manifest.ts +3 -2
  12. package/packages/builtin-tool-agent-builder/src/systemRole.ts +8 -8
  13. package/packages/builtin-tool-agent-builder/src/types.ts +7 -3
  14. package/packages/context-engine/src/providers/AgentBuilderContextInjector.ts +20 -4
  15. package/packages/context-engine/src/providers/GroupAgentBuilderContextInjector.ts +18 -2
  16. package/packages/model-bank/src/aiModels/lobehub.ts +20 -1
  17. package/packages/model-runtime/src/providers/fal/index.test.ts +176 -1
  18. package/packages/model-runtime/src/providers/fal/index.ts +3 -1
  19. package/src/app/[variants]/(main)/agent/features/Conversation/MainChatInput/MessageFromUrl.tsx +57 -9
  20. package/src/app/[variants]/(main)/agent/profile/features/Header/AgentPublishButton/PublishButton.tsx +5 -8
  21. package/src/app/[variants]/(main)/agent/profile/features/Header/index.tsx +0 -2
  22. package/src/app/[variants]/(main)/agent/profile/features/ProfileEditor/index.tsx +2 -0
  23. package/src/app/[variants]/(main)/group/features/Conversation/MainChatInput/MessageFromUrl.tsx +24 -10
  24. package/src/features/PluginStore/Content.tsx +1 -4
  25. package/src/features/ProfileEditor/AgentTool.tsx +68 -12
  26. package/src/features/ProfileEditor/PluginTag.tsx +56 -3
  27. package/src/layout/GlobalProvider/index.tsx +1 -1
  28. package/src/locales/default/setting.ts +1 -0
  29. package/src/locales/default/subscription.ts +2 -0
  30. package/src/services/chat/index.ts +24 -1
  31. package/src/services/chat/mecha/contextEngineering.ts +28 -2
  32. package/src/store/chat/slices/plugin/actions/pluginTypes.ts +11 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,64 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [Version 2.0.0-next.285](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.284...v2.0.0-next.285)
6
+
7
+ <sup>Released on **2026-01-14**</sup>
8
+
9
+ #### ✨ Features
10
+
11
+ - **misc**: Update the agent profiles tools check & agentbuilder tools & publish to market button.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's improved
19
+
20
+ - **misc**: Update the agent profiles tools check & agentbuilder tools & publish to market button, closes [#11501](https://github.com/lobehub/lobe-chat/issues/11501) ([85277fa](https://github.com/lobehub/lobe-chat/commit/85277fa))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
30
+ ## [Version 2.0.0-next.284](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.283...v2.0.0-next.284)
31
+
32
+ <sup>Released on **2026-01-14**</sup>
33
+
34
+ #### ♻ Code Refactoring
35
+
36
+ - **misc**: Remove the old lobehub plugins.
37
+
38
+ #### 🐛 Bug Fixes
39
+
40
+ - **misc**: Slove the settings/profile change but not refresh the profiles.
41
+
42
+ <br/>
43
+
44
+ <details>
45
+ <summary><kbd>Improvements and Fixes</kbd></summary>
46
+
47
+ #### Code refactoring
48
+
49
+ - **misc**: Remove the old lobehub plugins, closes [#11498](https://github.com/lobehub/lobe-chat/issues/11498) ([e5b47df](https://github.com/lobehub/lobe-chat/commit/e5b47df))
50
+
51
+ #### What's fixed
52
+
53
+ - **misc**: Slove the settings/profile change but not refresh the profiles, closes [#11497](https://github.com/lobehub/lobe-chat/issues/11497) ([f1e2111](https://github.com/lobehub/lobe-chat/commit/f1e2111))
54
+
55
+ </details>
56
+
57
+ <div align="right">
58
+
59
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
60
+
61
+ </div>
62
+
5
63
  ## [Version 2.0.0-next.283](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.282...v2.0.0-next.283)
6
64
 
7
65
  <sup>Released on **2026-01-14**</sup>
package/changelog/v1.json CHANGED
@@ -1,4 +1,25 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "features": [
5
+ "Update the agent profiles tools check & agentbuilder tools & publish to market button."
6
+ ]
7
+ },
8
+ "date": "2026-01-14",
9
+ "version": "2.0.0-next.285"
10
+ },
11
+ {
12
+ "children": {
13
+ "improvements": [
14
+ "Remove the old lobehub plugins."
15
+ ],
16
+ "fixes": [
17
+ "Slove the settings/profile change but not refresh the profiles."
18
+ ]
19
+ },
20
+ "date": "2026-01-14",
21
+ "version": "2.0.0-next.284"
22
+ },
2
23
  {
3
24
  "children": {
4
25
  "improvements": [
@@ -265,6 +265,7 @@
265
265
  "plugin.settings.title": "{{id}} Skill Configuration",
266
266
  "plugin.settings.tooltip": "Skill Configuration",
267
267
  "plugin.store": "Skill Store",
268
+ "publishToCommunity": "Publish to Community",
268
269
  "settingAgent.avatar.sizeExceeded": "Image size exceeds 1MB limit, please choose a smaller image",
269
270
  "settingAgent.avatar.title": "Avatar",
270
271
  "settingAgent.backgroundColor.title": "Background Color",
@@ -57,6 +57,8 @@
57
57
  "funds.packages.noPackages": "No credit packages",
58
58
  "funds.packages.purchaseFirst": "Purchase your first credit package",
59
59
  "funds.packages.purchasedOn": "Purchased on {{date}}",
60
+ "funds.packages.gift": "Gift",
61
+ "funds.packages.giftedOn": "Gifted on {{date}}",
60
62
  "funds.packages.sort.amountAsc": "Amount: Low to High",
61
63
  "funds.packages.sort.amountDesc": "Amount: High to Low",
62
64
  "funds.packages.sort.balanceAsc": "Balance: Low to High",
@@ -265,6 +265,7 @@
265
265
  "plugin.settings.title": "{{id}} 技能配置",
266
266
  "plugin.settings.tooltip": "技能配置",
267
267
  "plugin.store": "技能商店",
268
+ "publishToCommunity": "发布到社区",
268
269
  "settingAgent.avatar.sizeExceeded": "图片大小超过 1MB 限制,请选择更小的图片",
269
270
  "settingAgent.avatar.title": "助理头像",
270
271
  "settingAgent.backgroundColor.title": "头像背景色",
@@ -57,6 +57,8 @@
57
57
  "funds.packages.noPackages": "暂无积分包",
58
58
  "funds.packages.purchaseFirst": "购买您的第一个积分包",
59
59
  "funds.packages.purchasedOn": "购买于 {{date}}",
60
+ "funds.packages.gift": "赠送",
61
+ "funds.packages.giftedOn": "赠送于 {{date}}",
60
62
  "funds.packages.sort.amountAsc": "金额:从低到高",
61
63
  "funds.packages.sort.amountDesc": "金额:从高到低",
62
64
  "funds.packages.sort.balanceAsc": "余额:从低到高",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/lobehub",
3
- "version": "2.0.0-next.283",
3
+ "version": "2.0.0-next.285",
4
4
  "description": "LobeHub - an open-source,comprehensive AI Agent framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
5
5
  "keywords": [
6
6
  "framework",
@@ -1,4 +1,4 @@
1
- import { KLAVIS_SERVER_TYPES } from '@lobechat/const';
1
+ import { KLAVIS_SERVER_TYPES, LOBEHUB_SKILL_PROVIDERS } from '@lobechat/const';
2
2
  import { marketToolsResultsPrompt, modelsResultsPrompt } from '@lobechat/prompts';
3
3
  import { BuiltinServerRuntimeOutput } from '@lobechat/types';
4
4
 
@@ -10,9 +10,11 @@ import { getToolStoreState } from '@/store/tool';
10
10
  import {
11
11
  builtinToolSelectors,
12
12
  klavisStoreSelectors,
13
+ lobehubSkillStoreSelectors,
13
14
  pluginSelectors,
14
15
  } from '@/store/tool/selectors';
15
16
  import { KlavisServerStatus } from '@/store/tool/slices/klavisStore/types';
17
+ import { LobehubSkillStatus } from '@/store/tool/slices/lobehubSkillStore/types';
16
18
  import { getUserStoreState } from '@/store/user';
17
19
  import { userProfileSelectors } from '@/store/user/selectors';
18
20
 
@@ -732,7 +734,82 @@ export class AgentBuilderExecutionRuntime {
732
734
  }
733
735
  }
734
736
 
735
- // Not a Klavis tool, check if it's a builtin tool
737
+ // Check if it's a LobehubSkill provider
738
+ const isLobehubSkillEnabled =
739
+ typeof window !== 'undefined' &&
740
+ window.global_serverConfigStore?.getState()?.serverConfig?.enableLobehubSkill;
741
+
742
+ if (isLobehubSkillEnabled) {
743
+ // Check if this is a LobehubSkill provider
744
+ const lobehubSkillServer = lobehubSkillStoreSelectors
745
+ .getServers(toolState)
746
+ .find((s) => s.identifier === identifier);
747
+
748
+ // Find LobehubSkill provider info from LOBEHUB_SKILL_PROVIDERS
749
+ const lobehubSkillProviderInfo = LOBEHUB_SKILL_PROVIDERS.find((p) => p.id === identifier);
750
+
751
+ if (lobehubSkillProviderInfo) {
752
+ // This is a LobehubSkill provider
753
+ if (lobehubSkillServer) {
754
+ // Server exists
755
+ if (lobehubSkillServer.status === LobehubSkillStatus.CONNECTED) {
756
+ // Already connected, just enable the plugin
757
+ const agentState = getAgentStoreState();
758
+ const currentPlugins =
759
+ agentSelectors.getAgentConfigById(agentId)(agentState).plugins || [];
760
+
761
+ if (!currentPlugins.includes(identifier)) {
762
+ await getAgentStoreState().optimisticUpdateAgentConfig(agentId, {
763
+ plugins: [...currentPlugins, identifier],
764
+ });
765
+ }
766
+
767
+ return {
768
+ content: `Successfully enabled LobehubSkill provider: ${lobehubSkillProviderInfo.label}`,
769
+ state: {
770
+ installed: true,
771
+ isLobehubSkill: true,
772
+ pluginId: identifier,
773
+ pluginName: lobehubSkillProviderInfo.label,
774
+ serverStatus: 'connected',
775
+ success: true,
776
+ } as InstallPluginState,
777
+ success: true,
778
+ };
779
+ } else {
780
+ // Server exists but not connected - need to reconnect
781
+ return {
782
+ content: `LobehubSkill provider "${lobehubSkillProviderInfo.label}" is not connected. Please reconnect it from the tools settings.`,
783
+ state: {
784
+ installed: false,
785
+ isLobehubSkill: true,
786
+ pluginId: identifier,
787
+ pluginName: lobehubSkillProviderInfo.label,
788
+ serverStatus: lobehubSkillServer.status,
789
+ success: false,
790
+ } as InstallPluginState,
791
+ success: false,
792
+ };
793
+ }
794
+ } else {
795
+ // Server doesn't exist - need to connect first
796
+ return {
797
+ content: `LobehubSkill provider "${lobehubSkillProviderInfo.label}" is not connected. Please connect it from the tools settings first.`,
798
+ state: {
799
+ installed: false,
800
+ isLobehubSkill: true,
801
+ pluginId: identifier,
802
+ pluginName: lobehubSkillProviderInfo.label,
803
+ serverStatus: 'not_connected',
804
+ success: false,
805
+ } as InstallPluginState,
806
+ success: false,
807
+ };
808
+ }
809
+ }
810
+ }
811
+
812
+ // Not a Klavis or LobehubSkill tool, check if it's a builtin tool
736
813
  const builtinTools = builtinToolSelectors.metaList(toolState);
737
814
  const builtinTool = builtinTools.find((t) => t.identifier === identifier);
738
815
 
@@ -1,16 +1,21 @@
1
1
  'use client';
2
2
 
3
- import { KLAVIS_SERVER_TYPES } from '@lobechat/const';
3
+ import { KLAVIS_SERVER_TYPES, LOBEHUB_SKILL_PROVIDERS } from '@lobechat/const';
4
4
  import { BuiltinInterventionProps } from '@lobechat/types';
5
- import { Avatar , Flexbox } from '@lobehub/ui';
5
+ import { Avatar, Flexbox } from '@lobehub/ui';
6
6
  import { CheckCircle } from 'lucide-react';
7
7
  import Image from 'next/image';
8
8
  import { memo } from 'react';
9
9
  import { useTranslation } from 'react-i18next';
10
10
 
11
11
  import { useToolStore } from '@/store/tool';
12
- import { klavisStoreSelectors, pluginSelectors } from '@/store/tool/selectors';
12
+ import {
13
+ klavisStoreSelectors,
14
+ lobehubSkillStoreSelectors,
15
+ pluginSelectors,
16
+ } from '@/store/tool/selectors';
13
17
  import { KlavisServerStatus } from '@/store/tool/slices/klavisStore/types';
18
+ import { LobehubSkillStatus } from '@/store/tool/slices/lobehubSkillStore/types';
14
19
 
15
20
  import type { InstallPluginParams } from '../../types';
16
21
 
@@ -34,10 +39,19 @@ const InstallPluginIntervention = memo<BuiltinInterventionProps<InstallPluginPar
34
39
  klavisStoreSelectors.getServers(s).find((srv) => srv.identifier === identifier),
35
40
  );
36
41
 
42
+ // Get LobehubSkill server state
43
+ const lobehubSkillServer = useToolStore((s) =>
44
+ lobehubSkillStoreSelectors.getServers(s).find((srv) => srv.identifier === identifier),
45
+ );
46
+
37
47
  // Check if it's a Klavis tool
38
48
  const klavisTypeInfo = KLAVIS_SERVER_TYPES.find((t) => t.identifier === identifier);
39
49
  const isKlavis = source === 'official' && !!klavisTypeInfo;
40
50
 
51
+ // Check if it's a LobehubSkill provider
52
+ const lobehubSkillProviderInfo = LOBEHUB_SKILL_PROVIDERS.find((p) => p.id === identifier);
53
+ const isLobehubSkill = source === 'official' && !!lobehubSkillProviderInfo;
54
+
41
55
  // Render success state (already installed)
42
56
  if (isPluginInstalled) {
43
57
  return (
@@ -54,12 +68,12 @@ const InstallPluginIntervention = memo<BuiltinInterventionProps<InstallPluginPar
54
68
  <CheckCircle size={20} style={{ color: 'var(--lobe-success-6)' }} />
55
69
  <Flexbox gap={4}>
56
70
  <span style={{ fontWeight: 600 }}>
57
- {isKlavis
71
+ {isKlavis || isLobehubSkill
58
72
  ? t('agentBuilder.installPlugin.connectedAndEnabled')
59
73
  : t('agentBuilder.installPlugin.installedAndEnabled')}
60
74
  </span>
61
75
  <span style={{ color: 'var(--lobe-text-secondary)', fontSize: 12 }}>
62
- {klavisTypeInfo?.label || identifier}
76
+ {klavisTypeInfo?.label || lobehubSkillProviderInfo?.label || identifier}
63
77
  </span>
64
78
  </Flexbox>
65
79
  </Flexbox>
@@ -105,6 +119,53 @@ const InstallPluginIntervention = memo<BuiltinInterventionProps<InstallPluginPar
105
119
  );
106
120
  }
107
121
 
122
+ // Render LobehubSkill provider
123
+ if (isLobehubSkill) {
124
+ const icon =
125
+ typeof lobehubSkillProviderInfo?.icon === 'string'
126
+ ? lobehubSkillProviderInfo.icon
127
+ : undefined;
128
+ const isNotConnected =
129
+ !lobehubSkillServer || lobehubSkillServer.status !== LobehubSkillStatus.CONNECTED;
130
+
131
+ return (
132
+ <Flexbox
133
+ gap={12}
134
+ style={{ background: 'var(--lobe-fill-tertiary)', borderRadius: 8, padding: 16 }}
135
+ >
136
+ <Flexbox align="center" gap={12} horizontal>
137
+ {icon ? (
138
+ <Image
139
+ alt={lobehubSkillProviderInfo?.label || identifier}
140
+ height={40}
141
+ src={icon}
142
+ style={{ borderRadius: 8 }}
143
+ unoptimized
144
+ width={40}
145
+ />
146
+ ) : (
147
+ <Avatar avatar="🔗" size={40} style={{ borderRadius: 8 }} />
148
+ )}
149
+ <Flexbox flex={1} gap={4}>
150
+ <Flexbox align="center" gap={8} horizontal>
151
+ <span style={{ fontWeight: 600 }}>
152
+ {lobehubSkillProviderInfo?.label || identifier}
153
+ </span>
154
+ <span style={{ color: 'var(--lobe-text-tertiary)', fontSize: 12 }}>
155
+ LobeHub Skill
156
+ </span>
157
+ </Flexbox>
158
+ <span style={{ color: 'var(--lobe-text-secondary)', fontSize: 12 }}>
159
+ {isNotConnected
160
+ ? t('agentBuilder.installPlugin.requiresAuth')
161
+ : t('agentBuilder.installPlugin.clickApproveToConnect')}
162
+ </span>
163
+ </Flexbox>
164
+ </Flexbox>
165
+ </Flexbox>
166
+ );
167
+ }
168
+
108
169
  // Render MCP marketplace plugin
109
170
  // Note: The actual installation happens in ExecutionRuntime after user approves
110
171
  return (
@@ -9,8 +9,16 @@ import type { InstallPluginParams, InstallPluginState } from '../../types';
9
9
 
10
10
  const InstallPlugin = memo<BuiltinRenderProps<InstallPluginParams, InstallPluginState>>(
11
11
  ({ pluginState }) => {
12
- const { pluginId, pluginName, installed, awaitingApproval, isKlavis, serverStatus, error } =
13
- pluginState || {};
12
+ const {
13
+ pluginId,
14
+ pluginName,
15
+ installed,
16
+ awaitingApproval,
17
+ isKlavis,
18
+ isLobehubSkill,
19
+ serverStatus,
20
+ error,
21
+ } = pluginState || {};
14
22
 
15
23
  if (!pluginId) return null;
16
24
 
@@ -43,7 +51,7 @@ const InstallPlugin = memo<BuiltinRenderProps<InstallPluginParams, InstallPlugin
43
51
  <Flexbox align={'center'} gap={8} horizontal style={{ fontSize: 13 }}>
44
52
  <Clock size={14} style={{ color: 'var(--lobe-warning-6)' }} />
45
53
  <span style={{ fontWeight: 500 }}>
46
- {isKlavis ? (
54
+ {isKlavis || isLobehubSkill ? (
47
55
  <>
48
56
  Waiting for authorization:{' '}
49
57
  <code
@@ -90,7 +98,7 @@ const InstallPlugin = memo<BuiltinRenderProps<InstallPluginParams, InstallPlugin
90
98
  <Flexbox align={'center'} gap={8} horizontal style={{ fontSize: 13 }}>
91
99
  <CheckCircle size={14} style={{ color: 'var(--lobe-success-6)' }} />
92
100
  <span style={{ fontWeight: 500 }}>
93
- {isKlavis ? 'Connected and enabled' : 'Installed and enabled'}:{' '}
101
+ {isKlavis || isLobehubSkill ? 'Connected and enabled' : 'Installed and enabled'}:{' '}
94
102
  <code
95
103
  style={{
96
104
  background: 'var(--lobe-fill-tertiary)',
@@ -27,6 +27,7 @@ export const AgentBuilderManifest: BuiltinToolManifest = {
27
27
  {
28
28
  description:
29
29
  'Search for tools (MCP plugins) in the marketplace. Users can browse and install tools directly from the search results. Use this when users want to find new tools or capabilities.',
30
+ humanIntervention: 'always',
30
31
  name: AgentBuilderApiName.searchMarketTools,
31
32
  parameters: {
32
33
  properties: {
@@ -55,7 +56,7 @@ export const AgentBuilderManifest: BuiltinToolManifest = {
55
56
  // ==================== Write Operations ====================
56
57
  {
57
58
  description:
58
- 'Install a plugin for the agent. This tool ALWAYS REQUIRES user approval before installation, even in auto-run mode. For MCP marketplace plugins, it will install and enable the plugin. For Klavis tools that need OAuth, it will initiate the connection flow and wait for user to complete authorization.',
59
+ 'Install a plugin for the agent. This tool ALWAYS REQUIRES user approval before installation, even in auto-run mode. For MCP marketplace plugins, it will install and enable the plugin. For Klavis tools and LobehubSkill providers that need OAuth, it will initiate the connection flow and wait for user to complete authorization.',
59
60
  humanIntervention: 'always',
60
61
  name: AgentBuilderApiName.installPlugin,
61
62
  parameters: {
@@ -67,7 +68,7 @@ export const AgentBuilderManifest: BuiltinToolManifest = {
67
68
  },
68
69
  source: {
69
70
  description:
70
- 'Plugin source type: "market" for MCP marketplace plugins, "official" for builtin/Klavis tools',
71
+ 'Plugin source type: "market" for MCP marketplace plugins, "official" for builtin/Klavis/LobehubSkill tools',
71
72
  enum: ['market', 'official'],
72
73
  type: 'string',
73
74
  },
@@ -12,7 +12,7 @@ export const systemPrompt = `You are an Agent Configuration Assistant integrated
12
12
  The injected context includes:
13
13
  - **agent_meta**: title, description, avatar, backgroundColor, tags
14
14
  - **agent_config**: model, provider, plugins, systemRole (preview), and other advanced settings
15
- - **official_tools**: List of available official tools including built-in tools and LobeHub integrations (Gmail, Google Calendar, Notion, GitHub, etc.) with their enabled/installed status
15
+ - **official_tools**: List of available official tools including built-in tools, Klavis MCP servers, and LobehubSkill providers (Linear, Outlook Calendar, Twitter, etc.) with their enabled/installed status
16
16
 
17
17
  You should use this context to understand the current state of the agent and available tools before making any modifications.
18
18
  </context_awareness>
@@ -24,7 +24,7 @@ You have access to tools that can modify agent configurations:
24
24
  - **getAvailableModels**: Get all available AI models and providers that can be used. Optionally filter by provider ID.
25
25
  - **searchMarketTools**: Search for tools (MCP plugins) in the marketplace. Shows results with install buttons for users to install directly.
26
26
 
27
- Note: Official tools (built-in tools and LobeHub Mcp integrations) are automatically available in the \`<current_agent_context>\` - no need to search for them.
27
+ Note: Official tools (built-in tools, Klavis MCP servers, and LobehubSkill providers) are automatically available in the \`<current_agent_context>\` - no need to search for them.
28
28
 
29
29
  **Write Operations:**
30
30
  - **updateConfig**: Update agent configuration fields (model, provider, plugins, and advanced settings). Use this for all config changes.
@@ -180,16 +180,16 @@ User: "What tools are available in the marketplace?"
180
180
  Action: Use searchMarketTools without query to browse all available tools. Display the list with descriptions and install options.
181
181
 
182
182
  User: "帮我找一下有什么插件可以用"
183
- Action: Reference the \`<official_tools>\` from the injected context to show available built-in tools and LobeHub integrations. This allows the user to enable tools directly or connect to services like Gmail, Google Calendar, etc.
183
+ Action: Reference the \`<official_tools>\` from the injected context to show available built-in tools, Klavis MCP servers, and LobehubSkill providers. This allows the user to enable tools directly or connect to services.
184
184
 
185
- User: "I want to connect my Gmail"
186
- Action: Check the \`<official_tools>\` in the context for Gmail LobeHub integration. If found, use installPlugin with source "official" to connect it.
185
+ User: "I want to connect my Linear"
186
+ Action: Check the \`<official_tools>\` in the context for Linear LobehubSkill provider. If found, use installPlugin with source "official" to connect it.
187
187
 
188
- User: "帮我安装 GitHub 插件"
189
- Action: Check the \`<official_tools>\` in the context for GitHub integration. If found, use installPlugin with source "official" to install it.
188
+ User: "帮我连接 Twitter"
189
+ Action: Check the \`<official_tools>\` in the context for Twitter (X) LobehubSkill provider. If found, use installPlugin with source "official" to connect it.
190
190
 
191
191
  User: "What official integrations are available?"
192
- Action: Reference the \`<official_tools>\` from the injected context to list all available LobeHub integrations like Gmail, Google Calendar, Notion, Slack, GitHub, etc.
192
+ Action: Reference the \`<official_tools>\` from the injected context to list all available integrations including built-in tools, Klavis MCP servers, and LobehubSkill providers (Linear, Outlook Calendar, Twitter, etc.).
193
193
 
194
194
  User: "帮我设置开场白" / "Set an opening message for this agent"
195
195
  Action: Use updateConfig with { config: { openingMessage: "Hello! I'm your AI assistant. How can I help you today?" } }
@@ -164,7 +164,7 @@ export interface InstallPluginParams {
164
164
  */
165
165
  identifier: string;
166
166
  /**
167
- * Plugin source type: 'market' for MCP marketplace, 'official' for builtin/klavis tools
167
+ * Plugin source type: 'market' for MCP marketplace, 'official' for builtin/klavis/lobehubSkill tools
168
168
  */
169
169
  source: 'market' | 'official';
170
170
  }
@@ -187,6 +187,10 @@ export interface InstallPluginState {
187
187
  * Whether the plugin is a Klavis tool that needs OAuth connection
188
188
  */
189
189
  isKlavis?: boolean;
190
+ /**
191
+ * Whether the plugin is a LobehubSkill provider that needs OAuth connection
192
+ */
193
+ isLobehubSkill?: boolean;
190
194
  /**
191
195
  * Klavis OAuth URL if authorization is needed
192
196
  */
@@ -204,9 +208,9 @@ export interface InstallPluginState {
204
208
  */
205
209
  serverName?: string;
206
210
  /**
207
- * Klavis server status
211
+ * Server status (for Klavis tools and LobehubSkill providers)
208
212
  */
209
- serverStatus?: 'connected' | 'pending_auth' | 'error';
213
+ serverStatus?: 'connected' | 'pending_auth' | 'error' | 'not_connected';
210
214
  /**
211
215
  * Whether the operation was successful
212
216
  */
@@ -31,8 +31,8 @@ export interface OfficialToolItem {
31
31
  installed?: boolean;
32
32
  /** Tool display name */
33
33
  name: string;
34
- /** Tool type: 'builtin' for built-in tools, 'klavis' for LobeHub Mcp servers */
35
- type: 'builtin' | 'klavis';
34
+ /** Tool type: 'builtin' for built-in tools, 'klavis' for LobeHub Mcp servers, 'lobehub-skill' for LobeHub Skill providers */
35
+ type: 'builtin' | 'klavis' | 'lobehub-skill';
36
36
  }
37
37
 
38
38
  /**
@@ -58,7 +58,7 @@ export interface AgentBuilderContext {
58
58
  tags?: string[];
59
59
  title?: string;
60
60
  };
61
- /** Available official tools (builtin tools and Klavis integrations) */
61
+ /** Available official tools (builtin tools, Klavis integrations, and LobehubSkill providers) */
62
62
  officialTools?: OfficialToolItem[];
63
63
  }
64
64
 
@@ -136,6 +136,7 @@ const defaultFormatAgentContext = (context: AgentBuilderContext): string => {
136
136
  if (context.officialTools && context.officialTools.length > 0) {
137
137
  const builtinTools = context.officialTools.filter((t) => t.type === 'builtin');
138
138
  const klavisTools = context.officialTools.filter((t) => t.type === 'klavis');
139
+ const lobehubSkillTools = context.officialTools.filter((t) => t.type === 'lobehub-skill');
139
140
 
140
141
  const toolsSections: string[] = [];
141
142
 
@@ -167,6 +168,21 @@ const defaultFormatAgentContext = (context: AgentBuilderContext): string => {
167
168
  toolsSections.push(` <klavis_tools>\n${klavisItems}\n </klavis_tools>`);
168
169
  }
169
170
 
171
+ if (lobehubSkillTools.length > 0) {
172
+ const lobehubSkillItems = lobehubSkillTools
173
+ .map((t) => {
174
+ const attrs = [
175
+ `id="${t.identifier}"`,
176
+ `installed="${t.installed ? 'true' : 'false'}"`,
177
+ `enabled="${t.enabled ? 'true' : 'false'}"`,
178
+ ].join(' ');
179
+ const desc = t.description ? ` - ${escapeXml(t.description)}` : '';
180
+ return ` <tool ${attrs}>${escapeXml(t.name)}${desc}</tool>`;
181
+ })
182
+ .join('\n');
183
+ toolsSections.push(` <lobehub_skill_tools>\n${lobehubSkillItems}\n </lobehub_skill_tools>`);
184
+ }
185
+
170
186
  if (toolsSections.length > 0) {
171
187
  parts.push(
172
188
  `<available_official_tools>\n${toolsSections.join('\n')}\n</available_official_tools>`,
@@ -179,7 +195,7 @@ const defaultFormatAgentContext = (context: AgentBuilderContext): string => {
179
195
  }
180
196
 
181
197
  return `<current_agent_context>
182
- <instruction>This is the current agent's configuration context. Use this information when the user asks about or wants to modify agent settings. Use togglePlugin to enable/disable tools, or installPlugin to install new tools.</instruction>
198
+ <instruction>This is the current agent's configuration context. Use this information when the user asks about or wants to modify agent settings. Use togglePlugin to enable/disable tools, or installPlugin to install new tools (including builtin tools, Klavis servers, and LobehubSkill providers).</instruction>
183
199
  ${parts.join('\n')}
184
200
  </current_agent_context>`;
185
201
  };
@@ -47,8 +47,8 @@ export interface GroupOfficialToolItem {
47
47
  installed?: boolean;
48
48
  /** Tool display name */
49
49
  name: string;
50
- /** Tool type: 'builtin' for built-in tools, 'klavis' for LobeHub Mcp servers */
51
- type: 'builtin' | 'klavis';
50
+ /** Tool type: 'builtin' for built-in tools, 'klavis' for LobeHub Mcp servers, 'lobehub-skill' for LobeHub Skill providers */
51
+ type: 'builtin' | 'klavis' | 'lobehub-skill';
52
52
  }
53
53
 
54
54
  /**
@@ -195,6 +195,7 @@ const defaultFormatGroupContext = (context: GroupAgentBuilderContext): string =>
195
195
  if (context.officialTools && context.officialTools.length > 0) {
196
196
  const builtinTools = context.officialTools.filter((t) => t.type === 'builtin');
197
197
  const klavisTools = context.officialTools.filter((t) => t.type === 'klavis');
198
+ const lobehubSkillTools = context.officialTools.filter((t) => t.type === 'lobehub-skill');
198
199
 
199
200
  const toolsSections: string[] = [];
200
201
 
@@ -226,6 +227,21 @@ const defaultFormatGroupContext = (context: GroupAgentBuilderContext): string =>
226
227
  toolsSections.push(` <klavis_tools>\n${klavisItems}\n </klavis_tools>`);
227
228
  }
228
229
 
230
+ if (lobehubSkillTools.length > 0) {
231
+ const lobehubSkillItems = lobehubSkillTools
232
+ .map((t) => {
233
+ const attrs = [
234
+ `id="${t.identifier}"`,
235
+ `installed="${t.installed ? 'true' : 'false'}"`,
236
+ `enabled="${t.enabled ? 'true' : 'false'}"`,
237
+ ].join(' ');
238
+ const desc = t.description ? ` - ${escapeXml(t.description)}` : '';
239
+ return ` <tool ${attrs}>${escapeXml(t.name)}${desc}</tool>`;
240
+ })
241
+ .join('\n');
242
+ toolsSections.push(` <lobehub_skill_tools>\n${lobehubSkillItems}\n </lobehub_skill_tools>`);
243
+ }
244
+
229
245
  if (toolsSections.length > 0) {
230
246
  parts.push(
231
247
  `<available_official_tools>\n${toolsSections.join('\n')}\n</available_official_tools>`,
@@ -1226,11 +1226,30 @@ const lobehubImageModels: AIImageModelCard[] = [
1226
1226
  },
1227
1227
  type: 'image',
1228
1228
  },
1229
+ {
1230
+ description:
1231
+ 'Seedream 4.5, built by ByteDance Seed team, supports multi-image editing and composition. Features enhanced subject consistency, precise instruction following, spatial logic understanding, aesthetic expression, poster layout and logo design with high-precision text-image rendering.',
1232
+ displayName: 'Seedream 4.5',
1233
+ enabled: true,
1234
+ id: 'fal-ai/bytedance/seedream/v4.5',
1235
+ parameters: {
1236
+ height: { default: 2048, max: 4096, min: 1920, step: 1 },
1237
+ imageUrls: { default: [], maxCount: 10, maxFileSize: 10 * 1024 * 1024 },
1238
+ prompt: { default: '' },
1239
+ seed: { default: null },
1240
+ width: { default: 2048, max: 4096, min: 1920, step: 1 },
1241
+ },
1242
+ pricing: {
1243
+ units: [{ name: 'imageGeneration', rate: 0.04, strategy: 'fixed', unit: 'image' }],
1244
+ },
1245
+ releasedAt: '2025-12-04',
1246
+ type: 'image',
1247
+ },
1229
1248
  {
1230
1249
  description:
1231
1250
  'Seedream 4.0, built by ByteDance Seed, supports text and image inputs for highly controllable, high-quality image generation from prompts.',
1232
1251
  displayName: 'Seedream 4.0',
1233
- enabled: true,
1252
+ enabled: false,
1234
1253
  id: 'fal-ai/bytedance/seedream/v4',
1235
1254
  parameters: {
1236
1255
  height: { default: 1024, max: 4096, min: 1024, step: 1 },