= {
openai: { displayName: "OpenAI", logo: "/openai-logo.png" },
azure: { displayName: "Azure", logo: "/azure-logo.png" },
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/vector-stores/_components/VectorStoreTableColumns.tsx b/ui/litellm-dashboard/src/app/(dashboard)/vector-stores/_components/VectorStoreTableColumns.tsx
index cf162578177..a4c18e48e1a 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/vector-stores/_components/VectorStoreTableColumns.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/vector-stores/_components/VectorStoreTableColumns.tsx
@@ -5,7 +5,7 @@ import { Copy, MoreHorizontal, Pencil, Trash2 } from "lucide-react";
import { DataTableSortHeader } from "@/components/shared/DataTable";
import { CellTooltip, DateCell, IdentityCell } from "@/components/shared/table_cells";
-import { getProviderLogoAndName } from "@/components/provider_info_helpers";
+import { getVectorStoreProviderLogoAndName } from "@/components/vector_store_providers";
import { buttonVariants } from "@/components/ui/button";
import {
DropdownMenu,
@@ -19,7 +19,7 @@ import { cn } from "@/lib/cva.config";
import { copyToClipboard } from "@/utils/dataUtils";
function VectorStoreProviderCell({ provider }: { provider: string }) {
- const { displayName, logo } = getProviderLogoAndName(provider);
+ const { displayName, logo } = getVectorStoreProviderLogoAndName(provider);
return (
{logo ? (
diff --git a/ui/litellm-dashboard/src/components/vector_store_providers.test.tsx b/ui/litellm-dashboard/src/components/vector_store_providers.test.tsx
index 73faad09d44..782314cc4c9 100644
--- a/ui/litellm-dashboard/src/components/vector_store_providers.test.tsx
+++ b/ui/litellm-dashboard/src/components/vector_store_providers.test.tsx
@@ -1,6 +1,12 @@
import { describe, expect, it } from "vitest";
import { Providers, providerLogoMap } from "@/components/provider_info_helpers";
-import { getVectorStoreProviderLogoAndName, VectorStoreProviders } from "./vector_store_providers";
+import {
+ getProviderSpecificFields,
+ getVectorStoreProviderLogoAndName,
+ VectorStoreProviders,
+ vectorStoreProviderLogoMap,
+ vectorStoreProviderMap,
+} from "./vector_store_providers";
describe("getVectorStoreProviderLogoAndName", () => {
it("resolves vector-store-only slugs to their own logo and display name", () => {
@@ -16,6 +22,38 @@ describe("getVectorStoreProviderLogoAndName", () => {
logo: expect.stringContaining("s3_vector"),
displayName: VectorStoreProviders.S3Vectors,
});
+ expect(getVectorStoreProviderLogoAndName("valkey")).toEqual({
+ logo: expect.stringContaining("valkey"),
+ displayName: VectorStoreProviders.Valkey,
+ });
+ });
+
+ it("registers valkey in the provider, logo, and field maps", () => {
+ expect(vectorStoreProviderMap.Valkey).toBe("valkey");
+ expect(vectorStoreProviderLogoMap[VectorStoreProviders.Valkey]).toContain("valkey");
+ expect(getProviderSpecificFields("valkey").map((field) => field.name)).toEqual([
+ "valkey_host",
+ "valkey_port",
+ "valkey_password",
+ "valkey_ssl",
+ "embedding_model",
+ "valkey_text_field",
+ "valkey_embedding_field",
+ ]);
+ });
+
+ it("offers valkey_ssl as a false/true select defaulting to false", () => {
+ const sslField = getProviderSpecificFields("valkey").find((field) => field.name === "valkey_ssl");
+
+ expect(sslField).toMatchObject({
+ type: "select",
+ required: false,
+ initialValue: "false",
+ });
+ expect(sslField?.options).toEqual([
+ { value: "false", label: "false" },
+ { value: "true", label: "true" },
+ ]);
});
it("resolves shared slugs to the same bundled logo as the provider map", () => {
diff --git a/ui/litellm-dashboard/src/components/vector_store_providers.tsx b/ui/litellm-dashboard/src/components/vector_store_providers.tsx
index d8ee2eb4720..ed91988f397 100644
--- a/ui/litellm-dashboard/src/components/vector_store_providers.tsx
+++ b/ui/litellm-dashboard/src/components/vector_store_providers.tsx
@@ -2,6 +2,7 @@ import { getProviderLogoAndName, Providers, providerLogoMap } from "@/components
import milvusLogo from "../../public/assets/logos/milvus.svg";
import postgresqlLogo from "../../public/assets/logos/postgresql.svg";
import s3VectorLogo from "../../public/assets/logos/s3_vector.png";
+import valkeyLogo from "../../public/assets/logos/valkey.svg";
export enum VectorStoreProviders {
Bedrock = "Amazon Bedrock",
@@ -12,6 +13,7 @@ export enum VectorStoreProviders {
OpenAI = "OpenAI",
Azure = "Azure OpenAI",
Milvus = "Milvus",
+ Valkey = "Valkey",
}
export const vectorStoreProviderMap: Record = {
@@ -23,6 +25,7 @@ export const vectorStoreProviderMap: Record = {
Azure: "azure",
Milvus: "milvus",
S3Vectors: "s3_vectors",
+ Valkey: "valkey",
};
export const vectorStoreProviderLogoMap: Record = {
@@ -34,6 +37,7 @@ export const vectorStoreProviderLogoMap: Record = {
[VectorStoreProviders.Azure]: providerLogoMap[Providers.Azure] ?? "",
[VectorStoreProviders.Milvus]: milvusLogo.src,
[VectorStoreProviders.S3Vectors]: s3VectorLogo.src,
+ [VectorStoreProviders.Valkey]: valkeyLogo.src,
};
// Define field types for provider-specific configurations
@@ -165,6 +169,71 @@ export const vectorStoreProviderFields: Record
type: "select",
},
],
+ valkey: [
+ {
+ name: "valkey_host",
+ label: "Valkey Host",
+ tooltip: "Hostname of your Valkey server with the valkey-search module loaded (no scheme or port)",
+ placeholder: "my-valkey.example.com",
+ required: true,
+ type: "text",
+ },
+ {
+ name: "valkey_port",
+ label: "Valkey Port",
+ tooltip: "Port of your Valkey server",
+ placeholder: "6379",
+ required: false,
+ type: "text",
+ initialValue: "6379",
+ },
+ {
+ name: "valkey_password",
+ label: "Valkey Password",
+ tooltip: "Password for your Valkey server (leave blank if authentication is disabled)",
+ required: false,
+ type: "password",
+ },
+ {
+ name: "valkey_ssl",
+ label: "Use TLS",
+ tooltip:
+ "Connect over TLS with rediss:// instead of redis://. Required for AWS ElastiCache clusters that have in-transit encryption enabled.",
+ required: false,
+ type: "select",
+ options: [
+ { value: "false", label: "false" },
+ { value: "true", label: "true" },
+ ],
+ initialValue: "false",
+ },
+ {
+ name: "embedding_model",
+ label: "Embedding Model",
+ tooltip: "Embedding model used to embed queries before searching the Valkey index",
+ placeholder: "text-embedding-3-small",
+ required: true,
+ type: "text",
+ },
+ {
+ name: "valkey_text_field",
+ label: "Text Field",
+ tooltip: "Name of the hash field that stores the document text",
+ placeholder: "text",
+ required: false,
+ type: "text",
+ initialValue: "text",
+ },
+ {
+ name: "valkey_embedding_field",
+ label: "Vector Field Name",
+ tooltip: "Name of the HASH field in your FT index that stores the document vector",
+ placeholder: "embedding",
+ required: false,
+ type: "text",
+ initialValue: "embedding",
+ },
+ ],
s3_vectors: [
{
name: "vector_bucket_name",