diff --git a/ui/admin/app/components/agent/FirstModelProviderBanner.tsx b/ui/admin/app/components/agent/FirstModelProviderBanner.tsx
index f01d6904..876a503e 100644
--- a/ui/admin/app/components/agent/FirstModelProviderBanner.tsx
+++ b/ui/admin/app/components/agent/FirstModelProviderBanner.tsx
@@ -1,7 +1,7 @@
import { Link } from "@remix-run/react";
import { $path } from "remix-routes";
-import { TypographyP } from "~/components/Typography";
+import { TypographyH3, TypographyP } from "~/components/Typography";
import { OttoLogo } from "~/components/branding/OttoLogo";
import { Button } from "~/components/ui/button";
@@ -18,9 +18,9 @@ export function FirstModelProviderBanner() {
}}
/>
-
+
Ready to create your first Agent?
-
+
You're almost there! To start creating or using{" "}
agents, you'll need access to a LLM (Large
diff --git a/ui/admin/app/components/model-providers/ModelProviderBanner.tsx b/ui/admin/app/components/model-providers/ModelProviderBanner.tsx
deleted file mode 100644
index d24df06a..00000000
--- a/ui/admin/app/components/model-providers/ModelProviderBanner.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { CircleAlert } from "lucide-react";
-
-import { TypographyP } from "~/components/Typography";
-
-export function ModelProviderBanner() {
- return (
-
-
-
-
- To use Otto's features, you'll need to set up a
- Model Provider. Select and configure one below to get
- started!
-
-
-
- );
-}
diff --git a/ui/admin/app/components/model-providers/ModelProviderConfigure.tsx b/ui/admin/app/components/model-providers/ModelProviderConfigure.tsx
index da106505..7523d3b5 100644
--- a/ui/admin/app/components/model-providers/ModelProviderConfigure.tsx
+++ b/ui/admin/app/components/model-providers/ModelProviderConfigure.tsx
@@ -4,9 +4,9 @@ import useSWR from "swr";
import { ModelProvider, ModelProviderConfig } from "~/lib/model/modelProviders";
import { ModelProviderApiService } from "~/lib/service/api/modelProviderApiService";
-import { DefaultModelAliasForm } from "~/components/composed/DefaultModelAliasForm";
import { ModelProviderForm } from "~/components/model-providers/ModelProviderForm";
import { ModelProviderIcon } from "~/components/model-providers/ModelProviderIcon";
+import { DefaultModelAliasForm } from "~/components/model/shared/DefaultModelAliasForm";
import { LoadingSpinner } from "~/components/ui/LoadingSpinner";
import { Button } from "~/components/ui/button";
import {
diff --git a/ui/admin/app/components/model-providers/ModelProviderForm.tsx b/ui/admin/app/components/model-providers/ModelProviderForm.tsx
index 46c53fda..cdb94f2f 100644
--- a/ui/admin/app/components/model-providers/ModelProviderForm.tsx
+++ b/ui/admin/app/components/model-providers/ModelProviderForm.tsx
@@ -1,5 +1,4 @@
import { zodResolver } from "@hookform/resolvers/zod";
-import { Link } from "@remix-run/react";
import { CircleHelpIcon } from "lucide-react";
import { useFieldArray, useForm } from "react-hook-form";
import { toast } from "sonner";
@@ -18,6 +17,8 @@ import { ControlledInput } from "~/components/form/controlledInputs";
import { ModelProviderConfigurationLinks } from "~/components/model-providers/constants";
import { Button } from "~/components/ui/button";
import { Form } from "~/components/ui/form";
+import { Link } from "~/components/ui/link";
+import { ScrollArea } from "~/components/ui/scroll-area";
import { Separator } from "~/components/ui/separator";
import { useAsync } from "~/hooks/useAsync";
@@ -157,7 +158,7 @@ export function ModelProviderForm({
modelProvider.id === "azure-openai-model-provider";
return (
-
+
Required Configuration
@@ -192,17 +193,18 @@ export function ModelProviderForm({
{ModelProviderConfigurationLinks[
modelProvider.id
] ? (
-
-
-
-
-
+
+
+
) : null}
>
) : null}
-
+
{modelProviders.map((modelProvider) => (
-
-
+
svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
+ {
+ variants: {
+ variant: {
+ default: "bg-background text-foreground",
+ destructive:
+ "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+);
+
+const Alert = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes & VariantProps
+>(({ className, variant, ...props }, ref) => (
+
+));
+Alert.displayName = "Alert";
+
+const AlertTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+ {props.children}
+
+));
+AlertTitle.displayName = "AlertTitle";
+
+const AlertDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+AlertDescription.displayName = "AlertDescription";
+
+export { Alert, AlertTitle, AlertDescription };
diff --git a/ui/admin/app/routes/_auth.model-providers.tsx b/ui/admin/app/routes/_auth.model-providers.tsx
index bf88729b..143dec5d 100644
--- a/ui/admin/app/routes/_auth.model-providers.tsx
+++ b/ui/admin/app/routes/_auth.model-providers.tsx
@@ -1,13 +1,14 @@
+import { CircleAlertIcon } from "lucide-react";
import useSWR, { preload } from "swr";
import { ModelProvider } from "~/lib/model/modelProviders";
import { ModelProviderApiService } from "~/lib/service/api/modelProviderApiService";
import { TypographyH2 } from "~/components/Typography";
-import { DefaultModelAliasFormDialog } from "~/components/composed/DefaultModelAliasForm";
-import { ModelProviderBanner } from "~/components/model-providers/ModelProviderBanner";
import { ModelProviderList } from "~/components/model-providers/ModelProviderLists";
import { CommonModelProviderIds } from "~/components/model-providers/constants";
+import { DefaultModelAliasFormDialog } from "~/components/model/shared/DefaultModelAliasForm";
+import { Alert, AlertDescription, AlertTitle } from "~/components/ui/alert";
export async function clientLoader() {
await preload(
@@ -65,7 +66,17 @@ export default function ModelProviders() {
- {configured ? null : }
+ {configured ? null : (
+
+
+ No Model Providers Configured!
+
+ To use Otto's features, you'll need to set
+ up a Model Provider. Select and configure one below
+ to get started!
+
+
+ )}
diff --git a/ui/admin/app/routes/_auth.models.tsx b/ui/admin/app/routes/_auth.models.tsx
index 3465ec31..9746ba97 100644
--- a/ui/admin/app/routes/_auth.models.tsx
+++ b/ui/admin/app/routes/_auth.models.tsx
@@ -10,10 +10,10 @@ import { ModelProviderApiService } from "~/lib/service/api/modelProviderApiServi
import { TypographyH2 } from "~/components/Typography";
import { DataTable } from "~/components/composed/DataTable";
-import { DefaultModelAliasFormDialog } from "~/components/composed/DefaultModelAliasForm";
import { AddModel } from "~/components/model/AddModel";
import { DeleteModel } from "~/components/model/DeleteModel";
import { UpdateModelDialog } from "~/components/model/UpdateModel";
+import { DefaultModelAliasFormDialog } from "~/components/model/shared/DefaultModelAliasForm";
import { Button } from "~/components/ui/button";
import {
Tooltip,