default profiles page to active profile
This commit is contained in:
+51
-24
@@ -389,6 +389,33 @@ function profileFormFromStatus(status: StatusPayload | null): ProfileFormState {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function profileFormFromProfile(profile: Profile): ProfileFormState {
|
||||||
|
const form = profile.form || {};
|
||||||
|
return {
|
||||||
|
...defaultProfileForm,
|
||||||
|
name: profile.name,
|
||||||
|
listen_host: form.listen_host || "",
|
||||||
|
listen_port: form.listen_port || "",
|
||||||
|
upstream_base_url: form.upstream_base_url || "",
|
||||||
|
auth_mode: (form.auth_mode as ProfileFormState["auth_mode"]) || "passthrough",
|
||||||
|
auth_env: form.auth_env || "",
|
||||||
|
auth_file: form.auth_file || "",
|
||||||
|
manual_secret: "",
|
||||||
|
manual_secret_file: form.manual_secret_file || "",
|
||||||
|
manual_secret_configured: Boolean(form.manual_secret_configured),
|
||||||
|
auth_json_path: form.auth_json_path || "",
|
||||||
|
auth_json_key: form.auth_json_key || "OPENAI_API_KEY",
|
||||||
|
request_history_limit: form.request_history_limit || defaultProfileForm.request_history_limit,
|
||||||
|
model_remap: form.model_remap || "",
|
||||||
|
reasoning_equals: form.reasoning_equals || "",
|
||||||
|
retryable_status_codes: form.retryable_status_codes || defaultProfileForm.retryable_status_codes,
|
||||||
|
retryable_error_messages: Array.isArray(form.retryable_error_messages)
|
||||||
|
? form.retryable_error_messages.join("\n")
|
||||||
|
: defaultProfileForm.retryable_error_messages,
|
||||||
|
endpoints: Array.isArray(form.endpoints) ? form.endpoints.join("\n") : "",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function ruleFormFromStatus(status: StatusPayload | null): RuleFormState {
|
function ruleFormFromStatus(status: StatusPayload | null): RuleFormState {
|
||||||
const config = status?.config || {};
|
const config = status?.config || {};
|
||||||
return {
|
return {
|
||||||
@@ -429,6 +456,7 @@ export default function App() {
|
|||||||
const [deletingProfile, setDeletingProfile] = useState("");
|
const [deletingProfile, setDeletingProfile] = useState("");
|
||||||
const [switchingTo, setSwitchingTo] = useState("");
|
const [switchingTo, setSwitchingTo] = useState("");
|
||||||
const [restoreRequested, setRestoreRequested] = useState(false);
|
const [restoreRequested, setRestoreRequested] = useState(false);
|
||||||
|
const [shouldSyncProfileFormToActive, setShouldSyncProfileFormToActive] = useState(true);
|
||||||
|
|
||||||
const metrics = status?.metrics || {};
|
const metrics = status?.metrics || {};
|
||||||
const tokens = metrics.token_totals || {};
|
const tokens = metrics.token_totals || {};
|
||||||
@@ -503,6 +531,12 @@ export default function App() {
|
|||||||
window.location.hash = page;
|
window.location.hash = page;
|
||||||
}, [page]);
|
}, [page]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (page === "profiles") {
|
||||||
|
setShouldSyncProfileFormToActive(true);
|
||||||
|
}
|
||||||
|
}, [page]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onHashChange = () => {
|
const onHashChange = () => {
|
||||||
const next = window.location.hash.replace("#", "") as PageKey;
|
const next = window.location.hash.replace("#", "") as PageKey;
|
||||||
@@ -529,6 +563,19 @@ export default function App() {
|
|||||||
return () => window.clearInterval(timer);
|
return () => window.clearInterval(timer);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (page !== "profiles" || !shouldSyncProfileFormToActive) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const activeProfile = profiles.find((profile) => profile.active);
|
||||||
|
if (!activeProfile) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setProfileForm(profileFormFromProfile(activeProfile));
|
||||||
|
setProfileMessage({ text: "", tone: "" });
|
||||||
|
setShouldSyncProfileFormToActive(false);
|
||||||
|
}, [page, profiles, shouldSyncProfileFormToActive]);
|
||||||
|
|
||||||
async function saveRules(event: FormEvent) {
|
async function saveRules(event: FormEvent) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
setRuleMessage({ text: "正在保存配置...", tone: "" });
|
setRuleMessage({ text: "正在保存配置...", tone: "" });
|
||||||
@@ -608,30 +655,8 @@ export default function App() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function editProfile(profile: Profile) {
|
function editProfile(profile: Profile) {
|
||||||
const form = profile.form || {};
|
setShouldSyncProfileFormToActive(false);
|
||||||
setProfileForm({
|
setProfileForm(profileFormFromProfile(profile));
|
||||||
...defaultProfileForm,
|
|
||||||
name: profile.name,
|
|
||||||
listen_host: form.listen_host || "",
|
|
||||||
listen_port: form.listen_port || "",
|
|
||||||
upstream_base_url: form.upstream_base_url || "",
|
|
||||||
auth_mode: (form.auth_mode as ProfileFormState["auth_mode"]) || "passthrough",
|
|
||||||
auth_env: form.auth_env || "",
|
|
||||||
auth_file: form.auth_file || "",
|
|
||||||
manual_secret: "",
|
|
||||||
manual_secret_file: form.manual_secret_file || "",
|
|
||||||
manual_secret_configured: Boolean(form.manual_secret_configured),
|
|
||||||
auth_json_path: form.auth_json_path || "",
|
|
||||||
auth_json_key: form.auth_json_key || "OPENAI_API_KEY",
|
|
||||||
request_history_limit: form.request_history_limit || defaultProfileForm.request_history_limit,
|
|
||||||
model_remap: form.model_remap || "",
|
|
||||||
reasoning_equals: form.reasoning_equals || "",
|
|
||||||
retryable_status_codes: form.retryable_status_codes || defaultProfileForm.retryable_status_codes,
|
|
||||||
retryable_error_messages: Array.isArray(form.retryable_error_messages)
|
|
||||||
? form.retryable_error_messages.join("\n")
|
|
||||||
: defaultProfileForm.retryable_error_messages,
|
|
||||||
endpoints: Array.isArray(form.endpoints) ? form.endpoints.join("\n") : "",
|
|
||||||
});
|
|
||||||
setProfileMessage({ text: "编辑后保存 profile env;如果保存的是当前运行 profile,后端会直接后台热应用。", tone: "" });
|
setProfileMessage({ text: "编辑后保存 profile env;如果保存的是当前运行 profile,后端会直接后台热应用。", tone: "" });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -719,6 +744,7 @@ export default function App() {
|
|||||||
const payload = await fetchJson<StatusPayload>(api.status);
|
const payload = await fetchJson<StatusPayload>(api.status);
|
||||||
if (payload.config?.profile_name === profileName) {
|
if (payload.config?.profile_name === profileName) {
|
||||||
setSwitchingTo("");
|
setSwitchingTo("");
|
||||||
|
setShouldSyncProfileFormToActive(true);
|
||||||
Promise.all([loadStatus(true), loadRequests(), loadProfiles(), loadLogs(false)]).catch(() => {});
|
Promise.all([loadStatus(true), loadRequests(), loadProfiles(), loadLogs(false)]).catch(() => {});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -989,6 +1015,7 @@ export default function App() {
|
|||||||
className="secondary"
|
className="secondary"
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setShouldSyncProfileFormToActive(false);
|
||||||
setProfileForm(profileFormFromStatus(status));
|
setProfileForm(profileFormFromStatus(status));
|
||||||
setProfileMessage({ text: "", tone: "" });
|
setProfileMessage({ text: "", tone: "" });
|
||||||
}}
|
}}
|
||||||
|
|||||||
Reference in New Issue
Block a user