diff --git a/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx b/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx
index 80c5d38fb4..9810f47f49 100644
--- a/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx
+++ b/apps/web/src/app/admin/components/UserAdmin/UserAdminAccountInfo.tsx
@@ -12,6 +12,10 @@ import { Button } from '@/components/ui/button';
import Link from 'next/link';
import { SquareArrowOutUpRight, Webhook } from 'lucide-react';
import { createHash } from 'crypto';
+import { useMutation } from '@tanstack/react-query';
+import { useTRPC } from '@/lib/trpc/utils';
+import { toast } from 'sonner';
+import { useState } from 'react';
function getGravatarUrl(email: string, size: number = 80): string {
const hash = createHash('md5').update(email.toLowerCase().trim()).digest('hex');
@@ -25,6 +29,24 @@ export function UserAdminAccountInfo(user: UserAdminAccountInfoProps) {
const stripeUrl = `https://dashboard.stripe.com/${process.env.NODE_ENV === 'development' ? 'test/' : ''}customers/${user.stripe_customer_id}`;
const hibpUrl = `https://haveibeenpwned.com/account/${encodeURIComponent(user.google_user_email)}`;
+ const trpc = useTRPC();
+ const [isOpenAIDeactivated, setIsOpenAIDeactivated] = useState(user.is_openai_deactivated);
+ const toggleOpenAIDeactivated = useMutation(
+ trpc.admin.users.setOpenAIDeactivated.mutationOptions({
+ onSuccess: (_, variables) => {
+ setIsOpenAIDeactivated(variables.is_openai_deactivated);
+ toast.success(
+ variables.is_openai_deactivated
+ ? 'OpenAI deactivated: balanced will route to Kimi K2.5'
+ : 'OpenAI re-enabled: balanced will route to Codex'
+ );
+ },
+ onError: error => {
+ toast.error(error.message || 'Failed to update OpenAI deactivation status');
+ },
+ })
+ );
+
return (
{!user.is_sso_protected_domain && }
+