feat(config): 更新系统配置默认值和文档说明

- 将 allowCustomChannel 默认值从 false 改为 true
- 修改 allowCustomChannel 字段类型为指针类型以支持默认值设置
- 更新相关文档中对 allowCustomChannel 功能的描述
- 修复画布页面中对话框节点打开逻辑,避免文本节点意外触发编辑对话框
- 将用户配置中的渠道模式默认值从 remote 改为 local
This commit is contained in:
HouYunFei
2026-05-22 08:11:13 +08:00
parent d40b9b53c2
commit 9c2fa25380
7 changed files with 13 additions and 10 deletions
+1 -1
View File
@@ -122,7 +122,7 @@
| `defaultImageModel` | string | 默认图片模型 | | `defaultImageModel` | string | 默认图片模型 |
| `defaultTextModel` | string | 默认文本模型 | | `defaultTextModel` | string | 默认文本模型 |
| `systemPrompt` | string | 系统提示词 | | `systemPrompt` | string | 系统提示词 |
| `allowCustomChannel` | bool | 是否允许用户自定义渠道,允许时前端提供走后端渠道和自定义 baseUrl 直连两种模式 | | `allowCustomChannel` | bool | 是否允许用户自定义渠道,默认允许,关闭后前端提供走后端渠道模式 |
`private.value` 当前字段: `private.value` 当前字段:
+3 -3
View File
@@ -17,7 +17,7 @@
"defaultImageModel": "gpt-image-2", "defaultImageModel": "gpt-image-2",
"defaultTextModel": "gpt-5.5", "defaultTextModel": "gpt-5.5",
"systemPrompt": "", "systemPrompt": "",
"allowCustomChannel": false "allowCustomChannel": true
} }
} }
``` ```
@@ -35,14 +35,14 @@
| `defaultImageModel` | string | 默认图片模型,从 `availableModels` 中选择 | | `defaultImageModel` | string | 默认图片模型,从 `availableModels` 中选择 |
| `defaultTextModel` | string | 默认文本模型,从 `availableModels` 中选择 | | `defaultTextModel` | string | 默认文本模型,从 `availableModels` 中选择 |
| `systemPrompt` | string | 系统提示词 | | `systemPrompt` | string | 系统提示词 |
| `allowCustomChannel` | boolean | 是否允许用户在配置弹窗中切换为本地直连渠道 | | `allowCustomChannel` | boolean | 是否允许用户在配置弹窗中切换为本地直连渠道,默认允许 |
用户侧请求模式: 用户侧请求模式:
| 模式 | 说明 | | 模式 | 说明 |
| --- | --- | | --- | --- |
| 云端渠道 | 使用后端 `/api/v1/*` 代理接口,请求会按模型名匹配 `private.value.channels` 中的可用渠道 | | 云端渠道 | 使用后端 `/api/v1/*` 代理接口,请求会按模型名匹配 `private.value.channels` 中的可用渠道 |
| 本地直连 | `allowCustomChannel` `true`可选,用户在浏览器本地配置 `baseUrl``apiKey` 和模型列表后直接请求模型接口 | | 本地直连 | 默认可选;`allowCustomChannel` 关闭后不可选,用户在浏览器本地配置 `baseUrl``apiKey` 和模型列表后直接请求模型接口 |
## private.value ## private.value
+1 -1
View File
@@ -28,7 +28,7 @@ type PublicModelChannelSetting struct {
DefaultImageModel string `json:"defaultImageModel"` DefaultImageModel string `json:"defaultImageModel"`
DefaultTextModel string `json:"defaultTextModel"` DefaultTextModel string `json:"defaultTextModel"`
SystemPrompt string `json:"systemPrompt"` SystemPrompt string `json:"systemPrompt"`
AllowCustomChannel bool `json:"allowCustomChannel"` AllowCustomChannel *bool `json:"allowCustomChannel"`
} }
// PublicSetting 公开配置。 // PublicSetting 公开配置。
+4
View File
@@ -33,6 +33,10 @@ func normalizePublicSetting(setting model.PublicSetting) model.PublicSetting {
if setting.ModelChannel.AvailableModels == nil { if setting.ModelChannel.AvailableModels == nil {
setting.ModelChannel.AvailableModels = []string{} setting.ModelChannel.AvailableModels = []string{}
} }
if setting.ModelChannel.AllowCustomChannel == nil {
enabled := true
setting.ModelChannel.AllowCustomChannel = &enabled
}
return setting return setting
} }
+1 -1
View File
@@ -32,7 +32,7 @@ const emptySettings: AdminSettings = {
defaultImageModel: "", defaultImageModel: "",
defaultTextModel: "", defaultTextModel: "",
systemPrompt: "", systemPrompt: "",
allowCustomChannel: false, allowCustomChannel: true,
}, },
}, },
private: { channels: [] }, private: { channels: [] },
@@ -488,7 +488,7 @@ function InfiniteCanvasPage() {
setConnections((prev) => [...prev, { id: nanoid(), ...connection }]); setConnections((prev) => [...prev, { id: nanoid(), ...connection }]);
setSelectedNodeIds(new Set([newNode.id])); setSelectedNodeIds(new Set([newNode.id]));
setSelectedConnectionId(null); setSelectedConnectionId(null);
setDialogNodeId(newNode.id); if (type !== CanvasNodeType.Text) setDialogNodeId(newNode.id);
setPendingConnectionCreate(null); setPendingConnectionCreate(null);
setConnecting(null); setConnecting(null);
}, [effectiveConfig.imageModel, effectiveConfig.model, effectiveConfig.size, message, setConnecting]); }, [effectiveConfig.imageModel, effectiveConfig.model, effectiveConfig.size, message, setConnecting]);
@@ -598,7 +598,7 @@ function InfiniteCanvasPage() {
setNodes((prev) => [...prev, newNode]); setNodes((prev) => [...prev, newNode]);
setSelectedNodeIds(new Set([newNode.id])); setSelectedNodeIds(new Set([newNode.id]));
setSelectedConnectionId(null); setSelectedConnectionId(null);
setDialogNodeId(newNode.id); if (type !== CanvasNodeType.Text) setDialogNodeId(newNode.id);
}, },
[effectiveConfig.imageModel, effectiveConfig.model, effectiveConfig.size, getCanvasCenter], [effectiveConfig.imageModel, effectiveConfig.model, effectiveConfig.size, getCanvasCenter],
); );
@@ -1782,7 +1782,6 @@ function InfiniteCanvasPage() {
setNodes((prev) => [...prev, node]); setNodes((prev) => [...prev, node]);
setSelectedNodeIds(new Set([node.id])); setSelectedNodeIds(new Set([node.id]));
setSelectedConnectionId(null); setSelectedConnectionId(null);
setDialogNodeId(node.id);
}, [screenToCanvas, size.height, size.width]); }, [screenToCanvas, size.height, size.width]);
const handleAssetInsert = useCallback((payload: InsertAssetPayload) => { const handleAssetInsert = useCallback((payload: InsertAssetPayload) => {
+1 -1
View File
@@ -24,7 +24,7 @@ export type AiConfig = {
export const CONFIG_STORE_KEY = "infinite-canvas:ai_config_store"; export const CONFIG_STORE_KEY = "infinite-canvas:ai_config_store";
export const defaultConfig: AiConfig = { export const defaultConfig: AiConfig = {
channelMode: "remote", channelMode: "local",
baseUrl: "https://api.openai.com", baseUrl: "https://api.openai.com",
apiKey: "", apiKey: "",
model: "gpt-image-2", model: "gpt-image-2",