diff --git a/ui/litellm-dashboard/src/components/OldTeams.tsx b/ui/litellm-dashboard/src/components/OldTeams.tsx index adfec4bdf6a..8b618f78aaa 100644 --- a/ui/litellm-dashboard/src/components/OldTeams.tsx +++ b/ui/litellm-dashboard/src/components/OldTeams.tsx @@ -76,6 +76,7 @@ interface EditTeamModalProps { import { updateExistingKeys } from "@/utils/dataUtils"; import DeleteResourceModal from "./common_components/DeleteResourceModal"; +import LoggingExportersSelect from "./logging_credentials/LoggingExportersSelect"; import { Member, teamCreateCall } from "./networking"; import { ModelSelect } from "./ModelSelect/ModelSelect"; @@ -468,6 +469,22 @@ const Teams: React.FC = ({ accessToken, userID, userRole, premiumUser formValues.metadata = JSON.stringify(metadata); } + // Merge admin-owned logging_exporters into metadata at create time so the + // user can assign destinations from the new-team form (instead of create-then-edit). + if (Array.isArray(formValues.logging_exporters) && formValues.logging_exporters.length > 0) { + let metadata: Record = {}; + if (typeof formValues.metadata === "string" && formValues.metadata.trim().length > 0) { + try { + metadata = JSON.parse(formValues.metadata); + } catch (e) { + console.warn("Invalid JSON in metadata field, starting with empty object"); + } + } + metadata = { ...metadata, logging_exporters: formValues.logging_exporters }; + formValues.metadata = JSON.stringify(metadata); + } + delete formValues.logging_exporters; + if (formValues.secret_manager_settings) { if (typeof formValues.secret_manager_settings === "string") { if (formValues.secret_manager_settings.trim() === "") { @@ -1568,6 +1585,14 @@ const Teams: React.FC = ({ accessToken, userID, userRole, premiumUser Logging Settings + + +
= ({ } } + if (Array.isArray(values.logging_exporters) && values.logging_exporters.length > 0) { + let existingMetadata: Record = {}; + if (typeof values.metadata === "string" && values.metadata.trim().length > 0) { + existingMetadata = JSON.parse(values.metadata); + } else if (values.metadata && typeof values.metadata === "object") { + existingMetadata = values.metadata; + } + values.metadata = { ...existingMetadata, logging_exporters: values.logging_exporters }; + } + delete values.logging_exporters; + await organizationCreateCall(accessToken, values); NotificationsManager.success("Organization created successfully"); setIsOrgModalVisible(false); @@ -513,6 +525,14 @@ const OrganizationsTable: React.FC = ({ /> + + + +