🌍 {{ t('environment') }}
⚠ {{ envParams.hazardLevel }}/10
{{ t('weather') }}{{ getEnvLabel('weather', envParams.weather) }} {{ t('terrain') }}{{ getEnvLabel('terrain', envParams.terrain) }} {{ t('lighting') }}{{ getEnvLabel('lighting', envParams.lighting) }} {{ t('temperature') }}{{ getEnvLabel('temperature', envParams.temperature) }} {{ t('hazardLevel') }}
{{ envParams.hazardLevel }}/10
{{ t('specialConditions') }}
{{ cond }}
🩺 {{ t('bodyStatus') }}
{{ getBodyStatusSummary().text }}
{{ bodyStatus.head.hp_pct }}%
{{ bodyStatus.torso.hp_pct }}%
{{ bodyStatus.arm_left.hp_pct }}%
{{ bodyStatus.arm_right.hp_pct }}%
{{ bodyStatus.legs.hp_pct }}%
🔒
🔒
🔒
🔒
🔒
{{ BODY_REGION_ICONS[key] }}
{{ region.hp_pct }}%
健康 轻伤 中伤 重伤
🩸出血 ☠️中毒 🦴残疾 🌙诅咒 😴疲惫 ✨ 状态正常
🎒 {{ t('itemBackpack') }}
{{ t('itemCount').replace('{n}', (dmAiSystem.modeState.ownedItems ? dmAiSystem.modeState.ownedItems.length : 0) + (dmAiSystem.modeState.envItems ? dmAiSystem.modeState.envItems.length : 0)) }}
🧰 {{ t('ownedItems') }}
🧰 {{ item }} {{ t('ownedTag') }}
🌍 {{ t('envObtained') }}
📦 {{ item }} {{ t('envTag') }}
🎒 {{ t('emptyBackpack') }}
{{ t('battleResources') }}
{{ resource }}: {{ count }}
🔍 {{ t('cluesFound') }} ({{ dmAiSystem.modeState.cluesFound.length }}/{{ dmAiSystem.modeState.cluesTotal }})
{{ clue }}
🪞 {{ locale === 'zh' ? '当前状态' : locale === 'es' ? 'Estado actual' : 'Current state' }} {{ getBodyStatusSummary().text }}
{{ locale === 'zh' ? '正在准备人物状态图...' : locale === 'es' ? 'Preparando el retrato de estado...' : 'Preparing state portrait...' }}
{{ locale === 'zh' ? '正在替换为本回合映射图' : locale === 'es' ? 'Actualizando al retrato de este turno' : 'Updating to this turn portrait' }}
{{ locale === 'zh' ? '过场里优先展示人物状态映射,只保留必要的生命与受伤摘要。' : locale === 'es' ? 'La transición prioriza el retrato de estado y solo conserva un resumen compacto.' : 'The transition prioritizes the self-state portrait and keeps only a compact summary.' }}
❤️ HP
{{ dmAiSystem.modeState.hp }}/{{ dmAiSystem.modeState.maxHp }}
{{ t('staminaLabel') }}
{{ dmAiSystem.modeState.stamina }}%
{{ BODY_REGION_ICONS[key] }} {{ BODY_REGION_NAMES[key] }}
{{ region.hp_pct }}% {{ (region.hp_pct - clockAnimation.bodySnapshot[key]) > 0 ? '+' : '' }}{{ region.hp_pct - clockAnimation.bodySnapshot[key] }}
🩸出血 ☠️中毒 🦴残疾 🌙诅咒 😴疲惫 ✨ 正常
🎒 {{ t('itemBackpack') }} {{ t('itemCount').replace('{n}', (dmAiSystem.modeState.ownedItems ? dmAiSystem.modeState.ownedItems.length : 0) + (dmAiSystem.modeState.envItems ? dmAiSystem.modeState.envItems.length : 0)) }}
🧰 {{ item }} {{ t('ownedTag') }}
📦 {{ item }} {{ t('envTag') }}
⚔️ {{ t('battleResources') }}
{{ resource }}: {{ count }}
🔍 {{ t('cluesFound') }} ({{ dmAiSystem.modeState.cluesFound.length }}/{{ dmAiSystem.modeState.cluesTotal }})
{{ clue }}
🎯 {{ t('yourChoice') }} {{ clockAnimation.selectedChoiceText }}
🌞 🌛
{{ clockAnimation.durationLabel }}
{{ clockAnimation.phaseText || '时间正在流逝...' }}
🎯 {{ clockAnimation.selectedChoiceText }} {{ lastTurnConsequence.rollSuccess ? '🎉 ' + t('animActionSuccess') : '💥 ' + t('animActionFailed') }}
{{ lastTurnConsequence.rollSuccess ? lastTurnConsequence.successOutcome : lastTurnConsequence.failureOutcome }}
{{ t('probability') }}: {{ lastTurnConsequence.probTier }}
🩺
{{ t('bodyConditionChange') }}
❤️ HP {{ lastTurnConsequence.hpDelta > 0 ? '+' : '' }}{{ lastTurnConsequence.hpDelta }}
⚡ {{ t('staminaLabel') }} {{ lastTurnConsequence.staminaDelta > 0 ? '+' : '' }}{{ lastTurnConsequence.staminaDelta }}%
{{ {head:'🧠 ' + t('bodyHead'),torso:'🫁 ' + t('bodyTorso'),arm_left:'💪 ' + t('bodyArmLeft'),arm_right:'🦾 ' + t('bodyArmRight'),legs:'🦵 ' + t('bodyLegs')}[region] || region }} {{ delta > 0 ? '+' : '' }}{{ delta }}%
🎒
{{ t('itemChangeLabel') }}
{{ ic.action === 'add' ? '✅ ' + t('itemGain') : '❌ ' + t('itemLose') }} {{ ic.name }}
{{ t('aiWeavingStory') }}

{{ t('icfSubtitle') }}

{{ t('icfReadCarefully') }}

中文 English Español
正在加载知情同意书内容...

🎲 {{ t('title') }} v{{ appVersion }}

{{ t('todoDescription') }}

📝 {{ t('profileEntry') }} 🧠 {{ t('vviqTab') }} 🖼️ {{ t('amodalCountTask') }} 🎮 {{ t('gameTab') }}
{{ t('phaseFlowHint') }}
{{ phase2LockReason }}
📝

{{ t('todoProfile') }}

{{ t('todoProfileDesc') }}

{{ t('completed') }} {{ t('pending') }}
🧠

{{ t('todoVviq') }}

{{ t('todoVviqDesc') }}

{{ t('completed') }} {{ t('pending') }}

{{ t('todoNonModal') }}

{{ t('todoNonModalDesc') }}

{{ t('completed') }} {{ t('pending') }}
🎮

{{ t('todoGame') }}

{{ canAccessPhaseTwo ? t('todoGameDesc') : phase2LockReason }}

{{ t('completed') }} {{ t('pending') }} {{ t('locked') }}
{{ t('overallProgress') }} {{ (userTodos.profileCompleted ? 1 : 0) + (userTodos.vviqCompleted ? 1 : 0) + (userTodos.gameCompleted ? 1 : 0) + (userTodos.nonModalCompleted ? 1 : 0) }} / 4
{{ t('saveInfo') }} {{ t('refresh') }}

{{ t('selectScenario') }}

开发模式:已启用问卷跳过开关。点击下方剧本卡片旁的「[DEV] 跳到问卷」可直接显示问卷。
{{ scenario.name }}
💎 {{ t('modeTreasureHunter') }} ⚔️ {{ t('modeBattleRoyale') }} 🏚️ {{ t('modeSnowstormManor') }} {{ t('scenarioTag') }}
🎭 {{ t('characterCountLabel').replace('{n}', scenario._characterCount) }} ⚠️ {{ t('noCharacterWarning') }}

{{ scenario.intro || t('noDescription') }}

🧪 [DEV] 跳到问卷
📜

📖 {{ gameSession.scenarioName }}

💎 {{ t('modeTreasureHunter') }} ⚔️ {{ t('modeBattleRoyale') }} 🏚️ {{ t('modeSnowstormManor') }} ⏳ {{ t('turnsTag').replace('{n}', dmAiSystem.scenarioStructure.totalTurns || 15) }} 📚 {{ t('chaptersTag').replace('{n}', 3) }}
{{ dmAiSystem.scenarioStructure.storyBackground }}
⚡ {{ t('emergencyEvent') }} {{ dmAiSystem.scenarioStructure.initialEvent.description || JSON.stringify(dmAiSystem.scenarioStructure.initialEvent) }}
{{ t('chapterTitle').replace('{n}', ch.chapterIndex) }} · {{ ch.title || t('unnamed') }}
{{ t('turnRange').replace('{start}', ch.turnStart).replace('{end}', ch.turnEnd) }}
🔑 {{ t('clueLabel') }}: {{ ch.keyItem }}
{{ ch.description }}
📋 {{ t('gameRulesTitle') }}
{{ gameSession.showGameRules ? t('gameRulesCollapse') : t('gameRulesExpand') }} {{ gameSession.showGameRules ? '▲' : '▼' }}

🎮 {{ t('gameRulesFlowTitle') }}

{{ t('gameRulesFlowDesc').replace('{0}', dmAiSystem.scenarioStructure.totalTurns || 15) }}

{{ t('gameRulesFlowStep1') }}
{{ t('gameRulesFlowStep2') }}
{{ t('gameRulesFlowStep3') }}
{{ t('gameRulesFlowStep4') }}

⚙️ {{ t('gameRulesBindTitle') }}

{{ t('gameRulesBindDesc') }}

🩺 {{ t('gameRulesBindBody') }}
{{ t('gameRulesBindTime') }}
⚠️ {{ t('gameRulesBindRisk') }}
🔑 {{ t('gameRulesBindItems') }}

💡 {{ t('gameRulesNoticeTitle') }}

1. {{ t('gameRulesNotice1') }}
2. {{ t('gameRulesNotice2') }}
3. {{ t('gameRulesNotice3') }}
4. {{ t('gameRulesNotice4') }}

{{ t('selectYourCharacter') }}

{{ t('selectCharacterHint') }}

🎭

{{ character.name }}

{{ character.biography || t('noDescription') }}

🧠 过去的记忆
{{ character.autobiographicalMemory }}
{{ t('cancel') }}

{{ t('prologueHeading') }}

{{ gameSession.scenarioName }} — {{ t('chapter1Start') }}

{{ t('generatingPrologue') }}

{{ t('generatingPrologueHint') }}

{{ t('aiErrorPrologue') }}

{{ t('aiErrorHint') }}

{{ t('retryPrologueBtn') }}

{{ t('prologuePreludeTitle') }}

{{ prologuePreludeText }}

🎬 {{ t('scenarioOpeningNarrative') }}

{{ dmAiSystem.scenarioStructure.openingNarrative ? t('prologueConfiguredOpeningBadge') : t('prologueFallbackOpeningBadge') }}

{{ dmAiSystem.scenarioStructure.openingNarrative ? t('prologueOpeningConfiguredHint') : t('prologueOpeningFallbackHint') }}

{{ gameSession.prologueNarrative }}

📋 {{ t('chapterOneLabel') }}:{{ dmAiSystem.scenarioStructure.chapters[0].title || t('startLabel') }}

{{ t('turnRange').replace('{start}', dmAiSystem.scenarioStructure.chapters[0].turnStart).replace('{end}', dmAiSystem.scenarioStructure.chapters[0].turnEnd) }} · {{ dmAiSystem.scenarioStructure.chapters[0].description }}

🔑 {{ t('keyItemClueHint').replace('{item}', dmAiSystem.scenarioStructure.chapters[0].keyItem).replace('{turn}', dmAiSystem.scenarioStructure.chapters[0].turnEnd) }}

⚔️ {{ t('startAdventure') }}
🎭
{{ gameSession.selectedCharacterName }}
🩸 ☠️ 🦴 🌙 😴
🎭
{{ gameSession.selectedCharacterName }}
📍 {{ dmAiSystem.temporal && dmAiSystem.temporal.enabled ? t('turnLabel').replace('{n}', dmAiSystem.temporal.turnIndex) : t('stepLabel') + ' ' + gameSession.currentStep }}

🩺 {{ t('bodyStatus') }}
{{ getBodyStatusSummary().text }}

{{ BODY_REGION_ICONS[key] }}
身体变化会直接反映到人物状态图和过场结果里,这里只保留必要摘要。
❤️ HP
{{ dmAiSystem.modeState.hp }}/{{ dmAiSystem.modeState.maxHp }}
{{ t('staminaLabel') }}
{{ dmAiSystem.modeState.stamina }}%
{{ BODY_REGION_ICONS[key] }} {{ BODY_REGION_NAMES[key] }}
{{ region.hp_pct }}%
🩸出血 ☠️中毒 🦴残疾 🌙诅咒 😴疲惫 ✨ 状态正常

🎒 背包
{{ (dmAiSystem.modeState.ownedItems ? dmAiSystem.modeState.ownedItems.length : 0) + (dmAiSystem.modeState.envItems ? dmAiSystem.modeState.envItems.length : 0) }} 件

🧰 {{ t('ownedItems') }}
🧰 {{ item }} {{ t('ownedTag') }}
🌍 {{ t('envObtained') }}
📦 {{ item }} {{ t('envTag') }}
🎒 {{ t('emptyBackpack') }}
⚔️ {{ t('battleResources') }}
{{ resource }}: {{ count }}
🔍 {{ t('cluesFound') }} ({{ dmAiSystem.modeState.cluesFound.length }}/{{ dmAiSystem.modeState.cluesTotal }})
{{ clue }}

✨ {{ t('personality') }}

{{ currentCharacterCard.biography.substring(0, 60) }}{{ currentCharacterCard.biography.length > 60 ? '...' : '' }}
{{ currentCharacterCard.biography }}

📖 自传体记忆

{{ (buildDynamicMemory()[0]?.content || '暂无记忆').substring(0, 60) }}...
{{ section.icon }} {{ section.title }}
{{ section.content }}
暂无记忆数据

📜 {{ t('history') }} {{ gameSession.history.length }} 条

最近:{{ gameSession.history[gameSession.history.length - 1]?.choice || '暂无' }}
暂无历史记录
步骤 {{ gameSession.history.length - idx }}
选择:{{ record.choice }}
结果:{{ record.result }}
{{ dmAiSystem.endingResult.ending_label }}
{{ dmAiSystem.endingResult.final_score }}
{{ t('endingFinalScore') }}
{{ t('endingScoreBreakdown') }}
{{ key }} {{ value }}
{{ t('endingRawTotal') }} {{ dmAiSystem.endingResult.raw_score }}
{{ t('endingMultiplierLabel') }}: ×{{ dmAiSystem.endingResult.multiplier }}
📖 {{ t('checkpointChapterLabel').replace('{chapter}', checkpointDialogData.chapterIndex) }}
⚠️ 📊
{{ t('checkpointStatusFail') }} {{ t('checkpointStatusPass') }} {{ t('checkpointStatusNoRule') }}
{{ t('checkpointKeyItem') }}
{{ checkpointDialogData.keyItem }}
{{ checkpointDialogData.keyItemObtained ? t('checkpointObtained') : t('checkpointNotObtained') }}
🤖 {{ t('dmSystem') }}
🤖 {{ t('dmSystem') }}
⏳ {{ t('timeSystem') }} {{ getTemporalPhaseName() }}
{{ t('turnProgress') }} {{ dmAiSystem.temporal.turnIndex }} / {{ dmAiSystem.temporal.totalTurns || 15 }}
{{ t('currentWorldTime') }}
{{ formatTemporalWorldTime() }}
{{ t('turnSpan') }}
{{ getCurrentTurnDuration() }}
{{ t('narrativeGranularityLabel') }}
{{ getNarrativeGranularity() }}
📖 {{ t('storyteller') }}
{{ t('waitingForDm') }}
{{ dmAiSystem.narrative.content }}
暂无AI叙事内容
🎯 {{ t('choiceMaker') }}
{{ t('waitingForDm') }}
⏱️ {{ formatEstimatedDuration(choice.estimated_duration) }}
{{ choice.prob_tier }}
{{ choice.text }}
⚠️ {{ choice.unavailable_reason }}
✓ {{ choice.consequence.success_outcome }}
✗ {{ choice.consequence.failure_outcome }}
🩺 {{ t('bodyEffectPreview') }}
✓ {{ t('onSuccess') }}
{{ t('noEffect') }}
✗ {{ t('onFailure') }}
{{ t('noEffect') }}
❤️ HP {{ choice.hp_delta > 0 ? '+' : '' }}{{ choice.hp_delta }} 💔 {{ t('failureHp') }} {{ choice.hp_delta_fail }} ⚡ {{ t('staminaLabel') }} {{ choice.stamina_delta > 0 ? '+' : '' }}{{ choice.stamina_delta }}
自我投射: {{ choice.mtt.selfProjection || '中' }} 自传意识: {{ choice.mtt.autonoetic || '中' }} 时空重建: {{ choice.mtt.spatiotemporal || '中' }}
{{ dmAiSystem.aiChoices.content }}
暂无AI选项
{{ dmAiSystem.aiChoices._debugExpanded ? '▼' : '▶' }} 🔧 ChoiceMaker JSON 调试 {{ dmAiSystem.aiChoices.parsedChoices.length }} 选项
{{ dmAiSystem.aiChoices._debugJson }}
🎨 {{ t('storyPainter') }}
{{ t('waitingForDm') }}
{{ t('generatingImage') }}
{{ dmAiSystem.sceneVisual.content }}
🎨 图像提示词 可编辑
✨ 优化 🖼️ 生成 📋 复制
📝 原始场景描述:
{{ promptDebug.originalPrompt }}
快捷风格: {{ style.name }}
暂无场景描述
⚔️

📖 {{ gameSession.scenarioName }}

{{ getGameModeIcon() }} {{ getGameModeName() }} 🤖 AI DM
{{ dmAiSystem.temporal.turnIndex }} /{{ dmAiSystem.temporal.totalTurns || 15 }}
📍 {{ gameSession.currentStep }}
{{ getTemporalPhaseName() }}
🕐 {{ formatTemporalWorldTime() }} ( {{ getCurrentTurnDuration() }} )
{{ getModeHealthLevel().level }}
{{ getModeMainBarPercent() }}%
⏳ {{ dmAiSystem.modeState.turnsRemaining }}
{{ t('aiErrorHint') }}
{{ t('retryBtn') }} {{ t('retryAllBtn') }}
{{ t('turnLabel').replace('{n}', dmAiSystem.temporal.turnIndex) }}
{{ getNarratorStyle().icon }} {{ getNarratorStyle().name }}
{{ t('retryStoryBtn') }}
⚠️ {{ t('aiErrorStory') }}: {{ dmAiSystem.narrative.content }}
{{ dmAiSystem.narrative.content }}

{{ getNarratorStyle().icon }} 叙事者正在构思...

{{ t('aiErrorStory') }}

{{ t('aiErrorHint') }}

{{ t('retryStoryBtn') }}
本回合人物状态图
{{ dmAiSystem.loading.statusProjection ? '正在更新' : (dmAiSystem.statusProjection.imageUrl ? '已就绪' : '待生成') }}
选项结算完成后,正在立即刷新人物状态图...
当前还没有可用于融合的人物状态图。
这张图会在场景融合前先完成,并作为当前回合的人物参考输入。
人物状态图更新失败,当前会优先沿用上一张状态图继续融合。
{{ dmAiSystem.sceneVisual.imageInputMode === 'reference_fusion' ? '本回合融合输入链路' : dmAiSystem.sceneVisual.imageInputMode === 'image_edit' ? '本回合图像编辑底图' : '本回合图像输入' }}
{{ dmAiSystem.sceneVisual.imageInputMode === 'reference_fusion' ? ('共 ' + (dmAiSystem.sceneVisual.referenceImageDetails.length || dmAiSystem.sceneVisual.referenceImages.length) + ' 张') : (dmAiSystem.sceneVisual.editImage ? '1 张基底图' : '等待输入') }}
每回合会先更新人物状态图;场景生成优先使用资源合成环境图,没有时再退回原始环境图,并与最新人物状态图融合;只有状态图不可用时,才回退到人物底图或连续图。
{{ item.label }}
{{ item.kind === 'resource_reference' ? '当前回合的资源合成环境图,优先固定空间、道具与 NPC 布局。' : item.kind === 'environment' ? '当前回合原始环境图,负责固定空间与环境氛围。' : item.kind === 'status_projection' ? '结算后立即生成的人物状态图,负责保留当前伤势、姿态与疲劳状态。' : item.kind === 'portrait_base' ? '当最新状态图不可用时,用角色基底图保持人物一致性。' : item.kind === 'legacy_entity_reference' ? '旧版角色或关键道具设定图,用于主体一致性兜底。' : item.kind === 'continuity_scene' ? '上一回合场景连续图,用于延续镜头和空间。' : '当前用于图像生成的参考输入。' }}
编辑基底图
当前采用图像编辑模式,会先基于这张底图再做本回合更新。
等待本回合原始场景图与人物状态图进入融合链路。
本回合融合结果
{{ dmAiSystem.sceneVisual.loadingLabel || '融合结果会在这里完整显示,不再裁切画面。' }}
🎨 AI正在绘制融合场景...
{{ dmAiSystem.sceneVisual.loadingLabel || (locale === 'zh' ? '正在准备图像生成...' : locale === 'es' ? 'Preparando la generación de imagen...' : 'Preparing image generation...') }}
{{ t('aiErrorImage') }} {{ t('aiErrorHint') }} {{ t('retryImageBtn') }}
暂无融合结果图像 生成图像 {{ t('regenerateScene') }}
{{ dmAiSystem.sceneVisual.content }}
🩺 {{ t('bodyStatus') }} {{ getBodyStatusSummary().text }}
身体变化会直接反映到人物状态图和过场结果里,这里只保留必要摘要。
❤️ HP
{{ dmAiSystem.modeState.hp }}/{{ dmAiSystem.modeState.maxHp }}
{{ t('staminaLabel') }}
{{ dmAiSystem.modeState.stamina }}%
{{ BODY_REGION_ICONS[key] }} {{ BODY_REGION_NAMES[key] }}
{{ region.hp_pct }}%
🩸{{ t('bleeding') }} ☠️{{ t('poisoned') }} 🦴{{ t('disabled') }} 🌙{{ t('cursed') }} 😴{{ t('exhausted') }} ✨ {{ t('statusNormal') }}
🪞 状态投射图 刷新
正在根据本回合伤势更新角色状态图...
选择带头像的角色后,这里会显示根据身体状态实时更新的投射图。
下一回合场景生图会优先把这张状态投射图作为角色参考,和预设环境图一起融合。
状态投射图生成失败,当前保留上一张人物状态图。
状态演化历史 {{ getStatusProjectionHistoryEntries().length }} 张
🎒 {{ t('itemBackpack') }} {{ t('itemCount').replace('{n}', (dmAiSystem.modeState.ownedItems || []).length + (dmAiSystem.modeState.envItems || []).length) }}
🧰 {{ t('ownedItems') }}
🧰 {{ item }}
🌍 {{ t('envObtained') }}
📦 {{ item }}
🎒
{{ t('emptyBackpack') }}
⚔️ {{ t('battleResources') }}
{{ resource }}: {{ count }}
🔍 {{ t('cluesFound') }} ({{ dmAiSystem.modeState.cluesFound.length }}/{{ dmAiSystem.modeState.cluesTotal }})
{{ clue }}
{{ lastTurnConsequence.rollSuccess === true ? '✅' : (lastTurnConsequence.rollSuccess === false ? '❌' : '🎲') }}

🎲 {{ t('lastTurnResult') }} {{ t('turnLabel').replace('{n}', lastTurnConsequence.turnIndex) }}

{{ t('yourChoice') }}
{{ lastTurnConsequence.choiceText }}
⏱️ {{ formatEstimatedDuration(lastTurnConsequence.estimatedDuration) }}
{{ lastTurnConsequence.rollSuccess ? '🎉' : '💥' }}
{{ lastTurnConsequence.rollSuccess ? t('actionSuccess') : t('actionFailed') }}
{{ lastTurnConsequence.probTier }}
{{ t('bias') }}: {{ lastTurnConsequence.biasRules.join(', ') }}
{{ lastTurnConsequence.rollSuccess ? t('successOutcome') : t('failureOutcome') }} {{ lastTurnConsequence.rollSuccess ? lastTurnConsequence.successOutcome : lastTurnConsequence.failureOutcome }}
❤️ {{ t('hpChange') }}
{{ lastTurnConsequence.hpDelta > 0 ? '+' : '' }}{{ lastTurnConsequence.hpDelta }}
⚡ {{ t('staminaChange') }}
{{ lastTurnConsequence.staminaDelta > 0 ? '+' : '' }}{{ lastTurnConsequence.staminaDelta }}
🩺 {{ t('bodyPartChange') }}
{{ BODY_REGION_ICONS[region] }} {{ BODY_REGION_NAMES[region] }} {{ delta > 0 ? '+' : '' }}{{ delta }}%
🎒 {{ t('itemChange') }}
{{ item.action === 'add' ? '📦 +' : '📤 -' }} {{ item.name }}
🧠 {{ t('mttDimension') }}
{{ t('selfProjection') }}: {{ lastTurnConsequence.mttTags.selfProjection || '中' }} {{ t('autoneticAwareness') }}: {{ lastTurnConsequence.mttTags.autonoetic || '中' }} {{ t('spatiotemporalReconstruction') }}: {{ lastTurnConsequence.mttTags.spatiotemporal || '中' }}

🎯 {{ t('yourChoice') }}

⏱ {{ getNextTurnTimeInfo()?.label }} {{ t('exitGame') }}
🤖 {{ t('aiRecommendedOptions') }}
{{ t('retryChoicesBtn') }}

{{ t('aiErrorChoices') }}

{{ t('aiErrorHint') }}

{{ t('generatingChoices') }}
{{ dmAiSystem.aiChoices.content }}
⏱️ {{ formatEstimatedDuration(choice.estimated_duration) }}
{{ choice.prob_tier }}
{{ choice.text }}
🧭 已保存你的判断
调整判断
{{ t('secondaryChoiceStateQuestion') }}
{{ getSecondaryChoiceOptionLabel('statePrediction', getSecondaryChoiceResponse(idx)?.statePrediction) }}
{{ t('secondaryChoiceRiskQuestion') }}
{{ getSecondaryChoiceOptionLabel('riskPrediction', getSecondaryChoiceResponse(idx)?.riskPrediction) }}
{{ t('secondaryChoiceBasisQuestion') }}
{{ getSecondaryChoiceOptionLabel('judgmentBasis', getSecondaryChoiceResponse(idx)?.judgmentBasis) }}
你认为这个行动大约会耗时多久?
{{ getSecondaryChoiceOptionLabel('playerExpectedDuration', getSecondaryChoiceResponse(idx)?.playerExpectedDuration || getSecondaryChoiceResponse(idx)?.player_expected_duration) }}
▶ 判断已完成,请点击右下角时钟启动过场并进入下一步 ⏱ {{ getNextTurnTimeInfo()?.label }}
📝 还需要完成判断
请先回答状态预期、风险、判断依据和预期耗时,保存后再点击右下角时钟进入下一步。
⚠️ {{ choice.unavailable_reason }}
{{ choice.consequence.success_outcome }}
{{ choice.consequence.failure_outcome }}
🩺 {{ t('bodyEffectPreview') }}
✓ {{ t('onSuccess') }}
{{ t('noEffect') }}
✗ {{ t('onFailure') }}
❤️ HP {{ choice.hp_delta > 0 ? '+' : '' }}{{ choice.hp_delta }} 💔 {{ t('failureHp') }} {{ choice.hp_delta_fail }} ⚡ {{ t('staminaLabel') }} {{ choice.stamina_delta > 0 ? '+' : '' }}{{ choice.stamina_delta }}
自我投射: {{ choice.mtt.selfProjection || '中' }} 自传意识: {{ choice.mtt.autonoetic || '中' }} 时空重建: {{ choice.mtt.spatiotemporal || '中' }}
{{ dmAiSystem.aiChoices.content }}

{{ t('vviqIntro') }}

{{ t('vviqDescription') }}

{{ t('vviqScoreGuide') }}
{{ t('vviqScore5') }}
{{ t('vviqScore4') }}
{{ t('vviqScore3') }}
{{ t('vviqScore2') }}
{{ t('vviqScore1') }}

{{ t('vviqImageGuide') || '评分参考图示' }}

VVIQ Rating Scale Visualization

{{ t('vviqImageCaption') || '1 = 最清晰生动 → 5 = 完全没有图像' }}

{{ t('startTest') }}

{{ vviqQuestions[vviqCurrentQuestion - 1]?.category }}

{{ vviqQuestions[vviqCurrentQuestion - 1]?.question }}

{{ score }}
{{ vviqRatingTexts[score - 1] }}
{{ t('prevQuestion') }} {{ vviqCurrentQuestion === vviqQuestions.length ? t('submitTest') : t('nextStep') }}

{{ t('amodalTaskDesc') }}

🖼️

{{ t('amodalImageTask') }}

{{ t('amodalCountTaskDesc') }}

{{ t('completed') }} {{ t('startAmodalTask') }}

{{ amodalTask.imageTaskCompleted ? '🎉 恭喜您已完成图像计数任务!' : '💡 请完成图像计数任务以获得评估结果' }}

{{ t('amodalTutorialRule1') }} {{ t('amodalTutorialRule2') }} {{ t('amodalTutorialRule3') }}

{{ t('amodalTutorialCountingMethod') }}

  • {{ t('amodalTutorialCountVisible') }}
  • {{ t('amodalTutorialCountPartial') }}

{{ t('amodalTutorialExampleTitle') }}

{{ t('amodalTutorialExampleDesc') }}

Example: eggs
{{ t('amodalTutorialExampleAnswer') }}
{{ t('amodalTutorialNote') }}
{{ t('amodalTutorialBack') }} {{ t('amodalTutorialConfirm') }}
{{ t('amodalObjectType') }}: {{ imageCountTask.currentItem.objectType }}
{{ t('exitGame') }} {{ imageCountTask.currentIndex === imageCountTask.items.length - 1 ? t('amodalFinishTask') : t('amodalSubmitAnswer') }}

{{ amodalTask.currentItem.itemName }}

{{ amodalTask.currentItem.itemDescription }}

🖼️

图片素材准备中...

🎬

视频素材准备中...

{{ t('amodalTimeRemaining') }}: {{ amodalTask.currentItem.timeLimitSeconds }}s

{{ amodalTask.taskType === 'image' ? t('amodalWhatDoYouSee') : t('amodalDescribeEvent') }}

{{ t('amodalConfidenceLevel') }}

{{ t('exitGame') }} {{ amodalTask.currentIndex === amodalTask.items.length - 1 ? t('amodalFinishTask') : t('amodalSubmitAnswer') }}
{{ t('refresh') }} {{ t('add') }}
{{ t('refresh') }} {{ t('add') }}
🤖 AI 角色团队
为每个AI角色设定人格特质,它们将以你定义的风格参与故事创作。选择剧本后可配置对应的AI角色。
选择剧本 {{ s.name }} {{ s.status === 'published' ? '已发布' : '草稿' }}

加载AI角色配置...

📖

{{ getAgentTypeName('storyteller') }}

故事叙事生成者 · 负责描绘场景、推进剧情、塑造NPC

叙事风格
语气基调
叙事节奏
{{ getSliderLabel('pacing', agentPersonas.storyteller.pacing) }}
细节程度
{{ getSliderLabel('detailLevel', agentPersonas.storyteller.detailLevel) }}
对话频率
{{ getSliderLabel('dialogueFreq', agentPersonas.storyteller.dialogueFreq) }}
人设补充
{{ buildPersonaPrompt('storyteller') }}
🎯

{{ getAgentTypeName('choicemaker') }}

选项生成者 · 负责设计5类互动选项和后果概要

难度档位
{{ getSliderLabel('difficulty', agentPersonas.choicemaker.difficulty) }}
风险偏向
{{ getSliderLabel('riskBalance', agentPersonas.choicemaker.riskBalance) }}
创意程度
{{ getSliderLabel('creativity', agentPersonas.choicemaker.creativity) }}
道德深度
{{ getSliderLabel('moralComplexity', agentPersonas.choicemaker.moralComplexity) }}
人设补充
{{ buildPersonaPrompt('choicemaker') }}
🎨

{{ getAgentTypeName('storypainter') }}

场景描绘者 · 负责将叙事转化为视觉画面和图像提示

画风偏好
色彩风格
构图偏好
氛围基调
人设补充
{{ buildPersonaPrompt('storypainter') }}
{{ t('refresh') }} {{ t('addScenario') }}
🧠 {{ t('vviqAssessmentTitle') }} {{ t('exportData') }}
{{ vviqStatsDetail.totalCount }}
{{ t('totalCount') }}
{{ vviqStatsDetail.avgScore }}
{{ t('avgScore') }}
{{ vviqStatsDetail.maxScore }}
{{ t('maxScore') }}
{{ vviqStatsDetail.minScore }}
{{ t('minScore') }}
{{ vviqStatsDetail.uniqueUsers }}
{{ t('uniqueUsers') }}
{{ count }}
{{ range }} {{ t('scoreUnit') }}
🤖 {{ t('aiVviqTitle') }}
{{ t('aiVviqSubtitle') }}
{{ t('aiVviqStartTest') }} {{ t('aiVviqRefresh') }}
{{ aiVviqStats.totalExperiments }}
{{ t('aiVviqTotalExperiments') }}
{{ aiVviqStats.completed }}
{{ t('aiVviqCompleted') }}
{{ aiVviqStats.failed }}
{{ t('aiVviqFailed') }}
{{ aiVviqStats.running }}
{{ t('aiVviqRunning') }}
{{ aiVviqStats.avgScore }}
{{ t('aiVviqAvgScore') }}
{{ t('aiVviqOneByOne') }}
{{ t('aiVviqTemplateVarsHint') }}
{{ getAiUserName(currentAiVviqDetail.aiUserId) }} {{ getStatusText(currentAiVviqDetail.status) }} {{ currentAiVviqDetail.totalScore || '-' }} / 160 {{ currentAiVviqDetail.percentage ? currentAiVviqDetail.percentage + '%' : '-' }} {{ currentAiVviqDetail.language }} {{ formatDuration(currentAiVviqDetail.totalDurationMs) }} {{ currentAiVviqDetail.totalTokens || '-' }} {{ formatDateTime(currentAiVviqDetail.createTime) }}

{{ t('aiVviqBehaviourRecords') }}

{{ getAiUserName(currentIOLogDetail.aiUserId) }} #{{ currentIOLogDetail.id }} {{ currentIOLogDetail.language }}
🔢 {{ t('countingStatsTitle') }} {{ t('exportData') }}
{{ amodalStatsDetail.counting.totalCount || 0 }}
{{ t('totalCompletions') }}
{{ amodalStatsDetail.counting.uniqueUsers || 0 }}
{{ t('uniqueUsers') }}
{{ (amodalStatsDetail.counting.avgMae || 0).toFixed(1) }}
{{ t('amodalMAE') }} ({{ t('avgLabel') }})
{{ (amodalStatsDetail.counting.avgRmse || 0).toFixed(1) }}
{{ t('amodalRMSE') }} ({{ t('avgLabel') }})
终局问卷总开关
关闭后,剧本结束将不再弹出问卷;已有模版会保留,但不会参与实际流程。
刷新 新建模版
留空或0表示对所有剧本通用 🧠 SEM 构念定义(潜变量)
关联题目ID(在题目中填写此构念ID即可自动归入):{{ qid }} 暂无关联题目
添加构念 📝 题目列表
必答
添加题目
{{ questionnaireResultsAdmin.filter(r => r.isCompleted === 1).length }}
有效提交数
{{ [...new Set(questionnaireResultsAdmin.filter(r=>r.isCompleted===1).map(r=>r.userId))].length }}
参与用户数
{{ questionnaireTemplates.length }}
问卷模版数
{{ questionnaireTemplates.filter(t => t.scenarioId).length }}
绑定剧本数
📋 {{ getTemplateNameById(Number(tplId)) }} 模版 #{{ tplId }} {{ Object.keys(tplAggs).length }} 个构念
{{ constructId }}
{{ getConstructLabel(constructId, Number(tplId)) }}
{{ agg.mean }}
均值 / 5.0
±{{ agg.stdDev }} SD | n={{ agg.n }}
Cronbach's α = {{ agg.cronbachAlpha }}
{{ questionnaireDetailRow.id }} {{ getUsernameById(questionnaireDetailRow.userId) }} {{ questionnaireDetailRow.sessionId }} {{ getTemplateNameById(questionnaireDetailRow.templateId) }} - {{ questionnaireDetailRow.isCompleted === 1 ? '已完成' : '未完成' }} {{ formatDateTime(questionnaireDetailRow.startedAt) }} {{ formatDateTime(questionnaireDetailRow.completedAt) }}
{{ getConstructLabel(item.constructId, questionnaireDetailRow.templateId) }}
{{ item.constructId }}
{{ item.score }}
{{ item.itemCount }} 条目 | [{{ item.rawScores.join(', ') }}]
📝 逐题作答记录
{{ t('statsRefresh') }}
{{ statsOverview.totalUsers }}
{{ t('totalUsers') }}
{{ statsOverview.vviqTotal }}
VVIQ2 {{ t('totalCompletions') }}
{{ statsOverview.amodalImageCompleted }}
{{ t('imageTaskStats') }}
👤 {{ t('userDetailsTitle') }}
{{ t('statsRefresh') }}
{{ userDetailsSummary.total }}
{{ t('totalUsers') }}
{{ userDetailsSummary.allCompleted }}
{{ t('colCompleteness') }} 5/5
{{ userDetailsSummary.hasProfile }}
{{ t('colProfileFilled') }}
{{ userDetailsSummary.hasVviq }}
VVIQ {{ t('completedUsers') }}
{{ t('colCompleteness') }}: {{ t('completenessItems') }}
{{ t('colDimSem') }}: {{ t('semScaleNote') }}
🎮 {{ t('mttEpisodicStatsTitle') }}
{{ t('exportData') }} {{ t('cancelAllActive') }} ({{ sessionStats.activeSessions }})
{{ sessionStats.totalSessions }}
{{ t('totalSessions') }}
{{ sessionStats.activeSessions }}
{{ t('activeSessions') }}
{{ sessionStats.finishedSessions }}
{{ t('finishedSessions') }}
{{ sessionStats.cancelledSessions }}
{{ t('cancelledSessions') }}
{{ sessionStats.totalTurns }}
{{ t('totalTurns') }}
⏱️ 专家校正 action_time_mapping 补充台
刷新 清空表单
{{ actionTimeMappingSummary.reviewCount }}
待复核实例
{{ actionTimeMappingSummary.groupedCount }}
待复核分组
{{ actionTimeMappingSummary.mappingCount }}
总映射数
{{ actionTimeMappingSummary.customCount }}
自定义补充数
保存补充映射 重置
{{ t('refresh') }} {{ t('add') }}
{{ t('refresh') }} {{ t('save') }}
🌍 世界环境模板
JSON: 起始地点、约束条件等
JSON: 该世界可用的天气/地形/光照类型
可以先单独创建角色卡,之后再把角色绑定到具体剧本。
📖 角色深层设定
关键设定:解释动机/恐惧触发器的过去事件,游戏中作为角色记忆展示
⚡ {{ s }}
添加
角色在游戏系统中可用的能力
JSON: 基线属性、限度、弱点
📦 {{ r }}
添加
该角色专属的起始道具/资源(不同于剧本全局道具)
🖼️ 展示设置
当前头像
{{ formData.imageUrl }}
移除
上传新头像 {{ showAvatarGallery ? '收起画廊' : '从画廊选择' }}
暂无已上传的头像,请先上传
圆形 方形 肖像
选择角色在游戏中的头像显示风格
{{ t('scenarioOpeningNarrativeHint') }}
{{ t('scenarioLanguageHint') }}
📐 回合与章节结构 (15回合 / 3章) 默认15回合,修改将重置时间调度
🔄 重置为默认渐进
回合 {{ g.turn }} {{ g.hours }}h
每个回合可独立设置时间流逝量,默认为渐进式(小时→天→年)
第{{ ch.chapterIndex }}章 回合 {{ ch.turnStart }}-{{ ch.turnEnd }}
每5回合为1章,检查点结算时验证关键道具,未获得则淘汰
🧭 15回合剧情蓝图
解析为15回合流程 重置空白蓝图
这里的结构会直接注入 AI 叙事与选项生成。失败结果和失败影响会成为后续回合的压力来源,而不是只停留在文案里。
第{{ bp.turn }}回合 第{{ bp.chapterIndex }}章 {{ getTurnBlueprintChapterTitle(bp) }} {{ bp.stageType }}
🖼️ 环境设定图 融合时作为环境风格参考
{{ bp.environmentStyleImageUrl ? '更换环境图' : '上传环境图' }}
上传后保存的是本站本地路径,不是公网图床链接。若外部生图 API 需要自己回源取图,就必须走服务端代理/内联,或改成公网可访问图床。
⚠️ 请先保存剧本后再上传
🎒 道具参考图 生成资源图时保持关键道具一致性
{{ bp.itemReferenceImageUrl ? '更换道具图' : '上传道具图' }}
推荐上传关键武器、工具、机关道具的定妆图,让资源图稳定保留这些物件。
⚠️ 请先保存剧本后再上传
🧍 NPC参考图 生成资源图时保持 NPC 外观一致
{{ bp.npcReferenceImageUrl ? '更换NPC图' : '上传NPC图' }}
推荐上传本回合关键 NPC 的立绘或半身图,方便后续资源图保持身份和服饰统一。
⚠️ 请先保存剧本后再上传
🧩 回合资源图 运行时优先与自我状态图二次融合
{{ bp.resourceFusionImageUrl ? '重新生成资源图' : '生成资源图' }} {{ bp.resourceFusionImageUrl ? '上传覆盖资源图' : '手动上传资源图' }}
当前已准备 {{ getTurnResourceSourceDetails(bp).length }} 张源图。至少需要 2 张源图,系统会按“环境图 + 道具/NPC图”生成资源图,再在运行时与自我状态图融合。
资源图生成后仍需保存剧本,才能把该回合的资源图地址写入剧本配置。
⚠️ 请先保存剧本后再生成或上传资源图
建议把 15 回合都填满,至少保证每回合有目标、成功结果、失败结果和失败影响。
🎯 事件与规则
第1回合触发的公共事件,所有角色共享,制造紧迫感
{{ item.isKeyItem ? '🔑 关键' : '📦 普通' }}
初始获得 关键道具 回合出现 (0=初始)
+ 添加道具
配置剧本中的所有道具。「初始获得」道具在游戏开始时自动获得,其余道具在指定回合/事件触发时出现。「关键道具」是检查点结算的必需品。
⚙️ 高级规则
选项格式规则: 菜单大小、必需类别、概率机制
Hard-Fail: 玩家维度/仅检查点触发
第15回合后的10题测验配置
{{ evt.type === 'public' ? '🌍 公共' : evt.type === 'private' ? '🔒 私有' : '👁️ 隐藏' }} 回合触发
+ 添加回合事件
在指定回合自动触发的环境事件,注入叙事上下文影响AI生成
🎨 沉浸式环境
{{ formData.backgroundImageUrl ? '更换图片' : '上传背景图片' }}
⚠️ 请先保存剧本后再上传图片
支持 JPG/PNG/GIF/WebP,建议尺寸 1920×1080,最大 10MB
{{ t('phase2AccessHint') }}
{{ t(profileForm.role === 'admin' ? 'admin' : 'user') }}
{{ idx + 1 }}. {{ q.text }} {{ t('questionnaireRequired') }}
{{ t('questionnaireRefData') }}: {{ q._behaviorHint }}
{{ t('questionnaireStronglyDisagree') }} {{ n }} {{ t('questionnaireStronglyAgree') }}
{{ t('questionnaireStronglyDisagree') }} {{ n }} {{ t('questionnaireStronglyAgree') }}
{{ opt.label }}
{{ currentSessionDetail.session?.id }} {{ currentSessionDetail.username }} {{ getSessionStatusText(currentSessionDetail.session?.status) }} {{ currentSessionDetail.scenario?.name || t('unknownScenario') }} {{ currentSessionDetail.task?.title || t('unknownTask') }} {{ currentSessionDetail.turnCount || 0 }} {{ t('turnCount') }} {{ formatDateTime(currentSessionDetail.session?.startedAt) }} {{ currentSessionDetail.session?.endedAt ? formatDateTime(currentSessionDetail.session?.endedAt) : '-' }} {{ currentSessionDetail.stats?.durationMinutes || 0 }} {{ t('minutes') }} ({{ t('avgTurnDuration') }}: {{ currentSessionDetail.stats?.avgTurnDurationSeconds || 0 }}{{ t('seconds') }}) {{ t('behaviourStats') }}
{{ currentBehaviourStats.engagementScore || 0 }}
{{ t('engagementScore') }}
{{ getDecisionStyleText(currentBehaviourStats.decisionStyle) }}
{{ t('decisionStyle') }}
{{ formatDuration(currentBehaviourStats.avgDecisionTimeMs) }}
{{ t('avgDecisionTime') }}
{{ formatDuration(currentBehaviourStats.avgReadingTimeMs) }}
{{ t('avgReadingTime') }}
{{ currentBehaviourStats.totalTurns || 0 }} {{ currentBehaviourStats.totalChoices || 0 }} {{ currentBehaviourStats.totalChoiceChanges || 0 }} {{ currentBehaviourStats.hesitationCount || 0 }} {{ formatDuration(currentBehaviourStats.minDecisionTimeMs) }} {{ formatDuration(currentBehaviourStats.maxDecisionTimeMs) }} {{ currentBehaviourStats.quickDecisions || 0 }} {{ currentBehaviourStats.slowDecisions || 0 }} {{ currentBehaviourStats.totalTextInputs || 0 }} {{ currentBehaviourStats.totalCharacterViews || 0 }}
{{ formatBehaviourTypeText(behaviourType) }}: {{ count }}
{{ t('aiVviqBehaviourRecords') }}
{{ t('turnHistory') }}
{{ t('turnIndex') }} {{ turn.turnIndex }} {{ t('checkpointChapterLabel').replace('{chapter}', turn.chapterIndex) }} {{ turn.timeGranularity }}
{{ t('userInput') }}:
{{ turn.actionTaken || turn.subjectInput || t('noInput') }}
{{ t('systemResponse') }}:
{{ turn.storytellerText }}
{{ t('aiChoices') }}:
{{ getTurnChoiceSummary(turn) }}
{{ t('secondaryChoiceDialogTitle') }}:
{{ t('secondaryChoiceStateQuestion') }} {{ getSecondaryChoiceOptionLabel('statePrediction', getTurnSecondaryChoice(turn).statePrediction) }}
{{ t('secondaryChoiceRiskQuestion') }} {{ getSecondaryChoiceOptionLabel('riskPrediction', getTurnSecondaryChoice(turn).riskPrediction) }}
{{ t('secondaryChoiceBasisQuestion') }} {{ getSecondaryChoiceOptionLabel('judgmentBasis', getTurnSecondaryChoice(turn).judgmentBasis) }}
{{ currentVviqDetail.userId }} {{ getUsernameById(currentVviqDetail.userId) }} {{ currentVviqDetail.totalScore }} {{ currentVviqDetail.percentage }}% {{ currentVviqDetail.interpretation }} {{ formatDateTime(currentVviqDetail.completedAt) }} {{ t('answerDetail') }}
{{ t('exportSelectAll') }} {{ t('exportClear') }} {{ t('exportRecommended') }}
{{ t('fieldRecordId') }} {{ t('fieldUserId') }} {{ t('fieldUsername') }} {{ t('fieldCompletedItems') }} {{ t('fieldStatus') }} {{ t('fieldStartTime') }} {{ t('fieldCompletedTime') }} {{ t('fieldMAE') }} {{ t('fieldMSE') }} {{ t('fieldRMSE') }} {{ t('fieldResponseTimeMs') }} {{ t('fieldResponseTimeSec') }} {{ t('fieldAccuracyRate') }} {{ t('fieldAnswersJson') }} {{ t('fieldAnswersExpanded') }}
{{ t('fieldRecordId') }} {{ t('fieldUserId') }} {{ t('fieldUsername') }} {{ t('fieldTotalScore') }} {{ t('fieldPercentage') }} {{ t('fieldInterpretation') }} {{ t('fieldCompletedTime') }} {{ t('fieldAnswersJson') }}
{{ t('fieldSessionId') }} {{ t('fieldUserId') }} {{ t('fieldUsername') }} {{ t('fieldTaskId') }} {{ t('fieldTaskTitle') }} {{ t('fieldScenarioName') }} {{ t('fieldStatus') }} {{ t('fieldTurnCount') }} {{ t('fieldStartTime') }} {{ t('fieldEndTime') }} {{ t('fieldDuration') }}
{{ t('exportSelectedCount').replace('{count}', exportDialog.selectedFields.length) }}
{{ getFieldLabel(field) }} {{ t('exportSelectFieldTip') }}
{{ locale === 'zh' ? '手册内容将指导AI如何扮演DM角色,包括语气、风格、规则等' : 'Manual content guides AI on how to play DM role, including tone, style, rules, etc.' }}
{{ locale === 'zh' ? '输入OpenAI API密钥以启用AI DM功能' : 'Enter OpenAI API key to enable AI DM functionality' }}

{{ currentCharacterCard.name }}

🎭 {{ t('personality') }}

{{ currentCharacterCard.biography }}

📖 自传体记忆

{{ section.icon }} {{ section.title }}
{{ section.content }}

📖 {{ t('characterMemory') }}

{{ currentCharacterCard.memoryText }}
{{ t('dmLanguageHint') }}
{{ dmConfig.apiProvider === 'qwen' ? 'DashScope API Key' : dmConfig.apiProvider === 'openrouter' ? 'OpenRouter API Key (sk-or-...)' : dmConfig.apiProvider === 'gemini' ? 'Google AI API Key' : dmConfig.apiProvider === 'openai' ? 'OpenAI API Key (sk-...)' : dmConfig.apiProvider === 'ollama' ? '无需API Key' : 'API Key' }}
常用Base URL参考:
• Qwen/DashScope: https://dashscope.aliyuncs.com/compatible-mode/v1
• OpenRouter: https://openrouter.ai/api/v1
• OpenAI: https://api.openai.com/v1
• Gemini: https://generativelanguage.googleapis.com/v1beta/openai/
• Ollama: http://localhost:11434/v1
{{ t('save') }}
{{ getAgentIcon(agent.agentType) }}
{{ getAgentTypeName(agent.agentType) }}
{{ agent.useCustomApi ? '使用下方独立的API配置' : '使用DM基础配置中的API' }}
🔑 独立API配置
🧪 Prompt Lab
choicemaker 实际执行的是 AI service 里的 choicemaker YAML 模板。上方“系统提示词”现在是补充约束层,不再是另一套独立输出协议。
在这里可以直接修改 choicemaker 的真实 system_prompt、user_prompt_template 和可用变量对应关系。
打开 ChoiceMaker Prompt Lab
{{ locale === 'zh' ? '自动模式会在有回合参考图时走融合;图像编辑会优先使用上一回合场景图或当前回合蓝图图片作为底图;纯文生图则完全不使用参考图。' : locale === 'es' ? 'El modo automático usa fusión si hay imágenes de referencia; la edición usa primero la imagen del turno previo o la del blueprint actual como base; texto a imagen no usa referencias.' : 'Auto uses reference fusion when available; image edit prefers the previous turn image or current blueprint image as the base; text-to-image uses no references.' }}
🧪 Prompt Lab
每次发送图像生成请求时会自动追加在最终 prompt 前面。适合放长期固定的风格、镜头、质感要求。
每次发送图像生成请求时会自动追加在最终 prompt 后面。适合放长期固定的排除项、结构约束和质量约束。
如果你想改 storypainter 模板本身,或者 Seedream 的“图1/图2 融合包装词”,请直接打开下面的模板编辑器。
打开 Storypainter Prompt Lab
{{ agent.systemPrompt || (locale === 'zh' ? '暂无提示词,点击编辑按钮添加' : 'No prompt yet, click edit to add') }}
{{ t('loadTemplate') }} {{ t('saveAsTemplate') }} {{ t('resetToDefault') }}
{{ template.name }}
这里编辑的是持久生效的提示词源头: storypainter 模板决定视觉描述和基础图像提示词结构, seedream_reference_fusion 模板决定图像融合时发给 Seedream 的图1/图2包装词。
修改这里会影响 storypainter 如何从叙事、选项、状态和蓝图中组装场景描述与基础 image prompt。
重新读取 保存模板
可用变量:{{ (aiPromptTemplateEditors.storypainter.variables || []).join(', ') || '无' }}
修改这里会影响参考图融合时,在最终图像提示词前面附加给 Seedream 的“图1 / 图2”说明。请保留 {{prompt}} 变量,它代表基础图像提示词正文。
重新读取 保存模板
可用变量:{{ (aiPromptTemplateEditors.seedream_reference_fusion.variables || []).join(', ') || '无' }}
这里编辑的是 choicemaker 实际运行时使用的模板源头。它决定固定 5 类 skeleton、严格 JSON 输出,以及回合状态、身体状态、环境参数等内容如何注入用户提示词。
如果这里的模板和上方“系统提示词补充约束”冲突,以这里的协议结构为准。建议把字段名、5类 skeleton 和 JSON 结构保留稳定。
重新读取 保存模板
可用变量:{{ (aiPromptTemplateEditors.choicemaker.variables || []).join(', ') || '无' }}