Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qjclaw-dmg
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
AI-甘富林
qjclaw-dmg
Commits
d60ecae9
Commit
d60ecae9
authored
May 15, 2026
by
edy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(settings): edit model endpoint configs
parent
c591100b
Changes
10
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
391 additions
and
108 deletions
+391
-108
app-config.ts
apps/desktop/src/main/services/app-config.ts
+18
-12
App.tsx
apps/ui/src/App.tsx
+91
-16
SettingsPanels.tsx
apps/ui/src/features/settings/SettingsPanels.tsx
+130
-33
settingsDrafts.ts
apps/ui/src/features/settings/settingsDrafts.ts
+27
-3
useSaveSettings.ts
apps/ui/src/features/settings/useSaveSettings.ts
+54
-16
useSettingsState.ts
apps/ui/src/features/settings/useSettingsState.ts
+24
-0
useSmokeActionHandlers.ts
apps/ui/src/features/smoke/useSmokeActionHandlers.ts
+1
-1
mock-desktop-api.ts
apps/ui/src/lib/mock-desktop-api.ts
+6
-3
settingsDrafts.test.ts
apps/ui/test/settingsDrafts.test.ts
+10
-4
settingsPanelsSource.test.ts
apps/ui/test/settingsPanelsSource.test.ts
+30
-20
No files found.
apps/desktop/src/main/services/app-config.ts
View file @
d60ecae9
...
@@ -223,19 +223,19 @@ function mergeExpertModelConfig(
...
@@ -223,19 +223,19 @@ function mergeExpertModelConfig(
):
ExpertModelConfig
{
):
ExpertModelConfig
{
return
{
return
{
image
:
{
image
:
{
baseUrl
:
FIXED_EXPERT_MODEL_ENDPOINTS
.
image
.
baseUrl
,
baseUrl
:
typeof
input
?.
image
?.
baseUrl
===
"string"
?
input
.
image
.
baseUrl
.
trim
()
:
current
.
image
.
baseUrl
,
apiKeyConfigured
:
typeof
input
?.
image
?.
apiKey
===
"string"
?
Boolean
(
input
.
image
.
apiKey
.
trim
())
:
current
.
image
.
apiKeyConfigured
,
apiKeyConfigured
:
typeof
input
?.
image
?.
apiKey
===
"string"
?
Boolean
(
input
.
image
.
apiKey
.
trim
())
:
current
.
image
.
apiKeyConfigured
,
modelId
:
FIXED_EXPERT_MODEL_ENDPOINTS
.
image
.
modelId
modelId
:
typeof
input
?.
image
?.
modelId
===
"string"
?
input
.
image
.
modelId
.
trim
()
:
current
.
image
.
modelId
},
},
video
:
{
video
:
{
baseUrl
:
FIXED_EXPERT_MODEL_ENDPOINTS
.
video
.
baseUrl
,
baseUrl
:
typeof
input
?.
video
?.
baseUrl
===
"string"
?
input
.
video
.
baseUrl
.
trim
()
:
current
.
video
.
baseUrl
,
apiKeyConfigured
:
typeof
input
?.
video
?.
apiKey
===
"string"
?
Boolean
(
input
.
video
.
apiKey
.
trim
())
:
current
.
video
.
apiKeyConfigured
,
apiKeyConfigured
:
typeof
input
?.
video
?.
apiKey
===
"string"
?
Boolean
(
input
.
video
.
apiKey
.
trim
())
:
current
.
video
.
apiKeyConfigured
,
modelId
:
FIXED_EXPERT_MODEL_ENDPOINTS
.
video
.
modelId
modelId
:
typeof
input
?.
video
?.
modelId
===
"string"
?
input
.
video
.
modelId
.
trim
()
:
current
.
video
.
modelId
},
},
copywriting
:
{
copywriting
:
{
baseUrl
:
FIXED_EXPERT_MODEL_ENDPOINTS
.
copywriting
.
baseUrl
,
baseUrl
:
typeof
input
?.
copywriting
?.
baseUrl
===
"string"
?
input
.
copywriting
.
baseUrl
.
trim
()
:
current
.
copywriting
.
baseUrl
,
apiKeyConfigured
:
typeof
input
?.
copywriting
?.
apiKey
===
"string"
?
Boolean
(
input
.
copywriting
.
apiKey
.
trim
())
:
current
.
copywriting
.
apiKeyConfigured
,
apiKeyConfigured
:
typeof
input
?.
copywriting
?.
apiKey
===
"string"
?
Boolean
(
input
.
copywriting
.
apiKey
.
trim
())
:
current
.
copywriting
.
apiKeyConfigured
,
modelId
:
FIXED_EXPERT_MODEL_ENDPOINTS
.
copywriting
.
modelId
modelId
:
typeof
input
?.
copywriting
?.
modelId
===
"string"
?
input
.
copywriting
.
modelId
.
trim
()
:
current
.
copywriting
.
modelId
},
},
digitalHuman
:
{
digitalHuman
:
{
...
FIXED_DIGITAL_HUMAN_CONFIG
,
...
FIXED_DIGITAL_HUMAN_CONFIG
,
...
@@ -395,19 +395,25 @@ export class AppConfigService {
...
@@ -395,19 +395,25 @@ export class AppConfigService {
runtimeMode: normalizeRuntimeMode(config.runtimeMode ?? process.env.QJCLAW_RUNTIME_MODE),
runtimeMode: normalizeRuntimeMode(config.runtimeMode ?? process.env.QJCLAW_RUNTIME_MODE),
expertModelConfig: {
expertModelConfig: {
image: {
image: {
baseUrl: defaultExpertModelConfig.image.baseUrl,
baseUrl: typeof config.expertModelConfig?.image?.baseUrl === "string"
? config.expertModelConfig.image.baseUrl
: defaultExpertModelConfig.image.baseUrl,
apiKeyConfigured: Boolean(config.expertModelConfig?.image?.apiKeyConfigured),
apiKeyConfigured: Boolean(config.expertModelConfig?.image?.apiKeyConfigured),
modelId: defaultExpertModelConfig.image.modelId
modelId:
config.expertModelConfig?.image?.modelId ??
defaultExpertModelConfig.image.modelId
},
},
video: {
video: {
baseUrl: defaultExpertModelConfig.video.baseUrl,
baseUrl: typeof config.expertModelConfig?.video?.baseUrl === "string"
? config.expertModelConfig.video.baseUrl
: defaultExpertModelConfig.video.baseUrl,
apiKeyConfigured: Boolean(config.expertModelConfig?.video?.apiKeyConfigured),
apiKeyConfigured: Boolean(config.expertModelConfig?.video?.apiKeyConfigured),
modelId: defaultExpertModelConfig.video.modelId
modelId:
config.expertModelConfig?.video?.modelId ??
defaultExpertModelConfig.video.modelId
},
},
copywriting: {
copywriting: {
baseUrl: defaultExpertModelConfig.copywriting.baseUrl,
baseUrl: typeof config.expertModelConfig?.copywriting?.baseUrl === "string"
? config.expertModelConfig.copywriting.baseUrl
: defaultExpertModelConfig.copywriting.baseUrl,
apiKeyConfigured: Boolean(config.expertModelConfig?.copywriting?.apiKeyConfigured),
apiKeyConfigured: Boolean(config.expertModelConfig?.copywriting?.apiKeyConfigured),
modelId: defaultExpertModelConfig.copywriting.modelId
modelId:
config.expertModelConfig?.copywriting?.modelId ??
defaultExpertModelConfig.copywriting.modelId
},
},
digitalHuman: {
digitalHuman: {
...FIXED_DIGITAL_HUMAN_CONFIG,
...FIXED_DIGITAL_HUMAN_CONFIG,
...
...
apps/ui/src/App.tsx
View file @
d60ecae9
...
@@ -366,10 +366,22 @@ export default function App() {
...
@@ -366,10 +366,22 @@ export default function App() {
setWorkspacePathDraft
,
setWorkspacePathDraft
,
imageModelApiKeyDraft
,
imageModelApiKeyDraft
,
setImageModelApiKeyDraft
,
setImageModelApiKeyDraft
,
imageModelBaseUrlDraft
,
setImageModelBaseUrlDraft
,
imageModelModelIdDraft
,
setImageModelModelIdDraft
,
videoModelApiKeyDraft
,
videoModelApiKeyDraft
,
setVideoModelApiKeyDraft
,
setVideoModelApiKeyDraft
,
videoModelBaseUrlDraft
,
setVideoModelBaseUrlDraft
,
videoModelModelIdDraft
,
setVideoModelModelIdDraft
,
copywritingModelApiKeyDraft
,
copywritingModelApiKeyDraft
,
setCopywritingModelApiKeyDraft
,
setCopywritingModelApiKeyDraft
,
copywritingModelBaseUrlDraft
,
setCopywritingModelBaseUrlDraft
,
copywritingModelModelIdDraft
,
setCopywritingModelModelIdDraft
,
digitalHumanVolcAccessKeyDraft
,
digitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKeyDraft
,
digitalHumanVolcSecretKeyDraft
,
digitalHumanVolcSecretKeyDraft
,
...
@@ -436,8 +448,14 @@ export default function App() {
...
@@ -436,8 +448,14 @@ export default function App() {
lobsterKey
:
lobsterKeyDraft
,
lobsterKey
:
lobsterKeyDraft
,
workspacePath
:
workspacePathDraft
,
workspacePath
:
workspacePathDraft
,
imageModelApiKey
:
imageModelApiKeyDraft
,
imageModelApiKey
:
imageModelApiKeyDraft
,
imageModelBaseUrl
:
imageModelBaseUrlDraft
,
imageModelModelId
:
imageModelModelIdDraft
,
videoModelApiKey
:
videoModelApiKeyDraft
,
videoModelApiKey
:
videoModelApiKeyDraft
,
videoModelBaseUrl
:
videoModelBaseUrlDraft
,
videoModelModelId
:
videoModelModelIdDraft
,
copywritingModelApiKey
:
copywritingModelApiKeyDraft
,
copywritingModelApiKey
:
copywritingModelApiKeyDraft
,
copywritingModelBaseUrl
:
copywritingModelBaseUrlDraft
,
copywritingModelModelId
:
copywritingModelModelIdDraft
,
digitalHumanVolcAccessKey
:
digitalHumanVolcAccessKeyDraft
,
digitalHumanVolcAccessKey
:
digitalHumanVolcAccessKeyDraft
,
digitalHumanVolcSecretKey
:
digitalHumanVolcSecretKeyDraft
,
digitalHumanVolcSecretKey
:
digitalHumanVolcSecretKeyDraft
,
digitalHumanQiniuAccessKey
:
digitalHumanQiniuAccessKeyDraft
,
digitalHumanQiniuAccessKey
:
digitalHumanQiniuAccessKeyDraft
,
...
@@ -464,14 +482,26 @@ export default function App() {
...
@@ -464,14 +482,26 @@ export default function App() {
setWorkspacePathDraft
,
setWorkspacePathDraft
,
setLobsterKeyDraft
,
setLobsterKeyDraft
,
setImageModelApiKeyDraft
,
setImageModelApiKeyDraft
,
setImageModelBaseUrlDraft
,
setImageModelModelIdDraft
,
setVideoModelApiKeyDraft
,
setVideoModelApiKeyDraft
,
setVideoModelBaseUrlDraft
,
setVideoModelModelIdDraft
,
setCopywritingModelApiKeyDraft
,
setCopywritingModelApiKeyDraft
,
setCopywritingModelBaseUrlDraft
,
setCopywritingModelModelIdDraft
,
setDigitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcSecretKeyDraft
,
setDigitalHumanVolcSecretKeyDraft
,
setDigitalHumanQiniuAccessKeyDraft
,
setDigitalHumanQiniuAccessKeyDraft
,
setDigitalHumanQiniuSecretKeyDraft
,
setDigitalHumanQiniuSecretKeyDraft
,
setVideoAnalyzerBaseUrlDraft
,
setVideoAnalyzerModelIdDraft
,
setVideoAnalyzerApiKeyDraft
,
setVideoAnalyzerApiKeyDraft
,
setReplicationBriefBaseUrlDraft
,
setReplicationBriefModelIdDraft
,
setReplicationBriefApiKeyDraft
,
setReplicationBriefApiKeyDraft
,
setVectcutBaseUrlDraft
,
setVectcutFileBaseUrlDraft
,
setVectcutApiKeyDraft
,
setVectcutApiKeyDraft
,
setXhsFeishuAppIdDraft
,
setXhsFeishuAppIdDraft
,
setXhsFeishuAppSecretDraft
,
setXhsFeishuAppSecretDraft
,
...
@@ -506,9 +536,21 @@ export default function App() {
...
@@ -506,9 +536,21 @@ export default function App() {
const
displayedWorkspacePath
=
workspacePathDraft
.
trim
()
||
savedWorkspacePath
||
ui
.
none
;
const
displayedWorkspacePath
=
workspacePathDraft
.
trim
()
||
savedWorkspacePath
||
ui
.
none
;
const
hasPendingWorkspacePathChange
=
Boolean
(
config
&&
workspacePathDraft
.
trim
()
&&
workspacePathDraft
.
trim
()
!==
savedWorkspacePath
);
const
hasPendingWorkspacePathChange
=
Boolean
(
config
&&
workspacePathDraft
.
trim
()
&&
workspacePathDraft
.
trim
()
!==
savedWorkspacePath
);
const
hasPendingBasicConfig
=
hasPendingLobsterKey
||
hasPendingWorkspacePathChange
;
const
hasPendingBasicConfig
=
hasPendingLobsterKey
||
hasPendingWorkspacePathChange
;
const
hasPendingCopywritingConfig
=
Boolean
(
copywritingModelApiKeyDraft
.
trim
());
const
hasPendingCopywritingConfig
=
Boolean
(
const
hasPendingImageConfig
=
Boolean
(
imageModelApiKeyDraft
.
trim
());
copywritingModelBaseUrlDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
copywriting
.
baseUrl
??
""
).
trim
()
const
hasPendingVideoConfig
=
Boolean
(
videoModelApiKeyDraft
.
trim
());
||
copywritingModelModelIdDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
copywriting
.
modelId
??
""
).
trim
()
||
copywritingModelApiKeyDraft
.
trim
()
);
const
hasPendingImageConfig
=
Boolean
(
imageModelBaseUrlDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
image
.
baseUrl
??
""
).
trim
()
||
imageModelModelIdDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
image
.
modelId
??
""
).
trim
()
||
imageModelApiKeyDraft
.
trim
()
);
const
hasPendingVideoConfig
=
Boolean
(
videoModelBaseUrlDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
video
.
baseUrl
??
""
).
trim
()
||
videoModelModelIdDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
video
.
modelId
??
""
).
trim
()
||
videoModelApiKeyDraft
.
trim
()
);
const
hasPendingDigitalHumanConfig
=
Boolean
(
const
hasPendingDigitalHumanConfig
=
Boolean
(
digitalHumanVolcAccessKeyDraft
.
trim
()
digitalHumanVolcAccessKeyDraft
.
trim
()
||
digitalHumanVolcSecretKeyDraft
.
trim
()
||
digitalHumanVolcSecretKeyDraft
.
trim
()
...
@@ -544,14 +586,35 @@ export default function App() {
...
@@ -544,14 +586,35 @@ export default function App() {
setXhsFeishuTableIdDraft
(
drafts
.
xhsFeishuTableId
);
setXhsFeishuTableIdDraft
(
drafts
.
xhsFeishuTableId
);
},
[]);
},
[]);
const
resetCopywritingSettingsDrafts
=
useCallback
(()
=>
{
const
resetCopywritingSettingsDrafts
=
useCallback
(()
=>
{
setCopywritingModelApiKeyDraft
(
getResetCopywritingSettingsDrafts
().
copywritingModelApiKey
);
if
(
!
config
)
{
},
[]);
return
;
}
const
drafts
=
getResetCopywritingSettingsDrafts
(
config
);
setCopywritingModelBaseUrlDraft
(
drafts
.
copywritingModelBaseUrl
);
setCopywritingModelModelIdDraft
(
drafts
.
copywritingModelModelId
);
setCopywritingModelApiKeyDraft
(
drafts
.
copywritingModelApiKey
);
},
[
config
]);
const
resetImageSettingsDrafts
=
useCallback
(()
=>
{
const
resetImageSettingsDrafts
=
useCallback
(()
=>
{
setImageModelApiKeyDraft
(
getResetImageSettingsDrafts
().
imageModelApiKey
);
if
(
!
config
)
{
},
[]);
return
;
}
const
drafts
=
getResetImageSettingsDrafts
(
config
);
setImageModelBaseUrlDraft
(
drafts
.
imageModelBaseUrl
);
setImageModelModelIdDraft
(
drafts
.
imageModelModelId
);
setImageModelApiKeyDraft
(
drafts
.
imageModelApiKey
);
},
[
config
]);
const
resetVideoSettingsDrafts
=
useCallback
(()
=>
{
const
resetVideoSettingsDrafts
=
useCallback
(()
=>
{
setVideoModelApiKeyDraft
(
getResetVideoSettingsDrafts
().
videoModelApiKey
);
if
(
!
config
)
{
},
[]);
return
;
}
const
drafts
=
getResetVideoSettingsDrafts
(
config
);
setVideoModelBaseUrlDraft
(
drafts
.
videoModelBaseUrl
);
setVideoModelModelIdDraft
(
drafts
.
videoModelModelId
);
setVideoModelApiKeyDraft
(
drafts
.
videoModelApiKey
);
},
[
config
]);
const
resetDigitalHumanSettingsDrafts
=
useCallback
(()
=>
{
const
resetDigitalHumanSettingsDrafts
=
useCallback
(()
=>
{
const
drafts
=
getResetDigitalHumanSettingsDrafts
();
const
drafts
=
getResetDigitalHumanSettingsDrafts
();
setDigitalHumanVolcAccessKeyDraft
(
drafts
.
digitalHumanVolcAccessKey
);
setDigitalHumanVolcAccessKeyDraft
(
drafts
.
digitalHumanVolcAccessKey
);
...
@@ -1419,8 +1482,14 @@ export default function App() {
...
@@ -1419,8 +1482,14 @@ export default function App() {
xhsFeishuAppSecret
:
xhsFeishuAppSecretDraft
,
xhsFeishuAppSecret
:
xhsFeishuAppSecretDraft
,
xhsFeishuAppToken
:
xhsFeishuAppTokenDraft
,
xhsFeishuAppToken
:
xhsFeishuAppTokenDraft
,
xhsFeishuTableId
:
xhsFeishuTableIdDraft
,
xhsFeishuTableId
:
xhsFeishuTableIdDraft
,
copywritingModelBaseUrl
:
copywritingModelBaseUrlDraft
,
copywritingModelModelId
:
copywritingModelModelIdDraft
,
copywritingModelApiKey
:
copywritingModelApiKeyDraft
,
copywritingModelApiKey
:
copywritingModelApiKeyDraft
,
imageModelBaseUrl
:
imageModelBaseUrlDraft
,
imageModelModelId
:
imageModelModelIdDraft
,
imageModelApiKey
:
imageModelApiKeyDraft
,
imageModelApiKey
:
imageModelApiKeyDraft
,
videoModelBaseUrl
:
videoModelBaseUrlDraft
,
videoModelModelId
:
videoModelModelIdDraft
,
videoModelApiKey
:
videoModelApiKeyDraft
,
videoModelApiKey
:
videoModelApiKeyDraft
,
digitalHumanVolcAccessKey
:
digitalHumanVolcAccessKeyDraft
,
digitalHumanVolcAccessKey
:
digitalHumanVolcAccessKeyDraft
,
digitalHumanVolcSecretKey
:
digitalHumanVolcSecretKeyDraft
,
digitalHumanVolcSecretKey
:
digitalHumanVolcSecretKeyDraft
,
...
@@ -1442,8 +1511,14 @@ export default function App() {
...
@@ -1442,8 +1511,14 @@ export default function App() {
setXhsFeishuAppSecret
:
setXhsFeishuAppSecretDraft
,
setXhsFeishuAppSecret
:
setXhsFeishuAppSecretDraft
,
setXhsFeishuAppToken
:
setXhsFeishuAppTokenDraft
,
setXhsFeishuAppToken
:
setXhsFeishuAppTokenDraft
,
setXhsFeishuTableId
:
setXhsFeishuTableIdDraft
,
setXhsFeishuTableId
:
setXhsFeishuTableIdDraft
,
setCopywritingModelBaseUrl
:
setCopywritingModelBaseUrlDraft
,
setCopywritingModelModelId
:
setCopywritingModelModelIdDraft
,
setCopywritingModelApiKey
:
setCopywritingModelApiKeyDraft
,
setCopywritingModelApiKey
:
setCopywritingModelApiKeyDraft
,
setImageModelBaseUrl
:
setImageModelBaseUrlDraft
,
setImageModelModelId
:
setImageModelModelIdDraft
,
setImageModelApiKey
:
setImageModelApiKeyDraft
,
setImageModelApiKey
:
setImageModelApiKeyDraft
,
setVideoModelBaseUrl
:
setVideoModelBaseUrlDraft
,
setVideoModelModelId
:
setVideoModelModelIdDraft
,
setVideoModelApiKey
:
setVideoModelApiKeyDraft
,
setVideoModelApiKey
:
setVideoModelApiKeyDraft
,
setDigitalHumanVolcAccessKey
:
setDigitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKey
:
setDigitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcSecretKey
:
setDigitalHumanVolcSecretKeyDraft
,
setDigitalHumanVolcSecretKey
:
setDigitalHumanVolcSecretKeyDraft
,
...
@@ -1459,18 +1534,18 @@ export default function App() {
...
@@ -1459,18 +1534,18 @@ export default function App() {
setVectcutFileBaseUrl
:
setVectcutFileBaseUrlDraft
,
setVectcutFileBaseUrl
:
setVectcutFileBaseUrlDraft
,
setVectcutApiKey
:
setVectcutApiKeyDraft
setVectcutApiKey
:
setVectcutApiKeyDraft
},
},
onSaveLobsterKey
:
()
=>
void
saveLobsterKey
()
,
onSaveLobsterKey
:
saveLobsterKey
,
onSaveXhsFeishuConfig
:
()
=>
void
saveXhsFeishuConfig
()
,
onSaveXhsFeishuConfig
:
saveXhsFeishuConfig
,
onResetXhsFeishuConfig
:
resetXhsFeishuSettingsDrafts
,
onResetXhsFeishuConfig
:
resetXhsFeishuSettingsDrafts
,
onSaveCopywritingConfig
:
()
=>
void
saveCopywritingConfig
()
,
onSaveCopywritingConfig
:
saveCopywritingConfig
,
onResetCopywritingConfig
:
resetCopywritingSettingsDrafts
,
onResetCopywritingConfig
:
resetCopywritingSettingsDrafts
,
onSaveImageConfig
:
()
=>
void
saveImageConfig
()
,
onSaveImageConfig
:
saveImageConfig
,
onResetImageConfig
:
resetImageSettingsDrafts
,
onResetImageConfig
:
resetImageSettingsDrafts
,
onSaveVideoConfig
:
()
=>
void
saveVideoConfig
()
,
onSaveVideoConfig
:
saveVideoConfig
,
onResetVideoConfig
:
resetVideoSettingsDrafts
,
onResetVideoConfig
:
resetVideoSettingsDrafts
,
onSaveDigitalHumanConfig
:
()
=>
void
saveDigitalHumanConfig
()
,
onSaveDigitalHumanConfig
:
saveDigitalHumanConfig
,
onResetDigitalHumanConfig
:
resetDigitalHumanSettingsDrafts
,
onResetDigitalHumanConfig
:
resetDigitalHumanSettingsDrafts
,
onSaveDouyinRuntimeConfig
:
()
=>
void
saveDouyinRuntimeConfig
()
,
onSaveDouyinRuntimeConfig
:
saveDouyinRuntimeConfig
,
onResetDouyinRuntimeConfig
:
resetDouyinRuntimeSettingsDrafts
,
onResetDouyinRuntimeConfig
:
resetDouyinRuntimeSettingsDrafts
,
onRevealSecret
:
revealConfigSecret
,
onRevealSecret
:
revealConfigSecret
,
pickWorkspaceDirectory
,
pickWorkspaceDirectory
,
...
...
apps/ui/src/features/settings/SettingsPanels.tsx
View file @
d60ecae9
This diff is collapsed.
Click to expand it.
apps/ui/src/features/settings/settingsDrafts.ts
View file @
d60ecae9
...
@@ -22,6 +22,24 @@ export interface DigitalHumanResetSettingsDrafts {
...
@@ -22,6 +22,24 @@ export interface DigitalHumanResetSettingsDrafts {
digitalHumanQiniuSecretKey
:
string
digitalHumanQiniuSecretKey
:
string
}
}
export
interface
CopywritingResetSettingsDrafts
{
copywritingModelBaseUrl
:
string
copywritingModelModelId
:
string
copywritingModelApiKey
:
string
}
export
interface
ImageResetSettingsDrafts
{
imageModelBaseUrl
:
string
imageModelModelId
:
string
imageModelApiKey
:
string
}
export
interface
VideoResetSettingsDrafts
{
videoModelBaseUrl
:
string
videoModelModelId
:
string
videoModelApiKey
:
string
}
export
interface
DouyinRuntimeResetSettingsDrafts
{
export
interface
DouyinRuntimeResetSettingsDrafts
{
videoAnalyzerBaseUrl
:
string
videoAnalyzerBaseUrl
:
string
videoAnalyzerModelId
:
string
videoAnalyzerModelId
:
string
...
@@ -58,20 +76,26 @@ export function getResetBasicSettingsDrafts(config: AppConfig): BasicResetSettin
...
@@ -58,20 +76,26 @@ export function getResetBasicSettingsDrafts(config: AppConfig): BasicResetSettin
}
}
}
}
export
function
getResetCopywritingSettingsDrafts
(
)
{
export
function
getResetCopywritingSettingsDrafts
(
config
:
AppConfig
):
CopywritingResetSettingsDrafts
{
return
{
return
{
copywritingModelBaseUrl
:
config
.
expertModelConfig
.
copywriting
.
baseUrl
,
copywritingModelModelId
:
config
.
expertModelConfig
.
copywriting
.
modelId
??
""
,
copywritingModelApiKey
:
""
copywritingModelApiKey
:
""
}
}
}
}
export
function
getResetImageSettingsDrafts
(
)
{
export
function
getResetImageSettingsDrafts
(
config
:
AppConfig
):
ImageResetSettingsDrafts
{
return
{
return
{
imageModelBaseUrl
:
config
.
expertModelConfig
.
image
.
baseUrl
,
imageModelModelId
:
config
.
expertModelConfig
.
image
.
modelId
??
""
,
imageModelApiKey
:
""
imageModelApiKey
:
""
}
}
}
}
export
function
getResetVideoSettingsDrafts
(
)
{
export
function
getResetVideoSettingsDrafts
(
config
:
AppConfig
):
VideoResetSettingsDrafts
{
return
{
return
{
videoModelBaseUrl
:
config
.
expertModelConfig
.
video
.
baseUrl
,
videoModelModelId
:
config
.
expertModelConfig
.
video
.
modelId
??
""
,
videoModelApiKey
:
""
videoModelApiKey
:
""
}
}
}
}
...
...
apps/ui/src/features/settings/useSaveSettings.ts
View file @
d60ecae9
...
@@ -9,8 +9,14 @@ interface UseSaveSettingsOptions {
...
@@ -9,8 +9,14 @@ interface UseSaveSettingsOptions {
lobsterKey
:
string
lobsterKey
:
string
workspacePath
:
string
workspacePath
:
string
imageModelApiKey
:
string
imageModelApiKey
:
string
imageModelBaseUrl
:
string
imageModelModelId
:
string
videoModelApiKey
:
string
videoModelApiKey
:
string
videoModelBaseUrl
:
string
videoModelModelId
:
string
copywritingModelApiKey
:
string
copywritingModelApiKey
:
string
copywritingModelBaseUrl
:
string
copywritingModelModelId
:
string
digitalHumanVolcAccessKey
:
string
digitalHumanVolcAccessKey
:
string
digitalHumanVolcSecretKey
:
string
digitalHumanVolcSecretKey
:
string
digitalHumanQiniuAccessKey
:
string
digitalHumanQiniuAccessKey
:
string
...
@@ -37,14 +43,26 @@ interface UseSaveSettingsOptions {
...
@@ -37,14 +43,26 @@ interface UseSaveSettingsOptions {
setWorkspacePathDraft
(
value
:
string
):
void
setWorkspacePathDraft
(
value
:
string
):
void
setLobsterKeyDraft
(
value
:
string
):
void
setLobsterKeyDraft
(
value
:
string
):
void
setImageModelApiKeyDraft
(
value
:
string
):
void
setImageModelApiKeyDraft
(
value
:
string
):
void
setImageModelBaseUrlDraft
(
value
:
string
):
void
setImageModelModelIdDraft
(
value
:
string
):
void
setVideoModelApiKeyDraft
(
value
:
string
):
void
setVideoModelApiKeyDraft
(
value
:
string
):
void
setVideoModelBaseUrlDraft
(
value
:
string
):
void
setVideoModelModelIdDraft
(
value
:
string
):
void
setCopywritingModelApiKeyDraft
(
value
:
string
):
void
setCopywritingModelApiKeyDraft
(
value
:
string
):
void
setCopywritingModelBaseUrlDraft
(
value
:
string
):
void
setCopywritingModelModelIdDraft
(
value
:
string
):
void
setDigitalHumanVolcAccessKeyDraft
(
value
:
string
):
void
setDigitalHumanVolcAccessKeyDraft
(
value
:
string
):
void
setDigitalHumanVolcSecretKeyDraft
(
value
:
string
):
void
setDigitalHumanVolcSecretKeyDraft
(
value
:
string
):
void
setDigitalHumanQiniuAccessKeyDraft
(
value
:
string
):
void
setDigitalHumanQiniuAccessKeyDraft
(
value
:
string
):
void
setDigitalHumanQiniuSecretKeyDraft
(
value
:
string
):
void
setDigitalHumanQiniuSecretKeyDraft
(
value
:
string
):
void
setVideoAnalyzerBaseUrlDraft
(
value
:
string
):
void
setVideoAnalyzerModelIdDraft
(
value
:
string
):
void
setVideoAnalyzerApiKeyDraft
(
value
:
string
):
void
setVideoAnalyzerApiKeyDraft
(
value
:
string
):
void
setReplicationBriefBaseUrlDraft
(
value
:
string
):
void
setReplicationBriefModelIdDraft
(
value
:
string
):
void
setReplicationBriefApiKeyDraft
(
value
:
string
):
void
setReplicationBriefApiKeyDraft
(
value
:
string
):
void
setVectcutBaseUrlDraft
(
value
:
string
):
void
setVectcutFileBaseUrlDraft
(
value
:
string
):
void
setVectcutApiKeyDraft
(
value
:
string
):
void
setVectcutApiKeyDraft
(
value
:
string
):
void
setXhsFeishuAppIdDraft
(
value
:
string
):
void
setXhsFeishuAppIdDraft
(
value
:
string
):
void
setXhsFeishuAppSecretDraft
(
value
:
string
):
void
setXhsFeishuAppSecretDraft
(
value
:
string
):
void
...
@@ -80,7 +98,7 @@ export function useSaveSettings({
...
@@ -80,7 +98,7 @@ export function useSaveSettings({
resetDrafts
?:
(
savedConfig
:
AppConfig
)
=>
void
resetDrafts
?:
(
savedConfig
:
AppConfig
)
=>
void
})
=>
{
})
=>
{
if
(
!
config
||
saving
)
{
if
(
!
config
||
saving
)
{
return
return
false
}
}
const
input
:
SaveConfigInput
=
{
const
input
:
SaveConfigInput
=
{
...
@@ -119,15 +137,17 @@ export function useSaveSettings({
...
@@ -119,15 +137,17 @@ export function useSaveSettings({
options
?.
resetDrafts
?.(
savedConfig
)
options
?.
resetDrafts
?.(
savedConfig
)
setters
.
setInfoText
(
options
?.
successMessage
??
(
trimmedLobsterKey
?
labels
.
saveSuccessPending
:
labels
.
saveSuccessApplied
))
setters
.
setInfoText
(
options
?.
successMessage
??
(
trimmedLobsterKey
?
labels
.
saveSuccessPending
:
labels
.
saveSuccessApplied
))
void
refresh
(
false
)
void
refresh
(
false
)
return
true
}
catch
(
error
)
{
}
catch
(
error
)
{
setters
.
setErrorText
(
normalizeError
(
error
))
setters
.
setErrorText
(
normalizeError
(
error
))
return
false
}
finally
{
}
finally
{
setters
.
setSaving
(
false
)
setters
.
setSaving
(
false
)
}
}
},
[
config
,
desktopApi
,
labels
.
saveSuccessApplied
,
labels
.
saveSuccessPending
,
normalizeError
,
refresh
,
saving
,
setters
])
},
[
config
,
desktopApi
,
labels
.
saveSuccessApplied
,
labels
.
saveSuccessPending
,
normalizeError
,
refresh
,
saving
,
setters
])
const
saveLobsterKey
=
useCallback
(
async
()
=>
{
const
saveLobsterKey
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
lobsterKey
:
drafts
.
lobsterKey
,
lobsterKey
:
drafts
.
lobsterKey
,
resetDrafts
:
()
=>
{
resetDrafts
:
()
=>
{
setters
.
setLobsterKeyDraft
(
""
)
setters
.
setLobsterKeyDraft
(
""
)
...
@@ -165,7 +185,7 @@ export function useSaveSettings({
...
@@ -165,7 +185,7 @@ export function useSaveSettings({
},
[
config
,
setters
])
},
[
config
,
setters
])
const
saveWorkspaceDirectory
=
useCallback
(
async
()
=>
{
const
saveWorkspaceDirectory
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
workspacePath
:
drafts
.
workspacePath
,
workspacePath
:
drafts
.
workspacePath
,
successMessage
:
labels
.
workspaceSaved
,
successMessage
:
labels
.
workspaceSaved
,
resetDrafts
:
(
savedConfig
)
=>
{
resetDrafts
:
(
savedConfig
)
=>
{
...
@@ -175,7 +195,7 @@ export function useSaveSettings({
...
@@ -175,7 +195,7 @@ export function useSaveSettings({
},
[
drafts
.
workspacePath
,
labels
.
workspaceSaved
,
saveConfig
,
setters
])
},
[
drafts
.
workspacePath
,
labels
.
workspaceSaved
,
saveConfig
,
setters
])
const
saveXhsFeishuConfig
=
useCallback
(
async
()
=>
{
const
saveXhsFeishuConfig
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
xhsFeishuConfig
:
{
xhsFeishuConfig
:
{
appId
:
drafts
.
xhsFeishuAppId
.
trim
()
||
undefined
,
appId
:
drafts
.
xhsFeishuAppId
.
trim
()
||
undefined
,
appSecret
:
drafts
.
xhsFeishuAppSecret
.
trim
()
||
undefined
,
appSecret
:
drafts
.
xhsFeishuAppSecret
.
trim
()
||
undefined
,
...
@@ -192,46 +212,58 @@ export function useSaveSettings({
...
@@ -192,46 +212,58 @@ export function useSaveSettings({
},
[
drafts
.
xhsFeishuAppId
,
drafts
.
xhsFeishuAppSecret
,
drafts
.
xhsFeishuAppToken
,
drafts
.
xhsFeishuTableId
,
saveConfig
,
setters
])
},
[
drafts
.
xhsFeishuAppId
,
drafts
.
xhsFeishuAppSecret
,
drafts
.
xhsFeishuAppToken
,
drafts
.
xhsFeishuTableId
,
saveConfig
,
setters
])
const
saveCopywritingConfig
=
useCallback
(
async
()
=>
{
const
saveCopywritingConfig
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
expertModelConfig
:
{
expertModelConfig
:
{
copywriting
:
{
copywriting
:
{
baseUrl
:
drafts
.
copywritingModelBaseUrl
.
trim
()
||
undefined
,
modelId
:
drafts
.
copywritingModelModelId
.
trim
()
||
undefined
,
apiKey
:
drafts
.
copywritingModelApiKey
.
trim
()
||
undefined
apiKey
:
drafts
.
copywritingModelApiKey
.
trim
()
||
undefined
}
}
},
},
resetDrafts
:
()
=>
{
resetDrafts
:
(
savedConfig
)
=>
{
setters
.
setCopywritingModelApiKeyDraft
(
""
)
setters
.
setCopywritingModelApiKeyDraft
(
""
)
setters
.
setCopywritingModelBaseUrlDraft
(
savedConfig
.
expertModelConfig
.
copywriting
.
baseUrl
)
setters
.
setCopywritingModelModelIdDraft
(
savedConfig
.
expertModelConfig
.
copywriting
.
modelId
??
""
)
}
}
})
})
},
[
drafts
.
copywritingModelApiKey
,
saveConfig
,
setters
])
},
[
drafts
.
copywritingModelApiKey
,
drafts
.
copywritingModelBaseUrl
,
drafts
.
copywritingModelModelId
,
saveConfig
,
setters
])
const
saveImageConfig
=
useCallback
(
async
()
=>
{
const
saveImageConfig
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
expertModelConfig
:
{
expertModelConfig
:
{
image
:
{
image
:
{
baseUrl
:
drafts
.
imageModelBaseUrl
.
trim
()
||
undefined
,
modelId
:
drafts
.
imageModelModelId
.
trim
()
||
undefined
,
apiKey
:
drafts
.
imageModelApiKey
.
trim
()
||
undefined
apiKey
:
drafts
.
imageModelApiKey
.
trim
()
||
undefined
}
}
},
},
resetDrafts
:
()
=>
{
resetDrafts
:
(
savedConfig
)
=>
{
setters
.
setImageModelApiKeyDraft
(
""
)
setters
.
setImageModelApiKeyDraft
(
""
)
setters
.
setImageModelBaseUrlDraft
(
savedConfig
.
expertModelConfig
.
image
.
baseUrl
)
setters
.
setImageModelModelIdDraft
(
savedConfig
.
expertModelConfig
.
image
.
modelId
??
""
)
}
}
})
})
},
[
drafts
.
imageModelApiKey
,
saveConfig
,
setters
])
},
[
drafts
.
imageModelApiKey
,
drafts
.
imageModelBaseUrl
,
drafts
.
imageModelModelId
,
saveConfig
,
setters
])
const
saveVideoConfig
=
useCallback
(
async
()
=>
{
const
saveVideoConfig
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
expertModelConfig
:
{
expertModelConfig
:
{
video
:
{
video
:
{
baseUrl
:
drafts
.
videoModelBaseUrl
.
trim
()
||
undefined
,
modelId
:
drafts
.
videoModelModelId
.
trim
()
||
undefined
,
apiKey
:
drafts
.
videoModelApiKey
.
trim
()
||
undefined
apiKey
:
drafts
.
videoModelApiKey
.
trim
()
||
undefined
}
}
},
},
resetDrafts
:
()
=>
{
resetDrafts
:
(
savedConfig
)
=>
{
setters
.
setVideoModelApiKeyDraft
(
""
)
setters
.
setVideoModelApiKeyDraft
(
""
)
setters
.
setVideoModelBaseUrlDraft
(
savedConfig
.
expertModelConfig
.
video
.
baseUrl
)
setters
.
setVideoModelModelIdDraft
(
savedConfig
.
expertModelConfig
.
video
.
modelId
??
""
)
}
}
})
})
},
[
drafts
.
videoModelApiKey
,
saveConfig
,
setters
])
},
[
drafts
.
videoModelApiKey
,
drafts
.
videoModelBaseUrl
,
drafts
.
videoModelModelId
,
saveConfig
,
setters
])
const
saveDigitalHumanConfig
=
useCallback
(
async
()
=>
{
const
saveDigitalHumanConfig
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
expertModelConfig
:
{
expertModelConfig
:
{
digitalHuman
:
{
digitalHuman
:
{
volcAccessKey
:
drafts
.
digitalHumanVolcAccessKey
.
trim
()
||
undefined
,
volcAccessKey
:
drafts
.
digitalHumanVolcAccessKey
.
trim
()
||
undefined
,
...
@@ -250,7 +282,7 @@ export function useSaveSettings({
...
@@ -250,7 +282,7 @@ export function useSaveSettings({
},
[
drafts
.
digitalHumanQiniuAccessKey
,
drafts
.
digitalHumanQiniuSecretKey
,
drafts
.
digitalHumanVolcAccessKey
,
drafts
.
digitalHumanVolcSecretKey
,
saveConfig
,
setters
])
},
[
drafts
.
digitalHumanQiniuAccessKey
,
drafts
.
digitalHumanQiniuSecretKey
,
drafts
.
digitalHumanVolcAccessKey
,
drafts
.
digitalHumanVolcSecretKey
,
saveConfig
,
setters
])
const
saveDouyinRuntimeConfig
=
useCallback
(
async
()
=>
{
const
saveDouyinRuntimeConfig
=
useCallback
(
async
()
=>
{
await
saveConfig
({
return
await
saveConfig
({
douyinRuntimeConfig
:
{
douyinRuntimeConfig
:
{
videoAnalyzer
:
{
videoAnalyzer
:
{
baseUrl
:
drafts
.
videoAnalyzerBaseUrl
.
trim
()
||
undefined
,
baseUrl
:
drafts
.
videoAnalyzerBaseUrl
.
trim
()
||
undefined
,
...
@@ -268,9 +300,15 @@ export function useSaveSettings({
...
@@ -268,9 +300,15 @@ export function useSaveSettings({
apiKey
:
drafts
.
vectcutApiKey
.
trim
()
||
undefined
apiKey
:
drafts
.
vectcutApiKey
.
trim
()
||
undefined
}
}
},
},
resetDrafts
:
()
=>
{
resetDrafts
:
(
savedConfig
)
=>
{
setters
.
setVideoAnalyzerBaseUrlDraft
(
savedConfig
.
douyinRuntimeConfig
.
videoAnalyzer
.
baseUrl
)
setters
.
setVideoAnalyzerModelIdDraft
(
savedConfig
.
douyinRuntimeConfig
.
videoAnalyzer
.
modelId
??
""
)
setters
.
setVideoAnalyzerApiKeyDraft
(
""
)
setters
.
setVideoAnalyzerApiKeyDraft
(
""
)
setters
.
setReplicationBriefBaseUrlDraft
(
savedConfig
.
douyinRuntimeConfig
.
replicationBrief
.
baseUrl
)
setters
.
setReplicationBriefModelIdDraft
(
savedConfig
.
douyinRuntimeConfig
.
replicationBrief
.
modelId
??
""
)
setters
.
setReplicationBriefApiKeyDraft
(
""
)
setters
.
setReplicationBriefApiKeyDraft
(
""
)
setters
.
setVectcutBaseUrlDraft
(
savedConfig
.
douyinRuntimeConfig
.
vectcut
.
baseUrl
)
setters
.
setVectcutFileBaseUrlDraft
(
savedConfig
.
douyinRuntimeConfig
.
vectcut
.
fileBaseUrl
)
setters
.
setVectcutApiKeyDraft
(
""
)
setters
.
setVectcutApiKeyDraft
(
""
)
}
}
})
})
...
...
apps/ui/src/features/settings/useSettingsState.ts
View file @
d60ecae9
...
@@ -15,8 +15,14 @@ export function useSettingsState(config: AppConfig | null) {
...
@@ -15,8 +15,14 @@ export function useSettingsState(config: AppConfig | null) {
const
[
lobsterKeyDraft
,
setLobsterKeyDraft
]
=
useState
(
""
);
const
[
lobsterKeyDraft
,
setLobsterKeyDraft
]
=
useState
(
""
);
const
[
workspacePathDraft
,
setWorkspacePathDraft
]
=
useState
(
""
);
const
[
workspacePathDraft
,
setWorkspacePathDraft
]
=
useState
(
""
);
const
[
imageModelApiKeyDraft
,
setImageModelApiKeyDraft
]
=
useState
(
""
);
const
[
imageModelApiKeyDraft
,
setImageModelApiKeyDraft
]
=
useState
(
""
);
const
[
imageModelBaseUrlDraft
,
setImageModelBaseUrlDraft
]
=
useState
(
""
);
const
[
imageModelModelIdDraft
,
setImageModelModelIdDraft
]
=
useState
(
""
);
const
[
videoModelApiKeyDraft
,
setVideoModelApiKeyDraft
]
=
useState
(
""
);
const
[
videoModelApiKeyDraft
,
setVideoModelApiKeyDraft
]
=
useState
(
""
);
const
[
videoModelBaseUrlDraft
,
setVideoModelBaseUrlDraft
]
=
useState
(
""
);
const
[
videoModelModelIdDraft
,
setVideoModelModelIdDraft
]
=
useState
(
""
);
const
[
copywritingModelApiKeyDraft
,
setCopywritingModelApiKeyDraft
]
=
useState
(
""
);
const
[
copywritingModelApiKeyDraft
,
setCopywritingModelApiKeyDraft
]
=
useState
(
""
);
const
[
copywritingModelBaseUrlDraft
,
setCopywritingModelBaseUrlDraft
]
=
useState
(
""
);
const
[
copywritingModelModelIdDraft
,
setCopywritingModelModelIdDraft
]
=
useState
(
""
);
const
[
digitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKeyDraft
]
=
useState
(
""
);
const
[
digitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKeyDraft
]
=
useState
(
""
);
const
[
digitalHumanVolcSecretKeyDraft
,
setDigitalHumanVolcSecretKeyDraft
]
=
useState
(
""
);
const
[
digitalHumanVolcSecretKeyDraft
,
setDigitalHumanVolcSecretKeyDraft
]
=
useState
(
""
);
const
[
digitalHumanQiniuAccessKeyDraft
,
setDigitalHumanQiniuAccessKeyDraft
]
=
useState
(
""
);
const
[
digitalHumanQiniuAccessKeyDraft
,
setDigitalHumanQiniuAccessKeyDraft
]
=
useState
(
""
);
...
@@ -45,8 +51,14 @@ export function useSettingsState(config: AppConfig | null) {
...
@@ -45,8 +51,14 @@ export function useSettingsState(config: AppConfig | null) {
);
);
const
hasPendingModelKeys
=
Boolean
(
const
hasPendingModelKeys
=
Boolean
(
imageModelApiKeyDraft
.
trim
()
imageModelApiKeyDraft
.
trim
()
||
imageModelBaseUrlDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
image
.
baseUrl
??
""
).
trim
()
||
imageModelModelIdDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
image
.
modelId
??
""
).
trim
()
||
videoModelApiKeyDraft
.
trim
()
||
videoModelApiKeyDraft
.
trim
()
||
videoModelBaseUrlDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
video
.
baseUrl
??
""
).
trim
()
||
videoModelModelIdDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
video
.
modelId
??
""
).
trim
()
||
copywritingModelApiKeyDraft
.
trim
()
||
copywritingModelApiKeyDraft
.
trim
()
||
copywritingModelBaseUrlDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
copywriting
.
baseUrl
??
""
).
trim
()
||
copywritingModelModelIdDraft
.
trim
()
!==
(
config
?.
expertModelConfig
.
copywriting
.
modelId
??
""
).
trim
()
||
digitalHumanVolcAccessKeyDraft
.
trim
()
||
digitalHumanVolcAccessKeyDraft
.
trim
()
||
digitalHumanVolcSecretKeyDraft
.
trim
()
||
digitalHumanVolcSecretKeyDraft
.
trim
()
||
digitalHumanQiniuAccessKeyDraft
.
trim
()
||
digitalHumanQiniuAccessKeyDraft
.
trim
()
...
@@ -69,10 +81,22 @@ export function useSettingsState(config: AppConfig | null) {
...
@@ -69,10 +81,22 @@ export function useSettingsState(config: AppConfig | null) {
setWorkspacePathDraft
,
setWorkspacePathDraft
,
imageModelApiKeyDraft
,
imageModelApiKeyDraft
,
setImageModelApiKeyDraft
,
setImageModelApiKeyDraft
,
imageModelBaseUrlDraft
,
setImageModelBaseUrlDraft
,
imageModelModelIdDraft
,
setImageModelModelIdDraft
,
videoModelApiKeyDraft
,
videoModelApiKeyDraft
,
setVideoModelApiKeyDraft
,
setVideoModelApiKeyDraft
,
videoModelBaseUrlDraft
,
setVideoModelBaseUrlDraft
,
videoModelModelIdDraft
,
setVideoModelModelIdDraft
,
copywritingModelApiKeyDraft
,
copywritingModelApiKeyDraft
,
setCopywritingModelApiKeyDraft
,
setCopywritingModelApiKeyDraft
,
copywritingModelBaseUrlDraft
,
setCopywritingModelBaseUrlDraft
,
copywritingModelModelIdDraft
,
setCopywritingModelModelIdDraft
,
digitalHumanVolcAccessKeyDraft
,
digitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKeyDraft
,
setDigitalHumanVolcAccessKeyDraft
,
digitalHumanVolcSecretKeyDraft
,
digitalHumanVolcSecretKeyDraft
,
...
...
apps/ui/src/features/smoke/useSmokeActionHandlers.ts
View file @
d60ecae9
...
@@ -67,7 +67,7 @@ interface UseSmokeActionHandlersDeps {
...
@@ -67,7 +67,7 @@ interface UseSmokeActionHandlersDeps {
douyinRuntimeConfig
?:
SaveConfigInput
[
"douyinRuntimeConfig"
]
douyinRuntimeConfig
?:
SaveConfigInput
[
"douyinRuntimeConfig"
]
xhsFeishuConfig
?:
SaveConfigInput
[
"xhsFeishuConfig"
]
xhsFeishuConfig
?:
SaveConfigInput
[
"xhsFeishuConfig"
]
successMessage
?:
string
successMessage
?:
string
})
=>
Promise
<
void
>
})
=>
Promise
<
boolean
>
waitForSmokeConfigPublish
:
(
expected
:
AppConfig
[
"expertModelConfig"
])
=>
Promise
<
void
>
waitForSmokeConfigPublish
:
(
expected
:
AppConfig
[
"expertModelConfig"
])
=>
Promise
<
void
>
resolveHomeIntentSuggestion
:
(
prompt
?:
string
)
=>
Promise
<
{
resolveHomeIntentSuggestion
:
(
prompt
?:
string
)
=>
Promise
<
{
visible
:
boolean
visible
:
boolean
...
...
apps/ui/src/lib/mock-desktop-api.ts
View file @
d60ecae9
...
@@ -306,15 +306,18 @@ export const mockDesktopApi = {
...
@@ -306,15 +306,18 @@ export const mockDesktopApi = {
runtimeMode
:
input
.
runtimeMode
,
runtimeMode
:
input
.
runtimeMode
,
expertModelConfig
:
{
expertModelConfig
:
{
image
:
{
image
:
{
...
FIXED_EXPERT_MODEL_ENDPOINTS
.
image
,
baseUrl
:
input
.
expertModelConfig
?.
image
?.
baseUrl
?.
trim
()
||
FIXED_EXPERT_MODEL_ENDPOINTS
.
image
.
baseUrl
,
modelId
:
input
.
expertModelConfig
?.
image
?.
modelId
?.
trim
()
||
FIXED_EXPERT_MODEL_ENDPOINTS
.
image
.
modelId
,
apiKeyConfigured
:
Boolean
(
input
.
expertModelConfig
?.
image
?.
apiKey
?.
trim
()),
apiKeyConfigured
:
Boolean
(
input
.
expertModelConfig
?.
image
?.
apiKey
?.
trim
()),
},
},
video
:
{
video
:
{
...
FIXED_EXPERT_MODEL_ENDPOINTS
.
video
,
baseUrl
:
input
.
expertModelConfig
?.
video
?.
baseUrl
?.
trim
()
||
FIXED_EXPERT_MODEL_ENDPOINTS
.
video
.
baseUrl
,
modelId
:
input
.
expertModelConfig
?.
video
?.
modelId
?.
trim
()
||
FIXED_EXPERT_MODEL_ENDPOINTS
.
video
.
modelId
,
apiKeyConfigured
:
Boolean
(
input
.
expertModelConfig
?.
video
?.
apiKey
?.
trim
())
apiKeyConfigured
:
Boolean
(
input
.
expertModelConfig
?.
video
?.
apiKey
?.
trim
())
},
},
copywriting
:
{
copywriting
:
{
...
FIXED_EXPERT_MODEL_ENDPOINTS
.
copywriting
,
baseUrl
:
input
.
expertModelConfig
?.
copywriting
?.
baseUrl
?.
trim
()
||
FIXED_EXPERT_MODEL_ENDPOINTS
.
copywriting
.
baseUrl
,
modelId
:
input
.
expertModelConfig
?.
copywriting
?.
modelId
?.
trim
()
||
FIXED_EXPERT_MODEL_ENDPOINTS
.
copywriting
.
modelId
,
apiKeyConfigured
:
Boolean
(
input
.
expertModelConfig
?.
copywriting
?.
apiKey
?.
trim
()),
apiKeyConfigured
:
Boolean
(
input
.
expertModelConfig
?.
copywriting
?.
apiKey
?.
trim
()),
},
},
digitalHuman
:
{
digitalHuman
:
{
...
...
apps/ui/test/settingsDrafts.test.ts
View file @
d60ecae9
...
@@ -87,14 +87,20 @@ test("basic reset only affects lobster key and workspace path", () => {
...
@@ -87,14 +87,20 @@ test("basic reset only affects lobster key and workspace path", () => {
})
})
})
})
test
(
"single model resets only clear the current module key"
,
()
=>
{
test
(
"single model resets restore saved endpoints and clear the current module key"
,
()
=>
{
assert
.
deepEqual
(
getResetCopywritingSettingsDrafts
(),
{
assert
.
deepEqual
(
getResetCopywritingSettingsDrafts
(
config
),
{
copywritingModelBaseUrl
:
"https://copy.example.test"
,
copywritingModelModelId
:
"copy-model"
,
copywritingModelApiKey
:
""
,
copywritingModelApiKey
:
""
,
})
})
assert
.
deepEqual
(
getResetImageSettingsDrafts
(),
{
assert
.
deepEqual
(
getResetImageSettingsDrafts
(
config
),
{
imageModelBaseUrl
:
"https://image.example.test"
,
imageModelModelId
:
"image-model"
,
imageModelApiKey
:
""
,
imageModelApiKey
:
""
,
})
})
assert
.
deepEqual
(
getResetVideoSettingsDrafts
(),
{
assert
.
deepEqual
(
getResetVideoSettingsDrafts
(
config
),
{
videoModelBaseUrl
:
"https://video.example.test"
,
videoModelModelId
:
"video-model"
,
videoModelApiKey
:
""
,
videoModelApiKey
:
""
,
})
})
})
})
...
...
apps/ui/test/settingsPanelsSource.test.ts
View file @
d60ecae9
...
@@ -72,6 +72,8 @@ test("settings secret inputs default hidden and gate reveal buttons behind saved
...
@@ -72,6 +72,8 @@ test("settings secret inputs default hidden and gate reveal buttons behind saved
assert
.
match
(
settingsPanelsSource
,
/const visible = configured && Boolean
\(
revealedSecrets
\[
secretId
\]\)
/
)
assert
.
match
(
settingsPanelsSource
,
/const visible = configured && Boolean
\(
revealedSecrets
\[
secretId
\]\)
/
)
assert
.
match
(
settingsPanelsSource
,
/const secretPlaceholder = configured && !value && !visible
\?
"••••••••••••" : placeholder/
)
assert
.
match
(
settingsPanelsSource
,
/const secretPlaceholder = configured && !value && !visible
\?
"••••••••••••" : placeholder/
)
assert
.
match
(
settingsPanelsSource
,
/placeholder=
\{
secretPlaceholder
\}
/
)
assert
.
match
(
settingsPanelsSource
,
/placeholder=
\{
secretPlaceholder
\}
/
)
assert
.
match
(
settingsPanelsSource
,
/editable = true/
)
assert
.
match
(
settingsPanelsSource
,
/readOnly=
\{
!editable
\}
/
)
assert
.
match
(
settingsPanelsSource
,
/configured
\?
\(
/
)
assert
.
match
(
settingsPanelsSource
,
/configured
\?
\(
/
)
assert
.
match
(
settingsPanelsSource
,
/secretId: "lobsterKey"/
)
assert
.
match
(
settingsPanelsSource
,
/secretId: "lobsterKey"/
)
assert
.
match
(
settingsPanelsSource
,
/configured: workspaceApiKeyConfigured/
)
assert
.
match
(
settingsPanelsSource
,
/configured: workspaceApiKeyConfigured/
)
...
@@ -98,29 +100,37 @@ test("settings secret inputs default hidden and gate reveal buttons behind saved
...
@@ -98,29 +100,37 @@ test("settings secret inputs default hidden and gate reveal buttons behind saved
assert
.
match
(
settingsStylesSource
,
/
\.
settings-secret-reveal-button svg
\s
*
\{[\s\S]
*
?
width:
\s
*22px;
[\s\S]
*
?
height:
\s
*22px;/m
)
assert
.
match
(
settingsStylesSource
,
/
\.
settings-secret-reveal-button svg
\s
*
\{[\s\S]
*
?
width:
\s
*22px;
[\s\S]
*
?
height:
\s
*22px;/m
)
})
})
test
(
"fixed expert model cards show base_url and model_id as read-only values"
,
()
=>
{
test
(
"expert model cards become editable after clicking edit"
,
()
=>
{
assert
.
match
(
settingsPanelsSource
,
/config
\?\.
expertModelConfig
\.
copywriting
\.
baseUrl/
)
assert
.
match
(
settingsPanelsSource
,
/const
\[
editingSettingsSections, setEditingSettingsSections
\]
= useState<EditingSettingsSections>
\(\{\}\)
/
)
assert
.
match
(
settingsPanelsSource
,
/config
\?\.
expertModelConfig
\.
copywriting
\.
modelId/
)
assert
.
match
(
settingsPanelsSource
,
/const renderEditableActions =
\(
/
)
assert
.
match
(
settingsPanelsSource
,
/config
\?\.
expertModelConfig
\.
image
\.
baseUrl/
)
assert
.
match
(
settingsPanelsSource
,
/
\{
editing
\?
"取消" : "编辑"
\}
/
)
assert
.
match
(
settingsPanelsSource
,
/config
\?\.
expertModelConfig
\.
image
\.
modelId/
)
assert
.
match
(
settingsPanelsSource
,
/disabled=
\{
saving
\|\|
!editing
\|\|
!hasPending
\}
/
)
assert
.
match
(
settingsPanelsSource
,
/config
\?\.
expertModelConfig
\.
video
\.
baseUrl/
)
assert
.
match
(
settingsPanelsSource
,
/Promise
\.
resolve
\(
onSave
\(\)\)\.
then
\(\(
saved
\)
=>/
)
assert
.
match
(
settingsPanelsSource
,
/config
\?\.
expertModelConfig
\.
video
\.
modelId/
)
assert
.
match
(
settingsPanelsSource
,
/if
\(
saved !== false
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/sectionId: "copywriting"/
)
assert
.
match
(
settingsPanelsSource
,
/sectionId: "image"/
)
assert
.
match
(
settingsPanelsSource
,
/sectionId: "video"/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"base_url", drafts
\.
copywritingModelBaseUrl, setters
\.
setCopywritingModelBaseUrl, config
\?\.
expertModelConfig
\.
copywriting
\.
baseUrl, editingCopywritingConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"model_id", drafts
\.
copywritingModelModelId, setters
\.
setCopywritingModelModelId, config
\?\.
expertModelConfig
\.
copywriting
\.
modelId, editingCopywritingConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"base_url", drafts
\.
imageModelBaseUrl, setters
\.
setImageModelBaseUrl, config
\?\.
expertModelConfig
\.
image
\.
baseUrl, editingImageConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"model_id", drafts
\.
imageModelModelId, setters
\.
setImageModelModelId, config
\?\.
expertModelConfig
\.
image
\.
modelId, editingImageConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"base_url", drafts
\.
videoModelBaseUrl, setters
\.
setVideoModelBaseUrl, config
\?\.
expertModelConfig
\.
video
\.
baseUrl, editingVideoConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"model_id", drafts
\.
videoModelModelId, setters
\.
setVideoModelModelId, config
\?\.
expertModelConfig
\.
video
\.
modelId, editingVideoConfig/
)
assert
.
match
(
settingsPanelsSource
,
/onSave: onSaveCopywritingConfig/
)
assert
.
match
(
settingsPanelsSource
,
/onSave: onSaveImageConfig/
)
assert
.
match
(
settingsPanelsSource
,
/onSave: onSaveVideoConfig/
)
assert
.
match
(
settingsPanelsSource
,
/settings-readonly-config-value/
)
assert
.
match
(
settingsPanelsSource
,
/settings-readonly-config-value/
)
})
})
test
(
"douyin runtime base urls, model ids, and file base url use copyable read-only values"
,
()
=>
{
test
(
"douyin runtime base urls, model ids, and file base url enter editable mode"
,
()
=>
{
assert
.
match
(
settingsPanelsSource
,
/renderReadonlyConfigValue
\(
"base_url", config
\?\.
douyinRuntimeConfig
\.
videoAnalyzer
\.
baseUrl
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/sectionId: "douyinRuntime"/
)
assert
.
match
(
settingsPanelsSource
,
/renderReadonlyConfigValue
\(
"model_id", config
\?\.
douyinRuntimeConfig
\.
videoAnalyzer
\.
modelId
\|\|
"doubao-vision"
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"base_url", drafts
\.
videoAnalyzerBaseUrl, setters
\.
setVideoAnalyzerBaseUrl, config
\?\.
douyinRuntimeConfig
\.
videoAnalyzer
\.
baseUrl, editingDouyinRuntimeConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderReadonlyConfigValue
\(
"base_url", config
\?\.
douyinRuntimeConfig
\.
replicationBrief
\.
baseUrl
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"model_id", drafts
\.
videoAnalyzerModelId, setters
\.
setVideoAnalyzerModelId, config
\?\.
douyinRuntimeConfig
\.
videoAnalyzer
\.
modelId
\|\|
"doubao-vision", editingDouyinRuntimeConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderReadonlyConfigValue
\(
"model_id", config
\?\.
douyinRuntimeConfig
\.
replicationBrief
\.
modelId
\|\|
"qwen-max"
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"base_url", drafts
\.
replicationBriefBaseUrl, setters
\.
setReplicationBriefBaseUrl, config
\?\.
douyinRuntimeConfig
\.
replicationBrief
\.
baseUrl, editingDouyinRuntimeConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderReadonlyConfigValue
\(
"base_url", config
\?\.
douyinRuntimeConfig
\.
vectcut
\.
baseUrl
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"model_id", drafts
\.
replicationBriefModelId, setters
\.
setReplicationBriefModelId, config
\?\.
douyinRuntimeConfig
\.
replicationBrief
\.
modelId
\|\|
"qwen-max", editingDouyinRuntimeConfig/
)
assert
.
match
(
settingsPanelsSource
,
/renderReadonlyConfigValue
\(
"file_base_url", config
\?\.
douyinRuntimeConfig
\.
vectcut
\.
fileBaseUrl
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"base_url", drafts
\.
vectcutBaseUrl, setters
\.
setVectcutBaseUrl, config
\?\.
douyinRuntimeConfig
\.
vectcut
\.
baseUrl, editingDouyinRuntimeConfig/
)
assert
.
doesNotMatch
(
settingsPanelsSource
,
/setVideoAnalyzerBaseUrl
\(
event
\.
target
\.
value
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/renderEditableConfigValue
\(
"file_base_url", drafts
\.
vectcutFileBaseUrl, setters
\.
setVectcutFileBaseUrl, config
\?\.
douyinRuntimeConfig
\.
vectcut
\.
fileBaseUrl, editingDouyinRuntimeConfig/
)
assert
.
doesNotMatch
(
settingsPanelsSource
,
/setVideoAnalyzerModelId
\(
event
\.
target
\.
value
\)
/
)
assert
.
match
(
settingsPanelsSource
,
/onSave: onSaveDouyinRuntimeConfig/
)
assert
.
doesNotMatch
(
settingsPanelsSource
,
/setReplicationBriefBaseUrl
\(
event
\.
target
\.
value
\)
/
)
assert
.
doesNotMatch
(
settingsPanelsSource
,
/setReplicationBriefModelId
\(
event
\.
target
\.
value
\)
/
)
assert
.
doesNotMatch
(
settingsPanelsSource
,
/setVectcutBaseUrl
\(
event
\.
target
\.
value
\)
/
)
assert
.
doesNotMatch
(
settingsPanelsSource
,
/setVectcutFileBaseUrl
\(
event
\.
target
\.
value
\)
/
)
})
})
test
(
"read-only config values expose full values by title and copy on click or keyboard"
,
()
=>
{
test
(
"read-only config values expose full values by title and copy on click or keyboard"
,
()
=>
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment