@lobehub/chat 1.111.12 → 1.112.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [Version 1.112.0](https://github.com/lobehub/lobe-chat/compare/v1.111.12...v1.112.0)
6
+
7
+ <sup>Released on **2025-08-15**</sup>
8
+
9
+ #### ✨ Features
10
+
11
+ - **feature-flags**: Add ai_image flag to control AI painting UI.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's improved
19
+
20
+ - **feature-flags**: Add ai_image flag to control AI painting UI, closes [#8797](https://github.com/lobehub/lobe-chat/issues/8797) ([a1c66c8](https://github.com/lobehub/lobe-chat/commit/a1c66c8))
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
+
5
30
  ### [Version 1.111.12](https://github.com/lobehub/lobe-chat/compare/v1.111.11...v1.111.12)
6
31
 
7
32
  <sup>Released on **2025-08-14**</sup>
package/changelog/v1.json CHANGED
@@ -1,4 +1,9 @@
1
1
  [
2
+ {
3
+ "children": {},
4
+ "date": "2025-08-15",
5
+ "version": "1.112.0"
6
+ },
2
7
  {
3
8
  "children": {},
4
9
  "date": "2025-08-14",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.111.12",
3
+ "version": "1.112.0",
4
4
  "description": "Lobe Chat - an open-source, high-performance chatbot 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",
@@ -13,7 +13,7 @@ import { useSessionStore } from '@/store/session';
13
13
  import TopActions, { TopActionProps } from './TopActions';
14
14
 
15
15
  beforeAll(() => {
16
- initServerConfigStore({ featureFlags: { market: true } });
16
+ initServerConfigStore({ featureFlags: { market: true, ai_image: true } });
17
17
  });
18
18
 
19
19
  beforeEach(() => {
@@ -21,7 +21,7 @@ beforeEach(() => {
21
21
  });
22
22
 
23
23
  afterEach(() => {
24
- createServerConfigStore().setState({ featureFlags: { market: true } });
24
+ createServerConfigStore().setState({ featureFlags: { market: true, ai_image: true } });
25
25
  cleanup();
26
26
  });
27
27
 
@@ -56,10 +56,11 @@ const renderTopActions = (props: TopActionProps = {}) => {
56
56
  };
57
57
 
58
58
  describe('TopActions', () => {
59
- it('should render Chat and Market by default', () => {
59
+ it('should render Chat, AI Image and Market by default', () => {
60
60
  renderTopActions();
61
61
 
62
62
  expect(screen.getByText('tab.chat')).toBeInTheDocument();
63
+ expect(screen.getByText('tab.aiImage')).toBeInTheDocument();
63
64
  expect(screen.getByText('tab.discover')).toBeInTheDocument();
64
65
  });
65
66
 
@@ -85,6 +86,17 @@ describe('TopActions', () => {
85
86
  expect(screen.queryByText('tab.files')).not.toBeInTheDocument();
86
87
  });
87
88
 
89
+ it('should not render AI Image icon when ai_image is disabled', () => {
90
+ act(() => {
91
+ createServerConfigStore().setState({ featureFlags: { ai_image: false } });
92
+ });
93
+
94
+ renderTopActions();
95
+
96
+ expect(screen.getByText('tab.chat')).toBeInTheDocument();
97
+ expect(screen.queryByText('tab.aiImage')).not.toBeInTheDocument();
98
+ });
99
+
88
100
  it('should switch back to previous active session', () => {
89
101
  act(() => {
90
102
  useSessionStore.setState({ activeId: '1' });
@@ -27,7 +27,8 @@ export interface TopActionProps {
27
27
  const TopActions = memo<TopActionProps>(({ tab, isPinned }) => {
28
28
  const { t } = useTranslation('common');
29
29
  const switchBackToChat = useGlobalStore((s) => s.switchBackToChat);
30
- const { showMarket, enableKnowledgeBase } = useServerConfigStore(featureFlagsSelectors);
30
+ const { showMarket, enableKnowledgeBase, showAiImage } =
31
+ useServerConfigStore(featureFlagsSelectors);
31
32
  const hotkey = useUserStore(settingsSelectors.getHotkeyById(HotkeyEnum.NavigateToChat));
32
33
 
33
34
  const isChatActive = tab === SidebarTabKey.Chat && !isPinned;
@@ -75,15 +76,17 @@ const TopActions = memo<TopActionProps>(({ tab, isPinned }) => {
75
76
  />
76
77
  </Link>
77
78
  )}
78
- <Link aria-label={t('tab.aiImage')} href={'/image'}>
79
- <ActionIcon
80
- active={isImageActive}
81
- icon={Palette}
82
- size={ICON_SIZE}
83
- title={t('tab.aiImage')}
84
- tooltipProps={{ placement: 'right' }}
85
- />
86
- </Link>
79
+ {showAiImage && (
80
+ <Link aria-label={t('tab.aiImage')} href={'/image'}>
81
+ <ActionIcon
82
+ active={isImageActive}
83
+ icon={Palette}
84
+ size={ICON_SIZE}
85
+ title={t('tab.aiImage')}
86
+ tooltipProps={{ placement: 'right' }}
87
+ />
88
+ </Link>
89
+ )}
87
90
  {showMarket && (
88
91
  <Link aria-label={t('tab.discover')} href={'/discover'}>
89
92
  <ActionIcon
@@ -12,6 +12,7 @@ describe('FeatureFlagsSchema', () => {
12
12
  create_session: true,
13
13
  edit_agent: false,
14
14
  dalle: true,
15
+ ai_image: true,
15
16
  });
16
17
 
17
18
  expect(result.success).toBe(true);
@@ -36,6 +37,7 @@ describe('mapFeatureFlagsEnvToState', () => {
36
37
  create_session: true,
37
38
  edit_agent: false,
38
39
  dalle: true,
40
+ ai_image: true,
39
41
  check_updates: true,
40
42
  welcome_suggest: true,
41
43
  };
@@ -48,6 +50,7 @@ describe('mapFeatureFlagsEnvToState', () => {
48
50
  showOpenAIApiKey: true,
49
51
  showOpenAIProxyUrl: false,
50
52
  showDalle: true,
53
+ showAiImage: true,
51
54
  enableCheckUpdates: true,
52
55
  showWelcomeSuggest: true,
53
56
  };
@@ -24,6 +24,7 @@ export const FeatureFlagsSchema = z.object({
24
24
 
25
25
  plugins: z.boolean().optional(),
26
26
  dalle: z.boolean().optional(),
27
+ ai_image: z.boolean().optional(),
27
28
  speech_to_text: z.boolean().optional(),
28
29
  token_counter: z.boolean().optional(),
29
30
 
@@ -66,6 +67,7 @@ export const DEFAULT_FEATURE_FLAGS: IFeatureFlags = {
66
67
 
67
68
  plugins: true,
68
69
  dalle: true,
70
+ ai_image: true,
69
71
 
70
72
  check_updates: true,
71
73
  welcome_suggest: true,
@@ -106,6 +108,7 @@ export const mapFeatureFlagsEnvToState = (config: IFeatureFlags) => {
106
108
 
107
109
  enablePlugins: config.plugins,
108
110
  showDalle: config.dalle,
111
+ showAiImage: config.ai_image,
109
112
  showChangelog: config.changelog,
110
113
 
111
114
  enableCheckUpdates: config.check_updates,
@@ -25,6 +25,7 @@ describe('featureFlagsSelectors', () => {
25
25
  showChangelog: true,
26
26
  enableRAGEval: false,
27
27
  showDalle: true,
28
+ showAiImage: true,
28
29
  enableKnowledgeBase: true,
29
30
  showLLM: false,
30
31
  showCloudPromotion: false,