mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-07 16:56:40 +08:00
feat: add llm user agent setting
This commit is contained in:
@@ -83,6 +83,7 @@ interface UseLlmProviderDirectoryOptions {
|
|||||||
apiKey: Ref<string>
|
apiKey: Ref<string>
|
||||||
baseUrl: Ref<string>
|
baseUrl: Ref<string>
|
||||||
baseUrlPreset?: Ref<string>
|
baseUrlPreset?: Ref<string>
|
||||||
|
userAgent?: Ref<string>
|
||||||
model: Ref<string>
|
model: Ref<string>
|
||||||
maxContextTokens?: Ref<number>
|
maxContextTokens?: Ref<number>
|
||||||
authConnected?: Ref<boolean>
|
authConnected?: Ref<boolean>
|
||||||
@@ -253,6 +254,7 @@ export function useLlmProviderDirectory(options: UseLlmProviderDirectoryOptions)
|
|||||||
api_key: normalizeValue(options.apiKey.value) || undefined,
|
api_key: normalizeValue(options.apiKey.value) || undefined,
|
||||||
base_url: normalizeValue(options.baseUrl.value) || undefined,
|
base_url: normalizeValue(options.baseUrl.value) || undefined,
|
||||||
base_url_preset: normalizeValue(options.baseUrlPreset?.value) || undefined,
|
base_url_preset: normalizeValue(options.baseUrlPreset?.value) || undefined,
|
||||||
|
user_agent: normalizeValue(options.userAgent?.value) || undefined,
|
||||||
force_refresh: forceRefresh,
|
force_refresh: forceRefresh,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ export interface WizardData {
|
|||||||
apiKey: string
|
apiKey: string
|
||||||
baseUrl: string
|
baseUrl: string
|
||||||
baseUrlPreset: string
|
baseUrlPreset: string
|
||||||
|
userAgent: string
|
||||||
maxContextTokens: number
|
maxContextTokens: number
|
||||||
audioInputProvider: string
|
audioInputProvider: string
|
||||||
audioInputApiKey: string
|
audioInputApiKey: string
|
||||||
@@ -248,6 +249,7 @@ const wizardData = ref<WizardData>({
|
|||||||
apiKey: '',
|
apiKey: '',
|
||||||
baseUrl: 'https://api.deepseek.com',
|
baseUrl: 'https://api.deepseek.com',
|
||||||
baseUrlPreset: '',
|
baseUrlPreset: '',
|
||||||
|
userAgent: '',
|
||||||
maxContextTokens: 64,
|
maxContextTokens: 64,
|
||||||
audioInputProvider: 'openai',
|
audioInputProvider: 'openai',
|
||||||
audioInputApiKey: '',
|
audioInputApiKey: '',
|
||||||
@@ -1445,6 +1447,7 @@ export function useSetupWizard() {
|
|||||||
LLM_API_KEY: wizardData.value.agent.apiKey,
|
LLM_API_KEY: wizardData.value.agent.apiKey,
|
||||||
LLM_BASE_URL: wizardData.value.agent.baseUrl || null,
|
LLM_BASE_URL: wizardData.value.agent.baseUrl || null,
|
||||||
LLM_BASE_URL_PRESET: wizardData.value.agent.baseUrlPreset || null,
|
LLM_BASE_URL_PRESET: wizardData.value.agent.baseUrlPreset || null,
|
||||||
|
LLM_USER_AGENT: wizardData.value.agent.userAgent || null,
|
||||||
LLM_MAX_CONTEXT_TOKENS: wizardData.value.agent.maxContextTokens,
|
LLM_MAX_CONTEXT_TOKENS: wizardData.value.agent.maxContextTokens,
|
||||||
AUDIO_INPUT_PROVIDER: wizardData.value.agent.audioInputProvider || 'openai',
|
AUDIO_INPUT_PROVIDER: wizardData.value.agent.audioInputProvider || 'openai',
|
||||||
AUDIO_INPUT_API_KEY: wizardData.value.agent.audioInputApiKey || null,
|
AUDIO_INPUT_API_KEY: wizardData.value.agent.audioInputApiKey || null,
|
||||||
@@ -1558,6 +1561,7 @@ export function useSetupWizard() {
|
|||||||
wizardData.value.agent.apiKey = result.data.LLM_API_KEY || ''
|
wizardData.value.agent.apiKey = result.data.LLM_API_KEY || ''
|
||||||
wizardData.value.agent.baseUrl = result.data.LLM_BASE_URL || ''
|
wizardData.value.agent.baseUrl = result.data.LLM_BASE_URL || ''
|
||||||
wizardData.value.agent.baseUrlPreset = result.data.LLM_BASE_URL_PRESET || ''
|
wizardData.value.agent.baseUrlPreset = result.data.LLM_BASE_URL_PRESET || ''
|
||||||
|
wizardData.value.agent.userAgent = result.data.LLM_USER_AGENT || ''
|
||||||
wizardData.value.agent.maxContextTokens = result.data.LLM_MAX_CONTEXT_TOKENS || 64
|
wizardData.value.agent.maxContextTokens = result.data.LLM_MAX_CONTEXT_TOKENS || 64
|
||||||
wizardData.value.agent.audioInputProvider = result.data.AUDIO_INPUT_PROVIDER || 'openai'
|
wizardData.value.agent.audioInputProvider = result.data.AUDIO_INPUT_PROVIDER || 'openai'
|
||||||
wizardData.value.agent.audioInputApiKey = result.data.AUDIO_INPUT_API_KEY || ''
|
wizardData.value.agent.audioInputApiKey = result.data.AUDIO_INPUT_API_KEY || ''
|
||||||
|
|||||||
@@ -1456,6 +1456,8 @@ export default {
|
|||||||
llmApiKeyPlaceholder: 'Please enter API key',
|
llmApiKeyPlaceholder: 'Please enter API key',
|
||||||
llmBaseUrl: 'LLM Base URL',
|
llmBaseUrl: 'LLM Base URL',
|
||||||
llmBaseUrlHint: 'Base URL for LLM API, used for custom API endpoints',
|
llmBaseUrlHint: 'Base URL for LLM API, used for custom API endpoints',
|
||||||
|
llmUserAgent: 'User-Agent',
|
||||||
|
llmUserAgentHint: 'User-Agent sent to OpenAI-compatible APIs. Leave empty to use the SDK default.',
|
||||||
llmProviderAuth: 'Provider Authorization',
|
llmProviderAuth: 'Provider Authorization',
|
||||||
llmProviderAuthHint:
|
llmProviderAuthHint:
|
||||||
'Providers that support account authorization can complete sign-in here and reuse the saved auth state.',
|
'Providers that support account authorization can complete sign-in here and reuse the saved auth state.',
|
||||||
|
|||||||
@@ -1448,6 +1448,8 @@ export default {
|
|||||||
llmApiKeyPlaceholder: '请输入API密钥',
|
llmApiKeyPlaceholder: '请输入API密钥',
|
||||||
llmBaseUrl: 'LLM基础URL',
|
llmBaseUrl: 'LLM基础URL',
|
||||||
llmBaseUrlHint: 'LLM API的基础URL地址,用于自定义API端点',
|
llmBaseUrlHint: 'LLM API的基础URL地址,用于自定义API端点',
|
||||||
|
llmUserAgent: 'User-Agent',
|
||||||
|
llmUserAgentHint: 'OpenAI 兼容接口请求使用的 User-Agent,留空则使用 SDK 默认值',
|
||||||
llmProviderAuth: '提供商授权',
|
llmProviderAuth: '提供商授权',
|
||||||
llmProviderAuthHint: '支持账号登录授权的提供商,可以直接在这里完成登录并复用授权状态。',
|
llmProviderAuthHint: '支持账号登录授权的提供商,可以直接在这里完成登录并复用授权状态。',
|
||||||
llmProviderConnectedAs: '当前已连接:{label}',
|
llmProviderConnectedAs: '当前已连接:{label}',
|
||||||
|
|||||||
@@ -1449,6 +1449,8 @@ export default {
|
|||||||
llmApiKeyPlaceholder: '請輸入API密鑰',
|
llmApiKeyPlaceholder: '請輸入API密鑰',
|
||||||
llmBaseUrl: 'LLM基礎URL',
|
llmBaseUrl: 'LLM基礎URL',
|
||||||
llmBaseUrlHint: 'LLM API的基礎URL地址,用於自定義API端點',
|
llmBaseUrlHint: 'LLM API的基礎URL地址,用於自定義API端點',
|
||||||
|
llmUserAgent: 'User-Agent',
|
||||||
|
llmUserAgentHint: 'OpenAI 兼容接口請求使用的 User-Agent,留空則使用 SDK 預設值',
|
||||||
llmProviderAuth: '提供商授權',
|
llmProviderAuth: '提供商授權',
|
||||||
llmProviderAuthHint: '支援帳號登入授權的提供商,可以直接在這裡完成登入並重用授權狀態。',
|
llmProviderAuthHint: '支援帳號登入授權的提供商,可以直接在這裡完成登入並重用授權狀態。',
|
||||||
llmProviderConnectedAs: '目前已連接:{label}',
|
llmProviderConnectedAs: '目前已連接:{label}',
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ const SystemSettings = ref<any>({
|
|||||||
LLM_API_KEY: null,
|
LLM_API_KEY: null,
|
||||||
LLM_BASE_URL: 'https://api.deepseek.com',
|
LLM_BASE_URL: 'https://api.deepseek.com',
|
||||||
LLM_BASE_URL_PRESET: null,
|
LLM_BASE_URL_PRESET: null,
|
||||||
|
LLM_USER_AGENT: null,
|
||||||
AUDIO_INPUT_PROVIDER: 'openai',
|
AUDIO_INPUT_PROVIDER: 'openai',
|
||||||
AUDIO_INPUT_API_KEY: null,
|
AUDIO_INPUT_API_KEY: null,
|
||||||
AUDIO_INPUT_BASE_URL: null,
|
AUDIO_INPUT_BASE_URL: null,
|
||||||
@@ -214,6 +215,7 @@ type LlmSettingsSnapshot = {
|
|||||||
LLM_API_KEY: string
|
LLM_API_KEY: string
|
||||||
LLM_BASE_URL: string
|
LLM_BASE_URL: string
|
||||||
LLM_BASE_URL_PRESET: string
|
LLM_BASE_URL_PRESET: string
|
||||||
|
LLM_USER_AGENT: string
|
||||||
}
|
}
|
||||||
|
|
||||||
let llmTestRequestId = 0
|
let llmTestRequestId = 0
|
||||||
@@ -247,6 +249,13 @@ const llmBaseUrlPresetRef = computed({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const llmUserAgentRef = computed({
|
||||||
|
get: () => String(SystemSettings.value.Basic.LLM_USER_AGENT ?? ''),
|
||||||
|
set: value => {
|
||||||
|
SystemSettings.value.Basic.LLM_USER_AGENT = value || ''
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
const llmModelRef = computed({
|
const llmModelRef = computed({
|
||||||
get: () => String(SystemSettings.value.Basic.LLM_MODEL ?? ''),
|
get: () => String(SystemSettings.value.Basic.LLM_MODEL ?? ''),
|
||||||
set: value => {
|
set: value => {
|
||||||
@@ -292,6 +301,7 @@ const {
|
|||||||
apiKey: llmApiKeyRef,
|
apiKey: llmApiKeyRef,
|
||||||
baseUrl: llmBaseUrlRef,
|
baseUrl: llmBaseUrlRef,
|
||||||
baseUrlPreset: llmBaseUrlPresetRef,
|
baseUrlPreset: llmBaseUrlPresetRef,
|
||||||
|
userAgent: llmUserAgentRef,
|
||||||
model: llmModelRef,
|
model: llmModelRef,
|
||||||
maxContextTokens: llmMaxContextRef,
|
maxContextTokens: llmMaxContextRef,
|
||||||
})
|
})
|
||||||
@@ -353,6 +363,7 @@ function buildLlmSnapshot(): LlmSettingsSnapshot {
|
|||||||
LLM_API_KEY: String(SystemSettings.value.Basic.LLM_API_KEY ?? ''),
|
LLM_API_KEY: String(SystemSettings.value.Basic.LLM_API_KEY ?? ''),
|
||||||
LLM_BASE_URL: String(SystemSettings.value.Basic.LLM_BASE_URL ?? ''),
|
LLM_BASE_URL: String(SystemSettings.value.Basic.LLM_BASE_URL ?? ''),
|
||||||
LLM_BASE_URL_PRESET: String(SystemSettings.value.Basic.LLM_BASE_URL_PRESET ?? ''),
|
LLM_BASE_URL_PRESET: String(SystemSettings.value.Basic.LLM_BASE_URL_PRESET ?? ''),
|
||||||
|
LLM_USER_AGENT: String(SystemSettings.value.Basic.LLM_USER_AGENT ?? ''),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -369,6 +380,7 @@ function buildLlmTestPayload(snapshot: LlmSettingsSnapshot) {
|
|||||||
api_key: snapshot.LLM_API_KEY.trim(),
|
api_key: snapshot.LLM_API_KEY.trim(),
|
||||||
base_url: snapshot.LLM_BASE_URL.trim(),
|
base_url: snapshot.LLM_BASE_URL.trim(),
|
||||||
base_url_preset: snapshot.LLM_BASE_URL_PRESET.trim(),
|
base_url_preset: snapshot.LLM_BASE_URL_PRESET.trim(),
|
||||||
|
user_agent: snapshot.LLM_USER_AGENT.trim(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1205,6 +1217,15 @@ watch(currentLlmSnapshotKey, (snapshotKey, previousSnapshotKey) => {
|
|||||||
prepend-inner-icon="mdi-key-variant"
|
prepend-inner-icon="mdi-key-variant"
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
|
<VCol v-if="SystemSettings.Basic.AI_AGENT_ENABLE && showBaseUrlField" cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="SystemSettings.Basic.LLM_USER_AGENT"
|
||||||
|
:label="t('setting.system.llmUserAgent')"
|
||||||
|
:hint="t('setting.system.llmUserAgentHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-card-account-details-outline"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
<VCol v-if="SystemSettings.Basic.AI_AGENT_ENABLE && llmProviderAuthMethods.length > 0" cols="12">
|
<VCol v-if="SystemSettings.Basic.AI_AGENT_ENABLE && llmProviderAuthMethods.length > 0" cols="12">
|
||||||
<VAlert type="info" variant="tonal">
|
<VAlert type="info" variant="tonal">
|
||||||
<div class="d-flex flex-column flex-md-row justify-space-between ga-3">
|
<div class="d-flex flex-column flex-md-row justify-space-between ga-3">
|
||||||
|
|||||||
@@ -40,6 +40,13 @@ const baseUrlPresetRef = computed({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const userAgentRef = computed({
|
||||||
|
get: () => wizardData.value.agent.userAgent,
|
||||||
|
set: value => {
|
||||||
|
wizardData.value.agent.userAgent = value || ''
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
const modelRef = computed({
|
const modelRef = computed({
|
||||||
get: () => wizardData.value.agent.model,
|
get: () => wizardData.value.agent.model,
|
||||||
set: value => {
|
set: value => {
|
||||||
@@ -92,6 +99,7 @@ const {
|
|||||||
apiKey: apiKeyRef,
|
apiKey: apiKeyRef,
|
||||||
baseUrl: baseUrlRef,
|
baseUrl: baseUrlRef,
|
||||||
baseUrlPreset: baseUrlPresetRef,
|
baseUrlPreset: baseUrlPresetRef,
|
||||||
|
userAgent: userAgentRef,
|
||||||
model: modelRef,
|
model: modelRef,
|
||||||
maxContextTokens: maxContextTokensRef,
|
maxContextTokens: maxContextTokensRef,
|
||||||
authConnected: authConnectedRef,
|
authConnected: authConnectedRef,
|
||||||
@@ -349,6 +357,16 @@ onMounted(async () => {
|
|||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
|
|
||||||
|
<VCol v-if="showBaseUrlField" cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="wizardData.agent.userAgent"
|
||||||
|
:label="t('setting.system.llmUserAgent')"
|
||||||
|
:hint="t('setting.system.llmUserAgentHint')"
|
||||||
|
persistent-hint
|
||||||
|
prepend-inner-icon="mdi-card-account-details-outline"
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
|
||||||
<VCol v-if="providerAuthMethods.length > 0" cols="12">
|
<VCol v-if="providerAuthMethods.length > 0" cols="12">
|
||||||
<VAlert type="info" variant="tonal">
|
<VAlert type="info" variant="tonal">
|
||||||
<div class="d-flex flex-column ga-3">
|
<div class="d-flex flex-column ga-3">
|
||||||
|
|||||||
Reference in New Issue
Block a user