diff --git a/apps/ui/src/components/providers/hero.tsx b/apps/ui/src/components/providers/hero.tsx index 67402cb8d8..507f5bd48e 100644 --- a/apps/ui/src/components/providers/hero.tsx +++ b/apps/ui/src/components/providers/hero.tsx @@ -1,4 +1,13 @@ -import { ExternalLink, Play } from "lucide-react"; +import { + ExternalLink, + Play, + ShieldCheck, + ShieldAlert, + MapPin, + Database, + Eye, + Clock, +} from "lucide-react"; import { AuthLink } from "@/components/shared/auth-link"; import { Button } from "@/lib/components/button"; @@ -15,6 +24,42 @@ interface HeroProps { providerId: ProviderId; } +function DataPolicyBadge({ + value, + labelTrue, + labelFalse, + dangerIfTrue = false, +}: { + value: boolean | null; + labelTrue: string; + labelFalse: string; + dangerIfTrue?: boolean; +}) { + if (value === null) { + return ( + + Unknown + + ); + } + + const isDanger = dangerIfTrue ? value : !value; + + if (isDanger) { + return ( + + {value ? labelTrue : labelFalse} + + ); + } + + return ( + + {value ? labelTrue : labelFalse} + + ); +} + export function Hero({ providerId }: HeroProps) { const config = getConfig(); const provider = providerDefinitions.find((p) => p.id === providerId)!; @@ -70,8 +115,117 @@ export function Hero({ providerId }: HeroProps) { + + {(provider.dataPolicy || provider.headquarters) && ( +
+

+ {provider.dataPolicy?.apiTraining === false ? ( + + ) : ( + + )} + Data & Privacy +

+
+ {provider.headquarters && ( +
+ + HQ: + {provider.headquarters} +
+ )} + {provider.dataPolicy && ( + <> +
+ + + API Training: + + +
+
+ + + Consumer Training: + + +
+
+ + + Prompt Logging: + + +
+ {provider.dataPolicy.retentionPeriod !== undefined && ( +
+ + + Retention: + + + {provider.dataPolicy.retentionPeriod ?? "Unknown"} + +
+ )} + {provider.dataPolicy.gdpr !== undefined && ( +
+ + GDPR: + +
+ )} + {provider.dataPolicy.soc2 !== undefined && ( +
+ + SOC2: + +
+ )} + {provider.dataPolicy.iso27001 !== undefined && ( +
+ + + ISO 27001: + + +
+ )} + + )} +
+
+ )} + {(provider.termsUrl || provider.privacyPolicyUrl) && ( -
+
{provider.termsUrl && (
- - {modelsCount} model{modelsCount !== 1 ? "s" : ""} - +
+ + {modelsCount} model{modelsCount !== 1 ? "s" : ""} + + {provider.headquarters && ( + + + {provider.headquarters} + + )} + {provider.dataPolicy?.apiTraining === false && ( + + + No training + + )} +
{provider.website && (
; } +export interface ProviderDataPolicy { + apiTraining: boolean | null; + consumerTraining: boolean | null; + promptLogging: boolean | null; + retentionPeriod?: string | null; + soc2?: boolean | null; + iso27001?: boolean | null; + gdpr?: boolean | null; +} + export interface ProviderDefinition { id: string; name: string; @@ -51,9 +61,13 @@ export interface ProviderDefinition { regionConfig?: ProviderRegionConfig; termsUrl?: string | null; privacyPolicyUrl?: string | null; + /** ISO 3166-1 alpha-2 country code for provider headquarters */ + headquarters?: string | null; + /** Data usage and privacy policy details */ + dataPolicy?: ProviderDataPolicy | null; } -export const providers = [ +export const providers: ProviderDefinition[] = [ { id: "llmgateway", name: "LLM Gateway", @@ -71,6 +85,16 @@ export const providers = [ announcement: null, termsUrl: "https://llmgateway.io/terms", privacyPolicyUrl: "https://llmgateway.io/privacy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: false, + iso27001: false, + gdpr: false, + }, }, { id: "openai", @@ -89,6 +113,16 @@ export const providers = [ announcement: null, termsUrl: "https://openai.com/policies/terms-of-use", privacyPolicyUrl: "https://openai.com/policies/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: true, + promptLogging: true, + retentionPeriod: null, + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "anthropic", @@ -107,6 +141,16 @@ export const providers = [ announcement: null, termsUrl: "https://www.anthropic.com/terms", privacyPolicyUrl: "https://www.anthropic.com/privacy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: true, + promptLogging: true, + retentionPeriod: "30 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "google-ai-studio", @@ -128,6 +172,16 @@ export const providers = [ announcement: null, termsUrl: "https://ai.google.dev/gemini-api/terms", privacyPolicyUrl: "https://cloud.google.com/terms/data-processing-addendum", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: true, + promptLogging: true, + retentionPeriod: "55 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "glacier", @@ -147,6 +201,8 @@ export const providers = [ announcement: null, termsUrl: null, privacyPolicyUrl: null, + headquarters: null, + dataPolicy: null, }, { id: "google-vertex", @@ -171,6 +227,16 @@ export const providers = [ priority: 0.8, termsUrl: "https://cloud.google.com/terms/service-terms", privacyPolicyUrl: "https://policies.google.com/privacy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "vertex-openai", @@ -195,6 +261,16 @@ export const providers = [ priority: 0.9, termsUrl: "https://cloud.google.com/terms/service-terms", privacyPolicyUrl: "https://cloud.google.com/terms/data-processing-addendum", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "vertex-anthropic", @@ -218,6 +294,16 @@ export const providers = [ priority: 0.9, termsUrl: "https://cloud.google.com/terms/service-terms", privacyPolicyUrl: "https://cloud.google.com/terms/data-processing-addendum", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "quartz", @@ -242,6 +328,8 @@ export const providers = [ priority: 0.9, termsUrl: null, privacyPolicyUrl: null, + headquarters: null, + dataPolicy: null, }, { id: "avalanche", @@ -263,6 +351,8 @@ export const providers = [ announcement: null, termsUrl: null, privacyPolicyUrl: null, + headquarters: null, + dataPolicy: null, }, { id: "groq", @@ -280,6 +370,15 @@ export const providers = [ announcement: null, termsUrl: "https://groq.com/terms-of-use", privacyPolicyUrl: "https://groq.com/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + gdpr: true, + }, }, { id: "cerebras", @@ -298,6 +397,15 @@ export const providers = [ announcement: null, termsUrl: "https://cerebras.ai/terms-of-service", privacyPolicyUrl: "https://cerebras.ai/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + gdpr: true, + }, }, { id: "xai", @@ -316,6 +424,15 @@ export const providers = [ priority: 0.1, termsUrl: "https://x.ai/legal/terms-of-service", privacyPolicyUrl: "https://x.ai/legal/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: true, + retentionPeriod: "30 days", + soc2: true, + gdpr: true, + }, }, { id: "deepseek", @@ -336,6 +453,13 @@ export const providers = [ "https://cdn.deepseek.com/policies/en-US/deepseek-terms-of-use.html", privacyPolicyUrl: "https://cdn.deepseek.com/policies/en-US/deepseek-privacy-policy.html", + headquarters: "CN", + dataPolicy: { + apiTraining: true, + consumerTraining: true, + promptLogging: true, + retentionPeriod: null, + }, }, { id: "alibaba", @@ -373,6 +497,14 @@ export const providers = [ "https://www.alibabacloud.com/help/en/legal/latest/alibaba-cloud-international-website-product-terms-of-service-v-3-8-0", privacyPolicyUrl: "https://www.alibabacloud.com/help/en/legal/latest/alibaba-cloud-international-website-privacy-policy", + headquarters: "CN", + dataPolicy: { + apiTraining: false, + consumerTraining: null, + promptLogging: true, + retentionPeriod: null, + iso27001: true, + }, }, { id: "novita", @@ -390,6 +522,13 @@ export const providers = [ announcement: null, termsUrl: "https://novita.ai/legal/terms-of-service", privacyPolicyUrl: "https://novita.ai/legal/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + }, }, { id: "aws-bedrock", @@ -415,6 +554,16 @@ export const providers = [ learnMore: "https://docs.llmgateway.io/integrations/aws-bedrock", termsUrl: "https://aws.amazon.com/service-terms", privacyPolicyUrl: "https://aws.amazon.com/privacy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "azure", @@ -442,6 +591,16 @@ export const providers = [ learnMore: "https://docs.llmgateway.io/integrations/azure", termsUrl: "https://www.microsoft.com/licensing/terms", privacyPolicyUrl: "https://privacy.microsoft.com/privacystatement", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "azure-ai-foundry", @@ -467,6 +626,16 @@ export const providers = [ learnMore: "https://docs.llmgateway.io/integrations/azure", termsUrl: "https://www.microsoft.com/licensing/terms", privacyPolicyUrl: "https://privacy.microsoft.com/privacystatement", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "zai", @@ -484,6 +653,13 @@ export const providers = [ announcement: null, termsUrl: "https://docs.z.ai/legal-agreement/terms-of-use", privacyPolicyUrl: "https://docs.z.ai/legal-agreement/privacy-policy", + headquarters: "CN", + dataPolicy: { + apiTraining: false, + consumerTraining: null, + promptLogging: false, + retentionPeriod: "0 days", + }, }, { id: "moonshot", @@ -502,6 +678,13 @@ export const providers = [ termsUrl: "https://www.kimi.com/user/agreement/modelUse?version=v2", privacyPolicyUrl: "https://www.kimi.com/user/agreement/userPrivacy?version=v2", + headquarters: "CN", + dataPolicy: { + apiTraining: false, + consumerTraining: null, + promptLogging: false, + retentionPeriod: "0 days", + }, }, { id: "perplexity", @@ -520,6 +703,15 @@ export const providers = [ announcement: null, termsUrl: "https://www.perplexity.ai/hub/legal/terms-of-service", privacyPolicyUrl: "https://www.perplexity.ai/hub/legal/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + gdpr: true, + }, }, { id: "nebius", @@ -538,6 +730,15 @@ export const providers = [ announcement: null, termsUrl: "https://docs.nebius.com/legal/terms-of-use", privacyPolicyUrl: "https://docs.nebius.com/legal/privacy", + headquarters: "NL", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + }, }, { id: "mistral", @@ -555,6 +756,16 @@ export const providers = [ announcement: null, termsUrl: "https://legal.mistral.ai/terms/commercial-terms-of-service", privacyPolicyUrl: "https://mistral.ai/terms/#privacy-policy", + headquarters: "FR", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: true, + retentionPeriod: "30 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, { id: "inference.net", @@ -573,6 +784,14 @@ export const providers = [ announcement: null, termsUrl: "https://inference.net/terms-of-service", privacyPolicyUrl: "https://inference.net/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: null, + consumerTraining: null, + promptLogging: null, + retentionPeriod: null, + soc2: true, + }, }, { id: "together-ai", @@ -591,6 +810,14 @@ export const providers = [ announcement: null, termsUrl: "https://www.together.ai/terms-of-service", privacyPolicyUrl: "https://www.together.ai/privacy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + }, }, { id: "custom", @@ -606,6 +833,8 @@ export const providers = [ announcement: null, termsUrl: null, privacyPolicyUrl: null, + headquarters: null, + dataPolicy: null, }, { id: "nanogpt", @@ -623,6 +852,13 @@ export const providers = [ announcement: null, termsUrl: "https://nano-gpt.com/legal/terms-of-service", privacyPolicyUrl: "https://nano-gpt.com/legal/privacy-policy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: null, + retentionPeriod: null, + }, }, { id: "bytedance", @@ -642,6 +878,14 @@ export const providers = [ termsUrl: "https://docs.byteplus.com/en/docs/legal/docs-terms-of-service", privacyPolicyUrl: "https://docs.byteplus.com/en/docs/legal/docs-privacy-policy", + headquarters: "CN", + dataPolicy: { + apiTraining: false, + consumerTraining: null, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + }, }, { id: "minimax", @@ -660,6 +904,13 @@ export const providers = [ announcement: null, termsUrl: "https://intl.minimaxi.com/protocol/terms-of-service", privacyPolicyUrl: "https://intl.minimaxi.com/protocol/privacy-policy", + headquarters: "CN", + dataPolicy: { + apiTraining: false, + consumerTraining: null, + promptLogging: true, + retentionPeriod: null, + }, }, { id: "embercloud", @@ -678,6 +929,13 @@ export const providers = [ announcement: null, termsUrl: "https://www.embercloud.ai/terms", privacyPolicyUrl: "https://www.embercloud.ai/privacy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: true, + retentionPeriod: null, + }, }, { id: "xiaomi", @@ -700,6 +958,13 @@ export const providers = [ termsUrl: "https://platform.xiaomimimo.com/docs/terms/user-agreement", privacyPolicyUrl: "https://platform.xiaomimimo.com/docs/terms/privacy-policy", + headquarters: "CN", + dataPolicy: { + apiTraining: false, + consumerTraining: null, + promptLogging: true, + retentionPeriod: "30 days", + }, }, { id: "deepinfra", @@ -721,6 +986,16 @@ export const providers = [ announcement: null, termsUrl: "https://deepinfra.com/terms", privacyPolicyUrl: "https://deepinfra.com/privacy", + headquarters: "US", + dataPolicy: { + apiTraining: false, + consumerTraining: false, + promptLogging: false, + retentionPeriod: "0 days", + soc2: true, + iso27001: true, + gdpr: true, + }, }, ] as const satisfies ProviderDefinition[];