import { useEffect, useState } from "react"; import { Card, Form, Input, Select, Button, Alert, Space, Divider, Descriptions, message } from "antd"; import { api, type RuntimeSettings, type ProviderKey, getApiBaseUrl, setApiBaseUrl, } from "../services/api"; const PROVIDER_OPTIONS = [ { label: "OpenAI", value: "openai" as ProviderKey }, { label: "Anthropic", value: "anthropic" as ProviderKey }, { label: "DeepSeek", value: "deepseek" as ProviderKey }, { label: "自定义(OpenAI兼容)", value: "custom_openai" as ProviderKey }, ]; export default function Settings() { const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [runtime, setRuntime] = useState(null); const loadSettings = async () => { setLoading(true); try { const data = await api.settings.get(); setRuntime(data); form.setFieldsValue({ system_api_base_url: getApiBaseUrl(), ocr_provider: data.ocr_provider, ocr_model: data.ocr_model, inference_provider: data.inference_provider, inference_model: data.inference_model, custom_openai_base_url: data.base_urls?.custom_openai || "", }); } catch { message.error("加载设置失败"); } finally { setLoading(false); } }; useEffect(() => { loadSettings(); }, []); const onFinish = async (values: Record) => { setSaving(true); try { setApiBaseUrl(values.system_api_base_url || ""); const payload: Record = { ocr_provider: values.ocr_provider, ocr_model: values.ocr_model?.trim() || undefined, inference_provider: values.inference_provider, inference_model: values.inference_model?.trim() || undefined, openai_api_key: values.openai_api_key?.trim() || undefined, anthropic_api_key: values.anthropic_api_key?.trim() || undefined, deepseek_api_key: values.deepseek_api_key?.trim() || undefined, custom_openai_api_key: values.custom_openai_api_key?.trim() || undefined, custom_openai_base_url: values.custom_openai_base_url?.trim() || undefined, custom_openai_model: values.custom_openai_model?.trim() || undefined, }; const data = await api.settings.update(payload); setRuntime(data); message.success("设置已保存"); } catch { message.error("保存失败"); } finally { setSaving(false); } }; return (
OCR 视觉模型(截图识别交易) 推理模型(报告生成等文本推理) API Key 与厂商配置
{runtime && ( {getApiBaseUrl()} {runtime.base_urls.custom_openai || "-"} {runtime.ocr_provider} {runtime.ocr_model} {runtime.inference_provider} {runtime.inference_model} {runtime.has_keys.openai ? "已配置" : "未配置"} {runtime.has_keys.anthropic ? "已配置" : "未配置"} {runtime.has_keys.deepseek ? "已配置" : "未配置"} {runtime.has_keys.custom_openai ? "已配置" : "未配置"} )}
); }