feat: clarify image generation output controls

This commit is contained in:
john
2026-07-20 07:37:37 +08:00
parent 790c5794e9
commit 427a31ba21
5 changed files with 25 additions and 10 deletions
+1 -1
View File
@@ -37,7 +37,7 @@ const NAV_SECTIONS: NavSection[] = [
{ to: '/skills', label: '技能' },
{ to: '/policies', label: '策略' },
{ to: '/providers', label: '统一模型中心' },
{ to: '/asset-gateway', label: '资产能力' },
{ to: '/asset-gateway', label: '图片生成' },
{ to: '/blocked-words', label: '违禁词管理' },
],
},
+16 -8
View File
@@ -41,6 +41,11 @@ export function AssetGatewayPage() {
const [message, setMessage] = useState<string | null>(null);
const [error, setError] = useState<string | null>(null);
const activeKeys = useMemo(() => keys.filter((key) => key.status === 'active'), [keys]);
const orderedPlugins = useMemo(() => config?.plugins.slice().sort((left, right) => {
if (left.pluginId === 'asset-generate') return -1;
if (right.pluginId === 'asset-generate') return 1;
return left.pluginId.localeCompare(right.pluginId);
}) ?? [], [config]);
const load = useCallback(async () => {
setLoading(true);
@@ -108,16 +113,16 @@ export function AssetGatewayPage() {
return (
<div className="admin-page">
<div className="admin-page-head">
<h2></h2>
<p className="muted"></p>
<h2></h2>
<p className="muted"> AI </p>
</div>
{error && <p className="banner banner-error">{error}</p>}
{message && <p className="banner banner-success">{message}</p>}
<section className="asset-gateway-hero">
<div>
<div className="asset-kicker">OPTIONAL CAPABILITY</div>
<h3> Gateway</h3>
<p></p>
<h3></h3>
<p></p>
</div>
<label className="asset-toggle">
<input type="checkbox" checked={config.enabled} disabled={busy === 'global'} onChange={(event) => void saveGlobal(event.target.checked)} />
@@ -125,7 +130,7 @@ export function AssetGatewayPage() {
</label>
</section>
<div className="asset-plugin-grid asset-plugin-grid--balanced">
{config.plugins.map((plugin) => {
{orderedPlugins.map((plugin) => {
const draft = drafts[plugin.pluginId] ?? draftFromPlugin(plugin);
const selectedKey = activeKeys.find((key) => key.id === draft.llmProviderKeyId);
const visual = pluginVisuals[plugin.pluginId] ?? { icon: '✦', accent: 'blue' };
@@ -165,7 +170,7 @@ export function AssetGatewayPage() {
</> : <div className="asset-no-llm"> · LLM</div>}
{plugin.pluginId === 'asset-generate' && plugin.purposeCatalog?.length ? (
<fieldset className="asset-purpose-fieldset" disabled={!draft.enabled || draft.provider !== 'image_make'}>
<legend>image_make </legend>
<legend>AI </legend>
<div className="asset-purpose-grid">
{plugin.purposeCatalog.map((purpose) => (
<label key={purpose.id}>
@@ -174,11 +179,14 @@ export function AssetGatewayPage() {
checked={Boolean(draft.purposes[purpose.id])}
onChange={(event) => updatePurpose(plugin.pluginId, purpose.id, event.target.checked)}
/>
<span>{purpose.label}<small>{purpose.presetId}</small></span>
<span>
{purpose.label}
<small>{purpose.strategy === 'derive' ? '从页面头图派生 · 不重复生图' : purpose.presetId}</small>
</span>
</label>
))}
</div>
<p> MindSpace </p>
<p>使 AI </p>
</fieldset>
) : null}
</div>
+1 -1
View File
@@ -9,7 +9,7 @@ const QUICK_LINKS = [
{ to: '/users', label: '用户管理', desc: '创建账号、启用禁用' },
{ to: '/billing/recharge', label: '充值', desc: '为用户账户充值' },
{ to: '/providers', label: '统一模型中心', desc: 'Provider、执行器模型与启动控制' },
{ to: '/asset-gateway', label: '资产能力', desc: '可插拔素材插件、Provider 与专属 LLM 选择' },
{ to: '/asset-gateway', label: '图片生成', desc: '配置正文图、页面头图、卡片封面与信息流缩略图' },
{ to: '/mindspace', label: 'MindSpace 配置', desc: '公开页上限与空间发布参数' },
{ to: '/memory-v2', label: 'Memory V2', desc: '长期记忆 backend 与前置路由开关' },
{ to: '/skill-runtime', label: 'Skill Runtime', desc: 'H5 manifest 关键词路由开关' },
+5
View File
@@ -1111,6 +1111,11 @@ body,
line-height: 1.45;
}
.asset-purpose-grid small {
color: var(--color-text-muted);
line-height: 1.35;
}
.asset-purpose-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
+2
View File
@@ -213,6 +213,8 @@ export type AssetPluginConfig = {
id: string;
label: string;
presetId: string;
strategy?: 'generate' | 'derive';
sourcePurpose?: string | null;
}>;
};