@lobehub/chat 1.99.0 → 1.99.1
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 +17 -0
- package/apps/desktop/src/main/appBrowsers.ts +1 -1
- package/apps/desktop/src/main/core/BrowserManager.ts +5 -2
- package/changelog/v1.json +5 -0
- package/package.json +1 -1
- package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/LoadingState.tsx +2 -1
- package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/index.tsx +3 -5
- package/src/database/repositories/aiInfra/index.test.ts +6 -0
- package/src/database/repositories/aiInfra/index.ts +10 -1
- package/src/server/routers/lambda/aiProvider.test.ts +1 -0
- package/src/store/aiInfra/slices/aiProvider/action.ts +6 -1
- package/src/types/aiProvider.ts +1 -0
package/CHANGELOG.md
CHANGED
@@ -2,6 +2,23 @@
|
|
2
2
|
|
3
3
|
# Changelog
|
4
4
|
|
5
|
+
### [Version 1.99.1](https://github.com/lobehub/lobe-chat/compare/v1.99.0...v1.99.1)
|
6
|
+
|
7
|
+
<sup>Released on **2025-07-15**</sup>
|
8
|
+
|
9
|
+
<br/>
|
10
|
+
|
11
|
+
<details>
|
12
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
13
|
+
|
14
|
+
</details>
|
15
|
+
|
16
|
+
<div align="right">
|
17
|
+
|
18
|
+
[](#readme-top)
|
19
|
+
|
20
|
+
</div>
|
21
|
+
|
5
22
|
## [Version 1.99.0](https://github.com/lobehub/lobe-chat/compare/v1.98.2...v1.99.0)
|
6
23
|
|
7
24
|
<sup>Released on **2025-07-14**</sup>
|
@@ -128,9 +128,12 @@ export default class BrowserManager {
|
|
128
128
|
*/
|
129
129
|
initializeBrowsers() {
|
130
130
|
logger.info('Initializing all browsers');
|
131
|
-
Object.values(appBrowsers).forEach((browser) => {
|
131
|
+
Object.values(appBrowsers).forEach((browser: BrowserWindowOpts) => {
|
132
132
|
logger.debug(`Initializing browser: ${browser.identifier}`);
|
133
|
-
|
133
|
+
|
134
|
+
if (browser.keepAlive) {
|
135
|
+
this.retrieveOrInitialize(browser);
|
136
|
+
}
|
134
137
|
});
|
135
138
|
}
|
136
139
|
|
package/changelog/v1.json
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@lobehub/chat",
|
3
|
-
"version": "1.99.
|
3
|
+
"version": "1.99.1",
|
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",
|
package/src/app/[variants]/(main)/image/features/GenerationFeed/GenerationItem/LoadingState.tsx
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
'use client';
|
2
2
|
|
3
|
+
import { LoadingOutlined } from '@ant-design/icons';
|
3
4
|
import { Block } from '@lobehub/ui';
|
4
5
|
import { Spin } from 'antd';
|
5
6
|
import { memo } from 'react';
|
@@ -32,7 +33,7 @@ export const LoadingState = memo<LoadingStateProps>(({ generation, aspectRatio,
|
|
32
33
|
variant={'filled'}
|
33
34
|
>
|
34
35
|
<Center gap={8}>
|
35
|
-
<Spin
|
36
|
+
<Spin indicator={<LoadingOutlined spin />} />
|
36
37
|
<ElapsedTime generationId={generation.id} isActive={isGenerating} />
|
37
38
|
</Center>
|
38
39
|
<ActionButtons onDelete={onDelete} />
|
@@ -59,12 +59,10 @@ export const GenerationItem = memo<GenerationItemProps>(
|
|
59
59
|
|
60
60
|
// Generate filename with prompt and timestamp
|
61
61
|
const timestamp = dayjs(generation.createdAt).format('YYYY-MM-DD_HH-mm-ss');
|
62
|
-
const
|
63
|
-
|
64
|
-
|
65
|
-
.trim();
|
62
|
+
const baseName = prompt.slice(0, 30).trim();
|
63
|
+
const sanitizedBaseName = baseName.replaceAll(/["%*/:<>?\\|]/g, '').replaceAll(/\s+/g, '_');
|
64
|
+
const safePrompt = sanitizedBaseName || 'Untitled';
|
66
65
|
|
67
|
-
// Detect file extension from URL
|
68
66
|
const fileExtension = inferFileExtensionFromImageUrl(generation.asset.url);
|
69
67
|
const fileName = `${safePrompt}_${timestamp}.${fileExtension}`;
|
70
68
|
|
@@ -443,6 +443,9 @@ describe('AiInfraRepos', () => {
|
|
443
443
|
}),
|
444
444
|
],
|
445
445
|
enabledAiProviders: [{ id: 'openai', logo: 'logo1', name: 'OpenAI', source: 'builtin' }],
|
446
|
+
enabledChatAiProviders: [
|
447
|
+
{ id: 'openai', logo: 'logo1', name: 'OpenAI', source: 'builtin' },
|
448
|
+
],
|
446
449
|
enabledImageAiProviders: [],
|
447
450
|
runtimeConfig: {
|
448
451
|
openai: {
|
@@ -525,6 +528,9 @@ describe('AiInfraRepos', () => {
|
|
525
528
|
{ id: 'openai', logo: 'openai-logo', name: 'OpenAI', source: 'builtin' },
|
526
529
|
{ id: 'fal', logo: 'fal-logo', name: 'Fal', source: 'builtin' },
|
527
530
|
],
|
531
|
+
enabledChatAiProviders: [
|
532
|
+
{ id: 'openai', logo: 'openai-logo', name: 'OpenAI', source: 'builtin' },
|
533
|
+
],
|
528
534
|
enabledImageAiProviders: [
|
529
535
|
expect.objectContaining({
|
530
536
|
id: 'fal',
|
@@ -159,11 +159,20 @@ export class AiInfraRepos {
|
|
159
159
|
runtimeConfig[key] = merge(this.providerConfigs[key] || {}, value);
|
160
160
|
});
|
161
161
|
const enabledAiModels = allModels.filter((model) => model.enabled);
|
162
|
+
const enabledChatAiProviders = enabledAiProviders.filter((provider) => {
|
163
|
+
return allModels.some((model) => model.providerId === provider.id && model.type === 'chat');
|
164
|
+
});
|
162
165
|
const enabledImageAiProviders = enabledAiProviders.filter((provider) => {
|
163
166
|
return allModels.some((model) => model.providerId === provider.id && model.type === 'image');
|
164
167
|
});
|
165
168
|
|
166
|
-
return {
|
169
|
+
return {
|
170
|
+
enabledAiModels,
|
171
|
+
enabledAiProviders,
|
172
|
+
enabledChatAiProviders,
|
173
|
+
enabledImageAiProviders,
|
174
|
+
runtimeConfig,
|
175
|
+
};
|
167
176
|
};
|
168
177
|
|
169
178
|
getAiProviderModelList = async (providerId: string) => {
|
@@ -183,6 +183,11 @@ export const createAiProviderSlice: StateCreator<
|
|
183
183
|
return {
|
184
184
|
enabledAiModels: allModels.filter((m) => m.enabled),
|
185
185
|
enabledAiProviders: enabledAiProviders,
|
186
|
+
enabledChatAiProviders: enabledAiProviders.filter((provider) => {
|
187
|
+
return allModels.some(
|
188
|
+
(model) => model.providerId === provider.id && model.type === 'chat',
|
189
|
+
);
|
190
|
+
}),
|
186
191
|
enabledImageAiProviders: enabledAiProviders
|
187
192
|
.filter((provider) => {
|
188
193
|
return allModels.some(
|
@@ -215,7 +220,7 @@ export const createAiProviderSlice: StateCreator<
|
|
215
220
|
};
|
216
221
|
|
217
222
|
// 3. 组装最终数据结构
|
218
|
-
const enabledChatModelList = data.
|
223
|
+
const enabledChatModelList = data.enabledChatAiProviders.map((provider) => ({
|
219
224
|
...provider,
|
220
225
|
children: getModelListByType(provider.id, 'chat'),
|
221
226
|
name: provider.name || provider.id,
|
package/src/types/aiProvider.ts
CHANGED
@@ -255,6 +255,7 @@ export interface AiProviderRuntimeConfig {
|
|
255
255
|
export interface AiProviderRuntimeState {
|
256
256
|
enabledAiModels: EnabledAiModel[];
|
257
257
|
enabledAiProviders: EnabledProvider[];
|
258
|
+
enabledChatAiProviders: EnabledProvider[];
|
258
259
|
enabledImageAiProviders: EnabledProvider[];
|
259
260
|
runtimeConfig: Record<string, AiProviderRuntimeConfig>;
|
260
261
|
}
|