add the budget config to the resources

This commit is contained in:
Owen
2026-08-10 14:08:17 -04:00
parent eec3119297
commit 52de5eb539
5 changed files with 95 additions and 0 deletions
+2
View File
@@ -1817,6 +1817,8 @@
"aiResourceAliasRequired": "Alias is required for inference resources", "aiResourceAliasRequired": "Alias is required for inference resources",
"aiResourceDomainConfiguration": "Domain configuration", "aiResourceDomainConfiguration": "Domain configuration",
"aiResourceDomainConfigurationDescription": "Choose the domain clients will use to reach this inference resource.", "aiResourceDomainConfigurationDescription": "Choose the domain clients will use to reach this inference resource.",
"resourceBudgetSettings": "Budget",
"resourceBudgetSettingsDescription": "Configure how this inference resource restricts usage based on spending or token limits",
"sidebarApiKeys": "API Keys", "sidebarApiKeys": "API Keys",
"sidebarProvisioning": "Provisioning", "sidebarProvisioning": "Provisioning",
"sidebarSettings": "Settings", "sidebarSettings": "Settings",
@@ -0,0 +1,42 @@
"use client";
import { SettingsContainer } from "@app/components/Settings";
import { BudgetsEditor } from "@app/components/BudgetsEditor";
import { useSiteResourceContext } from "@app/hooks/useSiteResourceContext";
import { useTranslations } from "next-intl";
import { useRouter } from "next/navigation";
import { useEffect } from "react";
export default function PrivateResourceBudgetPage() {
const { siteResource } = useSiteResourceContext();
const router = useRouter();
const t = useTranslations();
useEffect(() => {
if (siteResource.mode !== "inference") {
router.replace(
`/${siteResource.orgId}/settings/resources/private/${siteResource.niceId}/general`
);
}
}, [
router,
siteResource.mode,
siteResource.niceId,
siteResource.orgId
]);
if (siteResource.mode !== "inference") {
return null;
}
return (
<SettingsContainer>
<BudgetsEditor
orgId={siteResource.orgId}
scope={{ type: "siteResource", id: siteResource.id }}
title={t("resourceBudgetSettings")}
description={t("resourceBudgetSettingsDescription")}
/>
</SettingsContainer>
);
}
@@ -70,6 +70,13 @@ export default async function PrivateResourceLayout(
} }
]; ];
if (siteResource.mode === "inference") {
navItems.push({
title: t("resourceBudgetSettings"),
href: `/{orgId}/settings/resources/private/{niceId}/budget`
});
}
return ( return (
<> <>
<SettingsSectionTitle <SettingsSectionTitle
@@ -0,0 +1,37 @@
"use client";
import { SettingsContainer } from "@app/components/Settings";
import { BudgetsEditor } from "@app/components/BudgetsEditor";
import { useResourceContext } from "@app/hooks/useResourceContext";
import { useTranslations } from "next-intl";
import { useRouter } from "next/navigation";
import { useEffect } from "react";
export default function PublicResourceBudgetPage() {
const { resource } = useResourceContext();
const router = useRouter();
const t = useTranslations();
useEffect(() => {
if (resource.mode !== "inference") {
router.replace(
`/${resource.orgId}/settings/resources/public/${resource.niceId}/general`
);
}
}, [router, resource.mode, resource.niceId, resource.orgId]);
if (resource.mode !== "inference") {
return null;
}
return (
<SettingsContainer>
<BudgetsEditor
orgId={resource.orgId}
scope={{ type: "resource", id: resource.resourceId }}
title={t("resourceBudgetSettings")}
description={t("resourceBudgetSettingsDescription")}
/>
</SettingsContainer>
);
}
@@ -113,6 +113,13 @@ export default async function ResourceLayout(props: ResourceLayoutProps) {
} }
} }
if (resource.mode === "inference") {
navItems.push({
title: t("resourceBudgetSettings"),
href: `/{orgId}/settings/resources/public/{niceId}/budget`
});
}
return ( return (
<> <>
<SettingsSectionTitle <SettingsSectionTitle