feat(settings): expose required Rust acceleration (#707)

This commit is contained in:
InfinityPacer
2026-08-24 10:46:26 +08:00
committed by GitHub
parent b8214c7f7a
commit 30b5c6445a
5 changed files with 31 additions and 4 deletions
+1
View File
@@ -2272,6 +2272,7 @@ export default {
rustAccel: 'Rust Acceleration', rustAccel: 'Rust Acceleration',
rustAccelHint: rustAccelHint:
'Use the backend Rust extension to accelerate filtering, RSS, indexer parsing, and recognition hot paths', 'Use the backend Rust extension to accelerate filtering, RSS, indexer parsing, and recognition hot paths',
rustAccelRequiredHint: 'The free-threaded runtime requires Rust acceleration',
rustAccelUnavailableHint: rustAccelUnavailableHint:
'The backend Rust acceleration extension is not installed or loaded, so this cannot be enabled', 'The backend Rust acceleration extension is not installed or loaded, so this cannot be enabled',
transferThreads: 'File Transfer Threads', transferThreads: 'File Transfer Threads',
+1
View File
@@ -2235,6 +2235,7 @@ export default {
encodingDetectionPerformanceModeHint: '优先提升探测效率,但可能降低编码探测的准确性', encodingDetectionPerformanceModeHint: '优先提升探测效率,但可能降低编码探测的准确性',
rustAccel: 'Rust 加速', rustAccel: 'Rust 加速',
rustAccelHint: '启用后使用后端 Rust 扩展加速过滤、RSS、索引器和媒体识别等热路径', rustAccelHint: '启用后使用后端 Rust 扩展加速过滤、RSS、索引器和媒体识别等热路径',
rustAccelRequiredHint: '当前 free-threaded 运行时固定使用 Rust 加速',
rustAccelUnavailableHint: '当前后端未安装或未加载 Rust 加速扩展,无法启用', rustAccelUnavailableHint: '当前后端未安装或未加载 Rust 加速扩展,无法启用',
transferThreads: '文件整理线程数', transferThreads: '文件整理线程数',
transferThreadsHint: '多线程整理文件可以提高速度,但可能增加系统资源占用', transferThreadsHint: '多线程整理文件可以提高速度,但可能增加系统资源占用',
+1
View File
@@ -2234,6 +2234,7 @@ export default {
encodingDetectionPerformanceModeHint: '優先提升探測效率,但可能降低編碼探測的準確性', encodingDetectionPerformanceModeHint: '優先提升探測效率,但可能降低編碼探測的準確性',
rustAccel: 'Rust 加速', rustAccel: 'Rust 加速',
rustAccelHint: '啟用後使用後端 Rust 擴展加速過濾、RSS、索引器和媒體識別等熱路徑', rustAccelHint: '啟用後使用後端 Rust 擴展加速過濾、RSS、索引器和媒體識別等熱路徑',
rustAccelRequiredHint: '當前 free-threaded 運行環境固定使用 Rust 加速',
rustAccelUnavailableHint: '當前後端未安裝或未加載 Rust 加速擴展,無法啟用', rustAccelUnavailableHint: '當前後端未安裝或未加載 Rust 加速擴展,無法啟用',
transferThreads: '文件整理線程數', transferThreads: '文件整理線程數',
transferThreadsHint: '多線程整理文件可以提高速度,但可能增加系統資源佔用', transferThreadsHint: '多線程整理文件可以提高速度,但可能增加系統資源佔用',
+12 -4
View File
@@ -238,6 +238,7 @@ const advancedDialog = ref(false)
const savingBasic = ref(false) const savingBasic = ref(false)
const testingLlm = ref(false) const testingLlm = ref(false)
const rustAccelAvailable = ref(false) const rustAccelAvailable = ref(false)
const rustAccelRequired = ref(false)
const agentMcpDialog = ref(false) const agentMcpDialog = ref(false)
const agentMcpServers = ref<AgentMcpServer[]>([]) const agentMcpServers = ref<AgentMcpServer[]>([])
const loadingAgentMcpServers = ref(false) const loadingAgentMcpServers = ref(false)
@@ -544,7 +545,11 @@ const canTestLlm = computed(() => {
}) })
const rustAccelHint = computed(() => const rustAccelHint = computed(() =>
rustAccelAvailable.value ? t('setting.system.rustAccelHint') : t('setting.system.rustAccelUnavailableHint'), rustAccelRequired.value
? t('setting.system.rustAccelRequiredHint')
: rustAccelAvailable.value
? t('setting.system.rustAccelHint')
: t('setting.system.rustAccelUnavailableHint'),
) )
const thinkingLevelItems = computed(() => [ const thinkingLevelItems = computed(() => [
@@ -797,7 +802,9 @@ async function loadSystemSettings() {
} }
const accelAvailable = Boolean(result.RUST_ACCEL_AVAILABLE ?? result.RUST_ACCEL_ENABLED) const accelAvailable = Boolean(result.RUST_ACCEL_AVAILABLE ?? result.RUST_ACCEL_ENABLED)
rustAccelAvailable.value = accelAvailable rustAccelAvailable.value = accelAvailable
if (!accelAvailable) SystemSettings.value.Advanced.RUST_ACCEL = false rustAccelRequired.value = Boolean(result.RUST_ACCEL_REQUIRED)
if (rustAccelRequired.value) SystemSettings.value.Advanced.RUST_ACCEL = true
else if (!accelAvailable) SystemSettings.value.Advanced.RUST_ACCEL = false
SystemSettings.value.Basic.LLM_THINKING_LEVEL = resolveThinkingLevelValue(result) SystemSettings.value.Basic.LLM_THINKING_LEVEL = resolveThinkingLevelValue(result)
await loadLlmProviders() await loadLlmProviders()
} catch (error) { } catch (error) {
@@ -898,7 +905,8 @@ async function testLlmConnection() {
// 保存高级设置 // 保存高级设置
async function saveAdvancedSettings() { async function saveAdvancedSettings() {
if (!normalizeDbBackupSettings()) return if (!normalizeDbBackupSettings()) return
if (!rustAccelAvailable.value) SystemSettings.value.Advanced.RUST_ACCEL = false if (rustAccelRequired.value) SystemSettings.value.Advanced.RUST_ACCEL = true
else if (!rustAccelAvailable.value) SystemSettings.value.Advanced.RUST_ACCEL = false
cleanEmptyFields(SystemSettings.value.Advanced, ['LOG_FILE_FORMAT']) cleanEmptyFields(SystemSettings.value.Advanced, ['LOG_FILE_FORMAT'])
// 同时保存高级设置和刮削开关设置 // 同时保存高级设置和刮削开关设置
@@ -2774,7 +2782,7 @@ watch(currentLlmSnapshotKey, (snapshotKey, previousSnapshotKey) => {
v-model="SystemSettings.Advanced.RUST_ACCEL" v-model="SystemSettings.Advanced.RUST_ACCEL"
:label="t('setting.system.rustAccel')" :label="t('setting.system.rustAccel')"
:hint="rustAccelHint" :hint="rustAccelHint"
:disabled="!rustAccelAvailable" :disabled="!rustAccelAvailable || rustAccelRequired"
persistent-hint persistent-hint
/> />
</VCol> </VCol>
@@ -1334,6 +1334,22 @@ describe('AccountSettingSystem', () => {
expect(findPost('system/env')?.[1]).toEqual(expect.objectContaining({ RUST_ACCEL: false })) expect(findPost('system/env')?.[1]).toEqual(expect.objectContaining({ RUST_ACCEL: false }))
}) })
it('keeps Rust acceleration enabled and read-only when required by the runtime', async () => {
systemEnv.RUST_ACCEL_AVAILABLE = true
systemEnv.RUST_ACCEL_REQUIRED = true
systemEnv.RUST_ACCEL = false
await renderSettings()
const dialog = await openAdvancedTab('实验室')
const rust = dialog.getByLabelText('Rust 加速')
expect(rust).toBeDisabled()
expect(rust).toBeChecked()
await fireEvent.click(dialog.getByRole('button', { name: '保存' }))
await waitFor(() => expect(findPost('system/env')).toBeDefined())
expect(findPost('system/env')?.[1]).toEqual(expect.objectContaining({ RUST_ACCEL: true }))
})
it('suppresses silent refresh while the advanced dialog is open and resumes after save', async () => { it('suppresses silent refresh while the advanced dialog is open and resumes after save', async () => {
await renderSettings() await renderSettings()
await waitFor(() => expect(mocks.apiGet).toHaveBeenCalledWith('system/env')) await waitFor(() => expect(mocks.apiGet).toHaveBeenCalledWith('system/env'))