@lobehub/lobehub 2.0.0-next.337 → 2.0.0-next.338
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/locales/en-US/setting.json +19 -0
- package/locales/zh-CN/auth.json +1 -0
- package/locales/zh-CN/setting.json +19 -0
- package/package.json +1 -1
- package/packages/model-runtime/src/providers/google/index.ts +14 -14
- package/packages/model-runtime/src/providers/moonshot/index.ts +1 -1
- package/packages/model-runtime/src/providers/openai/index.ts +3 -3
- package/packages/types/src/discover/index.ts +1 -1
- package/src/app/[variants]/(main)/agent/cron/[cronId]/CronConfig.ts +16 -16
- package/src/app/[variants]/(main)/agent/cron/[cronId]/features/CronJobSaveButton.tsx +1 -1
- package/src/app/[variants]/(main)/agent/cron/[cronId]/features/CronJobScheduleConfig.tsx +5 -2
- package/src/app/[variants]/(main)/community/features/Search.tsx +1 -1
- package/src/app/[variants]/(mobile)/router/mobileRouter.config.tsx +27 -0
- package/src/app/[variants]/(mobile)/settings/_layout/Header.tsx +8 -17
- package/src/app/[variants]/(mobile)/settings/_layout/index.tsx +6 -1
- package/src/app/[variants]/(mobile)/settings/provider/_layout/index.tsx +22 -0
- package/src/locales/default/setting.ts +19 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
## [Version 2.0.0-next.338](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.337...v2.0.0-next.338)
|
|
6
|
+
|
|
7
|
+
<sup>Released on **2026-01-22**</sup>
|
|
8
|
+
|
|
9
|
+
#### 🐛 Bug Fixes
|
|
10
|
+
|
|
11
|
+
- **misc**: Updata cron job ui & fixed commnuity pagenation goto error.
|
|
12
|
+
|
|
13
|
+
<br/>
|
|
14
|
+
|
|
15
|
+
<details>
|
|
16
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
17
|
+
|
|
18
|
+
#### What's fixed
|
|
19
|
+
|
|
20
|
+
- **misc**: Updata cron job ui & fixed commnuity pagenation goto error, closes [#11700](https://github.com/lobehub/lobe-chat/issues/11700) ([42ad2a0](https://github.com/lobehub/lobe-chat/commit/42ad2a0))
|
|
21
|
+
|
|
22
|
+
</details>
|
|
23
|
+
|
|
24
|
+
<div align="right">
|
|
25
|
+
|
|
26
|
+
[](#readme-top)
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
5
30
|
## [Version 2.0.0-next.337](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.336...v2.0.0-next.337)
|
|
6
31
|
|
|
7
32
|
<sup>Released on **2026-01-22**</sup>
|
package/changelog/v1.json
CHANGED
|
@@ -36,7 +36,11 @@
|
|
|
36
36
|
"agentCronJobs.noExecutionResults": "No execution results",
|
|
37
37
|
"agentCronJobs.remainingExecutions": "Remaining: {{count}}",
|
|
38
38
|
"agentCronJobs.save": "Save",
|
|
39
|
+
"agentCronJobs.saveAsNew": "Save as New",
|
|
39
40
|
"agentCronJobs.schedule": "Schedule",
|
|
41
|
+
"agentCronJobs.scheduleType.daily": "Daily",
|
|
42
|
+
"agentCronJobs.scheduleType.hourly": "Hourly",
|
|
43
|
+
"agentCronJobs.scheduleType.weekly": "Weekly",
|
|
40
44
|
"agentCronJobs.status.depleted": "Depleted",
|
|
41
45
|
"agentCronJobs.status.disabled": "Disabled",
|
|
42
46
|
"agentCronJobs.status.enabled": "Enabled",
|
|
@@ -45,6 +49,20 @@
|
|
|
45
49
|
"agentCronJobs.unlimited": "Unlimited",
|
|
46
50
|
"agentCronJobs.unnamedTask": "Unnamed Task",
|
|
47
51
|
"agentCronJobs.updateSuccess": "Scheduled task updated successfully",
|
|
52
|
+
"agentCronJobs.weekday.friday": "Friday",
|
|
53
|
+
"agentCronJobs.weekday.monday": "Monday",
|
|
54
|
+
"agentCronJobs.weekday.saturday": "Saturday",
|
|
55
|
+
"agentCronJobs.weekday.short.friday": "Fri",
|
|
56
|
+
"agentCronJobs.weekday.short.monday": "Mon",
|
|
57
|
+
"agentCronJobs.weekday.short.saturday": "Sat",
|
|
58
|
+
"agentCronJobs.weekday.short.sunday": "Sun",
|
|
59
|
+
"agentCronJobs.weekday.short.thursday": "Thu",
|
|
60
|
+
"agentCronJobs.weekday.short.tuesday": "Tue",
|
|
61
|
+
"agentCronJobs.weekday.short.wednesday": "Wed",
|
|
62
|
+
"agentCronJobs.weekday.sunday": "Sunday",
|
|
63
|
+
"agentCronJobs.weekday.thursday": "Thursday",
|
|
64
|
+
"agentCronJobs.weekday.tuesday": "Tuesday",
|
|
65
|
+
"agentCronJobs.weekday.wednesday": "Wednesday",
|
|
48
66
|
"agentCronJobs.weekdays": "Weekdays",
|
|
49
67
|
"agentInfoDescription.basic.avatar": "Avatar",
|
|
50
68
|
"agentInfoDescription.basic.description": "Description",
|
|
@@ -544,6 +562,7 @@
|
|
|
544
562
|
"systemAgent.translation.title": "Message Translation Agent",
|
|
545
563
|
"tab.about": "About",
|
|
546
564
|
"tab.agent": "Agent Service",
|
|
565
|
+
"tab.all": "All",
|
|
547
566
|
"tab.apikey": "API Key Management",
|
|
548
567
|
"tab.chatAppearance": "Chat Appearance",
|
|
549
568
|
"tab.common": "Appearance",
|
package/locales/zh-CN/auth.json
CHANGED
|
@@ -36,7 +36,11 @@
|
|
|
36
36
|
"agentCronJobs.noExecutionResults": "无执行结果",
|
|
37
37
|
"agentCronJobs.remainingExecutions": "剩余:{{count}}",
|
|
38
38
|
"agentCronJobs.save": "保存",
|
|
39
|
+
"agentCronJobs.saveAsNew": "另存为新任务",
|
|
39
40
|
"agentCronJobs.schedule": "计划",
|
|
41
|
+
"agentCronJobs.scheduleType.daily": "每日",
|
|
42
|
+
"agentCronJobs.scheduleType.hourly": "每小时",
|
|
43
|
+
"agentCronJobs.scheduleType.weekly": "每周",
|
|
40
44
|
"agentCronJobs.status.depleted": "已耗尽",
|
|
41
45
|
"agentCronJobs.status.disabled": "已禁用",
|
|
42
46
|
"agentCronJobs.status.enabled": "已启用",
|
|
@@ -45,6 +49,20 @@
|
|
|
45
49
|
"agentCronJobs.unlimited": "无限",
|
|
46
50
|
"agentCronJobs.unnamedTask": "未命名任务",
|
|
47
51
|
"agentCronJobs.updateSuccess": "定时任务更新成功",
|
|
52
|
+
"agentCronJobs.weekday.friday": "星期五",
|
|
53
|
+
"agentCronJobs.weekday.monday": "星期一",
|
|
54
|
+
"agentCronJobs.weekday.saturday": "星期六",
|
|
55
|
+
"agentCronJobs.weekday.short.friday": "周五",
|
|
56
|
+
"agentCronJobs.weekday.short.monday": "周一",
|
|
57
|
+
"agentCronJobs.weekday.short.saturday": "周六",
|
|
58
|
+
"agentCronJobs.weekday.short.sunday": "周日",
|
|
59
|
+
"agentCronJobs.weekday.short.thursday": "周四",
|
|
60
|
+
"agentCronJobs.weekday.short.tuesday": "周二",
|
|
61
|
+
"agentCronJobs.weekday.short.wednesday": "周三",
|
|
62
|
+
"agentCronJobs.weekday.sunday": "星期日",
|
|
63
|
+
"agentCronJobs.weekday.thursday": "星期四",
|
|
64
|
+
"agentCronJobs.weekday.tuesday": "星期二",
|
|
65
|
+
"agentCronJobs.weekday.wednesday": "星期三",
|
|
48
66
|
"agentCronJobs.weekdays": "工作日",
|
|
49
67
|
"agentInfoDescription.basic.avatar": "头像",
|
|
50
68
|
"agentInfoDescription.basic.description": "描述",
|
|
@@ -544,6 +562,7 @@
|
|
|
544
562
|
"systemAgent.translation.title": "消息内容翻译助理",
|
|
545
563
|
"tab.about": "关于",
|
|
546
564
|
"tab.agent": "助理服务",
|
|
565
|
+
"tab.all": "全部",
|
|
547
566
|
"tab.apikey": "API Key 管理",
|
|
548
567
|
"tab.chatAppearance": "聊天外观",
|
|
549
568
|
"tab.common": "外观",
|
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.338",
|
|
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",
|
|
@@ -242,7 +242,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
242
242
|
} catch (e) {
|
|
243
243
|
const err = e as Error;
|
|
244
244
|
|
|
245
|
-
//
|
|
245
|
+
// Remove previous silent handling, throw error uniformly
|
|
246
246
|
if (isAbortError(err)) {
|
|
247
247
|
log('Request was cancelled');
|
|
248
248
|
throw AgentRuntimeError.chat({
|
|
@@ -307,10 +307,10 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
307
307
|
try {
|
|
308
308
|
for await (const chunk of originalStream) {
|
|
309
309
|
if (signal.aborted) {
|
|
310
|
-
//
|
|
310
|
+
// If data has already been output, close the stream gracefully instead of throwing an error
|
|
311
311
|
if (hasData) {
|
|
312
312
|
log('Stream cancelled gracefully, preserving existing output');
|
|
313
|
-
//
|
|
313
|
+
// Explicitly inject cancellation error to avoid SSE fallback unexpected_end
|
|
314
314
|
controller.enqueue({
|
|
315
315
|
[LOBE_ERROR_KEY]: {
|
|
316
316
|
body: { name: 'Stream cancelled', provider, reason: 'aborted' },
|
|
@@ -322,7 +322,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
322
322
|
controller.close();
|
|
323
323
|
return;
|
|
324
324
|
} else {
|
|
325
|
-
//
|
|
325
|
+
// If no data has been output yet, close the stream directly and let downstream SSE emit error event during flush phase
|
|
326
326
|
log('Stream cancelled before any output');
|
|
327
327
|
controller.close();
|
|
328
328
|
return;
|
|
@@ -335,12 +335,12 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
335
335
|
} catch (error) {
|
|
336
336
|
const err = error as Error;
|
|
337
337
|
|
|
338
|
-
//
|
|
338
|
+
// Handle all errors uniformly, including abort errors
|
|
339
339
|
if (isAbortError(err) || signal.aborted) {
|
|
340
|
-
//
|
|
340
|
+
// If data has already been output, close the stream gracefully
|
|
341
341
|
if (hasData) {
|
|
342
342
|
log('Stream reading cancelled gracefully, preserving existing output');
|
|
343
|
-
//
|
|
343
|
+
// Explicitly inject cancellation error to avoid SSE fallback unexpected_end
|
|
344
344
|
controller.enqueue({
|
|
345
345
|
[LOBE_ERROR_KEY]: {
|
|
346
346
|
body: { name: 'Stream cancelled', provider, reason: 'aborted' },
|
|
@@ -353,7 +353,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
353
353
|
return;
|
|
354
354
|
} else {
|
|
355
355
|
log('Stream reading cancelled before any output');
|
|
356
|
-
//
|
|
356
|
+
// Inject an error marker with detailed error information to be handled by downstream google-ai transformer to output error event
|
|
357
357
|
controller.enqueue({
|
|
358
358
|
[LOBE_ERROR_KEY]: {
|
|
359
359
|
body: {
|
|
@@ -371,14 +371,14 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
371
371
|
return;
|
|
372
372
|
}
|
|
373
373
|
} else {
|
|
374
|
-
//
|
|
374
|
+
// Handle other stream parsing errors
|
|
375
375
|
log('Stream parsing error: %O', err);
|
|
376
|
-
//
|
|
376
|
+
// Try to parse Google error and extract code/message/status
|
|
377
377
|
const { error: parsedError, errorType } = parseGoogleErrorMessage(
|
|
378
378
|
err?.message || String(err),
|
|
379
379
|
);
|
|
380
380
|
|
|
381
|
-
//
|
|
381
|
+
// Inject an error marker with detailed error information to be handled by downstream google-ai transformer to output error event
|
|
382
382
|
controller.enqueue({
|
|
383
383
|
[LOBE_ERROR_KEY]: {
|
|
384
384
|
body: { ...parsedError, provider },
|
|
@@ -453,12 +453,12 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
453
453
|
const hasUrlContext = payload?.urlContext;
|
|
454
454
|
const hasFunctionTools = tools && tools.length > 0;
|
|
455
455
|
|
|
456
|
-
//
|
|
456
|
+
// If tool_calls already exist, prioritize handling function declarations
|
|
457
457
|
if (hasToolCalls && hasFunctionTools) {
|
|
458
458
|
return buildGoogleTools(tools);
|
|
459
459
|
}
|
|
460
460
|
|
|
461
|
-
//
|
|
461
|
+
// Build and return search-related tools (search tools cannot be used with FunctionCall simultaneously)
|
|
462
462
|
if (hasUrlContext && hasSearch) {
|
|
463
463
|
return [{ urlContext: {} }, { googleSearch: {} }];
|
|
464
464
|
}
|
|
@@ -469,7 +469,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
|
|
|
469
469
|
return [{ googleSearch: {} }];
|
|
470
470
|
}
|
|
471
471
|
|
|
472
|
-
//
|
|
472
|
+
// Finally consider function declarations
|
|
473
473
|
return buildGoogleTools(tools);
|
|
474
474
|
}
|
|
475
475
|
}
|
|
@@ -21,7 +21,7 @@ export const params = {
|
|
|
21
21
|
const filteredMessages = messages.map((message: any) => {
|
|
22
22
|
let normalizedMessage = message;
|
|
23
23
|
|
|
24
|
-
//
|
|
24
|
+
// Add a space for empty assistant messages (#8418)
|
|
25
25
|
if (message.role === 'assistant' && (!message.content || message.content === '')) {
|
|
26
26
|
normalizedMessage = { ...normalizedMessage, content: ' ' };
|
|
27
27
|
}
|
|
@@ -16,10 +16,10 @@ export interface OpenAIModelCard {
|
|
|
16
16
|
const prunePrefixes = ['o1', 'o3', 'o4', 'codex', 'computer-use', 'gpt-5'];
|
|
17
17
|
const oaiSearchContextSize = process.env.OPENAI_SEARCH_CONTEXT_SIZE; // low, medium, high
|
|
18
18
|
const enableServiceTierFlex = process.env.OPENAI_SERVICE_TIER_FLEX === '1';
|
|
19
|
-
const flexSupportedModels = ['gpt-5', 'o3', 'o4-mini']; // Flex
|
|
19
|
+
const flexSupportedModels = ['gpt-5', 'o3', 'o4-mini']; // Flex tier is only available for these models
|
|
20
20
|
|
|
21
21
|
const supportsFlexTier = (model: string) => {
|
|
22
|
-
//
|
|
22
|
+
// Exclude o3-mini, which does not support Flex tier
|
|
23
23
|
if (model.startsWith('o3-mini')) {
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
@@ -74,7 +74,7 @@ export const params = {
|
|
|
74
74
|
const modelsPage = (await client.models.list()) as any;
|
|
75
75
|
const modelList: OpenAIModelCard[] = modelsPage.data;
|
|
76
76
|
|
|
77
|
-
//
|
|
77
|
+
// Automatically detect model provider and select corresponding configuration
|
|
78
78
|
return processMultiProviderModelList(modelList, 'openai');
|
|
79
79
|
},
|
|
80
80
|
provider: ModelProvider.OpenAI,
|
|
@@ -61,24 +61,24 @@ export const TIMEZONE_OPTIONS = [
|
|
|
61
61
|
|
|
62
62
|
// Weekday options for checkbox group
|
|
63
63
|
export const WEEKDAY_OPTIONS = [
|
|
64
|
-
{ label: '
|
|
65
|
-
{ label: '
|
|
66
|
-
{ label: '
|
|
67
|
-
{ label: '
|
|
68
|
-
{ label: '
|
|
69
|
-
{ label: '
|
|
70
|
-
{ label: '
|
|
71
|
-
];
|
|
64
|
+
{ label: 'agentCronJobs.weekday.short.monday', value: 1 },
|
|
65
|
+
{ label: 'agentCronJobs.weekday.short.tuesday', value: 2 },
|
|
66
|
+
{ label: 'agentCronJobs.weekday.short.wednesday', value: 3 },
|
|
67
|
+
{ label: 'agentCronJobs.weekday.short.thursday', value: 4 },
|
|
68
|
+
{ label: 'agentCronJobs.weekday.short.friday', value: 5 },
|
|
69
|
+
{ label: 'agentCronJobs.weekday.short.saturday', value: 6 },
|
|
70
|
+
{ label: 'agentCronJobs.weekday.short.sunday', value: 0 },
|
|
71
|
+
] as const;
|
|
72
72
|
|
|
73
|
-
// Weekday labels for display
|
|
73
|
+
// Weekday labels for display (i18n keys)
|
|
74
74
|
export const WEEKDAY_LABELS: Record<number, string> = {
|
|
75
|
-
0: '
|
|
76
|
-
1: '
|
|
77
|
-
2: '
|
|
78
|
-
3: '
|
|
79
|
-
4: '
|
|
80
|
-
5: '
|
|
81
|
-
6: '
|
|
75
|
+
0: 'agentCronJobs.weekday.sunday',
|
|
76
|
+
1: 'agentCronJobs.weekday.monday',
|
|
77
|
+
2: 'agentCronJobs.weekday.tuesday',
|
|
78
|
+
3: 'agentCronJobs.weekday.wednesday',
|
|
79
|
+
4: 'agentCronJobs.weekday.thursday',
|
|
80
|
+
5: 'agentCronJobs.weekday.friday',
|
|
81
|
+
6: 'agentCronJobs.weekday.saturday',
|
|
82
82
|
};
|
|
83
83
|
|
|
84
84
|
/**
|
|
@@ -22,7 +22,7 @@ const CronJobSaveButton = memo<CronJobSaveButtonProps>(({ disabled, loading, onS
|
|
|
22
22
|
style={{ width: 200 }}
|
|
23
23
|
type="primary"
|
|
24
24
|
>
|
|
25
|
-
{t('agentCronJobs.saveAsNew'
|
|
25
|
+
{t('agentCronJobs.saveAsNew')}
|
|
26
26
|
</Button>
|
|
27
27
|
</Flexbox>
|
|
28
28
|
);
|
|
@@ -81,7 +81,7 @@ const CronJobScheduleConfig = memo<CronJobScheduleConfigProps>(
|
|
|
81
81
|
if (scheduleType === 'weekly' && weekdays.length > 0) {
|
|
82
82
|
result.push({
|
|
83
83
|
key: 'weekdays',
|
|
84
|
-
label: weekdays.map((day) => WEEKDAY_LABELS[day]).join(', '),
|
|
84
|
+
label: weekdays.map((day) => t(WEEKDAY_LABELS[day] as any)).join(', '),
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -126,7 +126,10 @@ const CronJobScheduleConfig = memo<CronJobScheduleConfigProps>(
|
|
|
126
126
|
maxTagCount="responsive"
|
|
127
127
|
mode="multiple"
|
|
128
128
|
onChange={(values: number[]) => onScheduleChange({ weekdays: values })}
|
|
129
|
-
options={WEEKDAY_OPTIONS
|
|
129
|
+
options={WEEKDAY_OPTIONS.map((opt) => ({
|
|
130
|
+
label: t(opt.label as any),
|
|
131
|
+
value: opt.value,
|
|
132
|
+
}))}
|
|
130
133
|
placeholder="Select days"
|
|
131
134
|
size="small"
|
|
132
135
|
style={{ minWidth: 150 }}
|
|
@@ -33,7 +33,7 @@ const Search = memo<StoreSearchBarProps>(() => {
|
|
|
33
33
|
const { q } = useQuery() as { q?: string };
|
|
34
34
|
const router = useQueryRoute();
|
|
35
35
|
const [word, setWord] = useState<string>(q || '');
|
|
36
|
-
const activeTab = pathname.split('/')[2] || '
|
|
36
|
+
const activeTab = pathname.split('/')[2] || 'agent';
|
|
37
37
|
const handleSearch = (value: string) => {
|
|
38
38
|
router.push(urlJoin('/community', activeTab), {
|
|
39
39
|
query: value ? { q: value } : {},
|
|
@@ -7,6 +7,7 @@ import MobileChatLayout from '@/app/[variants]/(mobile)/chat/_layout';
|
|
|
7
7
|
import MobileMeHomeLayout from '@/app/[variants]/(mobile)/me/(home)/layout';
|
|
8
8
|
import MobileMeProfileLayout from '@/app/[variants]/(mobile)/me/profile/layout';
|
|
9
9
|
import MobileMeSettingsLayout from '@/app/[variants]/(mobile)/me/settings/layout';
|
|
10
|
+
import MobileSettingsProviderLayout from '@/app/[variants]/(mobile)/settings/provider/_layout';
|
|
10
11
|
import {
|
|
11
12
|
BusinessMobileRoutesWithMainLayout,
|
|
12
13
|
BusinessMobileRoutesWithoutMainLayout,
|
|
@@ -174,6 +175,32 @@ export const mobileRoutes: RouteConfig[] = [
|
|
|
174
175
|
element: dynamicElement(() => import('../settings'), 'Mobile > Settings'),
|
|
175
176
|
index: true,
|
|
176
177
|
},
|
|
178
|
+
// Provider routes with nested structure
|
|
179
|
+
{
|
|
180
|
+
children: [
|
|
181
|
+
{
|
|
182
|
+
element: redirectElement('/settings/provider/all'),
|
|
183
|
+
index: true,
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
element: dynamicElement(
|
|
187
|
+
() => import('../../(main)/settings/provider').then((m) => m.ProviderDetailPage),
|
|
188
|
+
'Mobile > Settings > Provider > Detail',
|
|
189
|
+
),
|
|
190
|
+
path: ':providerId',
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
element: <MobileSettingsProviderLayout />,
|
|
194
|
+
path: 'provider',
|
|
195
|
+
},
|
|
196
|
+
// Other settings tabs (common, agent, memory, tts, about, etc.)
|
|
197
|
+
{
|
|
198
|
+
element: dynamicElement(
|
|
199
|
+
() => import('../../(main)/settings'),
|
|
200
|
+
'Mobile > Settings > Tab',
|
|
201
|
+
),
|
|
202
|
+
path: ':tab',
|
|
203
|
+
},
|
|
177
204
|
],
|
|
178
205
|
element: <MobileSettingsLayout />,
|
|
179
206
|
errorElement: <ErrorBoundary resetPath="/settings" />,
|
|
@@ -4,10 +4,9 @@ import { Flexbox } from '@lobehub/ui';
|
|
|
4
4
|
import { ChatHeader } from '@lobehub/ui/mobile';
|
|
5
5
|
import { memo } from 'react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
|
7
|
-
import { useNavigate } from 'react-router-dom';
|
|
7
|
+
import { useNavigate, useParams } from 'react-router-dom';
|
|
8
8
|
|
|
9
9
|
import { enableAuth } from '@/envs/auth';
|
|
10
|
-
import { useQueryState } from '@/hooks/useQueryParam';
|
|
11
10
|
import { useShowMobileWorkspace } from '@/hooks/useShowMobileWorkspace';
|
|
12
11
|
import { type SettingsTabs } from '@/store/global/initialState';
|
|
13
12
|
import { useSessionStore } from '@/store/session';
|
|
@@ -17,26 +16,16 @@ const Header = memo(() => {
|
|
|
17
16
|
const { t } = useTranslation('setting');
|
|
18
17
|
const showMobileWorkspace = useShowMobileWorkspace();
|
|
19
18
|
const navigate = useNavigate();
|
|
20
|
-
const
|
|
21
|
-
const [providerName, setProviderName] = useQueryState('provider');
|
|
19
|
+
const params = useParams<{ providerId?: string, tab?: string; }>();
|
|
22
20
|
|
|
23
21
|
const isSessionActive = useSessionStore((s) => !!s.activeId);
|
|
24
|
-
const isProvider =
|
|
22
|
+
const isProvider = params.providerId && params.providerId !== 'all';
|
|
25
23
|
|
|
26
24
|
const handleBackClick = () => {
|
|
27
|
-
console.log(
|
|
28
|
-
'gobackclick',
|
|
29
|
-
isSessionActive,
|
|
30
|
-
showMobileWorkspace,
|
|
31
|
-
activeSettingsKey,
|
|
32
|
-
providerName,
|
|
33
|
-
);
|
|
34
25
|
if (isSessionActive && showMobileWorkspace) {
|
|
35
26
|
navigate('/agent');
|
|
36
|
-
} else if (
|
|
37
|
-
|
|
38
|
-
setActiveSettingsKey('provider');
|
|
39
|
-
navigate(-1);
|
|
27
|
+
} else if (isProvider) {
|
|
28
|
+
navigate('/settings/provider/all');
|
|
40
29
|
} else {
|
|
41
30
|
navigate(enableAuth ? '/me/settings' : '/me');
|
|
42
31
|
}
|
|
@@ -49,7 +38,9 @@ const Header = memo(() => {
|
|
|
49
38
|
title={
|
|
50
39
|
<Flexbox align={'center'} gap={8} horizontal>
|
|
51
40
|
<span style={{ lineHeight: 1.2 }}>
|
|
52
|
-
{isProvider
|
|
41
|
+
{isProvider
|
|
42
|
+
? params.providerId
|
|
43
|
+
: t(`tab.${(params.tab || 'all') as SettingsTabs}` as any)}
|
|
53
44
|
</span>
|
|
54
45
|
</Flexbox>
|
|
55
46
|
}
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
import { memo } from 'react';
|
|
4
4
|
import { Outlet } from 'react-router-dom';
|
|
5
5
|
|
|
6
|
+
import MobileContentLayout from '@/components/server/MobileNavLayout';
|
|
7
|
+
|
|
6
8
|
import SettingsContextProvider from '../../../(main)/settings/_layout/ContextProvider';
|
|
9
|
+
import Header from './Header';
|
|
7
10
|
|
|
8
11
|
const MobileSettingsWrapper = memo(() => {
|
|
9
12
|
return (
|
|
@@ -13,7 +16,9 @@ const MobileSettingsWrapper = memo(() => {
|
|
|
13
16
|
showOpenAIProxyUrl: true,
|
|
14
17
|
}}
|
|
15
18
|
>
|
|
16
|
-
<
|
|
19
|
+
<MobileContentLayout header={<Header />}>
|
|
20
|
+
<Outlet />
|
|
21
|
+
</MobileContentLayout>
|
|
17
22
|
</SettingsContextProvider>
|
|
18
23
|
);
|
|
19
24
|
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Outlet, useNavigate, useParams } from 'react-router-dom';
|
|
4
|
+
|
|
5
|
+
import ProviderMenu from '../../../../(main)/settings/provider/ProviderMenu';
|
|
6
|
+
|
|
7
|
+
const Layout = () => {
|
|
8
|
+
const params = useParams<{ providerId: string }>();
|
|
9
|
+
const navigate = useNavigate();
|
|
10
|
+
|
|
11
|
+
const handleProviderSelect = (providerKey: string) => {
|
|
12
|
+
navigate(`/settings/provider/${providerKey}`);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
return params.providerId === 'all' ? (
|
|
16
|
+
<ProviderMenu mobile={true} onProviderSelect={handleProviderSelect} />
|
|
17
|
+
) : (
|
|
18
|
+
<Outlet />
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default Layout;
|
|
@@ -36,7 +36,11 @@ export default {
|
|
|
36
36
|
'agentCronJobs.noExecutionResults': 'No execution results',
|
|
37
37
|
'agentCronJobs.remainingExecutions': 'Remaining: {{count}}',
|
|
38
38
|
'agentCronJobs.save': 'Save',
|
|
39
|
+
'agentCronJobs.saveAsNew': 'Save as New',
|
|
39
40
|
'agentCronJobs.schedule': 'Schedule',
|
|
41
|
+
'agentCronJobs.scheduleType.daily': 'Daily',
|
|
42
|
+
'agentCronJobs.scheduleType.hourly': 'Hourly',
|
|
43
|
+
'agentCronJobs.scheduleType.weekly': 'Weekly',
|
|
40
44
|
'agentCronJobs.status.depleted': 'Depleted',
|
|
41
45
|
'agentCronJobs.status.disabled': 'Disabled',
|
|
42
46
|
'agentCronJobs.status.enabled': 'Enabled',
|
|
@@ -45,6 +49,20 @@ export default {
|
|
|
45
49
|
'agentCronJobs.unlimited': 'Unlimited',
|
|
46
50
|
'agentCronJobs.unnamedTask': 'Unnamed Task',
|
|
47
51
|
'agentCronJobs.updateSuccess': 'Scheduled task updated successfully',
|
|
52
|
+
'agentCronJobs.weekday.friday': 'Friday',
|
|
53
|
+
'agentCronJobs.weekday.monday': 'Monday',
|
|
54
|
+
'agentCronJobs.weekday.saturday': 'Saturday',
|
|
55
|
+
'agentCronJobs.weekday.short.friday': 'Fri',
|
|
56
|
+
'agentCronJobs.weekday.short.monday': 'Mon',
|
|
57
|
+
'agentCronJobs.weekday.short.saturday': 'Sat',
|
|
58
|
+
'agentCronJobs.weekday.short.sunday': 'Sun',
|
|
59
|
+
'agentCronJobs.weekday.short.thursday': 'Thu',
|
|
60
|
+
'agentCronJobs.weekday.short.tuesday': 'Tue',
|
|
61
|
+
'agentCronJobs.weekday.short.wednesday': 'Wed',
|
|
62
|
+
'agentCronJobs.weekday.sunday': 'Sunday',
|
|
63
|
+
'agentCronJobs.weekday.thursday': 'Thursday',
|
|
64
|
+
'agentCronJobs.weekday.tuesday': 'Tuesday',
|
|
65
|
+
'agentCronJobs.weekday.wednesday': 'Wednesday',
|
|
48
66
|
'agentCronJobs.weekdays': 'Weekdays',
|
|
49
67
|
'agentInfoDescription.basic.avatar': 'Avatar',
|
|
50
68
|
'agentInfoDescription.basic.description': 'Description',
|
|
@@ -622,6 +640,7 @@ export default {
|
|
|
622
640
|
'systemAgent.translation.title': 'Message Translation Agent',
|
|
623
641
|
'tab.about': 'About',
|
|
624
642
|
'tab.agent': 'Agent Service',
|
|
643
|
+
'tab.all': 'All',
|
|
625
644
|
'tab.apikey': 'API Key Management',
|
|
626
645
|
'tab.chatAppearance': 'Chat Appearance',
|
|
627
646
|
'tab.common': 'Appearance',
|