"use client" import { useState } from "react" import { Activity, ArrowRight, Check, ChevronRight, CircleCheck, Code2, Gauge, Globe2, LockKeyhole, Network, Route, ShieldCheck, Sparkles, Waypoints, Workflow, Zap, } from "lucide-react" import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts" import { ThemeToggle } from "@/components/theme-toggle" import { AnimatedList } from "@/components/ui/animated-list" import { ChartContainer, ChartTooltip, ChartTooltipContent, type ChartConfig, } from "@/components/ui/chart" import { FlickeringGrid } from "@/components/ui/flickering-grid" import { Globe } from "@/components/ui/globe" import { Marquee } from "@/components/ui/marquee" import { OrbitingCircles } from "@/components/ui/orbiting-circles" import { Ripple } from "@/components/ui/ripple" import { AnimatedSpan, Terminal, TypingAnimation, } from "@/components/ui/terminal" import { cn } from "@/lib/utils" const providers = [ { name: "OpenAI", mark: "OA" }, { name: "Anthropic", mark: "A" }, { name: "Gemini", mark: "G" }, { name: "Meta", mark: "M" }, { name: "Mistral", mark: "MI" }, { name: "xAI", mark: "x" }, { name: "Cohere", mark: "C" }, { name: "DeepSeek", mark: "DS" }, ] const routingEvents = [ { icon: , title: "Routed to Claude Sonnet", meta: "342ms · 8.2k tokens", accent: "bg-violet-500/15 text-violet-500", }, { icon: , title: "Prompt cache hit", meta: "Saved $0.018 · 42ms", accent: "bg-amber-500/15 text-amber-500", }, { icon: , title: "Latency policy applied", meta: "Gemini Flash · 118ms", accent: "bg-blue-500/15 text-blue-500", }, { icon: , title: "Fallback completed", meta: "OpenAI → Mistral · 621ms", accent: "bg-emerald-500/15 text-emerald-500", }, { icon: , title: "Guardrail passed", meta: "No sensitive data detected", accent: "bg-cyan-500/15 text-cyan-500", }, ] const usageData = [ { time: "08:00", cost: 28, latency: 54 }, { time: "10:00", cost: 35, latency: 48 }, { time: "12:00", cost: 31, latency: 64 }, { time: "14:00", cost: 48, latency: 57 }, { time: "16:00", cost: 41, latency: 72 }, { time: "18:00", cost: 57, latency: 66 }, { time: "20:00", cost: 52, latency: 82 }, ] const chartConfig = { cost: { label: "Requests", color: "#2563eb" }, latency: { label: "Latency", color: "#8b5cf6" }, } satisfies ChartConfig const reviews = [ { initials: "MK", name: "Maya Kim", role: "AI Platform Lead", quote: "Vertex gave us one reliable interface for every model experiment. We stopped rebuilding provider integrations and started shipping.", }, { initials: "JL", name: "Jon Bell", role: "Founding Engineer", quote: "Fallback routing turned model outages into a non-event. Our application stays fast even when a provider is under pressure.", }, { initials: "AR", name: "Ari Rao", role: "VP of Engineering", quote: "The unified cost view finally made inference spend understandable across teams, providers, and environments.", }, { initials: "SC", name: "Sofia Chen", role: "Product Engineer", quote: "We changed one base URL and had access to the models we needed. The developer experience is exactly that simple.", }, { initials: "OT", name: "Owen Taylor", role: "Infrastructure Director", quote: "Vertex lets our developers move quickly while the platform team keeps control of budgets, policies, and reliability.", }, { initials: "NB", name: "Nina Brooks", role: "Applied AI Engineer", quote: "Model comparisons that used to take days now take minutes. The same payload works everywhere we want to test.", }, ] const globeConfig = { width: 800, height: 800, onRender: () => {}, devicePixelRatio: 2, phi: 0, theta: 0.28, dark: 1, diffuse: 1.1, mapSamples: 12000, mapBrightness: 4.5, baseColor: [0.05, 0.12, 0.32] as [number, number, number], markerColor: [0.15, 0.46, 1] as [number, number, number], glowColor: [0.08, 0.18, 0.48] as [number, number, number], markers: [ { location: [37.7749, -122.4194] as [number, number], size: 0.08 }, { location: [40.7128, -74.006] as [number, number], size: 0.06 }, { location: [51.5072, -0.1276] as [number, number], size: 0.07 }, { location: [48.8566, 2.3522] as [number, number], size: 0.05 }, { location: [1.3521, 103.8198] as [number, number], size: 0.08 }, { location: [35.6762, 139.6503] as [number, number], size: 0.06 }, { location: [-33.8688, 151.2093] as [number, number], size: 0.05 }, { location: [-23.5505, -46.6333] as [number, number], size: 0.06 }, ], } function Brand({ compact = false }: { compact?: boolean }) { return ( {!compact && ( Vertex )} ) } function ProviderMark({ mark, name, small = false }: { mark: string; name: string; small?: boolean }) { return ( {mark} ) } function SectionHeading({ eyebrow, title, description, }: { eyebrow: string title: string description: string }) { return (

{eyebrow}

{title}

{description}

) } function FeatureCopy({ icon: Icon, title, description, }: { icon: React.ComponentType<{ className?: string }> title: string description: string }) { return (

{title}

{description}

) } function ReviewCard({ review }: { review: (typeof reviews)[number] }) { return (
“{review.quote}”
{review.initials} {review.name} {review.role}
) } export function VertexLandingPage() { const [annual, setAnnual] = useState(false) const firstReviews = reviews.slice(0, 3) const secondReviews = reviews.slice(3) return (
The unified AI gateway

One API for every AI model.

Route, optimize, and observe every model request through one OpenAI-compatible endpoint built for production.

Your application
POST /v1/chat/completions
Vertex Gateway
Routing by latency
Best available model
{providers.slice(0, 4).map((provider) => ( ))}

Every leading model, one gateway

{providers.map((provider) => (
{provider.name}
))}
{"> curl https://api.vertex.ai/v1/chat/completions \\"} {` -d '{ "model": "vertex/auto", "messages": [...] }'`} → evaluating 14 available models → route selected: anthropic/claude-sonnet ✓ response streamed in 342ms One endpoint. Any model. No rewrites.
{providers.slice(0, 4).map((provider) => ( ))} {providers.slice(4).map((provider) => ( ))}
{routingEvents.map((event) => (
{event.icon} {event.title} {event.meta}
))}
} />
8 regions online
{[ { number: "01", icon: Code2, title: "Change one base URL", text: "Keep your existing OpenAI-compatible SDK, payloads, and streaming logic.", }, { number: "02", icon: Workflow, title: "Set a routing policy", text: "Choose a model directly or let Vertex optimize for cost, quality, or latency.", }, { number: "03", icon: Gauge, title: "Observe every request", text: "Trace performance and spend across models, applications, and environments.", }, ].map((step, index) => (
{step.number}

{step.title}

{step.text}

))}

Reliability built into every request.

Production-grade controls keep your workloads available, observable, and protected as they scale.

{[ ["99.99%", "Gateway uptime"], ["8", "Global regions"], ["< 20ms", "Routing overhead"], ].map(([value, label], index) => (
{value} {label}
))}
{[ { name: "Developer", price: "$0", cadence: "/ month", description: "For prototypes, side projects, and individual builders.", action: "Start building", popular: false, features: ["Pay-as-you-go model usage", "All model providers", "Basic usage analytics", "Community support"], }, { name: "Team", price: annual ? "$39" : "$49", cadence: "/ month", description: "For teams running reliable AI products in production.", action: "Start 14-day trial", popular: true, features: ["Everything in Developer", "Routing and fallback policies", "Team budgets and alerts", "90-day request analytics", "Priority support"], }, { name: "Enterprise", price: "Custom", cadence: "", description: "For organizations that need security and scale.", action: "Talk to sales", popular: false, features: ["Everything in Team", "SAML SSO and audit logs", "Custom retention and regions", "Dedicated capacity", "Enterprise SLA"], }, ].map((plan) => (
{plan.popular && ( Most popular )}

{plan.name}

{plan.price} {plan.cadence && {plan.cadence}}

{plan.description}

{plan.action}
    {plan.features.map((feature) => (
  • {feature}
  • ))}
))}

Model usage is billed separately at transparent provider rates. No long-term contracts.

Early access feedback

Built for teams shipping AI

{firstReviews.map((review) => )} {secondReviews.map((review) => )}
) }