import Header from "@/src/components/layouts/header";
import ContainerPage from "@/src/components/layouts/container-page";
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/src/components/ui/breadcrumb";
import { Button } from "@/src/components/ui/button";
import { Card } from "@/src/components/ui/card";
import { NewOrganizationForm } from "@/src/features/organizations/components/NewOrganizationForm";
import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture";
import { NewProjectForm } from "@/src/features/projects/components/NewProjectForm";
import { useQueryProjectOrOrganization } from "@/src/features/projects/hooks";
import { ApiKeyRender } from "@/src/features/public-api/components/CreateApiKeyButton";
import { QuickstartExamples } from "@/src/features/public-api/components/QuickstartExamples";
import { MembershipInvitesPage } from "@/src/features/rbac/components/MembershipInvitesPage";
import { MembersTable } from "@/src/features/rbac/components/MembersTable";
import {
createProjectRoute,
inviteMembersRoute,
setupTracingRoute,
} from "@/src/features/setup/setupRoutes";
import { api } from "@/src/utils/api";
import { cn } from "@/src/utils/tailwind";
import { type RouterOutput } from "@/src/utils/types";
import { Check } from "lucide-react";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import { StringParam, useQueryParam } from "use-query-params";
// Multi-step setup process
// 1. Create Organization: /setup
// 2. Invite Members: /organization/:orgId/setup
// 3. Create Project: /organization/:orgId/setup?step=create-project
// 4. Setup Tracing: /project/:projectId/setup
export function SetupPage() {
const { project, organization } = useQueryProjectOrOrganization();
const router = useRouter();
const [orgStep] = useQueryParam("orgstep", StringParam); // "invite-members" | "create-project"
const queryProjectId = router.query.projectId as string | undefined;
// starts at 1 to align with breadcrumb
const stepInt = !organization
? 1
: project
? 4
: orgStep === "create-project"
? 3
: 2;
const hasTracingConfigured = api.traces.hasTracingConfigured.useQuery(
{ projectId: queryProjectId as string },
{
enabled: queryProjectId !== undefined && stepInt === 4,
refetchInterval: 5000,
trpc: {
context: {
skipBatch: true,
},
},
},
).data;
const capture = usePostHogClientCapture();
useEffect(() => {
if (hasTracingConfigured !== undefined) {
capture("onboarding:tracing_check_active", {
active: hasTracingConfigured,
});
}
}, [hasTracingConfigured, capture]);
return (
Organizations are used to manage your projects and teams.
Invite members to your organization to collaborate on
projects. You can always add more members later.
Projects are used to group traces, datasets, evals and prompts.
Multiple environments are best separated via tags within a
project.
These keys are used to authenticate your API requests. You can create more keys later in the project settings.
{apiKeys ? (You need to create an API key to start tracing your application.
Tracing is used to track and analyze your LLM calls. You can always skip this step and setup tracing later.