@lobehub/lobehub 2.0.0-next.296 → 2.0.0-next.297
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/changelog/v1.json +9 -0
- package/package.json +2 -2
- package/packages/types/package.json +1 -1
- package/packages/types/src/discover/assistants.ts +4 -0
- package/packages/types/src/discover/groupAgents.ts +196 -0
- package/packages/types/src/discover/index.ts +5 -1
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/DetailProvider.tsx +19 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Members/index.tsx +137 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Nav.tsx +88 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Overview/index.tsx +213 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Related/index.tsx +85 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/SystemRole/TagList.tsx +20 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/SystemRole/index.tsx +71 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Versions/index.tsx +119 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/index.tsx +51 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Header.tsx +253 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/AddGroupAgent.tsx +222 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/ActionButton/index.tsx +34 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/Summary/index.tsx +42 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Sidebar/index.tsx +41 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/features/StatusPage/index.tsx +104 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/index.tsx +103 -0
- package/src/app/[variants]/(main)/community/(detail)/group_agent/loading.tsx +1 -0
- package/src/app/[variants]/(main)/community/(detail)/user/features/DetailProvider.tsx +7 -1
- package/src/app/[variants]/(main)/community/(detail)/user/features/UserContent.tsx +2 -0
- package/src/app/[variants]/(main)/community/(detail)/user/features/UserGroupCard.tsx +186 -0
- package/src/app/[variants]/(main)/community/(detail)/user/features/UserGroupList.tsx +59 -0
- package/src/app/[variants]/(main)/community/(detail)/user/index.tsx +3 -1
- package/src/app/[variants]/(main)/community/(list)/assistant/features/List/Item.tsx +26 -8
- package/src/app/[variants]/(main)/community/(list)/assistant/index.tsx +1 -0
- package/src/app/[variants]/(main)/group/profile/features/GroupProfile/index.tsx +2 -0
- package/src/app/[variants]/(main)/group/profile/features/Header/AgentPublishButton/PublishResultModal.tsx +2 -1
- package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/GroupForkConfirmModal.tsx +60 -0
- package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/GroupPublishResultModal.tsx +62 -0
- package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/PublishButton.tsx +122 -0
- package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/index.tsx +46 -0
- package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/types.ts +12 -0
- package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/useMarketGroupPublish.ts +211 -0
- package/src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/utils.ts +22 -0
- package/src/app/[variants]/router/desktopRouter.config.tsx +7 -0
- package/src/locales/default/setting.ts +12 -0
- package/src/server/routers/lambda/market/agentGroup.ts +296 -0
- package/src/server/routers/lambda/market/index.ts +134 -4
- package/src/server/services/discover/index.ts +123 -7
- package/src/services/discover.ts +55 -0
- package/src/store/discover/slices/groupAgent/action.ts +80 -0
- package/src/store/discover/store.ts +3 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
## [Version 2.0.0-next.297](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.296...v2.0.0-next.297)
|
|
6
|
+
|
|
7
|
+
<sup>Released on **2026-01-16**</sup>
|
|
8
|
+
|
|
9
|
+
#### ✨ Features
|
|
10
|
+
|
|
11
|
+
- **misc**: Add agent group publish into market & use market group agents in lobehub.
|
|
12
|
+
|
|
13
|
+
<br/>
|
|
14
|
+
|
|
15
|
+
<details>
|
|
16
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
17
|
+
|
|
18
|
+
#### What's improved
|
|
19
|
+
|
|
20
|
+
- **misc**: Add agent group publish into market & use market group agents in lobehub, closes [#11535](https://github.com/lobehub/lobe-chat/issues/11535) ([02b9e76](https://github.com/lobehub/lobe-chat/commit/02b9e76))
|
|
21
|
+
|
|
22
|
+
</details>
|
|
23
|
+
|
|
24
|
+
<div align="right">
|
|
25
|
+
|
|
26
|
+
[](#readme-top)
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
5
30
|
## [Version 2.0.0-next.296](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.295...v2.0.0-next.296)
|
|
6
31
|
|
|
7
32
|
<sup>Released on **2026-01-16**</sup>
|
package/changelog/v1.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/lobehub",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.297",
|
|
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",
|
|
@@ -204,7 +204,7 @@
|
|
|
204
204
|
"@lobehub/desktop-ipc-typings": "workspace:*",
|
|
205
205
|
"@lobehub/editor": "^3.11.0",
|
|
206
206
|
"@lobehub/icons": "^4.0.2",
|
|
207
|
-
"@lobehub/market-sdk": "0.
|
|
207
|
+
"@lobehub/market-sdk": "0.29.0",
|
|
208
208
|
"@lobehub/tts": "^4.0.2",
|
|
209
209
|
"@lobehub/ui": "^4.19.0",
|
|
210
210
|
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"@lobechat/python-interpreter": "workspace:*",
|
|
9
9
|
"@lobechat/web-crawler": "workspace:*",
|
|
10
10
|
"@lobehub/chat-plugin-sdk": "^1.32.4",
|
|
11
|
-
"@lobehub/market-sdk": "0.
|
|
11
|
+
"@lobehub/market-sdk": "0.29.0",
|
|
12
12
|
"@lobehub/market-types": "^1.12.3",
|
|
13
13
|
"model-bank": "workspace:*",
|
|
14
14
|
"type-fest": "^4.41.0",
|
|
@@ -42,6 +42,8 @@ export enum AssistantNavKey {
|
|
|
42
42
|
|
|
43
43
|
export type AgentStatus = 'published' | 'unpublished' | 'archived' | 'deprecated';
|
|
44
44
|
|
|
45
|
+
export type AgentType = 'agent' | 'agent-group';
|
|
46
|
+
|
|
45
47
|
export interface DiscoverAssistantItem extends Omit<LobeAgentSettings, 'meta'>, MetaData {
|
|
46
48
|
author: string;
|
|
47
49
|
category?: AssistantCategory;
|
|
@@ -53,6 +55,7 @@ export interface DiscoverAssistantItem extends Omit<LobeAgentSettings, 'meta'>,
|
|
|
53
55
|
pluginCount: number;
|
|
54
56
|
status?: AgentStatus;
|
|
55
57
|
tokenUsage: number;
|
|
58
|
+
type?: AgentType;
|
|
56
59
|
userName?: string;
|
|
57
60
|
}
|
|
58
61
|
|
|
@@ -60,6 +63,7 @@ export type AssistantMarketSource = 'legacy' | 'new';
|
|
|
60
63
|
|
|
61
64
|
export interface AssistantQueryParams {
|
|
62
65
|
category?: string;
|
|
66
|
+
includeAgentGroup?: boolean;
|
|
63
67
|
locale?: string;
|
|
64
68
|
order?: 'asc' | 'desc';
|
|
65
69
|
ownerId?: string;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { MetaData } from '../meta';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Group Agent Member - represents a member agent in a group
|
|
5
|
+
*/
|
|
6
|
+
export interface GroupAgentMember {
|
|
7
|
+
avatar?: string;
|
|
8
|
+
category?: string;
|
|
9
|
+
config?: Record<string, any>;
|
|
10
|
+
description: string;
|
|
11
|
+
displayOrder?: number;
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
identifier: string;
|
|
14
|
+
name: string;
|
|
15
|
+
role: 'supervisor' | 'participant';
|
|
16
|
+
url: string;
|
|
17
|
+
version?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Group Agent Status
|
|
22
|
+
*/
|
|
23
|
+
export type GroupAgentStatus = 'published' | 'unpublished' | 'archived' | 'deprecated';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Group Agent Visibility
|
|
27
|
+
*/
|
|
28
|
+
export type GroupAgentVisibility = 'public' | 'private' | 'internal';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Group Agent Category
|
|
32
|
+
*/
|
|
33
|
+
export type GroupAgentCategory =
|
|
34
|
+
| 'productivity'
|
|
35
|
+
| 'entertainment'
|
|
36
|
+
| 'education'
|
|
37
|
+
| 'development'
|
|
38
|
+
| 'business'
|
|
39
|
+
| 'other';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Group Agent Config - similar to LobeAgentConfig but for groups
|
|
43
|
+
*/
|
|
44
|
+
export interface GroupAgentConfig {
|
|
45
|
+
/**
|
|
46
|
+
* Opening message when starting a conversation with the group
|
|
47
|
+
*/
|
|
48
|
+
openingMessage?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Opening questions to guide users
|
|
51
|
+
*/
|
|
52
|
+
openingQuestions?: string[];
|
|
53
|
+
/**
|
|
54
|
+
* System role/prompt for the group
|
|
55
|
+
*/
|
|
56
|
+
systemRole?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Additional configuration
|
|
59
|
+
*/
|
|
60
|
+
[key: string]: any;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Group Agent Item - basic info for list display
|
|
65
|
+
*/
|
|
66
|
+
export interface DiscoverGroupAgentItem extends MetaData {
|
|
67
|
+
author?: string;
|
|
68
|
+
avatar?: string;
|
|
69
|
+
backgroundColor?: string;
|
|
70
|
+
category?: GroupAgentCategory;
|
|
71
|
+
config?: GroupAgentConfig;
|
|
72
|
+
createdAt: string;
|
|
73
|
+
description?: string;
|
|
74
|
+
homepage?: string;
|
|
75
|
+
identifier: string;
|
|
76
|
+
installCount?: number;
|
|
77
|
+
isFeatured?: boolean;
|
|
78
|
+
isOfficial?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Number of knowledge bases across all member agents
|
|
81
|
+
*/
|
|
82
|
+
knowledgeCount?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Number of member agents in the group
|
|
85
|
+
*/
|
|
86
|
+
memberCount: number;
|
|
87
|
+
/**
|
|
88
|
+
* Number of plugins across all member agents
|
|
89
|
+
*/
|
|
90
|
+
pluginCount?: number;
|
|
91
|
+
status?: GroupAgentStatus;
|
|
92
|
+
tags?: string[];
|
|
93
|
+
title: string;
|
|
94
|
+
/**
|
|
95
|
+
* Estimated token usage for the group
|
|
96
|
+
*/
|
|
97
|
+
tokenUsage?: number;
|
|
98
|
+
updatedAt: string;
|
|
99
|
+
userName?: string;
|
|
100
|
+
version?: string;
|
|
101
|
+
versionNumber?: number;
|
|
102
|
+
visibility?: GroupAgentVisibility;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Group Agent Version
|
|
107
|
+
*/
|
|
108
|
+
export interface DiscoverGroupAgentVersion {
|
|
109
|
+
changelog?: string;
|
|
110
|
+
createdAt?: string;
|
|
111
|
+
isLatest?: boolean;
|
|
112
|
+
isValidated?: boolean;
|
|
113
|
+
status?: GroupAgentStatus;
|
|
114
|
+
version: string;
|
|
115
|
+
versionNumber: number;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Group Agent Detail - complete info for detail page
|
|
120
|
+
*/
|
|
121
|
+
export interface DiscoverGroupAgentDetail extends DiscoverGroupAgentItem {
|
|
122
|
+
/**
|
|
123
|
+
* Current version string
|
|
124
|
+
*/
|
|
125
|
+
currentVersion?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Current version number
|
|
128
|
+
*/
|
|
129
|
+
currentVersionNumber?: number;
|
|
130
|
+
/**
|
|
131
|
+
* Example conversations (if available from config)
|
|
132
|
+
*/
|
|
133
|
+
examples?: any;
|
|
134
|
+
/**
|
|
135
|
+
* Member agents in the group
|
|
136
|
+
*/
|
|
137
|
+
memberAgents: GroupAgentMember[];
|
|
138
|
+
/**
|
|
139
|
+
* Owner ID
|
|
140
|
+
*/
|
|
141
|
+
ownerId?: string;
|
|
142
|
+
/**
|
|
143
|
+
* Related group agents
|
|
144
|
+
*/
|
|
145
|
+
related?: DiscoverGroupAgentItem[];
|
|
146
|
+
/**
|
|
147
|
+
* Summary text (extracted from description or config)
|
|
148
|
+
*/
|
|
149
|
+
summary?: string;
|
|
150
|
+
/**
|
|
151
|
+
* Version history
|
|
152
|
+
*/
|
|
153
|
+
versions?: DiscoverGroupAgentVersion[];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Group Agent List Response
|
|
158
|
+
*/
|
|
159
|
+
export interface GroupAgentListResponse {
|
|
160
|
+
currentPage: number;
|
|
161
|
+
items: DiscoverGroupAgentItem[];
|
|
162
|
+
totalCount: number;
|
|
163
|
+
totalPages: number;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Group Agent Query Parameters
|
|
168
|
+
*/
|
|
169
|
+
export interface GroupAgentQueryParams {
|
|
170
|
+
category?: string;
|
|
171
|
+
locale?: string;
|
|
172
|
+
order?: 'asc' | 'desc';
|
|
173
|
+
ownerId?: string;
|
|
174
|
+
page?: number;
|
|
175
|
+
pageSize?: number;
|
|
176
|
+
q?: string;
|
|
177
|
+
sort?: 'createdAt' | 'updatedAt' | 'name' | 'recommended';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Group Agent Detail Query Parameters
|
|
182
|
+
*/
|
|
183
|
+
export interface GroupAgentDetailParams {
|
|
184
|
+
identifier: string;
|
|
185
|
+
locale?: string;
|
|
186
|
+
version?: string;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Group Agent Category Item
|
|
191
|
+
*/
|
|
192
|
+
export interface GroupAgentCategoryItem {
|
|
193
|
+
category: GroupAgentCategory;
|
|
194
|
+
count: number;
|
|
195
|
+
name: string;
|
|
196
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DiscoverAssistantItem } from './assistants';
|
|
2
|
+
import { DiscoverGroupAgentItem } from './groupAgents';
|
|
2
3
|
|
|
3
4
|
export * from './assistants';
|
|
5
|
+
export * from './groupAgents';
|
|
4
6
|
export * from './mcp';
|
|
5
7
|
export * from './models';
|
|
6
8
|
export * from './plugins';
|
|
@@ -8,6 +10,7 @@ export * from './providers';
|
|
|
8
10
|
|
|
9
11
|
export enum DiscoverTab {
|
|
10
12
|
Assistants = 'assistant',
|
|
13
|
+
GroupAgents = 'group_agent',
|
|
11
14
|
Home = 'home',
|
|
12
15
|
Mcp = 'mcp',
|
|
13
16
|
Models = 'model',
|
|
@@ -58,9 +61,10 @@ export interface DiscoverUserInfo {
|
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
/**
|
|
61
|
-
* User profile with their published agents
|
|
64
|
+
* User profile with their published agents and groups
|
|
62
65
|
*/
|
|
63
66
|
export interface DiscoverUserProfile {
|
|
67
|
+
agentGroups?: DiscoverGroupAgentItem[];
|
|
64
68
|
agents: DiscoverAssistantItem[];
|
|
65
69
|
user: DiscoverUserInfo;
|
|
66
70
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { type ReactNode, createContext, memo, use } from 'react';
|
|
4
|
+
|
|
5
|
+
import { type DiscoverGroupAgentDetail } from '@/types/discover';
|
|
6
|
+
|
|
7
|
+
export type DetailContextConfig = Partial<DiscoverGroupAgentDetail>;
|
|
8
|
+
|
|
9
|
+
export const DetailContext = createContext<DetailContextConfig>({});
|
|
10
|
+
|
|
11
|
+
export const DetailProvider = memo<{ children: ReactNode; config?: DetailContextConfig }>(
|
|
12
|
+
({ children, config = {} }) => {
|
|
13
|
+
return <DetailContext value={config}>{children}</DetailContext>;
|
|
14
|
+
},
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export const useDetailContext = () => {
|
|
18
|
+
return use(DetailContext);
|
|
19
|
+
};
|
package/src/app/[variants]/(main)/community/(detail)/group_agent/features/Details/Members/index.tsx
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Avatar, Flexbox, Tag } from '@lobehub/ui';
|
|
2
|
+
import { Card, Typography } from 'antd';
|
|
3
|
+
import { Crown, User } from 'lucide-react';
|
|
4
|
+
import { memo } from 'react';
|
|
5
|
+
import { useTranslation } from 'react-i18next';
|
|
6
|
+
|
|
7
|
+
import { useDetailContext } from '../../DetailProvider';
|
|
8
|
+
|
|
9
|
+
const { Title, Text, Paragraph } = Typography;
|
|
10
|
+
|
|
11
|
+
const MemberCard = memo(
|
|
12
|
+
({
|
|
13
|
+
agent,
|
|
14
|
+
currentVersion,
|
|
15
|
+
}: {
|
|
16
|
+
agent: any;
|
|
17
|
+
currentVersion: any;
|
|
18
|
+
}) => {
|
|
19
|
+
const { t } = useTranslation('discover');
|
|
20
|
+
const isSupervisor = agent.role === 'supervisor';
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<Card hoverable>
|
|
24
|
+
<Flexbox gap={12}>
|
|
25
|
+
{/* Avatar and Basic Info */}
|
|
26
|
+
<Flexbox align="center" gap={12} horizontal>
|
|
27
|
+
<Avatar avatar={currentVersion.avatar || agent.name[0]} size={48} />
|
|
28
|
+
<Flexbox flex={1} gap={4}>
|
|
29
|
+
<Flexbox align="center" gap={8} horizontal>
|
|
30
|
+
<Title level={5} style={{ margin: 0 }}>
|
|
31
|
+
{currentVersion.name || agent.name}
|
|
32
|
+
</Title>
|
|
33
|
+
{isSupervisor ? (
|
|
34
|
+
<Tag color="gold" icon={<Crown size={12} />}>
|
|
35
|
+
{t('members.supervisor', { defaultValue: 'Supervisor' })}
|
|
36
|
+
</Tag>
|
|
37
|
+
) : (
|
|
38
|
+
<Tag color="blue" icon={<User size={12} />}>
|
|
39
|
+
{t('members.participant', { defaultValue: 'Participant' })}
|
|
40
|
+
</Tag>
|
|
41
|
+
)}
|
|
42
|
+
</Flexbox>
|
|
43
|
+
<Text type="secondary">{agent.identifier}</Text>
|
|
44
|
+
</Flexbox>
|
|
45
|
+
</Flexbox>
|
|
46
|
+
|
|
47
|
+
{/* Description */}
|
|
48
|
+
{currentVersion.description && (
|
|
49
|
+
<Paragraph ellipsis={{ rows: 2 }} style={{ margin: 0 }} type="secondary">
|
|
50
|
+
{currentVersion.description}
|
|
51
|
+
</Paragraph>
|
|
52
|
+
)}
|
|
53
|
+
|
|
54
|
+
{/* System Role (if available) */}
|
|
55
|
+
{currentVersion.config?.systemRole && (
|
|
56
|
+
<Flexbox gap={4}>
|
|
57
|
+
<Text strong>{t('members.systemRole', { defaultValue: 'System Role' })}:</Text>
|
|
58
|
+
<Paragraph ellipsis={{ rows: 3 }} style={{ margin: 0 }} type="secondary">
|
|
59
|
+
{currentVersion.config.systemRole}
|
|
60
|
+
</Paragraph>
|
|
61
|
+
</Flexbox>
|
|
62
|
+
)}
|
|
63
|
+
|
|
64
|
+
{/* Metadata */}
|
|
65
|
+
<Flexbox gap={8} horizontal wrap="wrap">
|
|
66
|
+
{currentVersion.version && (
|
|
67
|
+
<Text type="secondary">
|
|
68
|
+
{t('members.version', { defaultValue: 'Version' })}: {currentVersion.version}
|
|
69
|
+
</Text>
|
|
70
|
+
)}
|
|
71
|
+
{currentVersion.tokenUsage !== undefined && (
|
|
72
|
+
<Text type="secondary">
|
|
73
|
+
{t('members.tokenUsage', { defaultValue: 'Token Usage' })}:{' '}
|
|
74
|
+
{currentVersion.tokenUsage}
|
|
75
|
+
</Text>
|
|
76
|
+
)}
|
|
77
|
+
</Flexbox>
|
|
78
|
+
|
|
79
|
+
{/* URL */}
|
|
80
|
+
{currentVersion.url && (
|
|
81
|
+
<Text
|
|
82
|
+
copyable={{ text: currentVersion.url }}
|
|
83
|
+
ellipsis
|
|
84
|
+
style={{ fontSize: 12 }}
|
|
85
|
+
type="secondary"
|
|
86
|
+
>
|
|
87
|
+
{currentVersion.url}
|
|
88
|
+
</Text>
|
|
89
|
+
)}
|
|
90
|
+
</Flexbox>
|
|
91
|
+
</Card>
|
|
92
|
+
);
|
|
93
|
+
},
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
MemberCard.displayName = 'MemberCard';
|
|
97
|
+
|
|
98
|
+
const Members = memo(() => {
|
|
99
|
+
const { t } = useTranslation('discover');
|
|
100
|
+
const { memberAgents = [] } = useDetailContext();
|
|
101
|
+
|
|
102
|
+
// Sort: supervisors first, then by displayOrder
|
|
103
|
+
const sortedMembers = [...(memberAgents || [])].sort((a: any, b: any) => {
|
|
104
|
+
const aRole = a.role || a.agent?.role;
|
|
105
|
+
const bRole = b.role || b.agent?.role;
|
|
106
|
+
if (aRole === 'supervisor' && bRole !== 'supervisor') return -1;
|
|
107
|
+
if (aRole !== 'supervisor' && bRole === 'supervisor') return 1;
|
|
108
|
+
const aOrder = a.displayOrder || a.agent?.displayOrder || 0;
|
|
109
|
+
const bOrder = b.displayOrder || b.agent?.displayOrder || 0;
|
|
110
|
+
return aOrder - bOrder;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<Flexbox gap={16}>
|
|
115
|
+
<Title level={4}>
|
|
116
|
+
{t('members.title', { defaultValue: 'Member Agents' })} ({memberAgents?.length || 0})
|
|
117
|
+
</Title>
|
|
118
|
+
|
|
119
|
+
<Flexbox gap={12}>
|
|
120
|
+
{sortedMembers.map((member: any, index) => {
|
|
121
|
+
// Support both flat structure and nested structure
|
|
122
|
+
const agent = member.agent || member;
|
|
123
|
+
const currentVersion = member.currentVersion || member;
|
|
124
|
+
return (
|
|
125
|
+
<MemberCard
|
|
126
|
+
agent={agent}
|
|
127
|
+
currentVersion={currentVersion}
|
|
128
|
+
key={agent.identifier || index}
|
|
129
|
+
/>
|
|
130
|
+
);
|
|
131
|
+
})}
|
|
132
|
+
</Flexbox>
|
|
133
|
+
</Flexbox>
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
export default Members;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { SOCIAL_URL } from '@lobechat/business-const';
|
|
4
|
+
import { Flexbox, Icon, Tabs } from '@lobehub/ui';
|
|
5
|
+
import { createStaticStyles } from 'antd-style';
|
|
6
|
+
import { BookOpenIcon, HistoryIcon, SquareUserIcon } from 'lucide-react';
|
|
7
|
+
import { memo } from 'react';
|
|
8
|
+
import { useTranslation } from 'react-i18next';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
const styles = createStaticStyles(({ css, cssVar }) => {
|
|
12
|
+
return {
|
|
13
|
+
link: css`
|
|
14
|
+
color: ${cssVar.colorTextDescription};
|
|
15
|
+
|
|
16
|
+
&:hover {
|
|
17
|
+
color: ${cssVar.colorInfo};
|
|
18
|
+
}
|
|
19
|
+
`,
|
|
20
|
+
nav: css`
|
|
21
|
+
border-block-end: 1px solid ${cssVar.colorBorder};
|
|
22
|
+
`,
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export enum GroupAgentNavKey {
|
|
27
|
+
Overview = 'overview',
|
|
28
|
+
SystemRole = 'systemRole',
|
|
29
|
+
Versions = 'versions',
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface NavProps {
|
|
33
|
+
activeTab?: GroupAgentNavKey;
|
|
34
|
+
mobile?: boolean;
|
|
35
|
+
setActiveTab?: (tab: GroupAgentNavKey) => void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const Nav = memo<NavProps>(({ mobile, setActiveTab, activeTab = GroupAgentNavKey.Overview }) => {
|
|
39
|
+
const { t } = useTranslation('discover');
|
|
40
|
+
|
|
41
|
+
const nav = (
|
|
42
|
+
<Tabs
|
|
43
|
+
activeKey={activeTab}
|
|
44
|
+
compact={mobile}
|
|
45
|
+
items={[
|
|
46
|
+
{
|
|
47
|
+
icon: <Icon icon={BookOpenIcon} size={16} />,
|
|
48
|
+
key: GroupAgentNavKey.Overview,
|
|
49
|
+
label: t('groupAgents.details.overview.title', { defaultValue: 'Overview' }),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
icon: <Icon icon={SquareUserIcon} size={16} />,
|
|
53
|
+
key: GroupAgentNavKey.SystemRole,
|
|
54
|
+
label: t('groupAgents.details.systemRole.title', { defaultValue: 'System Role' }),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
icon: <Icon icon={HistoryIcon} size={16} />,
|
|
58
|
+
key: GroupAgentNavKey.Versions,
|
|
59
|
+
label: t('groupAgents.details.versions.title', { defaultValue: 'Versions' }),
|
|
60
|
+
},
|
|
61
|
+
]}
|
|
62
|
+
onChange={(key) => setActiveTab?.(key as GroupAgentNavKey)}
|
|
63
|
+
/>
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return mobile ? (
|
|
67
|
+
nav
|
|
68
|
+
) : (
|
|
69
|
+
<Flexbox align={'center'} className={styles.nav} horizontal justify={'space-between'}>
|
|
70
|
+
{nav}
|
|
71
|
+
<Flexbox gap={12} horizontal>
|
|
72
|
+
<a className={styles.link} href={SOCIAL_URL.discord} rel="noreferrer" target="_blank">
|
|
73
|
+
{t('groupAgents.details.nav.needHelp', { defaultValue: 'Need help?' })}
|
|
74
|
+
</a>
|
|
75
|
+
<a
|
|
76
|
+
className={styles.link}
|
|
77
|
+
href="https://github.com/lobehub/lobe-chat/issues/new/choose"
|
|
78
|
+
rel="noreferrer"
|
|
79
|
+
target="_blank"
|
|
80
|
+
>
|
|
81
|
+
{t('groupAgents.details.nav.reportIssue', { defaultValue: 'Report issue' })}
|
|
82
|
+
</a>
|
|
83
|
+
</Flexbox>
|
|
84
|
+
</Flexbox>
|
|
85
|
+
);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
export default Nav;
|