b8be47d8d6
* feat(models): add WUI model display aliases Persist display-only model aliases in Web UI app config, surface them in the model selector/search, and keep canonical model IDs for Hermes calls. * fix(models): improve WUI model alias editing * fix(models): clarify unlisted model picker * fix(models): scope aliases to providers
1191 lines
47 KiB
TypeScript
1191 lines
47 KiB
TypeScript
export default {
|
||
// 登录
|
||
login: {
|
||
title: 'Hermes Web UI',
|
||
description: '输入访问令牌以继续。令牌在服务端启动日志中查看。',
|
||
placeholder: '访问令牌',
|
||
submit: '登录',
|
||
tokenRequired: '请输入访问令牌',
|
||
invalidToken: '令牌无效',
|
||
connectionFailed: '无法连接到服务器',
|
||
passwordLogin: '密码登录',
|
||
tokenLogin: '令牌登录',
|
||
usernamePlaceholder: '用户名',
|
||
passwordPlaceholder: '密码',
|
||
credentialsRequired: '请输入用户名和密码',
|
||
invalidCredentials: '用户名或密码错误',
|
||
tooManyAttempts: '登录失败次数过多,请稍后重试',
|
||
passwordMismatch: '两次密码不一致',
|
||
passwordTooShort: '密码长度至少 6 个字符',
|
||
setupSuccess: '密码登录配置成功',
|
||
passwordChanged: '密码修改成功',
|
||
passwordRemoved: '密码登录已移除',
|
||
setupPassword: '设置密码登录',
|
||
changePassword: '修改密码',
|
||
changeUsername: '修改用户名',
|
||
removePasswordLogin: '移除',
|
||
username: '用户名',
|
||
currentPassword: '当前密码',
|
||
newPassword: '新密码',
|
||
confirmPassword: '确认密码',
|
||
newUsername: '新用户名',
|
||
usernameChanged: '用户名修改成功',
|
||
usernameTooShort: '用户名至少 2 个字符',
|
||
setupDescription: '设置用户名和密码以便快速登录。访问令牌仍可继续使用。',
|
||
removeConfirm: '确定要移除密码登录吗?移除后需要使用访问令牌登录。',
|
||
passwordLoginNotConfigured: '密码登录未配置',
|
||
passwordLoginConfigured: '密码登录已启用({username})',
|
||
},
|
||
|
||
// 通用
|
||
common: {
|
||
loading: '加载中...',
|
||
cancel: '取消',
|
||
delete: '删除',
|
||
retry: '重试',
|
||
edit: '编辑',
|
||
save: '保存',
|
||
saved: '已保存',
|
||
saveFailed: '保存失败',
|
||
deleteFailed: '删除失败',
|
||
ok: '确定',
|
||
copied: '已复制',
|
||
copy: '复制',
|
||
update: '更新',
|
||
create: '创建',
|
||
noData: '暂无数据',
|
||
expired: '已过期',
|
||
fetch: '获取',
|
||
add: '添加',
|
||
enable: '启用',
|
||
disable: '禁用',
|
||
configured: '已配置',
|
||
notConfigured: '未配置',
|
||
confirm: '确定',
|
||
expand: '展开',
|
||
collapse: '收起',
|
||
start: '启动',
|
||
stop: '停止',
|
||
},
|
||
|
||
// 侧边栏
|
||
sidebar: {
|
||
chat: '对话',
|
||
search: '搜索',
|
||
apiRelay: '中转站',
|
||
history: '历史',
|
||
jobs: '任务',
|
||
kanban: '看板',
|
||
models: '模型',
|
||
profiles: '用户',
|
||
plugins: '插件',
|
||
skills: '技能',
|
||
memory: '记忆',
|
||
logs: '日志',
|
||
usage: '用量',
|
||
channels: '频道',
|
||
gateways: '网关',
|
||
terminal: '终端',
|
||
groupChat: '群聊',
|
||
files: '文件',
|
||
groupConversation: '对话',
|
||
groupPlatform: '平台',
|
||
groupAgent: '代理',
|
||
groupSystem: '系统',
|
||
groupMonitoring: '监控',
|
||
groupTools: '工具',
|
||
settings: '设置',
|
||
connected: '已连接',
|
||
disconnected: '未连接',
|
||
collapse: '收起菜单',
|
||
expand: '展开菜单',
|
||
updateTip: '在终端运行 "hermes-web-ui update" 即可更新',
|
||
updateVersion: '升级版本 v{version}',
|
||
updating: '正在更新...',
|
||
updateSuccess: '更新完成,请重启服务',
|
||
updateFailed: '更新失败',
|
||
logout: '退出登录',
|
||
nodeVersionWarning: '检测到 Node.js v{version},请升级到23以上版本。',
|
||
changelog: '更新日志',
|
||
noChangelog: '暂无更新日志',
|
||
},
|
||
|
||
// 抽屉
|
||
drawer: {
|
||
terminal: '终端',
|
||
files: '工作区',
|
||
},
|
||
|
||
// 对话
|
||
chat: {
|
||
contextRemaining: '剩余',
|
||
contextClickToEdit: '点击编辑上下文长度',
|
||
contextEditTitle: '编辑上下文长度',
|
||
contextEditDesc: '设置当前模型的上下文长度限制(token 数量)',
|
||
contextEditPlaceholder: '请输入上下文长度',
|
||
contextEditHint: '常见值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)',
|
||
contextEditSave: '保存',
|
||
contextEditCancel: '取消',
|
||
contextEditInvalid: '请输入有效的上下文长度',
|
||
contextEditSuccess: '上下文长度已更新',
|
||
contextEditFailed: '更新失败',
|
||
emptyState: '开始与 Hermes Agent 对话',
|
||
inputPlaceholder: '输入消息... (Enter 发送,Shift+Enter 换行)',
|
||
attachFiles: '添加附件',
|
||
autoPlaySpeech: '自动播放语音',
|
||
messageQueue: '消息队列',
|
||
removeQueuedMessage: '移除队列消息',
|
||
stop: '停止',
|
||
start: '启动',
|
||
stopGateway: '停止网关',
|
||
send: '发送',
|
||
contextUsed: '上下文已用:',
|
||
sessions: '会话',
|
||
webUiSessions: '会话',
|
||
sessionScopeHint: '这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。',
|
||
openHistory: '打开历史',
|
||
hermesHistory: 'Hermes 历史',
|
||
historyScopeHint: '这里按来源只读查看 Hermes 历史会话。',
|
||
noSessions: '暂无会话',
|
||
searchTitle: '搜索会话',
|
||
searchSubtitle: '按标题或消息内容搜索',
|
||
searchHint: 'Cmd/Ctrl+K',
|
||
searchPlaceholder: '搜索会话...',
|
||
searchEmpty: '最近会话',
|
||
searchRecent: '最近会话',
|
||
searchNoResults: '没有匹配的会话',
|
||
searchNoSnippet: '没有可显示的摘要',
|
||
searchEnterHint: 'Enter 打开 · Esc 关闭',
|
||
searchFailed: '搜索会话失败',
|
||
newChat: '新建对话',
|
||
deleteSession: '确定删除此会话?',
|
||
sessionDeleted: '会话已删除',
|
||
toggleBatchMode: '批量选择',
|
||
selectAll: '全选',
|
||
confirmBatchDelete: '确定删除选中的 {count} 个会话?',
|
||
batchDeleteSuccess: '已删除 {count} 个会话',
|
||
batchDeletePartial: '{failed} 个会话删除失败',
|
||
batchDeleteFailed: '批量删除失败',
|
||
rename: '重命名',
|
||
pin: '置顶',
|
||
unpin: '取消置顶',
|
||
pinned: '已置顶',
|
||
chatMode: '聊天',
|
||
liveMode: '实时',
|
||
liveSessions: '实时会话',
|
||
recentBadge: '最近',
|
||
linkedSessions: '关联 {count} 个会话',
|
||
noVisibleMessages: '没有人类可见消息。',
|
||
monitorRoleUser: '用户',
|
||
monitorRoleAssistant: '助手',
|
||
copySessionId: '复制会话 ID',
|
||
export: '导出',
|
||
exportFull: '全量导出 (JSON)',
|
||
exportCompressed: '压缩导出 (TXT)',
|
||
exportCompressing: '正在压缩上下文,请稍候...',
|
||
exportSuccess: '会话已导出',
|
||
exportFailed: '导出失败',
|
||
renamed: '已重命名',
|
||
renameFailed: '重命名失败',
|
||
renameSession: '重命名会话',
|
||
sessionNotFound: '会话未找到',
|
||
enterNewTitle: '输入新标题',
|
||
workspace: '工作区',
|
||
setWorkspace: '设置工作区',
|
||
setWorkspaceTitle: '设置会话工作区',
|
||
workspacePlaceholder: '输入项目路径,例如 /home/user/project',
|
||
workspaceSet: '工作区已设置',
|
||
workspaceSetFailed: '设置工作区失败',
|
||
other: '其他',
|
||
runFailed: '运行失败',
|
||
error: '错误',
|
||
tool: '工具',
|
||
arguments: '参数',
|
||
result: '结果',
|
||
truncated: '... (已截断)',
|
||
executionDuration: '执行时长',
|
||
thinkingLabel: '思考过程',
|
||
thinkingInProgress: '思考中…',
|
||
thinkingShow: '展开思考过程',
|
||
thinkingHide: '收起思考过程',
|
||
thinkingDuration: '已观察 {duration}',
|
||
thinkingChars: '{count} 字',
|
||
copyBubble: '复制消息',
|
||
copiedBubble: '已复制',
|
||
copyFailed: '复制失败',
|
||
playSpeech: '播放语音',
|
||
pauseSpeech: '暂停',
|
||
resumeSpeech: '继续',
|
||
stopSpeech: '停止',
|
||
speechNotSupported: '此浏览器不支持语音播放',
|
||
},
|
||
|
||
// 看板
|
||
kanban: {
|
||
title: '看板',
|
||
createTask: '新建任务',
|
||
noTasks: '暂无任务',
|
||
allStatuses: '全部状态',
|
||
allAssignees: '全部负责人',
|
||
board: {
|
||
create: '新建看板',
|
||
archive: '归档看板',
|
||
slugPlaceholder: '看板标识,例如 project-a',
|
||
namePlaceholder: '显示名称(可选)',
|
||
slugRequired: '看板标识不能为空',
|
||
created: '看板已创建',
|
||
archived: '看板已归档',
|
||
archiveConfirm: '确定归档当前看板?',
|
||
},
|
||
columns: {
|
||
triage: '待分拣',
|
||
todo: '待办',
|
||
ready: '就绪',
|
||
running: '进行中',
|
||
blocked: '阻塞',
|
||
done: '已完成',
|
||
archived: '已归档',
|
||
},
|
||
form: {
|
||
title: '标题',
|
||
titlePlaceholder: '任务标题',
|
||
titleRequired: '标题不能为空',
|
||
body: '描述',
|
||
bodyPlaceholder: '任务描述(可选)',
|
||
assignee: '负责人',
|
||
selectAssignee: '选择负责人...',
|
||
priority: '优先级',
|
||
selectPriority: '选择优先级...',
|
||
},
|
||
card: {
|
||
assigneeTooltip: '负责人',
|
||
priority: {
|
||
low: '低',
|
||
medium: '中',
|
||
high: '高',
|
||
},
|
||
timeAgo: {
|
||
justNow: '刚刚',
|
||
minutes: '{count}分钟前',
|
||
hours: '{count}小时前',
|
||
days: '{count}天前',
|
||
},
|
||
},
|
||
detail: {
|
||
status: '状态',
|
||
assignee: '负责人',
|
||
priority: '优先级',
|
||
tenant: '租户',
|
||
createdAt: '创建时间',
|
||
startedAt: '开始时间',
|
||
completedAt: '完成时间',
|
||
comments: '评论',
|
||
events: '事件',
|
||
runs: '运行记录',
|
||
result: '完成结果',
|
||
sessions: '关联会话',
|
||
sessionMessages: '会话记录',
|
||
noSessions: '未找到关联会话。',
|
||
artifacts: '产出文件',
|
||
sources: '数据来源',
|
||
highlights: '关键信息',
|
||
},
|
||
action: {
|
||
title: '操作',
|
||
complete: '完成',
|
||
completeSummary: '完成摘要(可选)',
|
||
block: '阻塞',
|
||
blockReason: '阻塞原因',
|
||
unblock: '解除阻塞',
|
||
assign: '分配',
|
||
assignTo: '分配给...',
|
||
},
|
||
message: {
|
||
taskCreated: '任务已创建',
|
||
taskCompleted: '任务已完成',
|
||
taskBlocked: '任务已阻塞',
|
||
taskUnblocked: '任务已解除阻塞',
|
||
taskAssigned: '任务已分配',
|
||
loadFailed: '加载任务失败',
|
||
},
|
||
stats: {
|
||
total: '总计',
|
||
tasks: '任务数',
|
||
},
|
||
},
|
||
|
||
// 定时任务
|
||
jobs: {
|
||
title: '定时任务',
|
||
createJob: '创建任务',
|
||
editJob: '编辑任务',
|
||
noJobs: '暂无定时任务,创建一个开始吧。',
|
||
name: '名称',
|
||
namePlaceholder: '任务名称',
|
||
schedule: '调度表达式 (Cron)',
|
||
schedulePlaceholder: '例如 0 9 * * *',
|
||
quickPresets: '快速预设',
|
||
selectPreset: '选择预设...',
|
||
presetEveryMinute: '每分钟',
|
||
presetEvery5Min: '每 5 分钟',
|
||
presetEveryHour: '每小时',
|
||
presetEveryDay: '每天 00:00',
|
||
presetEveryDay9: '每天 09:00',
|
||
presetEveryMonday: '每周一 09:00',
|
||
presetEveryMonth: '每月 1 日 09:00',
|
||
prompt: '提示词',
|
||
promptPlaceholder: '要执行的内容',
|
||
deliverTarget: '投递目标',
|
||
origin: '来源',
|
||
local: '本地',
|
||
repeatCount: '重复次数(可选)',
|
||
modelPlaceholder: 'Default model',
|
||
repeatPlaceholder: '留空表示无限重复',
|
||
jobCreated: '任务已创建',
|
||
jobUpdated: '任务已更新',
|
||
nameRequired: '名称为必填项',
|
||
scheduleRequired: '调度表达式为必填项',
|
||
loadFailed: '加载任务失败',
|
||
jobPaused: '任务已暂停',
|
||
jobResumed: '任务已恢复',
|
||
jobTriggered: '任务已触发',
|
||
modelUpdated: 'Model updated',
|
||
jobDeleted: '任务已删除',
|
||
status: {
|
||
running: '运行中',
|
||
paused: '已暂停',
|
||
disabled: '已禁用',
|
||
scheduled: '已调度',
|
||
},
|
||
info: {
|
||
model: 'Model',
|
||
schedule: 'Schedule',
|
||
lastRun: '上次运行',
|
||
nextRun: '下次运行',
|
||
deliver: '投递',
|
||
repeat: '重复',
|
||
},
|
||
action: {
|
||
pause: '暂停',
|
||
pauseJob: '暂停任务',
|
||
resume: '恢复',
|
||
resumeJob: '恢复任务',
|
||
runNow: '立即运行',
|
||
triggerImmediately: '立即触发',
|
||
},
|
||
runHistory: {
|
||
title: '运行历史',
|
||
runs: '次运行',
|
||
noRuns: '暂无运行历史。',
|
||
},
|
||
},
|
||
|
||
// 技能
|
||
skills: {
|
||
title: '技能',
|
||
searchPlaceholder: '搜索技能...',
|
||
noMatch: '没有匹配的技能',
|
||
noSkills: '暂无技能',
|
||
backTo: '返回',
|
||
attachedFiles: '附件文件',
|
||
loadFailed: '加载技能失败',
|
||
fileLoadFailed: '加载文件失败',
|
||
modified: '用户已修改',
|
||
archived: '已归档',
|
||
pinned: '已置顶',
|
||
pin: '置顶技能',
|
||
unpin: '取消置顶',
|
||
pinFailed: '更改置顶状态失败',
|
||
toggleFailed: '切换技能状态失败',
|
||
source: {
|
||
builtin: '内置',
|
||
hub: 'Hub 安装',
|
||
local: '本地安装',
|
||
},
|
||
},
|
||
|
||
// 插件
|
||
plugins: {
|
||
title: '插件',
|
||
refresh: '刷新',
|
||
notice: '只读展示可发现的 Hermes 插件 manifest。发现元数据读取不会加载插件代码。v1 管理动作仍保留在 CLI,新 Hermes 会话生效。',
|
||
loadFailed: '加载插件失败',
|
||
commandCopied: '命令已复制',
|
||
searchPlaceholder: '搜索 key、名称、描述、路径...',
|
||
source: '来源',
|
||
kind: '类型',
|
||
statusTitle: '状态',
|
||
configStatus: '配置:{status}',
|
||
notAvailable: '无',
|
||
copyCommand: '复制命令',
|
||
managedElsewhere: '由其他位置管理',
|
||
noMatch: '没有匹配当前筛选条件的插件',
|
||
enabled: '已启用',
|
||
disabled: '已禁用',
|
||
summary: {
|
||
total: '总数',
|
||
active: '已启用 / 自动',
|
||
inactive: '未启用',
|
||
disabled: '已禁用',
|
||
providerManaged: 'Provider 管理',
|
||
},
|
||
status: {
|
||
enabled: '已启用',
|
||
'auto-active': '自动启用',
|
||
inactive: '未启用',
|
||
disabled: '已禁用',
|
||
'provider-managed': 'Provider 管理',
|
||
},
|
||
statusLabel: {
|
||
enabled: '配置启用',
|
||
'auto-active': '自动启用',
|
||
inactive: '未启用',
|
||
disabled: '已禁用',
|
||
'provider-managed': 'Provider 管理',
|
||
},
|
||
configStatuses: {
|
||
enabled: '已启用',
|
||
disabled: '已禁用',
|
||
'not-enabled': '未启用',
|
||
auto: '自动',
|
||
'provider-managed': 'Provider 管理',
|
||
},
|
||
table: {
|
||
plugin: '插件',
|
||
status: '状态',
|
||
source: '来源',
|
||
kind: '类型',
|
||
capabilities: '能力',
|
||
path: '路径 / 入口',
|
||
cli: 'CLI',
|
||
},
|
||
capabilities: {
|
||
tools: '{count} 个工具',
|
||
hooks: '{count} 个 hook',
|
||
env: '{count} 个环境变量',
|
||
},
|
||
metadata: {
|
||
agentRoot: 'Agent 根目录',
|
||
python: 'Python',
|
||
scanCwd: '扫描 cwd',
|
||
projectPlugins: '项目插件',
|
||
},
|
||
},
|
||
|
||
// 记忆
|
||
memory: {
|
||
title: '记忆',
|
||
refresh: '刷新',
|
||
loadFailed: '加载记忆失败',
|
||
myNotes: '我的笔记',
|
||
noNotes: '暂无笔记。',
|
||
notesPlaceholder: '输入笔记内容...',
|
||
userProfile: '用户画像',
|
||
noProfile: '暂无画像。',
|
||
profilePlaceholder: '输入用户画像...',
|
||
soul: '灵魂',
|
||
noSoul: '暂无灵魂配置。',
|
||
soulPlaceholder: '输入灵魂配置...',
|
||
},
|
||
|
||
// 模型
|
||
models: {
|
||
title: '模型',
|
||
searchPlaceholder: '搜索模型...',
|
||
addProvider: '添加 Provider',
|
||
providerType: 'Provider 类型',
|
||
preset: '预设',
|
||
custom: '自定义',
|
||
selectProvider: '选择 Provider',
|
||
chooseProvider: '选择一个 provider...',
|
||
getApiKey: '获取 API Key',
|
||
name: '名称',
|
||
autoGeneratedName: '根据 Base URL 自动生成',
|
||
baseUrl: 'Base URL',
|
||
region: '区域',
|
||
regionIntl: '国际版',
|
||
regionCn: '中国大陆',
|
||
baseUrlPlaceholder: '例如 https://api.example.com/v1',
|
||
apiKey: 'API Key',
|
||
apiKeyPlaceholder: 'sk-...',
|
||
defaultModel: '默认模型',
|
||
selectOrInput: '选择或输入模型名称...',
|
||
selectModel: '选择模型...',
|
||
providerAdded: 'Provider 已添加',
|
||
providerDeleted: 'Provider 已删除',
|
||
deleteProvider: '删除 Provider',
|
||
deleteConfirm: '确定删除 "{name}" 吗?',
|
||
codexLoginTitle: 'OpenAI Codex 登录',
|
||
codexWaiting: '在授权页面输入以下代码完成登录:',
|
||
codexCopyCode: '代码已复制',
|
||
codexOpenLink: '打开授权页面',
|
||
codexApproved: '登录成功',
|
||
codexExpired: '授权已过期,请重试。',
|
||
nousLoginTitle: 'Nous Portal 登录',
|
||
nousWaiting: '在授权页面输入此代码完成登录:',
|
||
nousCopyCode: '代码已复制',
|
||
nousOpenLink: '打开授权页面',
|
||
nousApproved: '登录成功',
|
||
nousDenied: '授权被拒绝,请重试。',
|
||
nousExpired: '授权已过期,请重试。',
|
||
copilotLoginTitle: 'GitHub Copilot 登录',
|
||
copilotWaiting: '请前往 GitHub 输入下方设备代码完成授权。授权完成后窗口会自动关闭。',
|
||
copilotCopyCode: '代码已复制',
|
||
copilotOpenLink: '打开 GitHub 授权页',
|
||
copilotApproved: '登录成功!',
|
||
copilotDenied: '授权被拒绝。',
|
||
copilotExpired: '授权链接已过期,请重试。',
|
||
copilotAddDetectedTitle: '检测到 GitHub Copilot',
|
||
copilotAddDetected: '已在本机检测到 GitHub Copilot OAuth 凭证,点击「添加」即可在 Hermes 中启用 Copilot。',
|
||
copilotAddSourceEnv: '来源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)',
|
||
copilotAddSourceGhCli: '来源:gh CLI(gh auth token)',
|
||
copilotAddSourceAppsJson: '来源:VS Code Copilot 插件(apps.json)',
|
||
copilotDeleteHintEnv: '此操作会清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影响其他工具。',
|
||
copilotDeleteHintGhCli: 'Copilot 将从 Hermes 列表移除。不会影响 gh CLI —— `gh auth status` 仍显示已登录。',
|
||
copilotDeleteHintAppsJson: 'Copilot 将从 Hermes 列表移除。不会影响 VS Code Copilot 插件的登录。',
|
||
customBadge: '自定义',
|
||
previewBadge: '预览',
|
||
disabledBadge: '不可用',
|
||
disabledTooltip: "此模型当前账号不可用",
|
||
customModelPlaceholder: '未列出的模型 ID',
|
||
customModelHint: '仅用于 provider 支持但未返回的模型;不是重命名。按回车加载。',
|
||
removeCustomModel: '移除这个未列出的模型',
|
||
noProviders: '暂无 Provider,添加一个开始吧。',
|
||
models: '模型列表',
|
||
count: '个模型',
|
||
more: '个更多',
|
||
aliasEdit: '重命名',
|
||
aliasTitle: '模型显示名',
|
||
aliasTitleFor: '{model} 的显示名',
|
||
aliasPlaceholder: '留空则使用原始模型 ID',
|
||
aliasHint: '仅修改 Web UI 显示名,发送给 Hermes 的仍是原始模型 ID。',
|
||
aliasCanonical: '原始 ID:{model}',
|
||
aliasUseOriginal: '恢复原始 ID',
|
||
aliasManage: '显示名',
|
||
aliasManageFor: '{provider} 的显示名',
|
||
aliasSaveFailed: '保存显示名失败',
|
||
manageVisibleModels: '管理可见模型',
|
||
manageVisibleModelsFor: '管理 {name} 可见模型',
|
||
visibilityHint: '仅影响 Web UI 的模型选择器和模型页展示,不会改写 Hermes CLI 的 provider/model 配置。实际调用仍使用原始模型 ID。',
|
||
visibilitySelectOne: '至少保留一个可见模型',
|
||
visibilitySaved: '可见模型已保存',
|
||
visibilitySaveFailed: '保存可见模型失败',
|
||
showAllModels: '显示全部模型',
|
||
builtIn: '内置',
|
||
customType: '自定义',
|
||
provider: 'Provider',
|
||
contextLength: '上下文长度',
|
||
contextLengthPlaceholder: '例如 200000(可选)',
|
||
local: '本地 ({host})',
|
||
selectProviderRequired: '请选择 Provider',
|
||
baseUrlRequired: 'Base URL 为必填项',
|
||
apiKeyRequired: 'API Key 为必填项',
|
||
modelRequired: '默认模型为必填项',
|
||
enterBaseUrl: '请先输入 Base URL',
|
||
unexpectedFormat: '响应格式异常',
|
||
foundModels: '找到 {count} 个模型',
|
||
fetchFailed: '获取模型失败',
|
||
},
|
||
|
||
// 配置
|
||
profiles: {
|
||
title: '配置',
|
||
create: '创建配置',
|
||
import: '导入',
|
||
export: '导出',
|
||
rename: '重命名',
|
||
delete: '删除',
|
||
switchTo: '切换到',
|
||
switchConfirm: '切换到配置 "{name}" 将重启网关,是否继续?',
|
||
switchSuccess: '已切换到配置 "{name}"',
|
||
switchFailed: '切换配置失败,网关可能需要手动重启',
|
||
createSuccess: '配置 "{name}" 已创建',
|
||
createFailed: '创建配置失败',
|
||
renameSuccess: '配置已重命名',
|
||
renameFailed: '重命名配置失败',
|
||
deleteConfirm: '确定删除配置 "{name}" 吗?',
|
||
deleteSuccess: '配置已删除',
|
||
deleteFailed: '删除配置失败',
|
||
exportSuccess: '配置已导出',
|
||
exportFailed: '导出配置失败',
|
||
importSuccess: '配置已导入',
|
||
importFailed: '导入配置失败',
|
||
importSelectFile: '选择归档文件',
|
||
importInvalidFile: '请选择有效的归档文件 (.tar.gz, .tgz, .gz, .zip)',
|
||
name: '配置名称',
|
||
namePlaceholder: '仅限小写字母、数字、连字符',
|
||
nameValidation: '配置名称只能包含小写字母、数字、下划线和连字符',
|
||
newName: '新名称',
|
||
newNamePlaceholder: '小写字母、数字、连字符',
|
||
cloneFromCurrent: '从当前配置克隆',
|
||
cloneCleanupNotice: '克隆时会自动跳过独占型平台凭据(Weixin / Telegram / Slack 等),避免与源配置冲突',
|
||
cloneStrippedCredentials: '已清理 {count} 项独占凭据:{list}',
|
||
cloneDisabledPlatforms: '已禁用 {count} 个平台:{list}',
|
||
cloneStrippedConfigCredentials: '已清理 config.yaml 中 {count} 项内嵌凭据:{list}',
|
||
archivePath: '归档路径',
|
||
archivePathPlaceholder: '归档文件的服务器路径',
|
||
importName: '配置名称(可选)',
|
||
importNamePlaceholder: '留空则使用归档名称',
|
||
active: '活跃',
|
||
model: '模型',
|
||
gateway: '网关',
|
||
alias: '别名',
|
||
provider: 'Provider',
|
||
path: '路径',
|
||
skills: '技能',
|
||
hasEnv: '有 .env',
|
||
hasSoulMd: '有 soul.md',
|
||
noProfiles: '暂无配置,创建一个开始吧。',
|
||
},
|
||
|
||
// 日志
|
||
logs: {
|
||
title: '日志',
|
||
all: '全部',
|
||
searchPlaceholder: '搜索...',
|
||
refresh: '刷新',
|
||
noEntries: '暂无日志',
|
||
},
|
||
|
||
// 设置
|
||
settings: {
|
||
title: '设置',
|
||
saved: '已保存',
|
||
saveFailed: '保存失败',
|
||
tabs: {
|
||
display: '显示',
|
||
account: '账户',
|
||
agent: '代理',
|
||
memory: '记忆',
|
||
session: '会话',
|
||
privacy: '隐私',
|
||
apiServer: 'API 服务器',
|
||
models: '模型',
|
||
voice: '语音',
|
||
},
|
||
models: {
|
||
apiKey: 'API Key',
|
||
apiKeyPlaceholder: '输入 API Key',
|
||
save: '保存',
|
||
saved: '已保存',
|
||
saveFailed: '保存失败',
|
||
noProviders: '暂无已配置的模型',
|
||
},
|
||
display: {
|
||
streaming: '流式响应',
|
||
streamingHint: '实时显示 AI 回复',
|
||
compact: '紧凑模式',
|
||
compactHint: '减少消息间距',
|
||
showReasoning: '显示推理过程',
|
||
showReasoningHint: '展示模型思考过程',
|
||
showCost: '显示费用',
|
||
showCostHint: '在回复中显示 token 使用量',
|
||
inlineDiffs: '内联差异',
|
||
inlineDiffsHint: '代码变更以内联方式显示',
|
||
bellOnComplete: '完成提示音',
|
||
bellOnCompleteHint: 'AI 回复完成时播放提示音',
|
||
busyInputMode: '忙碌输入模式',
|
||
busyInputModeHint: 'AI 处理中仍可输入',
|
||
theme: '主题',
|
||
themeHint: '选择浅色、暗色或跟随系统',
|
||
themeLight: '浅色',
|
||
themeDark: '暗色',
|
||
themeSystem: '跟随系统',
|
||
},
|
||
agent: {
|
||
maxTurns: '最大轮次',
|
||
maxTurnsHint: '单次对话最大交互轮数',
|
||
gatewayTimeout: '网关超时',
|
||
gatewayTimeoutHint: '单次请求超时时间(秒)',
|
||
restartDrainTimeout: '重启排空超时',
|
||
restartDrainTimeoutHint: '重启前排空请求的超时时间(秒)',
|
||
toolEnforcement: '工具执行策略',
|
||
toolEnforcementHint: '控制工具调用的执行模式',
|
||
auto: '自动',
|
||
always: '始终',
|
||
never: '从不',
|
||
},
|
||
memory: {
|
||
enabled: '启用记忆',
|
||
enabledHint: '允许 AI 记住对话上下文',
|
||
userProfile: '用户画像',
|
||
userProfileHint: '允许 AI 记住用户偏好信息',
|
||
charLimit: '记忆字符上限',
|
||
charLimitHint: 'MEMORY.md 最大字符数',
|
||
userCharLimit: '用户画像字符上限',
|
||
userCharLimitHint: 'USER.md 最大字符数',
|
||
},
|
||
session: {
|
||
mode: '重置模式',
|
||
modeHint: '会话重置的触发条件',
|
||
modeBoth: '空闲 + 定时',
|
||
modeIdle: '仅空闲',
|
||
modeHourly: '仅定时',
|
||
idleMinutes: '空闲超时',
|
||
idleMinutesHint: '无操作后自动重置的等待时间(分钟)',
|
||
atHour: '定时重置时间',
|
||
humanOnly: '仅显示人类会话',
|
||
humanOnlyHint: '默认隐藏子代理和会话监看噪音',
|
||
liveMonitorHumanOnly: '实时监看:仅显示人类会话',
|
||
liveMonitorHumanOnlyHint: '在实时监看中默认隐藏子代理和会话监看噪音',
|
||
atHourHint: '每天在指定小时重置会话',
|
||
requireAuth: '会话授权',
|
||
requireAuthHint: '修改会话操作是否授权',
|
||
},
|
||
privacy: {
|
||
redactPii: '脱敏 PII',
|
||
redactPiiHint: '自动检测并隐藏敏感信息(密码、密钥等)',
|
||
},
|
||
apiServer: {
|
||
enable: '启用',
|
||
enableHint: '启用 API 服务器',
|
||
host: '主机',
|
||
hostHint: '监听地址',
|
||
port: '端口',
|
||
portHint: '监听端口',
|
||
key: '密钥',
|
||
keyHint: 'API 访问密钥',
|
||
cors: 'CORS 来源',
|
||
corsHint: '允许的跨域来源',
|
||
},
|
||
lockedIps: {
|
||
title: '锁定 IP 管理',
|
||
count: '{count} 个 IP 被锁定',
|
||
empty: '暂无锁定 IP',
|
||
unlock: '解锁',
|
||
unlockAll: '全部解锁',
|
||
unlockAllConfirm: '确认解锁所有锁定的 IP?',
|
||
unlocked: 'IP 已解锁',
|
||
allUnlocked: '已解锁 {count} 个 IP',
|
||
},
|
||
voice: {
|
||
ttsProvider: 'TTS 提供者',
|
||
ttsProviderHint: '选择消息朗读使用的语音引擎',
|
||
providerWebSpeech: 'WebSpeech API(浏览器内置)',
|
||
providerOpenai: 'OpenAI TTS',
|
||
providerCustom: '自定义端点(兼容 OpenAI)',
|
||
providerEdge: 'Edge TTS(免费,无需 API Key)',
|
||
|
||
// WebSpeech
|
||
webspeechVoice: '音色',
|
||
webspeechVoiceHint: '从浏览器或系统提供的语音中选择',
|
||
webspeechVoicePlaceholder: '自动(默认语音)',
|
||
|
||
// OpenAI
|
||
openaiKey: 'API 密钥',
|
||
openaiKeyHint: '具有 TTS 权限的 OpenAI API Key',
|
||
openaiUrl: 'API 基础地址',
|
||
openaiUrlHint: '例如 https://api.openai.com/v1/audio/speech',
|
||
openaiModel: '模型',
|
||
openaiModelHint: 'tts-1(快速)/ tts-1-hd(高音质)',
|
||
openaiVoice: '音色',
|
||
openaiVoiceHint: '用于语音合成的音色',
|
||
|
||
// 自定义端点
|
||
customHint: '支持任何 OpenAI 兼容的 TTS 服务——可用于 GPT-SoVITS、CosyVoice 等自部署服务。',
|
||
customUrl: 'API 地址',
|
||
customUrlHint: 'TTS 服务的完整基础地址',
|
||
customUrlPlaceholder: '本地适配器中配置的地址 如:http://127.0.0.1:9880',
|
||
customApiKey: 'API 密钥(可选)',
|
||
customApiKeyHint: '部分自部署服务需要身份验证',
|
||
customApiKeyPlaceholder: '不需要则留空',
|
||
// Edge TTS
|
||
edgeHint: '由 Microsoft Edge TTS 驱动(node-edge-tts)。',
|
||
edgeUrl: '适配器地址',
|
||
edgeUrlHint: 'Edge TTS 适配器地址,例如 http://127.0.0.1:9882',
|
||
edgeUrlPlaceholder: 'http://127.0.0.1:9882',
|
||
edgeVoice: '音色',
|
||
edgeVoiceHint: '选择用于语音合成的音色',
|
||
edgeRate: '语速',
|
||
edgeRateHint: '调整语音速度(0.5~2.0 倍)',
|
||
edgePitch: '音调',
|
||
edgePitchHint: '调整语音音调(-20~+20 Hz)',
|
||
|
||
|
||
// 试听
|
||
testTitle: '试听测试',
|
||
testText: '测试文本',
|
||
testTextPlaceholder: '输入测试文本...',
|
||
testTextDefault: '你好,这是一个语音测试。',
|
||
testButton: '试听',
|
||
testButtonPlaying: '播放中...',
|
||
testFailed: '测试失败:{error}',
|
||
},
|
||
},
|
||
|
||
// 平台频道设置
|
||
platform: {
|
||
requireMention: "需要 {'@'}提及",
|
||
requireMentionGroup: "群组中需要 {'@'}机器人 才会响应",
|
||
requireMentionChannel: "频道中需要 {'@'}机器人 才会响应",
|
||
requireMentionRoom: "房间中需要 {'@'}机器人 才会响应",
|
||
reactions: '表情回应',
|
||
reactionsHint: '对消息添加表情回应',
|
||
freeResponseChats: '自由响应聊天',
|
||
freeResponseChatsHint: "不需要 {'@'}提及即响应的聊天 ID(逗号分隔)",
|
||
freeResponseChannels: '自由响应频道',
|
||
freeResponseChannelsHint: "不需要 {'@'}提及即响应的频道 ID(逗号分隔)",
|
||
freeResponseRooms: '自由响应房间',
|
||
freeResponseRoomsHint: "不需要 {'@'}提及即响应的房间 ID(逗号分隔)",
|
||
mentionPatterns: '自定义提及模式',
|
||
mentionPatternsHint: '额外的触发模式列表',
|
||
autoThread: '自动创建线程',
|
||
autoThreadHint: "{'@'}提及 后自动创建回复线程",
|
||
autoThreadHintRoom: '在房间中自动创建回复线程',
|
||
dmMentionThreads: 'DM 提及线程',
|
||
dmMentionThreadsHint: '在私聊中也使用线程回复提及',
|
||
allowBots: '允许机器人消息',
|
||
allowBotsHint: '响应其他机器人发送的消息',
|
||
allowedChannels: '允许的频道',
|
||
allowedChannelsHint: '白名单频道 ID(逗号分隔)',
|
||
ignoredChannels: '忽略的频道',
|
||
ignoredChannelsHint: '不响应的频道 ID(逗号分隔)',
|
||
noThreadChannels: '无线程频道',
|
||
noThreadChannelsHint: '不创建线程的频道 ID(逗号分隔)',
|
||
exclusiveTokenWarning: '此平台使用独占 token 锁。每个 profile 必须使用不同的身份 token,否则会与其他 profile 冲突导致 gateway 启动失败。',
|
||
botToken: 'Bot Token',
|
||
botTokenHint: '开发者门户获取的 Bot Token',
|
||
accessToken: 'Access Token',
|
||
accessTokenHint: 'Matrix Access Token',
|
||
homeserver: 'Homeserver URL',
|
||
homeserverHint: 'Matrix 服务器地址',
|
||
appId: 'App ID',
|
||
appIdHint: '飞书 App ID',
|
||
appSecret: 'App Secret',
|
||
appSecretHint: '飞书 App Secret',
|
||
clientId: 'Client ID',
|
||
clientIdHint: '钉钉 Client ID',
|
||
clientSecret: 'Client Secret',
|
||
clientSecretHint: '钉钉 Client Secret',
|
||
botId: 'Bot ID',
|
||
botIdHint: '企业微信 Bot ID',
|
||
wecomSecretHint: '企业微信 Bot Secret',
|
||
waEnabled: '启用 WhatsApp',
|
||
waEnabledHint: '通过二维码配对启用 WhatsApp',
|
||
weixinToken: '微信 Token',
|
||
weixinTokenHint: '通过 weixin CLI 扫码登录获取 (hermes weixin)',
|
||
accountId: 'Account ID',
|
||
accountIdHint: '微信 Account ID',
|
||
qrLogin: '扫码登录',
|
||
qrRelogin: '重新登录',
|
||
qrFetching: '正在获取二维码...',
|
||
qrScanHint: '使用微信扫描二维码登录',
|
||
qrScanedHint: '已扫描,请在手机上确认...',
|
||
// QQ
|
||
qqAppId: 'App ID',
|
||
qqAppIdHint: 'QQ 开放平台机器人 App ID',
|
||
qqAppSecret: 'App Secret',
|
||
qqAppSecretHint: 'QQ 开放平台机器人 App Secret',
|
||
qqMarkdown: 'Markdown 支持',
|
||
qqMarkdownHint: '启用 Markdown 格式消息(部分客户端可能不支持)',
|
||
qqSandbox: '沙箱模式',
|
||
qqSandboxHint: '启用沙箱环境(测试用)',
|
||
qqQrScanHint: '使用 QQ 扫描上方二维码,或在手机上打开链接完成绑定',
|
||
},
|
||
|
||
// 网关
|
||
gateways: {
|
||
title: '网关',
|
||
running: '运行中',
|
||
stopped: '已停止',
|
||
started: '已启动',
|
||
startFailed: '启动失败',
|
||
stopFailed: '停止失败',
|
||
},
|
||
|
||
// 语言
|
||
language: {
|
||
label: '语言',
|
||
zh: '中文',
|
||
en: 'English',
|
||
},
|
||
|
||
// 终端
|
||
terminal: {
|
||
sessions: '会话',
|
||
newTab: '新建终端',
|
||
closeSession: '关闭此会话?',
|
||
sessionExited: '已退出',
|
||
processExited: '进程已退出,代码 {code}',
|
||
noSessions: '暂无终端会话',
|
||
connectionFailed: '终端服务连接失败',
|
||
connectionClosed: '终端连接已关闭',
|
||
connectionError: '终端连接错误',
|
||
},
|
||
|
||
// 群聊
|
||
groupChat: {
|
||
title: '群聊',
|
||
createRoom: '创建房间',
|
||
joinByCode: '通过邀请码加入',
|
||
roomName: '房间名称',
|
||
roomNamePlaceholder: '输入房间名称',
|
||
inviteCode: '邀请码',
|
||
autoGenerate: '自动生成',
|
||
noRooms: '暂无房间',
|
||
selectOrCreate: '选择或创建一个房间开始聊天',
|
||
agents: '智能体',
|
||
addAgent: '添加智能体',
|
||
selectProfile: '选择一个配置',
|
||
agentAdded: '智能体已添加',
|
||
agentAlreadyInRoom: '该智能体已在房间中',
|
||
noAgents: '当前房间暂无智能体',
|
||
members: '成员',
|
||
roomCreated: '房间已创建',
|
||
roomDeleted: '房间已删除',
|
||
deleteRoomConfirm: '确定删除这个房间吗?',
|
||
you: '你',
|
||
joined: '已加入房间',
|
||
joinFailed: '加入房间失败',
|
||
inputPlaceholder: '输入消息... (Enter 发送)',
|
||
enterCode: '输入邀请码',
|
||
yourName: '你的名称',
|
||
yourNamePlaceholder: '输入你的群聊昵称',
|
||
yourDescription: '自我描述(选填)',
|
||
yourDescriptionPlaceholder: '介绍一下你自己...',
|
||
agentName: 'Agent 名称',
|
||
agentNamePlaceholder: '自定义名称(留空则使用 profile 名称)',
|
||
agentDesc: 'Agent 描述',
|
||
agentDescPlaceholder: '描述这个 agent 的作用...',
|
||
agentReplying: '正在回复...',
|
||
agentCompressing: '正在压缩上下文...',
|
||
compressionSettings: '压缩设置',
|
||
triggerTokens: '触发压缩 Token 数',
|
||
triggerTokensDesc: '消息 token 数超过此值时触发上下文压缩',
|
||
maxHistoryTokens: '最大历史 Token 数',
|
||
maxHistoryTokensDesc: '压缩后发送给 LLM 的最大 token 数',
|
||
tailMessageCount: '保留最近消息数',
|
||
tailMessageCountDesc: '压缩后保留最近的原始消息条数',
|
||
compressionConfig: '压缩配置',
|
||
compressionSaved: '压缩配置已保存',
|
||
compressNow: '立即压缩',
|
||
compressingInProgress: '正在压缩中,请稍后',
|
||
},
|
||
|
||
// 用量统计
|
||
usage: {
|
||
title: '用量统计',
|
||
refresh: '刷新',
|
||
totalTokens: '总 Token 数',
|
||
inputTokens: '输入',
|
||
outputTokens: '输出',
|
||
totalSessions: '总会话数',
|
||
avgPerDay: '日均 ~{n}',
|
||
estimatedCost: '预估费用',
|
||
cacheHitRate: '缓存命中率',
|
||
modelBreakdown: '模型分布',
|
||
dailyTrend: '每日用量(近 30 天)',
|
||
date: '日期',
|
||
tokens: 'Token',
|
||
cache: '缓存',
|
||
cacheRead: '缓存读取',
|
||
cacheWrite: '缓存写入',
|
||
sessions: '会话',
|
||
cost: '费用',
|
||
noData: '暂无用量数据',
|
||
},
|
||
// 文件管理
|
||
files: {
|
||
title: '文件',
|
||
fileTree: '文件树',
|
||
tree: '目录树',
|
||
list: '文件列表',
|
||
breadcrumbRoot: '根目录',
|
||
newFile: '新建文件',
|
||
newFolder: '新建文件夹',
|
||
upload: '上传',
|
||
refresh: '刷新',
|
||
open: '打开',
|
||
edit: '编辑',
|
||
preview: '预览',
|
||
download: '下载',
|
||
copyPath: '复制路径',
|
||
rename: '重命名',
|
||
delete: '删除',
|
||
name: '名称',
|
||
size: '大小',
|
||
modified: '修改时间',
|
||
actions: '操作',
|
||
emptyDir: '空目录',
|
||
loading: '加载中...',
|
||
confirmDelete: '确定要删除「{name}」吗?',
|
||
confirmDeleteDir: '确定要删除目录「{name}」及其所有内容吗?',
|
||
deleteFailed: '删除失败',
|
||
deleted: '已删除',
|
||
renameTo: '重命名为',
|
||
newFileName: '文件名',
|
||
newFolderName: '文件夹名',
|
||
created: '已创建',
|
||
createFailed: '创建失败',
|
||
renamed: '已重命名',
|
||
renameFailed: '重命名失败',
|
||
uploadSuccess: '已上传 {count} 个文件',
|
||
uploadFailed: '上传失败',
|
||
saveFailed: '保存失败',
|
||
saved: '已保存',
|
||
unsavedChanges: '有未保存的更改,是否丢弃?',
|
||
pathCopied: '路径已复制',
|
||
fileTooLarge: '文件过大(最大 10MB)',
|
||
permissionDenied: '无法修改受保护的文件',
|
||
notFound: '文件或目录不存在',
|
||
backendError: '文件操作失败',
|
||
dragDropHint: '拖拽文件到此处上传',
|
||
closeEditor: '关闭编辑器',
|
||
closePreview: '关闭',
|
||
saveFile: '保存',
|
||
},
|
||
// 下载
|
||
download: {
|
||
downloading: '正在下载...',
|
||
downloadFailed: '下载失败',
|
||
fileNotFound: '文件不存在或已被删除',
|
||
fileTooLarge: '文件过大(超过限制)',
|
||
backendError: '文件读取失败,远程环境可能不可用',
|
||
backendTimeout: '文件读取超时',
|
||
unsupportedBackend: '当前 terminal backend 暂不支持文件下载',
|
||
invalidPath: '无效的文件路径',
|
||
download: '下载',
|
||
downloadFile: '下载文件',
|
||
},
|
||
|
||
// 更新日志
|
||
changelog: {
|
||
new_0_5_14_1: '新增会话导出功能:支持完整和压缩模式,导出为 JSON 或纯文本',
|
||
new_0_5_14_2: '修复终端面板启动即连接导致 PTY 资源耗尽的问题,改为懒加载连接',
|
||
new_0_5_14_3: '修复 WSL2 环境下 IPv6 双栈绑定导致健康检查失败、端口无法访问的问题',
|
||
new_0_5_14_4: '修复服务关闭时 SQLite 连接未释放导致重启后数据库被锁的问题',
|
||
new_0_5_14_5: '更新 FUN-Codex/FUN-Claude 模型列表,新增内置标识、API 中转站入口',
|
||
new_0_5_15_1: '新增看板面板,可视化任务与会话管理',
|
||
new_0_5_15_2: '新增官网首页与文档站',
|
||
new_0_5_15_3: '修复群聊 Agent 客户端使用动态端口而非硬编码 8648',
|
||
new_0_5_15_4: '新增 node-edge-tts 语音模块',
|
||
new_0_5_15_5: '修复 WSL 默认监听地址绑定问题',
|
||
new_0_5_15_6: '新增官网首页 SEO 元数据',
|
||
new_0_5_15_7: '新增基于 IP 的登录暴力破解防护',
|
||
new_0_5_15_8: '修复 MarkdownRenderer 中下载链接重复包装问题',
|
||
new_0_5_15_9: '修复 Hermes Markdown 媒体渲染与同步重试',
|
||
new_0_5_15_10: '重构移除上游环境变量依赖',
|
||
new_0_5_15_11: '如果看板功能无法使用,请升级 hermes-agent',
|
||
new_0_5_16_1: '聊天流式接口从 /v1/runs 迁移至 /v1/responses,降低延迟',
|
||
new_0_5_16_2: '持久化真实 API 用量(token、缓存、推理)到用量统计表',
|
||
new_0_5_16_3: '官网导航栏新增 QQ 群二维码',
|
||
new_0_5_16_4: '移除消息 schema 中未使用的 codex_reasoning_items 字段',
|
||
new_0_5_17_1: '全面兼容 Windows:路径处理、进程管理、终端、日志解析',
|
||
new_0_5_17_2: '重构 Gateway 进程管理,支持跨平台启动/停止/健康检查',
|
||
new_0_5_17_3: '修复 Termux 环境下插件发现失败的问题,自动解析 hermes shebang 定位 Python',
|
||
new_0_5_17_5: '优化认证锁定窗口和开发环境关闭流程',
|
||
new_0_5_17_4: 'YAML 配置解析容忍重复键',
|
||
new_0_5_17_6: 'Comic 主题新增中文(站酷快乐体)、日文(Zen Maru Gothic)、韩文(Gaegu)手写字体',
|
||
new_0_5_17_7: '新增 Comic/涂鸦主题风格',
|
||
new_0_5_17_8: '许可证变更为 BSL-1.1',
|
||
new_0_5_17_9: '新增只读 Hermes 插件页',
|
||
new_0_5_17_10: '图片上传转为 base64 多模态格式',
|
||
new_0_5_17_11: '修复 Kanban 看板选择与隔离问题',
|
||
new_0_5_17_12: '新增语音播放设置,支持 4 种 TTS 提供商',
|
||
new_0_5_17_13: '降低上下文压缩提示阈值从 200 到 150',
|
||
new_0_5_17_14: '修复 Web UI 自更新重启逻辑',
|
||
new_0_5_17_15: '修复 opencode-zen 和 opencode-go 共享环境变量导致配置联动',
|
||
new_0_5_17_16: '新增繁体中文(zh-TW)语言支持',
|
||
new_0_5_17_17: '模型页支持在 Web UI 里管理可见模型',
|
||
new_0_5_17_18: 'Kanban:补齐任务操作链路(评论、日志、分配、派发),明确能力边界',
|
||
new_0_5_17_19: '修复删除 Provider 时未清除认证条目',
|
||
new_0_5_17_20: '修复 Codex credential-pool 认证识别',
|
||
new_0_5_17_21: 'Edge TTS 新增语速/音调调节',
|
||
new_0_5_17_22: 'config.yaml 重复键不再导致解析崩溃',
|
||
new_0_5_17_23: 'Gateway 端口所有权检查改为基于 PID 文件,防止跨 Profile 端口占用',
|
||
new_0_5_17_24: '历史页面现在显示 Cron 会话记录',
|
||
new_0_5_17_25: '修复收起侧边栏时语言切换和主题图标挤压问题',
|
||
new_0_5_13_1: '新增消息队列,顺序处理运行请求,避免并发冲突',
|
||
new_0_5_13_2: '支持二级 Skills 目录结构,扁平化 Skill 归入"杂项"分类',
|
||
new_0_5_13_3: '启动同步时过滤临时会话(eph_*),避免导入内部会话',
|
||
new_0_5_13_4: '新增 Termux/proot 环境兼容,支持移动端和嵌入式部署',
|
||
new_0_5_13_5: '完善聊天运行中止生命周期:用户取消时正确清理状态',
|
||
new_0_5_13_6: '移除历史消息列表中的流式指示器,显示更清爽',
|
||
new_0_5_13_7: '修复自定义 Provider 的上下文解析,改进模型匹配',
|
||
new_0_5_13_8: '修复 IPv6 默认监听地址绑定问题',
|
||
new_0_5_13_9: '优化聊天消息显示和上下文压缩逻辑',
|
||
new_0_5_13_10: '修复聊天完成提示音开关不生效及 cron 静默运行历史为空的问题',
|
||
new_0_5_12_1: '新增会话批量删除功能:支持 checkbox 多选、全选、批量删除,提升会话管理效率',
|
||
new_0_5_12_2: '新增模型上下文长度可视化编辑:点击上下文长度即可打开编辑弹窗,支持自定义 token 限制',
|
||
new_0_5_12_3: '修复群聊提及功能键盘选择问题:使用自定义下拉菜单替换 NDropdown,支持键盘导航和滚动跟随',
|
||
new_0_5_12_4: '新增聊天完成提示音:支持自动播放开关,提升交互体验',
|
||
new_0_5_12_5: '优化聊天消息显示:过滤空内容助手消息,改进历史记录和压缩逻辑',
|
||
new_0_5_12_6: '改进升级机制:使用 npm prefix -g 动态解析路径,支持 Homebrew 等非标准 Node.js 安装',
|
||
new_0_5_6_1: '新增语音播放功能:使用 Web Speech API,支持手动播放按钮、自动播放开关、彩虹边框动画和移动端优化',
|
||
new_0_5_6_2: '新增健壮的 LLM JSON 解析器,兼容 Python 格式并从流式事件中提取文本',
|
||
new_0_5_6_3: 'Skills 功能增强:使用统计、来源过滤、归档技能、来源追溯和置顶切换',
|
||
new_0_5_6_4: '扩展每日使用统计,包含详细的 token 细分,分离缓存读/写统计',
|
||
new_0_5_6_5: '优化会话历史范围说明,改进聊天和历史视图的描述',
|
||
new_0_5_6_6: '重新设计附件处理,采用 Anthropic 风格的 ContentBlock 数组格式,支持类型区分(文本、图片、文件)',
|
||
new_0_5_6_7: '新增前端文件下载功能,支持 ContentBlock 和 Markdown 两种格式,带身份验证',
|
||
new_0_5_10_1: 'GitHub Release 时自动构建 Docker 镜像并添加版本标签(如 :v0.5.10)',
|
||
new_0_5_10_2: '新增会话授权模式配置:approvals.mode(关闭/手动)',
|
||
new_0_5_10_3: '新增自动 OpenAPI 文档生成(94 个端点,24 个标签)',
|
||
new_0_5_10_4: '增强媒体渲染:支持 Markdown 中的图片、视频和文件',
|
||
new_0_5_10_5: '优化群聊提示并修复媒体处理',
|
||
new_0_5_6_8: '修复多进程冲突导致的 SQLite 数据库重置问题,清理冗余 nodemon 进程',
|
||
new_0_5_9_1: '统一应用程序中的 profile 管理,提供一致的 API 和状态管理',
|
||
new_0_5_9_2: '添加 GitHub issue 和 pull request 模板以改进贡献工作流程',
|
||
new_0_5_8_1: '新增抽屉面板支持移动端侧边栏,可自定义彩虹边框按钮',
|
||
new_0_5_8_2: '修复 profile 切换状态同步问题,立即更新 UI 并验证后端状态',
|
||
new_0_5_8_3: '过滤语音播放中的特殊字符和表情符号,改善语音合成效果',
|
||
new_0_5_8_4: '添加缺失的 i18n 键并统一会话数据源,优先使用数据库',
|
||
new_0_5_8_5: '优化 Vite 构建配置加快 Docker 构建,使用 esbuild 和代码分割',
|
||
new_0_5_7_1: '优化上下文压缩以支持富内容(图片、文件),改进工具消息处理',
|
||
new_0_5_7_2: '改进会话同步,使用批量插入和事务保护确保数据一致性',
|
||
new_0_5_7_3: '修复 usage.updated 事件接收,确保跨运行准确追踪 token',
|
||
new_0_5_5_1: '🎉 五一劳动节快乐!这个劳动节就不劳动啦,如果有问题大家忍忍',
|
||
new_0_5_5_2: '新增历史页面,用于浏览 Hermes 会话历史记录',
|
||
new_0_5_5_3: '历史页面独立管理会话状态,不影响当前聊天页面的活动会话',
|
||
new_0_5_5_4: '历史页面默认自动加载并选中第一个 CLI 类型的会话',
|
||
new_0_5_5_5: '新增 HistoryMessageList 组件,支持通过 props 注入会话数据',
|
||
new_0_5_5_6: '过滤空内容消息和无 toolName 的 tool 消息,提升历史记录显示质量',
|
||
new_0_5_5_7: '移除 localStorage 会话缓存,所有会话数据改为直接从后端获取',
|
||
new_0_5_5_8: '优化 profile 切换逻辑,移除废弃的缓存清理调用',
|
||
new_0_5_4_1: '修复并发聊天会话事件串扰问题,重构 WebSocket 事件路由机制',
|
||
new_0_5_4_2: '修复 cron job 编辑 payload,支持长提示词的仅名称编辑',
|
||
new_0_5_4_3: '修复 Docker 部署后 Web 终端无法使用 Hermes CLI 的问题',
|
||
new_0_5_4_4: '添加工作区对话框标题 i18n 翻译,改进会话持久化',
|
||
new_0_5_4_5: '支持代码块复制反馈,显示用户通知',
|
||
new_0_5_4_6: '对齐使用分析与 Hermes 状态数据库架构',
|
||
new_0_4_8_2: '修复嵌套 Markdown 代码块导致渲染截断',
|
||
new_0_4_8_3: '修复压缩续接会话投影和搜索问题',
|
||
new_0_4_8_4: '优化会话列表 N+1 查询,修复非 CJK 搜索 500 错误',
|
||
new_0_4_8_5: '修复切换标签页返回时强制滚动到底部',
|
||
new_0_4_8_6: '切换会话时添加加载过渡动画',
|
||
new_0_4_8_7: '修复登录 Token 验证使用正确的会话端点',
|
||
new_0_4_8_8: '修复刷新页面后图片附件失效问题',
|
||
new_0_4_8_9: '点击图片附件可全屏预览',
|
||
new_0_4_8_10: '上传目录从临时目录迁移到 ~/.hermes-web-ui/upload',
|
||
new_0_4_7_1: '实时流式显示思考/推理过程',
|
||
new_0_4_7_2: 'Docker 构建时跳过 prepare 脚本',
|
||
new_0_4_7_3: '群聊移动端体验改进和 UI 优化',
|
||
new_0_4_7_4: '将剩余上下文 Token 数限制为 0 而非负数',
|
||
new_0_4_7_5: '新增阿里云编码计划内置 Provider,支持 .env base_url 覆盖',
|
||
new_0_4_7_6: '启动时跳过远程配置文件以防止卡住',
|
||
new_0_4_7_7: '检测并展示被静默吞没的运行错误',
|
||
new_0_4_7_8: 'Provider 感知的上下文长度查询',
|
||
new_0_4_7_9: '切换时重置 config.model 并解析 CLI 自定义 Provider',
|
||
new_0_4_7_10: '删除内置 Provider 时清除 .env 中的 base_url_env',
|
||
new_0_4_7_11: '对齐群聊房间侧边栏背景与会话列表',
|
||
new_0_4_4_1: '新增文件浏览器,支持多后端(本地/Docker/SSH/Singularity)',
|
||
new_0_4_4_2: '新增聊天消息附件文件下载',
|
||
new_0_4_4_3: '活跃会话显示实时状态标签',
|
||
new_0_4_4_4: '新增 StepFun 和 Nous Portal Provider 支持',
|
||
new_0_4_4_5: '修复特殊字符搜索导致 500 错误',
|
||
new_0_4_5_1: '新增群聊功能,支持多 Agent 房间、提及路由和输入状态恢复',
|
||
new_0_4_5_2: '使用 YAML 重写模型上下文配置,新增 context_length 设置',
|
||
new_0_4_5_3: '新增 gpt-5.5 到 OpenAI Codex 模型列表',
|
||
new_0_4_5_4: '用本地控制器替换任务代理,优化模型加载',
|
||
new_0_4_5_5: 'ModelSelector 自定义模型功能新增 i18n 支持',
|
||
new_0_4_5_6: '修复侧边栏 i18n 缺失 key 警告',
|
||
new_0_4_5_7: '退出登录时清除所有 localStorage',
|
||
new_0_4_5_8: '新增日志定期轮转,防止日志无限增长',
|
||
new_0_4_2_1: '新增 Token 用量追踪、上下文显示和动态上下文长度',
|
||
new_0_4_2_2: '新增会话搜索弹窗',
|
||
new_0_4_2_3: '恢复群聊系统(Socket.IO + SQLite 持久化)',
|
||
new_0_4_2_4: 'Chat 页面新增固定会话和实时监控',
|
||
new_0_4_2_5: '修复内置 Provider 检测和模型匹配问题',
|
||
},
|
||
}
|