-
+
diff --git a/src/app/(dashboard)/dashboard/settings/components/ModalityBridgeMovedCard.tsx b/src/app/(dashboard)/dashboard/settings/components/ModalityBridgeMovedCard.tsx
new file mode 100644
index 0000000000..fcdde6f1f2
--- /dev/null
+++ b/src/app/(dashboard)/dashboard/settings/components/ModalityBridgeMovedCard.tsx
@@ -0,0 +1,32 @@
+"use client";
+
+import Link from "next/link";
+import { useTranslations } from "next-intl";
+
+// One-cycle migration notice. The legacy settings component remains in the
+// codebase for rollback, but Settings → AI no longer renders or writes it.
+export default function ModalityBridgeMovedCard() {
+ const t = useTranslations("settings");
+
+ return (
+
+
+
+ image_search
+
+
+
+ {t("modalityBridgeMovedTitle")}
+
+
{t("modalityBridgeMovedBody")}
+
+
+
+
+
+ {t("modalityBridgeMovedCta")}
+
+
+
+ );
+}
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index c01891be5f..f51be80b07 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -2295,7 +2295,7 @@
"suggestedModels": "Suggested models from provider",
"imageGeneration": "Image Generation",
"imageToText": "Image to Text",
- "imageToTextComingSoon": "The inline Image-to-Text playground will be available when /api/v1/images/understanding is implemented.",
+ "imageToTextComingSoon": "Modality Bridge can describe images for text-only models now. The inline playground will be available when /api/v1/images/understanding is implemented.",
"imageToTextBridgeCta": "Configure the Image→Text bridge in Modality Bridge settings",
"sttBridgeCta": "Configure the Speech→Text bridge in Modality Bridge settings",
"disabled": "Disabled",
diff --git a/tests/unit/ui/modality-bridge-moved-card.test.tsx b/tests/unit/ui/modality-bridge-moved-card.test.tsx
new file mode 100644
index 0000000000..8eb1b83335
--- /dev/null
+++ b/tests/unit/ui/modality-bridge-moved-card.test.tsx
@@ -0,0 +1,159 @@
+// @vitest-environment jsdom
+import React, { act } from "react";
+import { createRoot, type Root } from "react-dom/client";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+
+import MediaProviderPageClient from "@/app/(dashboard)/dashboard/media-providers/[kind]/[id]/MediaProviderPageClient";
+import SettingsAiPage from "@/app/(dashboard)/dashboard/settings/ai/page";
+import ModalityBridgeMovedCard from "@/app/(dashboard)/dashboard/settings/components/ModalityBridgeMovedCard";
+
+vi.mock("next-intl", () => ({
+ useTranslations: () =>
+ Object.assign((key: string) => key, {
+ rich: (key: string) => key,
+ }),
+}));
+
+vi.mock("@/shared/components", () => ({
+ Button: ({ children }: { children: React.ReactNode }) => ,
+}));
+
+vi.mock("@/app/(dashboard)/dashboard/settings/components/ThinkingBudgetTab", () => ({
+ default: () => null,
+}));
+vi.mock("@/app/(dashboard)/dashboard/settings/components/VisionBridgeSettingsTab", () => ({
+ default: () =>